16.04.2011

IR Arduino Selbstauslöser für Canon Spiegelreflex

Martin Koch hatte im Januar 2010 in seinem Blog eine Schaltung und einen Arduino-Code für die Fernsteuerung von Canon Kameras per Infrarotsignal veröffentlicht. Mit der Schaltung sind auch Intervallaufnahmen möglich, die sich dann zu Zeitrafferfilmen kombinieren lassen. Davon ausgehend habe ich die Schaltung um einen Transistor erweitert, so dass eine Power IR-LED mit 150 mA (SFH 485) angesteuert werden kann.



Das obige Schema und den Schaltplan habe ich mit fritzing erstellt. Eine freie Software, die ganz gut für solche Prototypen geeignet ist. Darin werden eine Darstellung für das Breadboard wie oben und ein Schaltplan sowie ein Platinenlayout gleichzeitig und synchron bearbeitet. Leider sehen die Schaltpläne immer ein bischen handgemalt aus.

Den Code aus Martin Kochs Blog  habe ich auch noch etwas veredelt, um präzisere Zeiten für die Reihenaufnahmen zu erhalten. Den Taster / Knopf zum Starten der Zeitreihen habe ich umfunktioniert. Er dient nun dazu manuell einen Impuls auszulösen, so dass der Sender auf die Kamera ausgerichtet werden kann.

/*
  IR_Canon
  Arduino Sketch 2011 by WoFu 
  
  based on http://controlyourcamera.blogspot.com/2010/01/infrared-controlled-timelapse.html
  thanks a lot to Martin Koch
  
*/

#define irLED 12 
#define statusLED 13
#define pushBUTTON 11

#define ACTIVE_HIGH_CAN 12
#define ACTIVE_LOW_CAN 12

int interval = 8; //seconds
unsigned long msecs=0;

void setup() {
  // set the LED-Pins to output
  pinMode(irLED, OUTPUT);
  pinMode(statusLED, OUTPUT);
  
  // and the button to input without pullup??
  pinMode(pushBUTTON, INPUT);
  digitalWrite(pushBUTTON, HIGH);
  
  // millis() returns the number of milliseconds since the Arduino board began running the current program. 
  // This number will overflow (go back to zero), after approximately 50 days. 
  msecs=millis(); 
}

void loop() { 

  if (millis() < msecs) {  // check for overflow
      msecs=0;    
  }
  else {
    if (millis()-msecs > interval *1000) {    
      //  seconds since last actions
      msecs=millis();
      // show on LED that something should happen
      digitalWrite(statusLED, HIGH);      
      sendInfraredSignal();
      if (interval > 1) {
        // wait half a seconds otherwise the signal can't be recognised
        delay(500);          
      }
      digitalWrite(statusLED, LOW);
    }
  }
  
  if (digitalRead(pushBUTTON) == HIGH) { 
    // someone pushed the button so fire the canon
    digitalWrite(statusLED, HIGH); 
    sendInfraredSignal(); 
    // remember the time, next action after  seconds
    msecs=millis();  
    delay(1000); //ms
    digitalWrite(statusLED, LOW); 
  }
}

void sendInfraredSignal() {
  // repeat 16 Signals
  for(int i=0; i<16; i++) { 
    digitalWrite(irLED, HIGH);
    delayMicroseconds(ACTIVE_HIGH_CAN);
    digitalWrite(irLED, LOW);
    delayMicroseconds(ACTIVE_LOW_CAN);
   } 
   
   // delay for immidiate shot
   delayMicroseconds(7330); 

  // repeat 16 Signals
   for(int i=0; i<16; i++) { 
    digitalWrite(irLED, HIGH);
    delayMicroseconds(ACTIVE_HIGH_CAN);
    digitalWrite(irLED, LOW);
    delayMicroseconds(ACTIVE_LOW_CAN);
   }   
}

Aktuell habe ich viel Spaß daran, den Sonnenuntergang aufzunehmen und mit Hilfe von Lightroom in einen Video umzurechnen. Meine Familie findet das zwar albern, aber die Ergebnisse beeindrucken dann doch.


Für alle die wissen wollen, wie man so einen Film macht und als Tip für ein Tool zur optimalen Erstellung von solchen Filmen mit Adobe Lightroom, kann ich lrtimelapse sehr empfehlen.

Inzwischen habe ich aus der Breadboard Version auch eine ordentlichere Variante auf Lochstreifen aufgebaut, die ich auf den Arduino Uno aufstecken kann.

Edit:
Inzwischen habe ich den Code an meiner EOS 60D getestet und mit je 12 uS On/Off Wartezeiten die maximale Reichweite erreicht. Bei optimaler Ausrichtung in der Wohnung waren das etwa 5 Meter.

Kommentare:

  1. Hallo!
    ich versuche gerade etwas ganz ähnliches mit einer alten Minolta F100. Welche Versorgungsspannung nehmen Sie für die Schaltung (9V?) und wie lauten die Wiederstandswerte in Ohm?

    Danke!

    Andi

    AntwortenLöschen
  2. Hallo Andi,

    als Versorgungsspannung nehme ich 5 Volt, da damit auch der Arduino gespeist wird.

    Die Widerstände haben die folgenden Werte:

    R1 150 Ohm für die Status LED
    R2 4,7 kOhm als Pullup am Schalter
    R3 47 Ohm dreimal parallel geschaltet zur Ansteuerung der Power IRLED
    R4 4,4 kOhm als Basiswiderstand für den Tansistor

    Entschuldige bitte, dass ich das nicht gleich im Schaltplan dokumentiert habe.

    Viel Glück und lass mal hören, ob das mit der Minolta klappt.

    Wolfgang

    AntwortenLöschen
  3. Hallo, vielen Dank! Wenn ich die richtigen IR-Codes finde sollte es klappen - melde mich sicher! P.S. Ich baue auch Chillis an :-)

    AntwortenLöschen