Как я фотографировал капли

Для того что бы сделать фото водной короны нужно нажать кнопку спуска фотоаппарата примерно сразу после того как капля ударилась о поверхность. Что сделать не совсем то и легко.

Для облегчения задачи я автоматизировал этот процесс. Реализация очень простая, я использовал Arduino, лазерную указку, фоторезистор(LDR) и инфракрасный светодиод. По цене все дешевое, фоторезистор я использовал самый дешевый был(~1$).

Алгоритм очень простой, лазерная указка светит на фоторезистор, в бесконечном цикле считываются данные с фоторезистора и как только считаное значение становится меньше N (зависит от освещенности в комнате) - после небольшой задержки(у меня было примерно 20 миллисекунд) тригерится спуск фотоаппарата.

В первой версии я использовал инфракрасный светодиод для посылки сигнала “сделать снимок”, но этот вариант работал нормально только с D80 и почти не работал новой камерой из-за чего был заменен на китайский пульт аналог Nikon ML-3.

#define ldrPin 0
#define ledPin 12
#define sPin 13

void setup() {
  Serial.begin(9600);
  //pinMode(ldrPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int val = analogRead(ldrPin);
  if (val < 150) {
    digitalWrite(sPin, HIGH);
    delay(25);
    sendNikonCode();
    Serial.print(val);
    Serial.println(" take picture");
    digitalWrite(sPin, LOW);
    delay(5000);
  }
  Serial.println(val);
}

void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait

  cli();  // this turns off any background interrupts

  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(ledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
   digitalWrite(ledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working

   // so 26 microseconds altogether
   microsecs -= 26;
  }

  sei();  // this turns them back on
}

void sendNikonCode() {
  // This is the code for my particular Nikon, for others use the tutorial
  // to 'grab' the proper code from the remote

  pulseIR(2080);
  delay(27);
  pulseIR(440);
  delayMicroseconds(1500);
  pulseIR(460);
  delayMicroseconds(3440);
  pulseIR(480);


  delay(65); // wait 65 milliseconds before sending it again

  pulseIR(2000);
  delay(27);
  pulseIR(440);
  delayMicroseconds(1500);
  pulseIR(460);
  delayMicroseconds(3440);
  pulseIR(480);
}

код “дергания” камеры взят от сюда http://sebastian.setz.name/arduino/my-libraries/multi-camera-ir-control/