Anwendungen mit Servo-Motoren

Servo-Motoren bilden den zweiten Typus von Motoren, der sich an Microcontrollern wie Arduino, Raspberry Pi oder BeagleBone betreiben lässt. Verbreitet sind die kleineren Vertreter ihrer Gattung zum Beispiel in der Robotik und im Modellbau. Diese Folge erläutert zuerst das Funktionsprinzip der Servo, bevor es in die Praxis geht.

In Pocket speichern vorlesen Druckansicht 15 Kommentare lesen
Lesezeit: 8 Min.
Von
  • Dr. Michael Stal
Inhaltsverzeichnis

Servo-Motoren bilden den zweiten Typus von Motoren, der sich an Microcontrollern wie Arduino, Raspberry Pi oder BeagleBone betreiben lässt. Verbreitet sind die kleineren Vertreter ihrer Gattung zum Beispiel in der Robotik und im Modellbau. Diese Folge erläutert zuerst das Funktionsprinzip der Servo, bevor es in die Praxis geht.

Mehr Infos

Servo-Motoren können sich auf Kommando zu einer bestimmten Drehposition bewegen. Den zugehörigen Drehwinkel erhalten Sie von außen. Sie sind daher mehr auf Präzision und Drehmoment ausgelegt, weniger auf Geschwindigkeit. Es gilt sogar: Je höher das Drehmoment, desto langsamer der Servo-Motor.

Um das Funktionsprinzip eines Servo-Motors zu verstehen, überlegen wir, wie man eine einfache Version dieses Motortyps konstruieren könnte.

Folgende Zutaten sind nötig:

  • ein Gleichstrommotor
  • Zahnräder als Getriebe
  • ein Potentiometer
  • Kontrolllogik

Am Rotor des Gleichstrommotors montieren wir gekoppelte Zahnräder, die zum einen für die Drehung des Servo sorgen und zum anderen synchron zur Rotation ein Potentiometer verstellen. Wir bauen letztlich eine Art Getriebemotor. Dazu integrieren wir Kontrolllogik, die Befehle von außen entgegennimmt und den Gleichstrommotor steuert. Apropos Befehle. Der Begriff "servo" kommt tatsächlich vom lateinischen servus (der Sklave).

Ein einfacher Servo-Motor besteht aus einem Gleichstrommotor (links unten), einem Zahnradgetriebe (rechts oben) und einem Poti (rechts unten). Die Kontrolllogik ist auf dem Bild nicht zu sehen.

(Bild: wikipedia.org)

Durch Ablesen des Widerstandswerts am Poti erkennt die Kontrolllogik die Position des Servo-Motors. Sie errechnet bei einem Befehl zur Neupositionierung, in welche Richtung sich der Gleichstrommotor drehen muss, um den Zielwinkel zu erreichen. Der Punkt, an dem das Potenziometer genau den halben Maximalwiderstand aufweist, bildet dabei den definierten Nullpunkt. Ein Servo kann sich in jede Richtung bis zu 90° vom Nullpunkt wegbewegen, sodass er einen Schwenkbereich von insgesamt <= 180° abdeckt.

Servo-Motoren haben das Bestreben, immer auf ihrer Position zu verharren, solange sie keine neue Position erhalten. Drücken Sie ruhig einmal gegen den rotierenden Teil des Servo-Motors. Der Motor wird sich dagegen "wehren". Typisch für solche Servos ist daher das Nachjustieren. Meistens überschreitet der Servo den Winkel leicht, korrigiert dann in die Gegenrichtung und so weiter, bis eine minimale Abweichung unterschritten wird.

Wie gesagt, ist der hausgemachte Servo nicht gerade üppig bestückt. Fortgeschrittenere Servos können zum Beispiel die Geschwindigkeit variieren oder volle 360° drehen. Industrielle Servo-Motoren lassen sich über entsprechende Schnittstellen an Feldbussystemen wie Profibus oder CAN-Bus betreiben, sind wesentlich genauer und integrieren leistungsfähige Motoren aller Art.

