Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Freilaufservo zentrieren

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 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

1x  BoE-Bot mit HomeWork Board oder Board of Education

1x  USB-Verbindungskabel

1x  Steckernetzteil

1x  dünner Schraubenzieher

Aufgaben
  • Trenne den BoE-Bot von der Stromversorgung
  • Übertrage das Programm Servo_zentrieren.bs2 in den Editor und speichere es ab.
  • Verbinde das BoE-Bot mit der Energiequelle.
  • Starte das Programm.
  • Verändere die Potentiometerstellung im Servo so lange, bis sich die Servoachse nicht mehr dreht.
  • Ändere das Programm in Zeile 7 so ab, dass dort Pin 12 eingetragen wird und führe die Justage für den zweiten Servo durch.

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.

2 - Mit Pulsweite Geschwindigkeit und Richtung steuern

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
  • Übertrage das Programm Servo_UhrzeigerMax.bs2 in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob sich der Servo mit ca. 50-60 UpM (Umdrehungen pro Minute) dreht.
  • Ändere das Programm in Zeile 7 so ab, dass dort Pin 12 eingetragen wird und wiederhole die Messung der Umdrehungsgeschwindigkeit für den anderen Servo.

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
  • Übertrage das Programm Servo_EntgegenUhrzeigerMax.bs2 in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob sich der Servo mit ca. 50-60 UpM (Umdrehungen pro Minute) entgegen dem Uhrzeiger dreht.
  • Ändere das Programm in Zeile 7 so ab, dass dort Pin 12 eingetragen wird und wiederhole die Messung der Umdrehungsgeschwindigkeit für den anderen Servo.

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.

3 - Zwei Servos gleichzeitig ansteuern

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
  • Übertrage das Programm Servo_2.bs2 in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob sich die beiden Räder in entgegengesetzter Richtung drehen.
  • Wie bewegt sich der Roboter?

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.

Abbildung 1 - Bewegung des Roboters bei unterschiedlichen Einstellungen des Argumentes "dauer" im pulsout-Befehl
Aufgaben
  • Lade das Programm Servo_2.bs2 in den Editor.
  • Verändere in Programmzeile 7 und 8 die Werte des Arguments dauer nach Vorgabe der Liste (Abb. 1) und speichere das Programm ab. Insgesamt sind 11 Programme zu schreiben.
  • Starte nach jeder Änderung das Programm und beobachte die Bewegung, die der Roboter ausführt.
  • Ergänze die jeweiligen Felder in der Liste mit deinen Beobachtungen.

4 - Mit FOR ... NEXT die Laufzeit eines Servos steuern

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
  • Übertrage das Programm ServoLZ_1.bs2 in den Editor und speichere das Programm ab.
  • Starte das Programm.
  • Überzeuge dich, dass der Servo an P13 für 2,3s entgegen dem Uhrzeigersinn und anschließend der Servo an P12 in gleicher Richtung doppelt so lange dreht.

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
  • Übertrage das Programm ServoLZ_2.bs2 in den Editor und speichere das Programm ab.
  • Starte das Programm.
  • Überzeuge dich, dass beide Servos für 3s in die entgegengesetzte Richtung laufen und anschließend, ebenfalls für 3s, drehen beide Servos ihre Drehrichtung um.

Das Programm ServoLZ_2.bs2

5 - Geschwindigkeit-Pulsweitendiagramm eines Servos

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
  • Übertrage das Programm Servo_3.bs2 in den Editor und speichere es ab.
  • Klicke in das Eingabefenster im Terminal und gib den Wert 650 ein. Schließe die Eingabe mit einem Zeilenrücklauf ab.
  • Überprüfe, ob sich der Servo für sechs Sekunden mit voller Geschwindigkeit im Uhrzeigersinn dreht.
  • Im Ausgabefenster des Terminals erscheint die Aufforderung eine neue Größe einzugeben.
  • Gib jetzt den Wert 850 ein und bestätige die Eingabe mit der Enter-Taste.
  • Überprüfe, ob sich der Servo mit voller Geschwindigkeit entgegen dem Uhrzeigersinn dreht.

Das Programm Servo_3.bs2

Debug Terminal mit Eingabe- und Ausgabefenster

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.

Abbildung 2
Aufgaben
  1. Markiere das rechte Rad deines Roboters mit einem Referenzpunkt, damit die Umdrehungsgeschwindigkeit leichter ermittelt werden kann.
  2. Starte das Programm Servo_3.bs2.
  3. Gib in das Eingabefenster des Terminals eine Pulsweite von 650 (entspricht 1,3ms) ein.
  4. Zähle die Umdrehungen des Rades während der 6 Sekunden Laufzeit.
  5. Multipliziere den ermittelten Wert mit 10 und du erhälst die Umdrehungszahl pro Minute.
  6. Trage den Wert in die Tabelle ein.
  7. Erhöhe die Pulsweite um 5 und gehe zurück zu Punkt 4. Wiederhole die Messungen, bis du bei 850 angekommen bist.

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.

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf