Остановить мгновение. Фототриггер на 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
}Результат



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














