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:
- Standardbauteile
- Leicht zu bauen
- Einfache Mechanik
- Open Source
- Leicht zu bedienen
- natürlich unter Linux lauffähig
- 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:
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:
Kommando | Funktion | Parameter |
'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 Webcam | 15,00 Euronen | (falls man keine hat) |
2 Modellbauservos | 12,00 Euronen | (6 Euro/Stück) |
1 Controller | 1,65 Euronen | (Fa.Reichelt) |
Kleinteile | 5,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.

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.