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

Propeller 8 Kern Controller - C Programmierung

Station 5 - Servo

Im Modellbau werden spezielle Servomotoren eingesetzt, die durch ihre kompakte und leichte Bauweise auffallen. Eingesetzt werden sie sowohl im Schiffs- wie im Flugmodellbau aber auch in Robotern sind sie zu finden. Die im Motor verarbeitete Elektronik kann entweder digital oder analog aufgebaut sein.

Servos empfangen über eine Steuerleitung von einem Mikrocontroller einen Impuls variabler Breite, den der Servo in eine Drehbewegung umsetzt.

 

Die Mittelstellung (auch Neutralstellung genannt) eines Servos ist dadurch festgelegt, dass sich das Stirnrad oder Steuerhorn auf der Antriebsachse um den gleichen Winkel nach rechts wie nach links bis zum jeweils äußeren Anschlagpunkt drehen muss.

 

In dieser Station wirst du erfahren, wie man einen Servo in verschiedene Positionen steuern kann, ihn kleine gleichmäßig ausgeführte stetige Drehbewegungen ausführen lässt und wie man zwei Servos gleichzeitig ansteuert.

Wenn du Station 5 durchgearbeitet hast, bist du in der Lage ...

  • zu erklären, was ein Impuls, was Impulsbreite und eine Periode ist.
  • zu erklären, was unter Pulsweitenmodulation (PWM) zu verstehen ist.
  • zu erklären, was unter ramping gemeint ist.
  • einen Servo über das PropBoE oder ProbAB anzuschließen.
  • einen Servo anzusteuern und ihn eine bestimmte Drehbewegung ausführen zu lassen.
  • zu erklären, wie ein Servo aufgebaut ist.
  • zu erklären, wodurch sich die Drehbewegung eines Servos beeinflussen lässt.
Beschreibung Prop-C
Drehwinkel

servo_angle(Pinport;Winkelmaß);

Beispiel:

servo_angle(18; 1800);

ramping

servo_setramp(Pinport;Wert x 0,1°/20ms)

Beispiel:

servo_setramp(18, 1);

Steuersignal an Servo für Drehung

servo_set(pin, time);

Beispiel:

servo_set(18, 2300);

Erläuterungen zu den neuen Befehlen

  • servo_angle(4, 1800);
    
    

Dreht einen Parallax Standard Servo, dessen Steuerleitung mit P4 des Controllers verbunden ist,  um einen Winkel von 180°.

 

  • servo_setramp(3, 10);
    
    

Die Steuerleitung ist mit P3 des Controllers verbunden. Das Steuerhorn dreht sich um 

 

10 x 0,1° / 20ms = 1° pro 20ms oder 50° in 1 Sekunde.

 

  • servo_set(18, 2300);
    
    

Schickt über Port 18 des Propeller-Controllers und über die angeschlossene Steuerleitung des Servos einen Dauerimpuls der Länge 2300µs. Ein Dauerimpuls von 500µs bewegt den Servo in die 0°, 1400µs in die 90° und 2300µs in die 180° Position. Die Berechnung der Zeit für einen bestimmten Drehwinkel mit einer Auflösung von einem Zehntel Grad errechnet sich über:

Drehwinkel von n° -> Zeit: 500 + 100 x n° x 0,1 

1 - Aufbau und Testlauf eines Standardservos

 

 

 

 

 

 

 

Abbildung 2: Standardservo

(1) Anschlussbuchse

(2) Verbindungskabel

(3) Steuerhorn

(4) Drehachse

(5) Gehäuse

Courtesy of Parallax Inc.

Die Spannungsversorgung

Ein Servomotor zieht mehr Strom, als ein USB-Port eines Mikrocontrollerboards zur Verfügung stellen kann. Eine externe Spannungsversorgung zum Beispiel über ein spannungsstabilisiertes Steckernetzteil ist deshalb unumgänglich.

Ermittlung der Kenndaten eines Servos

Das Datenblatt des Parallax Standard Servo liefert alle notwendigen Daten und Fakten für den Betrieb des Motors. Trage die entsprechenden Informationen in die folgende Tabelle ein:

Kenndaten eines Parallax Standard Servo
Spannungsversorgung

von ..

bis ...                                                             

Das externe Steckernetzteil liefert an seinem Ausgang                           Volt
Der Jumper auf dem PropBoE oder PropAB muss in die Stellung ... gebracht werden.  

