Kamera Fernsteuerung mit Arduino über USB

Eine Digitalkamera über USB zu steuern, bietet viel mehr Möglichkeiten, als die Steuerung über das Kabel Fernsteuerkabel. Neben Auslöser lassen sich über USB auch Blende, Belichtungszeit und Fokus der Kamera einstellen. Voraussetzung ist natürlich, dass die Kamera die Fernsteuerung über USB auch unterstützt. Canon Powershot bzw. Canon EOS und Nikon DSLR Benutzer sind hier fein raus, dafür funktioniert die hier vorgestellte Lösung mit dem Arduino und USB Host Shield.

Für alle anderen Kameras gilt es zunächst herauszufinden, ob sich die Kamera überhaupt fernsteuern lässt.
Die Libgphoto library, bzw. die Liste der unterstützten Kameras bietet eine gute Anlaufstelle. Allerdings gibt es hierzu keine fertige Lösung mit dem Arduino. Dafür ist aber die Steuerung über Rasperry Pi und/oder Android möglich.

Arduino

Von Hause aus, besitzt der Arduino nur einen USB Client Anschluss, zum Uploaden von Sketchen und für die Ein-Ausgabe über die serielle Schnittstelle. Eine Kamera kann man daran leider nicht anschließen, dazu bräuchte man einen USB Host Anschluss, wie man ihn bei PCs findet. Es gibt aber auch Möglichkeiten einen Arduino mit einem USB Host Port zu versehen:

  • USB-Host Shield
  • Arduino Mega ADK

Hinweis:
Auch Arduino Due, Tre und Yun verfügen über USB Host Ports. Hier werden aber andere Prozessoren verwendet. Die hier vorgestellten Bibliotheken funktionieren mit diesen Boards leider nicht.

Arduino mit USB Host Shield

Das USB Host Shield hat es inzwischen zu einem offiziellen Arduino Shield gebracht. Urprünglich entwickelt wurde es von Oleg Mazurov. Als USB Host Chip kommt der MAX3421E USB Host Controller von Maxim zum Einsatz

IMG_4859.JPG

Es gibt auch eine Reihe von USB Host Shields clones. Dabei sollte man aber darauf achten, wie das Modul mit dem Arduino verbunden wird. Benötigt werden die Hardware SPI Pins. Diese liegen je nach verwendeten Board auf unterschiedlichen Pins. Auf der sicheren Seite ist man eigentlich nur, wenn der 6-polige ISP (ICSP) Steckverbinder auf dem Shield vorhanden ist. Der ISP Steckverbinder ist bei allen Arduino Boards gleich belegt und befindet sich auch immer an der selben Position. Fehlt der ISP Steckverbinder, werden bei dem Shield die Arduino Digital Pins 13-10 verwendet, wie z.B. beim Sparkfun USB Host Shield. Dieses Shield funktioniert zwar mit dem Arduino Uno, nicht aber mit dem Arduino Leonardo oder dem Arduino Mega.

IMG_4855.JPG

Arduino Mega ADK

Eine weitere Möglichkeit für einen USB Host Anschluss bietet das Arduino Mega ADK Board. Ursprünglich für die Anbindung von Android Smartphones (ADK Android Develepment Kit), wurde das Mega ADK Board in Zusammenarbeit mit Google entwickelt. Im Prinzip ist es ein Arduino Mega mit integriertem USB Host Shield. Da der selbe Chip wie beim USB Host Shield verwendet wird, sind beide Varianten zueinander kompatibel.
ArduinoMegaADK.JPG

USB Host Library

Die USB Host Library von Oleg Mazurov bietet eine Fülle an Funktionen um allerhand USB Geräte über das USB Host Shield anzusprechen.

PTP und MTP

Zur Kommunikation von Digital Kameras und PC gibt es die Protokolle PTP (Picture Transfer Protocol) und das auf PTP aufbauende und erweiterte MTP (Media Transfer Protocol).

Obwohl beide Protokolle standardisiert sind, kocht hier jeder Kamera-Hersteller sein eigens Süppchen. Das macht es nicht gerade einfach herauszufinden, ob und welche Funktionen von der Kamera unterstützt werden. Oftmals beschränken sich die Hersteller nur auf den Datei-Transfer und verzichten auf Fernsteuer Funktionen.

PTP Library

Die PTP Library ebenfalls von Oleg Mazurov, ist das Mittel der Wahl um eine Digitalkamera mit einem Arduino über USB anzusteuern. Die PTP-Library baut auf der USB Host Lib auf. Neben ein paar allgemeinen PTP Beispielen gibt es hauptsächlich Beispiele für Nikon und Canon (EOS und Powershot) Kamera Modelle.

