Съемка быстротекущих процессов, таких как падение капли, взрыв воздушного шарика, - очень непростое дело. Точно подгадать момент, когда нужно нажать на спуск затвора, без специальных устройств практически невозможно. Нет, можно, конечно, сделать сотню попыток, и в какой-то момент удача повернется к тебе. Но можно обойтись и без сотни шариков. Тут на помощь придет Arduino. Ниже описан процесс конструирования автоматического триггера на базе Arduino с реакцией на звук или пересечение луча лазерной указки.
Cтрого говоря, Arduino будет управлять не затвором камеры, а фотовспышкой. К сожалению, задержка реакции камеры на сигнал — в районе 20 миллисекунд, что для человеческого глаза не заметно, но все же дольше, чем можно себе позволить при съемке лопнувшего шарика. Поэтому съемка производится в темной комнате с выдержкой 10 секунд, а вот вспышка срабатывает именно в нужный момент. Так как в комнате практически нет освещения, то всё экспонирование фотографии произойдет именно в момент работы вспышки (около 1 миллисекунды).
Лазерный фотосенсор
В качестве сенсора используется простая лазерная указка и фоторезистор. Луч указки направляется на фотосенсор, а фотосенсор будет регистрировать потерю луча. То есть в тот момент, когда объект пересекает луч, Arduino активирует вспышку. Также, в этот момент, программно отключается лазер, чтобы луч не попал на фотографию. Внеся небольшую задержку между пересечением луча и освещением сцены вспышкой, можно поймать в кадр интересные моменты, например, разбивающуюся о пол лампу накаливания, которая за мгновение до этого падая пересечет луч указки.
Для удешевления конструкции использовался недорогой лазерный модуль. Так как он очень маломощный, его можно запитать напрямую с цифрового выхода Arduino. Так как модуль лазера требует 3В, а напряжение на выходе Arduino 5В, в схеме используется делитель напряжения на двух резисторах. Другой делитель — в цепи фоторезистора. Значение сигнала с фоторезистора считывается аналоговым входом Arduino.




Звуковой сенсор
Сенсор реагирует на шум - это может быть звук падающей капли на воду или звук лопнувшего шарика и т.д. Для упрощения конструкции в схеме используется уже готовый усилитель, в данном случае — гитарный. С усилителя мы будем получать синусоидальный сигнал в районе 8 кГц на 5 вольтах. Для защиты аналогового входа Arduino используется диод, отсекающий отрицательную часть волны.


Не первом изображении — сигнал с усилителя (это голос), на втором — сигнал после диода. Arduino, считывая сигнал, сравнивает его с некоторым пороговым значением. Если сигнал превышает его, то срабатывает триггер вспышки. В принципе, можно сделать более избирательную систему и заставить Arduino реагировать на определенные частоты, но в данном приложении этого не требуется.


Управление вспышкой
Об управлении вспышкой читайте в прошлом проекте.

Окончательная сборка
Сборка заключалась в размещении всех компонентов в подходящем корпусе и выводе на корпус разъемов для подключения микрофона и лазерного сенсора.





Программный код
#define ENABLE_SOUND_TRIGGER |
#define LASER_THRESHHOLD 500 |
#define SOUND_THRESHHOLD 100 |
#define CAMERA_FLASH_PIN 4 |
#define LASER_TRIGGER_ANALOG_PIN 0 |
#define SOUND_TRIGGER_ANALOG_PIN 1 |
pinMode(CAMERA_FLASH_PIN, OUTPUT); |
digitalWrite(CAMERA_FLASH_PIN, LOW); |
pinMode(LASER_PIN, OUTPUT); |
digitalWrite(LASER_PIN, LOW); |
#ifdef ENABLE_LASER_TRIGGER |
digitalWrite(LASER_PIN, HIGH); |
//////////////////////////////////////////////////////////// |
//////////////////////////////////////////////////////////// |
#ifdef ENABLE_SOUND_TRIGGER |
soundVal = analogRead(SOUND_TRIGGER_ANALOG_PIN); |
if (soundVal > SOUND_THRESHHOLD) |
digitalWrite(CAMERA_FLASH_PIN, HIGH); |
Serial.println( "Flash Triggered!!!" ); |
digitalWrite(CAMERA_FLASH_PIN, LOW); |
Serial.println(soundVal, DEC); |
#endif // ENABLE_SOUND_TRIGGER |
//////////////////////////////////////////////////////////// |
//////////////////////////////////////////////////////////// |
#ifdef ENABLE_LASER_TRIGGER |
laserVal = analogRead(LASER_TRIGGER_ANALOG_PIN); |
if (laserVal < LASER_THRESHHOLD) |
digitalWrite(CAMERA_FLASH_PIN, HIGH); |
digitalWrite(LASER_PIN, LOW); |
Serial.println( "Flash Triggered!!!" ); |
digitalWrite(CAMERA_FLASH_PIN, LOW); |
digitalWrite(LASER_PIN, HIGH); |
Serial.println(laserVal, DEC); |
#endif // ENABLE_LASER_TRIGGER |
Результат



Оригинальная статья (англ.) на сайте автора