FAKEDOMAIN.DE

Die Idee

Ich wollte immer schon eine bewegliche Webcam haben. Aber alle waren entweder zu teuer oder es gab nur was für Kleinweich-Betriebssysteme. Also war selber machen angesagt. Die Kamera sollte folgende Kriterien erfüllen:
  1. Standardbauteile
  2. Leicht zu bauen
  3. Einfache Mechanik
  4. Open Source
  5. Leicht zu bedienen
  6. natürlich unter Linux lauffähig
  7. und zu guter Letzt, billig im Nachbau, weil das immer gut ist :-)

Die Umsetzung

Nun gings los.
Zuerst mal den Punkt eins abgehandelt. Zu Hause hatte ich noch die Aldi-Webcam Medion MD9308. Diese Kamera hat einen OV511-Chipsatz und wird per USB angeschlossen. Früher hatte ich sie als fest ausgerichtete Webcam in Betrieb. Die sollte nun als Kamera dienen. Zur Bewegung der Kamera entschied ich mich schnell für einen Atmel Microcontroller und Modellbauservos. Die Steuerung an die serielle Schnittstelle des PC und das wars dann schon.
Punkt zwei war dran. Da ich keine Erfahrungen mit Modellbauservos hatte wollte ich das ganze leicht aufbauen. Die Webcam war kein grosses Gewicht. Die eigentliche Halterung der ganzen Sache bog ich aus einem Reststück Aluminium. Das war einfacher zu biegen und zu bearbeiten als Eisen. Die Teile, die durch die Servos bewegt wurden, fertigte ich aus Kunststoff den ich per Heissluft zurechtbog. Für die Prototypenplatine nahm ich eine Punktrasterplatine die dann mit Drähten und Fädeltechnik gebastelt wurde.
Dann kam mit Punkt drei die Software. Da ich den BASCOM-Compiler für Atmelcontroller habe und der auch schon fertige Routinen für Servos drinhat, war die Entscheidung schnell gefallen. Also ran ans Programmieren. Und das kam dabei raus:

Der Atmel-Quellcode



Die Datenübertragung ist folgendermassen aufgebaut:
'  +--------------- Startbyte Hex FF
'  | +------------- Kommandobyte
'  | | +----------- X-Wert
'  | | | +--------- Y-Wert
'  | | | | +------- CRC-Prüfsumme High-Nibble
'  | | | | | +----- CRC-Prüfsumme Low -Nibble
'  | | | | | |
' FFCCXXYYCHCL

