C-Control und Digicam

Da die C-Control für (fast) alle erdenklichen Aufgaben beim Überwachen, Messen, Steuern und Regeln eingesetzt werden kann, stellte sich mir einmal die Frage, ob man nicht etwa auch eine digitale Kamera der Befehlsgewalt einer C-Control unterstellen könnte. Die für die Menschheit segensreichen Anwendungsmöglichkeiten einer solchen Kombination wären sicherlich sehr zahlreich. Als stellvertretendes Beispiel könnte man etwa an eine digitale Mausefalle denken, bei welcher das kleine Nagetier geknipst wird, sobald es sich in den Einzugsbereich eines Bewegungssensors begibt (um das dort befindliche Stückchen Emmentaler Käse genüsslich zu verspeisen). Es muss ja nicht immer gleich Blut fließen, damit der menschliche Jagdinstinkt auf seine Rechnung kommt..... manchmal genügt die Freude am Erfolg der eigenen List.

 

Also ran ans Internet zum Recherchieren. Schon bald träufelten ermutigende Informationen aus dem Netz: einige digitale Kameras älterer Generation verfügen über eine serielle Schnittstelle, über welche bestimmte Funktionen auch vom PC aus gesteuert werden können. Warum sollte dies dann nicht auch von der C-Control aus möglich sein? Dazu müsste man natürlich zuerst das Übertragungsprotokoll einer solchen Digicam kennen. Und siehe da, einem klugen Kopf irgendwo in Übersee ist es gelungen, ein solches Protokoll zu entziffern. Und zudem hat er es freundlicherweise ins Netz gestellt! (http://photopc.sourceforge.net/protocol.html) Innigsten Dank an Eugene Crosser! Darauf aufbauend haben sich noch weitere Tüftler ins Zeug gelegt, und die Sache noch etwas vervollständigt. Besonders hilfreich war folgende Quelle:

 http://www.wsrcc.com/wolfgang/camera/protocol-itojun.txt.

 

Dem einschlägigen Internet-Wissen war des Weiteren zu entnehmen, dass dieses Protokoll eine ganze Reihe älterer Digitalkameras verschiedener Hersteller (Epson, Sanyo, Agfa und Olympus) betrifft, welche alle mit derselben CPU ausgestattet wurden. Nach einigen weiteren Recherchen und Überlegungen fiel schließlich die Entscheidung, für erste konkrete Experimente eine Olympus C-860L bei Ebay zu ersteigern.

Gesagt, getan. Nun begann die richtige Bastelei. Nach einer Anzahl erfolgloser Experimente, mit denen hier nicht unnötig gelangweilt werden soll, schließlich der erhoffte Durchbruch: die Kamera knipst auf Befehl der C-Control fröhlich vor sich hin!

 

Und so funktioniert das Ganze:

Zuallererst muss die C-Control mit einem 8 Mhz Quarz auf eine Übertragungsrate von 19200 bps aufgerüstet werden, da die Digicam eben mit dieser Übertragungsrate arbeitet. Der Rest ist relativ einfach: man muss lediglich die C-Control anweisen, die richtigen Befehle im richtigen Moment an die Kamera zu schicken, und zwischendurch die Kamera daran hindern, plötzlich vor lauter Untätigkeit einzudösen.

Die Hardware:

C-Control, Olympus C-860L, PIR-Bewegungsmelder

Hier eine kurze Einführung in den verwendeten Sprachgebrauch: 

Am Anfang schickt die C-Control zum Initialisieren das Byte &H00 an die Kamera. Die Kamera antwortet mit dem Byte &H15. Daraufhin teilt die C-Control der Kamera mit, auf welche Übertragungsrate sie sich einstellen soll. Wir bleiben bei 19200 bps, der entsprechende Befehl besteht aus folgender Sequenz von Bytes: &H1B &H53 &H06 &H00 &H00 &H11 &H02 &H00 &H00 &H00 &H13 &H00. Die Kamera gibt darauf ein kräftiges &H06 von sich. Mit einer unendlichen Abfolge dieses Befehls in einer Warteschleife werden wir später die Kamera daran hindern, sich selbst einzuschläfern, wie es der Energiesparmodus ihr aufzudrängen versucht. Wollen wir nun vom Mäuschen eine Nahaufnahme machen, so können wir mit   &H1B &H43 &H06 &H00 &H00 &H21 &H01 &H00 &H00 &H00 &H22 &H00 den Makromodus aktivieren. Auch dieser Befehl wird wie alle anderen von der Kamera mit einem Bestätigungsbyte quittiert, wie dieses aussieht ist eigentlich gar nicht so wichtig. Welche weitere wichtige Befehle brauchen wir noch? Ach ja, natürlich, ein Foto schießen:  wird mit &H1B &H43 &H03 &H00 &H02 &H02 &H00 &H04 &H00 erledigt.

Einige weitere nützliche Befehle:

Makromodus wieder aufheben:  &H1B &H43 &H06 &H00 &H00 &H21 &H01 &H00 &H00 &H00 &H22 &H00

Blitz ausschalten: &H1B &H43 &H06 &H00 &H00 &H07 &H02 &H00 &H00 &H00 &H09 &H00

Blitz einschalten: &H1B &H43 &H06 &H00 &H00 &H07 &H01 &H00 &H00 &H00 &H08 &H00

Blitz für Mäuschen ohne rote Augen: &H1B &H43 &H06 &H00 &H00 &H07 &H03 &H00 &H00 &H00 &H0A &H00

 

 

 

Zu guter letzt noch ein paar Beispielfotos, zwar nicht von den Mäuschen, die waren alle plötzlich aus dem Keller verschwunden, dafür aber vom Futterhaus unserer gefiederten Freunde.

 

  Hier der Versuchsaufbau: unter dem Tuch stecken die C-Control und der Bewegungssensor, die Kamera ist an der anderen Seite des Futterhäuschens zu erkennen.

 

Und hier einige der gefiederten Gäste,

durch ausgeklügelte Technik auf Silizium

gebannt.....

 

Noch eine Bemerkung zum Abschluss:

Die Olympus C-860L hat eine recht geräuschvolle Mechanik, welche ganz hellhörige Kreaturen die Flucht ergreifen lässt. Ich hab auch einen Versuch mit einer Olympus C-2000Z von einem Freund unternommen, welche völlig geräuschlos arbeiten würde. Leider spricht diese aber auf die erläuterten Befehle nicht an. Sie arbeitet anscheinend nach einem anderen Übertragungsprotokoll, das erst noch geknackt werden muss....

 

 

 

Hier noch  ein einfacher Beispielcode für das Zusammenwirken von C-Control und Olympus C-860L:

 

 '**********Fotografische Mausefalle**************************************************

'steuert Olympus C-860 L in Verbindung mit PIR-Bewegungssensor an Port[1]

'                                                                      (z.B. Conrad Best.Nr. 172500)

'******************************************************************************************

 

define PIR Port[1]      'PIR Bewegungsmelder

 

 put &H00

 wait rxd

 gosub setbaud

 wait rxd

 gosub makro        'Makromodus einstellen

 wait rxd

 

#hauptschleife

  gosub weckschleife

  pause 10

  if PIR = 0 then gosub snap   'bei erkannter Bewegung Foto schießen

  goto hauptschleife

 

#weckschleife            'damit sich die Digicam nicht schlafen legt

  gosub setbaud

  wait rxd

  return

 

#setbaud

 put &H1B

 put &H53

 put &H06

 put &H00

 put &H00

 put &H11

 put &H02

 put &H00

 put &H00

 put &H00

 put &H13

 put &H00

 return

 

#snap

 put &H1B

 put &H43

 put &H03

 put &H00

 put &H02

 put &H02

 put &H00

 put &H04

 put &H00

 wait rxd

 pause 500   ' Pause zum Abspeichern des Fotos

 return

 

#makro

put &H1B

put &H43

put &H06

put &H00

put &H00

put &H21

put &H01

put &H00

put &H00

put &H00

put &H22

put &H00

return

'*************************************************

Warum die Bytes so kompliziert einzeln rüberschicken? Weil beim „print“ Befehl die C-Control noch 2 Steuerzeichen hinzufügt, nämlich &H13 und &H10. Das erste (&H13, carriage return) lässt sich mit einem Strichpunkt nach dem print-Befehl unterbinden, das &H10 kommt aber dennoch raus und das mag die Digicam einfach nicht.