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 ...
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
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:
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.
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.
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.
Schaltungsaufbau und Schaltskizze
Aufgabe |
|
Programmcode zu Aufgabe B04_01.c
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 |
|
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 |
|
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 |
|