Das Telegramm besteht aus 6 Bytes. Um einen definitiven Start zu haben sende ich als erstes ein Hex FF. Dann folgen die X- und Y-Koordinaten bzw. je nach Kommando Zeiten usw. Und zum Schluss die CRC8 Prüfsumme. Diese wird als High- und Low-Nibble getrennt übertragen um keine Probleme mit dem Startbyte zu bekommen. Kein Wert für XX und YY darf logischerweise 255 sein. Folgende Funktionen sind im Moment implementiert:
KommandoFunktionParameter
'M' = Asc 77 = Hex 40 = Okt 115 MOVE, dreht die Servos auf die in X und Y angegebene Position XX = Stellung Servo 1, YY = Stellung Servo 2
'S' = Asc 83 = Hex 53 = Okt 123 SAVE, Speichert Werte im internen EEPROM des Atmel
XX = 's' = ASC 115 = Hex 73 = Okt 163
YY = 's' = ASC 115 = Hex 73 = Okt 163 speichert die aktuellen Positionen als Standardposition
XX = 'x' = ASC 120 = Hex 78 = Okt 170
YY = '<' = ASC 60 = Hex 3C = Okt 074 speichert die aktuelle X-Positione als X-Min
XX = 'x' = ASC 120 = Hex 78 = Okt 170
YY = '>' = ASC 62 = Hex 3E = Okt 076 speichert die aktuelle X-Positione als X-Max
XX = 'y' = ASC 121 = Hex 79 = Okt 171
YY = '<' = ASC 60 = Hex 3C = Okt 074 speichert die aktuelle Y-Positione als Y-Min
XX = 'y' = ASC 121 = Hex 79 = Okt 171
YY = '>' = ASC 62 = Hex 3E = Okt 076 speichert die aktuelle Y-Positione als Y-Max
XX = 'a' = ASC 97 = Hex 61 = Okt 141
YY = 'a' = ASC 97 = Hex 61 = Okt 141 speichert Status der Automatikfunktion ab
'R' = Asc 82 = Hex 52 = Okt 122 RELAY, schaltet Relais ein oder aus XX = 0, YY = 0 => Relais AUS, XX = 1, YY = 1 => Relais EIN
'T' = Asc 84 = Hex 54 = Okt 124 TOGGLE, schaltet bei jedem Aufruf das Relais um XX = 0, YY = 1 Werte haben an sich nix zu sagen, Hauptsache null und eins
'P' = Asc 80 = Hex 50 = Okt 120 PULSE, Relais eine gewisse Zeit einschalten, dann automatisch aus XX und YY = Zeit in Zehntel-Sekunden also XX = 254 entspricht 25,4 Sekunden. XX und YY müssen gleich sein
'A' = Asc 65 = Hex 41 = Okt 101 AUTO, Relais wird bei jedem MOVE-Befehl eine gewisse Zeit eingeschaltet. Also dasselbe als wenn ich einen MOVE- und dann einen PULSE-Befehl sende. Das kann man z.B. dazu benutzen um eine Lampe anzuschalten wenn ein Bild gemacht wird. XX und YY = Zeit in Zehntel-Sekunden also XX = 254 entspricht 25,4 Sekunden. XX und YY müssen gleich sein. Eine Null deaktiviert die Funktion

Das das ganze per Web bedienbar sein sollte, kam bei Punkt fünf für mich nur ein Webformular in Frage. Dazu erstellte ich eine Webseite mit eingebettetem PHP-Code. Auch die ist noch verbesserungsürdig, aber Hauptsache sie läuft schon mal :-)

Punkt sechs ergab sich automatisch, da es auf einem Linux-PC installiert wurde :-)

Dann kam mit Punkt sieben die Abrechnung. Die sah dann folgendermassen aus:
1 Webcam15,00 Euronen(falls man keine hat)
2 Modellbauservos12,00 Euronen(6 Euro/Stück)
1 Controller1,65 Euronen(Fa.Reichelt)
Kleinteile5,00 Euronen(Bauteile, Schrauben usw.)

Summe:33,65 Euronen

Natärlich lässt sich bei der Kamera und den Servos noch sparen, falls man z.B. eine Kameras oder Servos noch hat.

Probleme die so auftraten:
Unter dem alten 2.4'er Kernel lief die Kamera ohne Probleme mit den w3cam-Tools von rasca. Aber mit dem 2.6'er Kernel ging dann nix mehr. Nachdem ich mir mal drei Tage Zeit genommen habe, kam ich der Sache dann auf Spur. Im Kernelmodul des OV511-Treibers hatte sich einiges getan und die Tools von rasca musste ich etwas anpassen bzw. den Aufruf verändern. Während füher ein Aufruf ohne Parameter genügte, musste ich jetzt den Farbpalettenparameter angeben.
Dann war es ein Problem, dass nicht jedes PHP mit der dio-Erweiterung kompiliert ist bzw. kein Modul mitbringt. Es klappt auch ohne das dio-Modul nur mit den normalen IO-Funktionen, aber dann muss man vorher mit setterm die Baudrate und andere Parameter einstellen. Da sind mir die dio-Funktionen lieber.

Servokamera Schaltplan	Und nun noch Bilder, Schaltpläne und alles was sonst noch gebraucht wird um das ganze nachzubauen. Oder halt als Eagle-Datei und das Layout.

(C) Joachim Fossie Bär Reiter 2009