Остановить мгновение. Фототриггер на Arduino

Быстрая съемка с помощью ArduinoСъемка быстротекущих процессов, таких как падение капли, взрыв воздушного шарика, - очень непростое дело. Точно подгадать момент, когда нужно нажать на спуск затвора, без специальных устройств практически невозможно. Нет, можно, конечно, сделать сотню попыток, и в какой-то момент удача повернется к тебе. Но можно обойтись и без сотни шариков. Тут на помощь придет Arduino. Ниже описан процесс конструирования автоматического триггера на базе Arduino с реакцией на звук или пересечение луча лазерной указки.

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

Лазерный фотосенсор

В качестве сенсора используется простая лазерная указка и фоторезистор. Луч указки направляется на фотосенсор, а фотосенсор будет регистрировать потерю луча. То есть в тот момент, когда объект пересекает луч, Arduino активирует вспышку. Также, в этот момент, программно отключается лазер, чтобы луч не попал на фотографию. Внеся небольшую задержку между пересечением луча и освещением сцены вспышкой, можно поймать в кадр интересные моменты, например, разбивающуюся о пол лампу накаливания, которая за мгновение до этого падая пересечет луч указки.

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

фоторезисторЛазерный модульПодсоединение лазера к Arduino

Схема подсоединения лазера и фоторезистра к Arduino

Звуковой сенсор

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

звуковая волнаОбрезанная звуковая волна, поступающая на вход Arduino

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

подключение усилителя к Ардуиноподключение микрофона к Arduino

Управление вспышкой

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

Схема подключения вспышки к Arduino

Окончательная сборка

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

сборка 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
}
Результат

Фотография с помощью ArduinoФотография с помощью ArduinoФотография с помощью Arduino

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