Woher weiß der Servo-Motor eigentlich, zu welcher Position er sich drehen soll? Dazu erhält die Kontrolllogik über die Kontrollleitung einen regelmäßigen Puls, zum Beispiel alle 20 Millisekunden. Ist die Pulslänge 1,5 Millisekunden, bewegt sich der Servo zum Nullpunkt. Falls die Pulslänge 1,5 Millisekunden unterschreitet (Bereich 1,5 bis eine Millisekunden), bewegt sich der Servo entgegen der Uhrzeigerrichtung bis zu einem dafür festgelegten Punkt. Beträgt die Pulslänge jedoch über 1,5 Millisekunden (Bereich 1,5 bis 2 Millisekunden), bewegt sich der Motor im Uhrzeigersinn bis zu einer definierten Position.

Die schlechteste Zeit zum Anfahren einer neues Position kommt folglich dann zustande, wenn der Servo sich in einer der beiden Richtungen bis zum Anschlag bewegt hat und sich dann bis zum entgegengesetzten Anschlagspunkt bewegen soll.

Viele Hobby-Servos lassen sich direkt am Arduino anschließen. Alternativ können wir sie aber auch über ein Motor-Shield steuern. Beide Optionen wollen wir uns ansehen.

Kleine Servos können Sie problemlos mit dem Arduino verbinden. Sollten Sie jedoch einen Servo mit hohem Stromverbrauch einsetzen, empfiehlt sich eine externe Stromversorgung. Auch hier gibt ein Blick in das Datenblatt des Servo-Motors Aufschluss.

Sofern wir kein Motor-Shield einsetzen, benötigen wir eine ähnliche Schaltung, wie wir sie bereits in der Folge über Gleichstrommotoren aufgebaut haben. Nur dass wir bei einem Servo-Motor lediglich die Position festlegen können. Wir hatten den unipolaren n-Kanal-Transistor IRF520 verwendet, um Stromversorgung von Arduino und Motor zu trennen. Den vertrauten Bekannten setzen wir aber nicht ein, wenn wir einen sehr leistungsschwachen Servo benutzen. Wie gesagt, eine Separation der Stromkreise ist nur dann nötig, sofern der Servo mehr Strom zieht als die geringe Stromstärke, die ein Arduino hergibt.

Wir integrieren zusätzlich ein Poti in die Schaltung, um die Position des Servo-Motors manuell steuern zu können. Drehen wir den Poti, bewegt sich der Servo nach links oder rechts.

Einfache Schaltung mit Servo und Poti

Servo-Unterstützung bringen die Arduino-Bibliotheken bereits von Haus aus mit, ebenso wie Beispiele für deren Verwendung (Menüpfad File | Examples). Hier haben wir also nicht viel Arbeit.

Methoden der Servo API sind zum Beispiel:

  • servo.attach(digitalPinWithPWM: Anschlusspin der Kontrollleitung
  • servo.write(angle): Drehen zu einer neuen Position (angle)
  • servo.read(): Abfrage der augenblicklichen Position

Das Programm zum Steuern des Servos ist nicht weiter aufregend. Wir inkludieren die Servo-Bibliothek über Servo.h. Im Setup-Teil weisen wir unserem Servo den Pin 9 zu. In der Schleife lesen wir zunächst den aktuellen Wert des Potentiometers aus, konvertieren diesen von 0..1023 in 0..180, und bewegen den Servo auf die entsprechende Winkelposition.

#include <Servo.h>

Servo servo1; // Servo
int val = 0;
int pos = 0;

void setup() {
servo1.attach(9); // Servo benutzt Arduino Pin 9
}

void loop() {
int val = analogRead(A0); // Auslesen Poti an A0
pos = map(val, 0, 1023, 0, 180); // Abbildung auf 0°..180°
servo1.write(pos); // Servo zu pos bewegen
}

Das Motorshield besitzt 2 Servo-Anschlüsse deren Kontroll-Pins mit den Arduino-Pins 9 und 10 verbunden sind

Für Servos hat das Motor-Shield außer zwei passenden dreipoligen Anschlüssen und der optionalen Versorgung durch eine externe Stromquelle nicht viel zu bieten. Wir können daher auch bei einem Motor-Shield die von der Arduino IDE bereitgestellten Bibliotheken nutzen. Die Kontrollleitung von Servo1 auf dem Shield ist mit dem digitalen Pin 9 des Arduino verbunden, während der digitale Arduino-Ausgang 10 Servo2 steuert. Wenn Sie also noch nicht sicher sind, ob Sie Servos direkt am Arduino oder am Motor-Shield betreiben sollen, wählen Sie auch bei Direktanschluss die digitalen Ausgänge 9 und 10 Ihres Arduino Uno.

Mehr Infos

Verwenden von Netzteilen

Für die Stromversorgung energiehungriger Schaltungen oder Komponenten empfiehlt sich die Verwendung eines schaltbaren und regulierbaren Netzteils mit 3V bis 12V Spannung und 1500 mA bis 3000 mA Stromstärke. Bei den Aufsatzsteckern gibt es verschiedene Varianten, etwa die männlichen mit zwei Stiften (+,-) oder die weiblichen mit einer Art Hohlzylinder, bei denen sich die verschiedenen Pole innen und außen befinden. Lesen Sie dazu die Bedienungsanleitung. Die Stromstärken-Angabe wie 1500 mA sagt nichts über die tatsächliche Stromstärke aus, sondern definiert die maximale Stromstärke, die Geräte über das Netzteil erhalten können, also die mögliche Gesamtleistung. Ein Arduino entnimmt trotzdem maximal 200 mA vom Netzteil. Je höher die Ampere-Angabe am Netzteil, desto mehr Reserven bringt es demzufolge mit.

Und nun wieder die "same procedure as every episode". Wir wollen uns den Servo mit JavaScript, Node.js, StandardFirmata und johnny-five gefügig machen. Zuallererst existieren zwei APIs zum Ansteuern von Servo-Motoren. Die Servos API ist für unsere Zwecke weniger interessant. Sie erlaubt Felder von mehreren Servos, die synchron das Gleiche tun sollen. Die Servo API deckt dagegen unseren Bedarf. Wir verwenden im Übrigen exakt dieselbe Schaltung, die wir bereits oben kennengelernt haben.

Bevor wir das JavaScript erstellen, müssen wir uns damit vertraut machen, auf welche Art uns johnny-five die Pins eines Microcontroller-Boards zugänglich macht. Das brauchen wir, sobald wir Werte von Ports auslesen oder schreiben wollen. Ein Beispiel für diese Notwendigkeit ist das an A0 angeschlossene Poti. Es soll beispielsweise auch bei Steuerung über JavaScript möglich sein, den Wert des Potentiometers als Basis für die anzusteuernde Position zu verwenden. Zu diesem Zweck gibt es in johnny-five die Pin API.

Das Skript implementiert letztlich dieselbe Funktionalität wie der vorangegangene Arduino-Sketch, nur eben ferngesteuert:

var five = require("johnny-five"), board = new five.Board();

board.on("ready", function() {
var servo1 = new five.Servo(9); // Servo an Pin 9
var poti = new five.Pin("A0"); // Poti an A0
five.Pin.read(poti, function(error, value) { // Poti auslesen
pos = value / 6; // Wert grob auf 0..180 abbilden
servo1.to(pos); // Servo an gewählte Position bewegen
});
});

Schaltbares Netzteil mit unterschiedlichen Anschlussarten

Das Ansteuern von Servo-Motoren ist sowohl über JavaScript als auch über Arduino IDE geradezu kinderleicht, der Aufwand für Schaltungen und Programmierungen eher gering. Den Stromverbrauch von Servos sollten Entwickler allerdings nicht unterschätzen. Es ist kein Problem, in kurzer Zeit eine 9V-Blockbatterie zu leeren. Daher ist ein kleineres schaltbares und geregeltes Netzteil mit ausreichend Reserven ratsam. Vernünftige Netzteile gibt es in der Regel bereits ab 20 Euro.

Sollten Sie einen Stromgenerator einsetzen, achten Sie darauf, dass dieser keine Spannungsspitzen zulässt.

In der nächsten Folge komplettieren wir die Betrachtung von Elektromotoren mit den Schrittmotoren. ()