Empfohlen wird, vorher das Kapitel Mikrocontroller – BASIC Stamp (BS) - Standardservos durchzuarbeiten. Dort werden die Befehle erläutert und an praktischen Beispielen ausprobiert, auf die hier zugegriffen wird.
Mit der Zentrierung eines Servos wird ein definierter Zustand markiert, bei dem sich ein Servo in Ruhe befindet, sich nicht dreht. Dazu wird das Signal für die Ansteuerung der Mittelposition eines Standardservos genommen: Impulslänge 1,5ms.
Legt man dieses Signal an einen Freilaufservo, wird es sich wahrscheinlich kontinuierlich drehen. Mit einem dünnen nicht zu langen Schraubenzieher wird über das Justierloch im Servo (falls vorhanden) das Potenziometer vorsichtig so lange verstellt, bis der Servo nicht mehr dreht. Sollte sich der Servo mit dem Anlegen der Versorgungsspannung und nach dem Start überhaupt nicht bewegen, kann das zwei Gründe haben:
der Servo ist defekt.
der Servo ist bereits zentriert.
Material |
|
Aufgaben |
|
Das Programm Servo_zentrieren.bs2
Die Servos testen
Mit diesen Übungen werden wir die Servos mit verschiedenen Geschwindigkeiten und in verschiedene Richtungen drehen lassen und dabei überprüfen, ob sie sauber arbeiten.
Der zentrale Befehl, mit dem die Drehgeschwindigkeit eines Servos beeinflusst wird, ist
pulsout pin, dauer
mit den Parametern
pin legt den I/O Pin fest und setzt ihn auf Ausgang
dauer legt die Länge eines Impulses in Vielfachen der Zeiteinheit von dauer fest. Die Zeiteinheit von dauer beträgt 2µs.
Beispiel
Eine Impulslänge von 1,5ms entspricht 1500µs oder 750 Zeiteinheiten á 2µs und ist die Einstellung, die einen Servo still stehen lässt.
Was passiert, wenn von dem Wert 1,5ms nach oben oder unten abgewichen wird?
Höchstgeschwindigkeit im Uhrzeigersinn
Bei einer Impulslänge von 1,3ms erreicht ein Freilaufservo seine höchste Geschwindigkeit; er dreht dabei im Uhrzeigersinn. Das wird mit dem folgenden Programm ausprobiert. Beachte, dass bei einer Impulslänge von 1,3ms der Parameter dauer im Befehl pulsout den Wert 650 annimmt.
Aufgaben |
|
Das Programm Servo_UhrzeigerMax.bs2
Merken wir uns, dass bei einem Wert des Parameters dauer im Befehl pulsout von unter 750 der Servo im Uhrzeigersinn dreht.
Höchstgeschwindigkeit entgegen dem Uhrzeigersinn
Bei einer Impulslänge von 1,7ms erreicht ein Freilaufservo seine höchste Geschwindigkeit bei einer Drehung entgegen dem Uhrzeigersinn. Bei einer Impulslänge von 1,7ms nimmt der Parameter dauer im Befehl pulsout den Wert 850 an.
Aufgaben |
|
Das Programm Servo_EntgegenUhrzeigerMax.bs2
Merken wir uns auch hier, dass bei einem Wert des Parameters dauer im Befehl pulsout von über 750 der Servo entgegen dem Uhrzeigersinn dreht.
Mit zwei pulsout-Befehlen lassen sich beide Servos gleichzeitig ansteuern. Wie sich dann der Roboter bewegen wird, testen wir mit einem weiteren Programm. Dabei lassen wir den einen Servo im und den anderen entgegen dem Uhrzeigersinn drehen.
Aufgaben |
|
Das Programm Servo_2.bs2
Jetzt kommst du!
Insgesamt gibt es vier verschiedene Kombinationen der Argumente des pulsout-Befehls, die wir immer wieder benutzen werden, wenn es um die Bewegung des BoE-Bot geht. Das Programm Servo_2.bs2 ist bereits ein Beispiel, bei dem das Argument dauer bei dem einen Servo mit 850 oberhalb 750 und beim anderen mit 650 darunter gelegen hat.
Welche Bewegung der Roboter bei welcher Einstellung der Argumente dauer mit den beiden Servos ausführt, muss später in Fleisch und Blut übergehen, wenn man einen Roboter sicher steuern will. Deshalb werden wir für verschiedene Einstellungen jetzt eine Übersicht anlegen.
Aufgaben |
|
Mit der Änderung der Pulsweite wird die Geschwindigkeit und Drehrichtung eines Servos beeinflusst. Wie lange ein Motor laufen soll, steuern wir mit Hilfe einer FOR ... NEXT Schleife.
Ein Beispiel
FOR zaehler = 1 to 100
PULSOUT 13, 850
PAUSE 20
NEXT
Bestimmen wir jetzt einmal die Zeit, die ein Servo mit dieser Schleife am Laufen gehalten wird. Bei jedem Schleifendurchlauf dauert die Ausführung des
pulsout-Befehls 1,7ms,
die Ausführung des Befehls
pause 20ms
und für die Ausführung der
FOR...NEXT - Schleife 1,3ms.
Macht in der Summe 23ms. Die Schleife wird 100-mal durchlaufen;
100 x 23ms ergibt 2300ms oder 2,3s.
Wenn ein Servo sich 4,6s bewegen soll, dann muss diese Schleife nicht 100 mal sondern 200 mal durchlaufen werden.
Programmbeispiel
Aufgaben |
|
Das Programm ServoLZ_1.bs2
Als nächstes sollen beide Servos laufen; der an P13 mit einer Pulsweite von 850 und der an P12 mit 650. Jeder Schleifendurchlauf benötigt:
1.7ms Servo an P13
1.3ms Servo an P12
20ms Pause
1,6ms Programmcode
24,6ms Summe
Wenn ein Servo eine bestimmte Zeit laufen soll, dann errechnet sich die Anzahl der Schleifendurchläufe wie folgt:
Anzahl der Schleifendurchläufe n
n = Zeit t in s / 0,0246s
Soll ein Servo zum Beispiel für 3s laufen, dann errechnet sich die Zahl der Schleifendurchläufe zu
n = 3s / 0,0246s = 122
Wird dieser Wert als Endwert in eine FOR...NEXT - Schleife eingesetzt, dann ergibt sich
FOR zaehler = 1 to 122
PULSOUT 13, 850
PULSOUT 12, 650
PAUSE 20
NEXT
Programmbeispiel
Aufgabe |
|
Das Programm ServoLZ_2.bs2
Aus den letzten Übungen wissen wir, dass Geschwindigkeit und Richtung eines Servos mit der Pulsweite im Befehl PULSOUT eng zusammenhängen. Wie der Zusammenhang genau ist, wird jetzt untersucht. Über das Terminalfenster werden unterschiedliche Pulsweiten eingegeben, an den Servo übertragen, die Umdrehungsgeschwindigkeit des Rades gemessen und anschließend in eine Tabelle eingetragen. Neu ist, dass in dieser Übung das Eingabefenster im oberen Bereich des Debug Terminals benutzt wird.
Der Befehl DEBUGIN
Das Debug Terminal setzt sich aus zwei Fensterbereichen zusammen
dem Eingabefenster und
dem Ausgabefenster
Über das Eingabefenster werden während eines Programmlaufes Meldungen/Informationen an die BASIC Stamp übertragen. Dies funktioniert mit Hilfe des Befehls DEBUGIN. Für das Beispiel der Pulsweiteneingabe wird im Programm zuerst eine Variable pulsweite vom Typ Word definiert.
pulsweite VAR Word
Ein nachfolgender DEBUGIN Befehl wartet auf die Eingabe einer Dezimalzahl im Eingabefenster des Terminals und ordnet sie, wenn die Eingabe mit einem Zeilenrücklauf abgeschlossen wurde, der Variablen pulsweite zu. Dies erfolgt mit dem Befehlsaufruf
DEBUGIN DEC pulsweite
Die Variable pulsweite und der dort abgelegte Wert lassen sich im BASIC Programm als Argument auch in anderen Befehlen aufrufen
PULSOUT 12, pulsweite
Programmbeispiel
In diesem Programm wird das Argument dauer im Befehl PULSOUT über das Eingabefenster im Terminal gesetzt.
Aufgaben |
|
Das Programm Servo_3.bs2
Wie arbeitet das Programm?
Zeilen 4 - 6
Drei Variablen vom Typ Word werden deklariert. In der nachfolgenden Endlosschleife läuft der Hauptteil ab.
Zeilen 9 bis 11
Im Debug Terminal(Ausgabefenster) erscheint die Aufforderung eine Pulsweite einzugeben. Der eingegebene Zahlenwert wird in der Variablen pulsweite abgelegt; ein zweiter Wert - das Komplement zu 1500 - wird berechnet und in pulsweiteComplement gespeichert.
Zeile 13 - 17
Um die anstehende Geschwindigkeitsmessung genauer zu machen, werden an beide Servos PULSOUT-Befehle übertragen: liegt der eine Wert bei 800, also 50 über der Zentrierstellung, dann ist der andere Wert entsprechend 50 darunter, bei 700. Die Summe aus beiden Werten muss immer 1500 ergeben.
Die FOR...NEXT Schleife benötigt für einen Durchlauf immer die gleiche Zeit von ca. 6 Sekunden.
Abb. 2 zeigt den Verlauf der Drehgeschwindigkeit bei unterschiedlichen Pulsweiten-Einstellungen für einen Servo. Auf der Rechtsachse ist die Pulsweite in ms aufgetragen, auf der Hochachse die Umdrehungsgeschwindigkeit pro Minute.
Aufgaben |
|
Meine Messungen
Denke daran, die Pulsweite im Programm Servo_2.bs2 wird in Vielfachen der Einheit 2µs angegeben. 1,3ms entsprechen einer Pulsweitenangabe im Befehl PULSOUT von 650.
Damit sind wir am Ende des Kapitels über Geschwindigkeit, Richtung und Zeitverlauf bei einem Servo angelangt. Als nächstes widmen wir uns dem Kapitel Navigation.