Dieser Text war 2006 noch nicht im Blog, ich habe den 2015 aus dem alten CMS überführt.
Das USB-Servo ist, wie der Name schon andeutet ein Servo das per USB angeschlossen und kontrolliert wird. Ein Servo ist ein Elektromotor der zum Beispiel zur Steuerung ferngesteuerter Spielzeuge eingesetzt wird. Ich habe dieses Projekt durchgeführt um eine Spielzeugfigur zu steuern. Die Puppe hat einen Knopf auf der Unterseite, sie fällt in sich zusammen wenn der Knopf gedrückt wird und steht wieder auf wenn losgelassen wird. Wenn der Computer in der Lage ist diesen Knopf zu drücken kann ich mit der Puppe Informationen anzeigen. Beispielsweise ob jemand im Jabber-Netzwerk online ist: wenn der Bekannte online geht steht die Puppe auf, wenn er sich abmeldet fällt sie in sich zusammen.Servos werden über drei Adern angeschlossen. Über eine rote und eine schwarze Ader werden sie mit Spannung versorgt, über eine gelbe mit dem Signal. Die Versorgungsspannung sollte zwischen 4,8 und 6 Volt liegen, die 5 Volt des USB-Ports liegen also im erlaubten Bereich. Auf der Signalleitung fließen keine großen Ströme, sie kann also direkt an den Controller angeschlossen werden. Der Winkel den das Servo einstellt wird über Pulsweitenmodulation (PWM) gesteuert. Dazu wird ein Signal mit 50Hz (ein Puls alle 20ms) erzeugt, die Länge der Pulse definiert den Winkel.
Ein Problem das ich nicht wirklich gelöst habe ist die Stromaufnahme: Ich weiß nicht, welcher Strom durch den Motor des Servos fließt. Er scheint niedrig genug zu sein um keine Probleme zu verursachen, aber ich habe nicht ausprobiert wie hoch er wird wenn das Servo blockiert wird. ICH HABE ALSO HIERMIT GEWARNT, für USB-Ports die in Flammen aufgehen fühle ich mich nicht mehr verantwortlich…
Das Paket dieses Projektes besteht aus drei Teilen: Der Firmware für einen ATmega8 Mikrocontroller, einen Kommandozeilen-Client der unter Linux läuft und den Schaltungen die für einen Nachbau benötigt werden.Dieses Projekt basiert auf meinem USB-LED-Fader, der seinerseits auf dem PowerSwitch Beispielprojekt von Objective Development basiert. Wie in diesen beiden Projekten kommt auch hier der Firmware-USB-Treiber zum Einsatz, den Objective Development für die AVR Mikrocontroller von Atmel entwickelt haben.
Dieser Treiber ist eine reine Firmware-Implementierung des USB 1.1 Standards für langsame Geräte. Er läuft auf preiswerten Mikrocontrollern aus Atmels AVR-Serie, wie dem ATtiny2313 oder sogar den noch kleineren 8-Pin-Controllern. Er implementiert den Standard soweit, daß sich sinnvolle Applikationen damit entwickeln lassen. Die Datei „firmware/usbdrv/usbdrv.h“ enthält weitere Informationen zu Möglichkeiten und Grenzen.
Bau und Installation
Die Installation wird in der beiliegenden Dokumentation beschrieben.
Benutzung
Das Gerät wird mit dem USB-Port verbunden. Wenn das Servo noch nicht in der Ausgangsposition steht wird es sich dorthin bewegen.
Das Kommandozeilen-Tool wird wie folgt benutzt:
1 2 3 |
usb-servo status usb-servo set <angle> usb-servo test |
Parameter
- angle: Der Winkel in den das Servo gestellt werden soll. 0 ist ganz links, 255 ist ganz rechts.
Beispiele
Den Status des Servo auslesen
1 |
usb-servo status |
Das gibt den Winkel aus, in dem sich das Servo gerade befindet.
1 |
Current servo angle: 42 |
Einen neuen Winkel einstellen
1 |
usb-servo set 23 |
Das stellt das Servo auf den Winkel 23. 0 ist ganz links, 255 ist ganz rechts. Mit 23 wird das Servo also fast ganz nach links bewegt.
Das Gerät testen
1 |
usb-servo test |
Diese Funktion sendet eine Menge Zufallszahlen an das Gerät, das die Zahlen wieder zurück schickt. Der Client kontrolliert die gesendeten und Empfangenen Zahlen auf Gleichheit.
Demoanwendung xservopointer
Dies ist eine reine Spaß-Anwendung die eigentlich niemand braucht. Grund genug, sie zu schreiben…Um sie zu benutzen wird das Servo mittig über dem Bildschirm (mit kleinen Änderungen an den Quellen sind auch andere Positionen möglich) montiert und mit einem Zeiger ausgerüstet.
Zukünftig muß man dann nie mehr nach seinem Mauszeiger suchen, der Zeiger an dem Servo zeigt einem immer in welcher Richtung er sich befindet.
Probleme
Das Hauptproblem sehe ich wie schon erwähnt in der Stromaufnahme. Ich habe das mit meinem Servo an meinem Notebook ausprobiert, ich bin mir nicht sicher ob das an anderen Systemen funktionieren würde. DIES KANN DEN COMPUTER ZERSTÖREN, und niemand außer demjenigen der es anschließt fühlt sich für eventuelle Schäden verantwortlich.
Ein anderes (kleineres) Problem ist die holperige Implementierung der Pulsweitenmodulation. Ich habe die Timing-Werte mittels Trial and Error ermittelt, die müssen nicht notwendigerweise für jedes Servo stimmen. Andererseits denke ich, daß Servos austauschbar sein sollten. Allerdings ist dies mein erstes und bislang einziges Servo, darüber kann ich also nicht viel sagen.
Danke!
Ich danke Objective Development für die Möglichkeit, den Treiber für mein Projekt zu benutzen. Ohne den Treiber würde dieses Projekt nicht existieren.
Lizenz
Meine Arbeit, also alles außer dem USB-Treiber, fällt unter die GNU General Public License (GPL). Eine Kopie der GPL liegt dem Projekt bei. Der USB-Treiber untersteht einer gesonderten Lizenz von Objective Development. In firmware/usbdrv/License.txt befinden sich weitere Informationen dazu.
Download
- usb-servo_061028.tar.gz – Schaltung, Sourcecode und Dokumentation, 391kB