Leider wurde die Bibliothek in der Vergangenheit nicht weiter gepflegt und funktionierte deshalb nicht mehr mit aktuellen Arduino Versionen. Auch ich war zunächst am Verzweifeln, wegen der schieren Masse an Fehlern, die es beim Übersetzen der Beispiel Sketche gab. Zudem wurde eine ältere Version des QP Frameworks verwendet, die nicht mehr zum Download bereitsteht.

Doch liest man sich alle Kommentare und Bug-Reports aufmerksam durch, findet man auch die Lösung für die Compiler Fehler. Fehlt nur ein Freiwilliger, der den Quellcode von den Fehlern befreit. Also habe ich mich daran gemacht. Das Ergebnis: Alle Beispiel Sketche lassen sich nun auch mit aktuellen Arduino Libraries übersetzen. Die aktualisierte PTP Lib finden man auf meiner Github-Seite. Ein Pull Request wurde erzeugt, bald werden die Änderungen in die Original PTP Lib einfließen.

Ein guter Test für den Anfang ist die Liste der unterstützten PTP Funktionen herauszufinden. Dazu dient der Sketch PTPDevInfo. Hier mal als Beispiel die Ausgabe meiner Canon Powershot G9 Kamera:


Camera connected

...
Operations supported:
1014 GetDevicePropDesc
1015 GetDevicePropValue
1016 SetDevicePropValue
1017 ResetDevicePropValue
1001 GetDeviceInfo
1002 OpenSession
1003 CloseSession
9013 PS_CheckEvent
901F Vendor defined
1004 GetStorageIDs
1005 GetStorageInfo
1006 GetNumObjects
1007 GetObjectHandles
1008 GetObjectInfo
1009 GetObject
100A GetThumb
101B GetPartialObject
100C SendObjectInfo
100D SendObject
100B DeleteObject
100F FormatStore
1012 SetObjectProtection
9001 PS_GetObjectSize
9021 PS_GetFolderEntries
901B PS_GetPartialObject
100E InitiateCapture
9008 PS_StartShootingMode
901A PS_InitiateCaptureInMemory
9009 PS_EndShootingMode
900B PS_ViewfinderOn
901D PS_GetViewfinderImage
900D PS_ReflectChanges
900C PS_ViewfinderOff
9014 PS_FocusLock
9015 PS_FocusUnlock
9018 Vendor defined
9012 Vendor defined
9801 GetObjectPropsSupported
9802 GetObjectPropDesc
9803 GetObjectPropValue
9804 SetObjectPropValue
9805 GetObjectPropList

...
Manufacturer: Canon Inc.
Model: Canon PowerShot G9
Device ver.: 1-4.2.1.0
Serial num.: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Alternativ Raspberry Pi und/oder Android

Für alle nicht Canon bzw. Nikon Besitzer gibt es mit GPhoto die Möglichkeit die Kamera über ein Unix kompatibles System zu steuern. Die sehr gut gepflegte Bibliothek unterstützt derzeit 1891 Kameras und Medienplayer. Allerdings ist GPhoto2 nur Kommandozeilen-basiert. Wer Grafik-Klicki-Bunti bevorzugt, für den gibt es UI wie gtkcam .

Interessant für Android Smartphone oder Tablet Besitzer ist auch DslrDashboard. Zwar ist es mir nie gelungen die Kamera direkt über das Smartphone/Tablet zu steuern, allerdings gibt es mit ddserver die Möglichkeit die Kamera über WLAN zu steuern. Dabei wird noch ein Linux Device wie z.B. Raspberry Pi oder einem OpenWRT WLAN Router benötigt, auf dem der ddserver läuft. Damit funktioniert es prima. Liveview, Timelapse, HDR, Fokusstacking sind einige der Features dieser Anwendung.

Screenshot_2014-09-02-00-08-43

Mehr zu diesem Thema findet man in meinem Buch ‚Hacks für die digitale Fotografie

