Остановить мгновение. Фототриггер на Arduino
Съемка быстротекущих процессов, таких как падение капли, взрыв воздушного шарика, - очень непростое дело. Точно подгадать момент, когда нужно нажать на спуск затвора, без специальных устройств практически невозможно. Нет, можно, конечно, сделать сотню попыток, и в какой-то момент удача повернется к тебе. Но можно обойтись и без сотни шариков. Тут на помощь придет Arduino. Ниже описан процесс конструирования автоматического триггера на базе Arduino с реакцией на звук или пересечение луча лазерной указки.
Cтрого говоря, Arduino будет управлять не затвором камеры, а фотовспышкой. К сожалению, задержка реакции камеры на сигнал — в районе 20 миллисекунд, что для человеческого глаза не заметно, но все же дольше, чем можно себе позволить при съемке лопнувшего шарика. Поэтому съемка производится в темной комнате с выдержкой 10 секунд, а вот вспышка срабатывает именно в нужный момент. Так как в комнате практически нет освещения, то всё экспонирование фотографии произойдет именно в момент работы вспышки (около 1 миллисекунды).
Лазерный фотосенсор
В качестве сенсора используется простая лазерная указка и фоторезистор. Луч указки направляется на фотосенсор, а фотосенсор будет регистрировать потерю луча. То есть в тот момент, когда объект пересекает луч, Arduino активирует вспышку. Также, в этот момент, программно отключается лазер, чтобы луч не попал на фотографию. Внеся небольшую задержку между пересечением луча и освещением сцены вспышкой, можно поймать в кадр интересные моменты, например, разбивающуюся о пол лампу накаливания, которая за мгновение до этого падая пересечет луч указки.
Для удешевления конструкции использовался недорогой лазерный модуль. Так как он очень маломощный, его можно запитать напрямую с цифрового выхода Arduino. Так как модуль лазера требует 3В, а напряжение на выходе Arduino 5В, в схеме используется делитель напряжения на двух резисторах. Другой делитель — в цепи фоторезистора. Значение сигнала с фоторезистора считывается аналоговым входом Arduino.
Звуковой сенсор
Сенсор реагирует на шум - это может быть звук падающей капли на воду или звук лопнувшего шарика и т.д. Для упрощения конструкции в схеме используется уже готовый усилитель, в данном случае — гитарный. С усилителя мы будем получать синусоидальный сигнал в районе 8 кГц на 5 вольтах. Для защиты аналогового входа Arduino используется диод, отсекающий отрицательную часть волны.
Не первом изображении — сигнал с усилителя (это голос), на втором — сигнал после диода. Arduino, считывая сигнал, сравнивает его с некоторым пороговым значением. Если сигнал превышает его, то срабатывает триггер вспышки. В принципе, можно сделать более избирательную систему и заставить Arduino реагировать на определенные частоты, но в данном приложении этого не требуется.
Управление вспышкой
Об управлении вспышкой читайте в прошлом проекте.
Окончательная сборка
Сборка заключалась в размещении всех компонентов в подходящем корпусе и выводе на корпус разъемов для подключения микрофона и лазерного сенсора.
Программный код
// Maurice Ribble //Переключение между разными типами триггера //#define ENABLE_LASER_TRIGGER #define ENABLE_SOUND_TRIGGER //Пороговые значения для срабатывания триггера //Определяются в зависимости от окружающих факторов #define LASER_THRESHHOLD 500 #define SOUND_THRESHHOLD 100 //Выводит сообщения, помогает при определинии //пороговых необходимых пороговых значений //#define PRINT_MESSAGES // Задает используемые цифровые выходы #define CAMERA_FLASH_PIN 4 #define LASER_PIN 5 // Задает используемые аналоговые выходы #define LASER_TRIGGER_ANALOG_PIN 0 #define SOUND_TRIGGER_ANALOG_PIN 1 void setup() { 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); // включить лазер #endif #ifdef PRINT_MESSAGES Serial.begin(9600); // открыть серийный порт #endif } void loop() { int soundVal; int laserVal; //////////////////////////////////////////////////////////// // Звуковой сенсор //////////////////////////////////////////////////////////// #ifdef ENABLE_SOUND_TRIGGER soundVal = analogRead(SOUND_TRIGGER_ANALOG_PIN); if (soundVal > SOUND_THRESHHOLD) { digitalWrite(CAMERA_FLASH_PIN, HIGH); #ifdef PRINT_MESSAGES Serial.println("Flash Triggered!!!"); #endif delay(100); digitalWrite(CAMERA_FLASH_PIN, LOW); } #ifdef PRINT_MESSAGES Serial.print("Sound: "); Serial.println(soundVal, DEC); #endif #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); // выключаем в момент фотографирования #ifdef PRINT_MESSAGES Serial.println("Flash Triggered!!!"); #endif delay(100); digitalWrite(CAMERA_FLASH_PIN, LOW); digitalWrite(LASER_PIN, HIGH); // Включаем обратно } #ifdef PRINT_MESSAGES Serial.print("Laser: "); Serial.println(laserVal, DEC); #endif #endif // ENABLE_LASER_TRIGGER }
Результат
Оригинальная статья (англ.) на сайте автора