Anschlüsse auf dem PropBoE und dem PropAB

Auf dem PropBoE und dem PropAB befinden sich direkt oberhalb des Steckbretts sechs 3-Pin Anschlüsse (P14 - P19). Mit Hilfe eines Kurzschlussbügels, jeweils links von einem Doppelanschluss, wird die anliegende externe Spannungsquelle eingestellt.

Abbildung 3 Die Anschlüsse für die Servos

In der oberen Stellung erhalten die V+ Pin ungeglättete Spannung direkt von einer an das Board angeschlossenen Energiequelle; die untere Stellung 5 V ist immer dann zu wählen, wenn ein Schaltnetzteil mit maximal 7,5 V = verwendet wird.

  • Liegt die Spannungsversorgung bei 6 Volt oder weniger, dann sollte der Kurzschlussbügel auf 5 V eingestellt werden.
  • Wird ein Batterieblock aus 4 AA-Batterien oder ein Steckernetzteil > 6 Volt benutzt, dann sollte der Bügel auf VIN eingestellt sein.

2 - Bestimmung der Mittelstellung des Steuerhorns

Die Drehbewegung eines Servos lässt sich am besten beobachten, wenn auf dem Steuerhorn ein kleiner Zeiger - ähnlich wie in der Abbildung - angebracht wird. Dies lässt sich am einfachsten mit Hilfe eines Tesastreifens und eines kleinen aus etwas stärkerem Papier gefertigten Pfeils herstellen.

  • Schneide dir aus einem etwas festeren Papier einen Pfeil aus.
  • Drehe ganz vorsichtig das Steuerhorn nach links bis zum Anschlag. Merke dir die Position. Drehe dann das Steuerhorn bis zum Anschlag nach rechts. Bestimme aus den beiden Extrempositionen die ungefähre Mittelstellung.
  • Klebe jetzt mit Hilfe eines Tesastreifens den Pfeil, ähnlich wie in der Abbildung rechts, auf das Steuerhorn. Er markiert die Mittelstellung.
  • Verbinde den Servo mit Port P18 auf dem PropBoE oder PropAB. Achte darauf, dass der Jumper auf 5V steht.

 

 

 

 

 

 

 

 

 

 

Abbildung 4

Steuerhorn mit Tesastreifen

Courtesy of Parallax Inc.

Schaltungsaufbau und Schaltskizze

Courtesy of Parallax Inc.
Aufgabe
  • Verbinde das PropBoE, PropAB über die USB-Schnittstelle mit dem Laptop.
  • Baue die Schaltung, wie oben dargestellt, auf. Achte genau auf die Anschlussbelegung, die Jumpereinstellung und die farbig codierten Anschlussdrähte des Servo.
  • Schließe das Steckernetzteil an und lasse den PWR-Schalter in der Position "0".
  • Übertrage das Programm B04_01.c in den Editor und speicher es ab.
  • Starte das Programm und prüfe, ob es die folgenden Punkte erfüllt.
  • Das Steuerhorn des Servo steuert drei Positionen an: von links nach rechts: 0°, 90° und 180°. In jeder der drei Winkelpositionen soll das Steuerhorn ca. 3 Sekunden verbleiben, bevor es in die nächste Position übergeht.
Courtesy of Parallax Inc.

Programmcode zu Aufgabe B04_01.c

3 - Ramping

Unter normalen Umständen steuert ein Servo seine neue Position unter der schnellsten ihm möglichen Geschwindigkeit an. Bei Umlaufservos gilt äquivalent, dass die Geschwindigkeit und/oder Richtung so schnell wie möglich umgesetzt werden, sobald die Impulsweite des Steuerimpulses geändert wird.

 

Ramping bedeutet, dass mit einer Neueinstellung für Drehposition und/oder Geschwindigkeit auch die Größe Änderungszeitraum eingeht. Ein Servo führt dann über diesen Änderungszeitraum eine  Positionsänderung durch; die Rotationsbewegungen lassen sich dadurch gleichmäßiger und weicher  im Verlauf einstellen.

 

Die Funktion servo_setramp() der Simple Library Bibliothek enthält zwei Parameter: den Anschlusspin pin des Servos und die Geschwindigkeit stepSize (angegeben in 10-tel Grad pro 0,02s), mit der der Servo rotiert.