14 Antworten auf „Kamera Fernsteuerung mit Arduino über USB“

  1. Wow, cool! Darauf habe ich gewartet. D.h. man kann mit der neusten Arduino IDE Version die PTP 2.0 lib verwenden? Genial! 🙂

    Gibt es zufällig irgendwo ein Beispiel, welches die Kamera erneut auslöst, sobald das Foto fertig/gespeichert ist? Ich bin bislang daran gescheitert und habe mich mit „delay“ herumgeschlagen, aber das ist nicht wirklich prickelnd…

    1. Hallo Fabian,

      danke für dein Feedback. Ja die Beispiele der PTP-Lib lassen sich mit allen aktuellen Arduino Versionen übersetzen.

      Zu deiner Frage. Delay ist hier sicher keine gute Lösung. Mit der millis() Funktion und abfragen/merken des Timerwertes sollte dies möglich sein. Hier mal ein ungetesteter Versuch des PTPCapture Beispiels. Sollte alle 5 Sekunden ein Foto aufnehmen.

      void CamStateHandlers::OnDeviceInitializedState(PTP *ptp)
      {
      static uint32_t next_time = 0;

      if (!stateConnected)
      {
      stateConnected = true;
      E_Notify(PSTR(„Camera connected\r\n“), 0x80);
      }

      uint32_t time_now = millis();

      if (time_now > next_time)
      {
      next_time = time_now + 5000;
      ptp->CaptureImage();
      }
      }

      LG Peter

  2. Super, jetzt lässt sich das ganze endlich kompilieren…
    Was mir jedoch aufgefallen ist, es braucht teilweise bis zu 15 Resets bis die Kamera erkannt wird… (D90 und D7200) Das erscheint mir doch ein bisschen merkwürdig. Wird sie bei Dir sofort erkannt? Ebenfalls funktioniert NkRemote nicht mit der D7200, PTPDevInfo erkennt sie jedoch. Die D90 wird erkannt, allerdings ist die Menue Steuerung nicht möglich, egal was ich im Monitor uder Putty eingebe, es bleibt einfach beim ersten Menue 🙁 (Ich verwende das Sparkfun Shield am Uno R3)
    Vielleicht fällt Dir was dazu ein…
    LG Stefan

    1. Hallo Stefan,

      leider fällt mir zu deinem Problem nichts ein. Meine Canon Kameras funktionieren problemlos. Mit Nikon kenne ich mich nicht aus.

      LG Peter

  3. Hi Peter,

    ich habe meinen Post und diesen Blog völlig aus den Augen verloren! Bin gerade erst wieder hier gelandet und habe deine Antwort gesehen. Vielen Dank schon mal dafür!

    Auch wenn ich die letzten Monate leider nicht zum Testen kam: meine Frage war ein wenig anders gemeint, als es anscheinend ankam. Was ich meinte war, wie man es hinkriegt, dass man von der Kamera den Status „Foto wurde geschossen“ bekommt und dann erst wieder das nächste Foto schießt. Sozusagen ein Event-Listener auf „Foto wurde geschossen“…

    Liebe Grüße
    Fabian

  4. Hallo, ich möchte ein Photo Booth bauen, ich habe schon einiges gelesen aber es ist immer nicht das was ich mir vorstelle.
    Ich möchte meine Kamera ( Canon EOS 500D) mit einem Youngnuo RF-603 auslösen, die Kamera soll mit einer 5 sec. Verzögerung ausgelöst werden. Es soll ein Uhr runter laufen ( Countdown) hast du ein tipp wie ich es umsetzen kann? Die kann per usb und klinke auslösen.
    Meine Vorstellung wäre. Youngnuo sender Youngnuo Empfänger, vom Youngnuo per Kabel
    (das eigentlich an die Kamera angeschloßen wird) in Arduino, der startet den Countdown, die zeit läuft runter dann wird die Kamera per usb oder klinke ausgelöst.
    Wenn es möglich ist, wird das bald auf einem display angezeigt und wenn der Photo Booth nicht benutzt wird, soll eine Diashow gezeigt werden.

    1. Hallo,

      ein sehr interessantes Projekt. Das sollte durchaus machbar sein. Statt dem Yongnuo RF-603 besser den neuen RF-603-II verwenden. Mit dem alten RF-603 klappt es nicht so gut als Fernauslöser für die Kamera. Als Countdown Anzeige könnte man eine 7 Segment Anzeige oder eine 8×8 LED Punktmatrix verwenden (mit seriell oder I2C Ansteuerung, z.B. Adafruit 8×8 LED Matrix mit I2C). Bei Steuerung mit dem Arduino würde ich die Kamera per Klinke oder über Infrarot LED auslösen. Über USB wird das mit dem Arduino schwierig. Der USB-Task muss ständig laufen, es darf kein delay() verwendet werden, usw. Bilder mit dem Arduino von der Kamera laden, speichern und auf einem Display anzeigen, ist nicht machbar. Der Programmieraufwand ist relativ einfach. Es gibt fertige Bibliotheken von Adafruit für die LED Anzeige und meine Foto Bibliothek https://github.com/robotfreak/dfhacks/tree/master/Arduino

      Für die Display Anzeige, bzw die Diashow, wäre ein Raspberry Pi besser geeignet. Ein Display mit HDMI Anschluss, Kamerasteuerung über USB mit der Gphoto2 Lib http://www.gphoto.org/. Damit kann man sich auch die Bilder von der Kamera laden und eine Diashow starten. Den Arduino würde man dann gar nicht benötigen. I2C und Port für den Anschluss des RF-603 hat der Raspberry Pi auch zur Genüge. Die Countdown Anzeige, könnte natürlich auch gleich auf dem Display erfolgen. Vom Programmieraufwand ist diese Lösung allerdings deutlich aufwändiger.

      LG Peter

      1. Das mit den Fotos anzeigen muss nicht sein, ich hätte dafür
        eine andere Lösung mit einem iPad.
        Das mit dem Rapberry habe ich mir auch schon überleget aber er muss wie ein Computer runtergefahren werden und das möchte ich nicht.
        Ich werde es so machen wie du es mir vorgeschlagen hast.
        2x RF-603 II vom Empfänger mit dem Kabel in Arduino der einen Countdown startet. Dafür werde ich eine 7 Segment Anzeige nehmen. Die Kamera werde ich über den Klinkenstecker auslösen.
        Kann ich mich an dich wenden wenn ich Fragen beim Programmieren habe?? Habe noch nie ein Arduino Programmiert.

        1. Hallo,

          kein Problem, wenn du Fragen zur Programmierung hast, kannst du dich gerne an mich wenden. Ich hatte auch vor, ein Photo Booth als Projekt für mein Buch zu bauen. Aus Zeit und Platzgründen wurde daraus dann leider nichts. Vielleicht baue ich mir jetzt so etwas. Eine schönes Projekt für lange kalte Winterabende.

          LG Peter

          1. Hi, habe alle Komponenten jetzt zusammen. Mein 7 Segment Anzeige funktioniert auch. Ich kann mit 2 Youngnuo 603 II eine led zum leuchten bringen. Mein Problem ist jetzt, ich bekomme es nicht hin mein Script so zu schreiben das ich es mit dem Youngnuo starten kann. Hast du ein Tipp für mich?

            Mein Script sieht so aus.
            // Longer, more obvious example for Arduino 7 segment display
            // http://www.hacktronics.com/Tutorials/arduino-and-7-segment-led.html
            // License: http://www.opensource.org/licenses/mit-license.php (Go crazy)

            void setup() {
            pinMode(2, OUTPUT);
            pinMode(3, OUTPUT);
            pinMode(4, OUTPUT);
            pinMode(5, OUTPUT);
            pinMode(6, OUTPUT);
            pinMode(7, OUTPUT);
            pinMode(8, OUTPUT);
            pinMode(9, OUTPUT);
            digitalWrite(9, 0); // start with the „dot“ off
            }

            void loop() {
            // write ‚3‘
            digitalWrite(2, 1);
            digitalWrite(3, 1);
            digitalWrite(4, 1);
            digitalWrite(5, 1);
            digitalWrite(6, 0);
            digitalWrite(7, 0);
            digitalWrite(8, 1);
            delay(1000);
            // write ‚2‘
            digitalWrite(2, 1);
            digitalWrite(3, 1);
            digitalWrite(4, 0);
            digitalWrite(5, 1);
            digitalWrite(6, 1);
            digitalWrite(7, 0);
            digitalWrite(8, 1);
            delay(1000);
            // write ‚1‘
            digitalWrite(2, 0);
            digitalWrite(3, 1);
            digitalWrite(4, 1);
            digitalWrite(5, 0);
            digitalWrite(6, 0);
            digitalWrite(7, 0);
            digitalWrite(8, 0);
            delay(1000);
            // write ‚0‘
            digitalWrite(2, 1);
            digitalWrite(3, 1);
            digitalWrite(4, 1);
            digitalWrite(5, 1);
            digitalWrite(6, 1);
            digitalWrite(7, 1);
            digitalWrite(8, 0);
            delay(4000);
            }

          2. Hallo,

            na ja, es fehlt die Abfrage Taste gedrückt, dann starte Countdown, löse Kamera aus.


            int ledPin = 13; // Kamera Ausloser digital pin 13
            int inPin = 10; // Yongnuo Taster digital pin 10


            void setup()
            {
            pinMode(ledPin, OUTPUT); // Kamera Ausloeser als Ausgang
            pinMode(inPin, INPUT); // Yongnuo Taster als Eingang
            // Setze pins fuer 7 segment display
            ...
            }


            void loop()
            {
            if (digitalRead(inPin) == LOW) // Yongnuo Taster gedrueckt?
            {
            while (digitalRead(inPin) == LOW); // warte bis Taster losgelassen
            // starte countdown
            ...
            // loese Kamera aus
            digitalWrite(ledPin, LOW); // Kamera Ausloeser Pin LOW
            delay(100);
            digitalWrite(ledPin, HIGH); // Kamera Ausloeser Pin HIGH
            }
            }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

neunzehn + achtzehn =