Wurde servo_setramp() einmal aufgerufen, dann wird jeder nachfolgende servo_angle() Befehlsaufruf mit der in servo_setramp festgelegten Geschwindigkeit ausgeführt. Ohne diesen Befehl werden Positionswechsel immer mit maximaler Geschwindigkeit durchgeführt.

Im folgenden Beispiel nimmt der Servo die ersten beiden Positionen mit maximaler Geschwindigkeit ein (Zeilen 6 - 9).

Mit dem nachfolgenden setramp-Befehl (Zeile 10) wird die Geschwindigkeit für die beiden nachfolgenden Positionsänderungen auf 0,8° pro 0,02s oder 40° pro 1Minute herabgesetzt (Zeilen 11 - 14).

Auszug aus der Simple Library Reference

In der Simple Library Reference findet man Hinweise zu den Funktionen der Bibliothek servo.h.

Sie enthält sieben neue Funktionen:

  • int serv_angle (int pin, int degreeTenths)
    
    

Dreht das Steuerhorn eines Servos um 0° bis 180° in jeweils 10-tel Grad Schritten.

  • int servo_speed(int pin, int speed)
    
    

Setzt die Drehgeschwindigkeit eines Parallax Umlaufservos fest.

  • servo_setramp(int pin, int stepSize)
    
    

Legt fest, um welchen Wert sich ein Servo innerhalb eines 20ms Zeitfensters dreht.

  • servo_set(int pin, int time)
    
    

Steuersignal für einen Servo an Pin pin mit einer Pulsdauer in Mikrosekunden.

  • servo_get(int pin)
    
    

Gibt die Pulsdauer in Mikrosekunden an, die an einen Servo übermittelt werden.

  • servo_disable(int pin)
    
    

Schaltet das Steuersignal zu einem Servo vorübergehend oder dauerhaft ab. Die Wiederherstellung der Positions- und Geschwindigkeitssteuerung erfolgt über die Befehle servo_angle, servo_speed oder servo_get.

  • servo_stop(void)
    
    

Stoppt einen Servo-Prozess und setzt einen Cog frei.

Aufgaben
  • Übertrage das folgende Programm in den SimpleIDE Editor und speichere es ab.
  • Starte das Programm und beobachte den Servo. Die ersten beiden Positionen sollten schnell eingenommen werden und die letzten beiden deutlich langsamer.

Jetzt kommst du!

Stell dir vor, du bist Ingenieur in einem Freizeitpark mit elektronisch gesteuerten Figuren (Animatronic). Nehmen wir weiter an, dass eine Figur zwei Servos für das Gesicht enthält und damit alle dreißig Sekunden eine andere Emotion ausdrückt. Insgesamt gibt es fünf verschiedene Emotionen. Deine Aufgabe ist es, diese Emotionen zu programmieren.

Eine Möglichkeit das technisch umzusetzen ist, die dafür notwendigen Servo-Positionen der beiden Motoren in je einem Array zu speichern.

Aufgaben
  • Überlege dir für jeden der beiden Servos fünf verschiedene Winkeleinstellungen und notiere sie in der folgenden Tabelle.
  • Entwickle ein Programm, das zwei Servos gleichzeitig steuert. Überprüfe anhand deiner eigenen Vorgabenliste, ob die Drehwinkel ungefähr eingehalten werden.

Meine Vorgabenwerte für die beiden Servos

TIP zum Programmentwurf

Der folgende Auszug zum Programmcode zeigt exemplarisch eine Lösung für die genannte Aufgabe für einen Servo. Statt wie im Programm mit print-Befehlen angegeben, lassen sich an dieser Stelle servo_angle() Funktionsaufrufe einsetzen. Denke daran, dass ein zweiter Servo an P17 angeschlossen ist.

 

int p[] = {100, 200, 300, 400, 500};

for (int i = 0; i < 6; i++)

{

  pause(500);

  print("p[%d] = %d\n", i, p[i]);

}

Aufgaben
  • Setze den PWR-Schalter auf dem Board auf 0.
  • Verbinde einen zweiten Servo mit P17.
  • Stelle den PWR-Schalter auf 1.
  • Übertrage dein selbst entwickeltes Programm servo_animatronic.c in den SimpleIDE Editor und speichere es ab.
  • Starte das Programm und beobachte die beiden Servos, ob sie das Vorhergesagte ausführen.
Druckversion | Sitemap
© Reinhard Rahner - Gettorf