Einen Servo mit Arduino zu steuern ist relativ einfach. Wenn man ein paar Dinge beachtet, dann erweitert man die blinkende und piepsende Arduino-Welt schnell mit Bewegungen und kinetischer Interaktion! In diesem Beitrag wird die Schaltung und der Code erklärt.
Servo: Aufbau und Anschluss
Ein Servo besteht aus einer Motorsteuerung (1), einem Elektromotor (2), einem Getriebe (3) und einem Potentiometer zur Positionsbestimmung (4). Alle Komponenten sind in einem robusten Gehäuse untergebracht.

Angeschlossen wird er über ein dreipoliges Kabel. Dabei handelt es sich um zwei Versorgungsleitungen (Plus und GND) und um eine Datenleitung.

Je nach Hersteller können die Kabelfarben abweichen. Gebräuchlich sind die Kombinationen Braun-Rot-Orange (GND, Plus, Daten) oder Schwarz-Rot-Gelb (GND, Plus, Daten). Ein Blick in die Beschreibung des Servomotors ist auf jeden Fall angebracht, um sicherzugehen, dass er richtig angeschlossen wird. Ein falsches Anschließen kann hier zu Schäden führen.
Schaltung und Beispiel-Programm-Code
Im Beispiel ist ein Standard-Servomotor* mit dem GND, 5V+ und dem digitalen Pin 9 verbunden. Des Weiteren ist ein Potentiometer am analogen Pin 2 angeschlossen.
Bei dem Programm handelt es sich um das Knob-Beispiel aus der Arduino Software (Datei > Beispiele > Servo > Knob).
#include <Servo.h> Servo myservo; // erstellt ein Servo-Objekt, um einen Servomotor zu steuern int potpin = 0; // Analog Pin, an dem das Potentiometer angeschlossen ist int val; // Variable um den Wert des Analogen Pin zwischenzuspeichern void setup() { myservo.attach(9); // verknüpft den Servomotor an Pin 9 mit dem Servo-Objekt } void loop() { val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023) val = map(val, 0, 1023, 0, 180); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und180) myservo.write(val); // überträgt die Zielposition an den Servomotors delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen }
In diesem Beispiel wird der Servomotor auf eine Position gesteuert, die mittels des Potentiometers festgelegt wird. Der Befehl myservo.write(val) stellt den Servomotor in eine bestimmte Position zwischen 0 und 180 Grad.
Viele Servomotoren mit Arduino steuern
Ein Servomotor benötigt für die Bewegungen relativ viel Strom. Wenn man mehr als einen Servomotor verwenden will, empfiehlt es sich, ein Servo-Shields wie das Adafruit Robot Shield* zu benutzen. Dabei handelt es sich um eine aufsteckbare Erweiterung für das Arduino-Board mit dessen Hilfe sich bis zu 16 Servomotoren gleichzeitig steuern lassen. Es bedarf allerdings eines externen Netzteils. Angenehmer Nebeneffekt ist, dass man nicht pro Servomotor einen wertvollen Kanal des Arduinos belegt.
Das Shield wird per I2C angesteuert. Hierbei handelt es sich um eine digitale Datenverbindung zwischen dem Arduino und dem Servo Shield, dass lediglich zwei Pins des Boards belegt.
Um diese Kommunikation einzurichten, gibt es eine Library von Adafruit, die sich im Handumdrehen einbinden und verwenden lässt.
Alternativ zum Adafruit Robot Servo Shield gibt es noch eine günstigere Variante von SunFounder*.

Tipp: Leider passen normale Servos nicht an LEGO Technik. Mit diesem kleinen 3D-Modell geht das dann aber doch. Ausgedruckt auf dem Wanhao Duplicator i3.
Spezialform Servo-Winde
Dabei handelt es sich um einen kräftigeren Servomotor. Er lässt sich nicht nur auf 180°, sondern je nach Typ auf 360° oder 720° drehen. Winden werden im Modellbau z.B. in Segelschiffen verbaut. Hier kann man sich das Produkt auf Amazon*ansehen.
Expertenwissen: Steuerung ohne Library
Zum Steuern des Servomotors verwendet man ein sich alle 20 Millisekunden wiederholendes Signal. Es besteht aus einem HIGH-Impuls, der zwischen 1 und 2 Millisekunden lang ist, und einem LOW-Impuls. Die Dauer des HIGH-Impulses bestimmt den Zielwinkel (normalerweise von 0 bis 180°). In der Arduino-Software kann hierfür der Befehl delayMicroseconds(x); verwenden:
digitalWrite(myServo,HIGH); delayMicroseconds(1500); digitalWrite(myServo,LOW); delayMicroseconds(18500);
Da der Servo einige Zeit benötigt, um sich auf den gewünschten Zielwinkel einzustellen, muss das Signal mindestens so lange wiederholt werden, bis der Servo die Position erreicht hat.
Servomotoren überprüfen ihren eigenen Stellwinkel mit einem eingebauten Potentiometer. Es kommt hierbei vor, dass eine gewünschte Position nicht exakt erreicht werden kann. Der Servo korrigiert sich dann kontinuierlich selbst, was zu einem »Zittern« des Servos führt. Um das zu verhindern, sollte der Impuls nach erreichen des Zielwinkels auf LOW geschaltet werden.
Alternativ zum selbst programmierten Signal, kann man die Servo-Library benutzen. Sie kommt mit der Arduino-Software. Im Beispiel Sweep (File>Examples>Servo>Sweep), wird gezeigt, wie man einen Servo mit der Servo-Library verwendet.
// Sweep // by BARRAGAN #include <Servo.h> Servo myservo; // erzeugt ein Servomotor-Objekt // maximal können acht Servomotor-Objekte erzeugt werden int pos = 0; // Variable, die die Servoposition (Winkel) speichert void setup(){ myservo.attach(9); // an welchem Pin ist der Servomotor angeschlossen } void loop(){ for(pos = 0; pos < 180; pos += 1) { // von 0 bis 180 Grad, in Schritten von einem Grad myservo.write(pos); // sagt dem Servomotor, in welche Position sich drehen soll delay(15); // wartet 15 Millisekunden } for(pos = 180; pos>=1; pos-=1) { // und das gleiche zurück myservo.write(pos); delay(15); } }
Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!
- Die beliebtesten Arduino-Projekte von StartHardware
- Inklusive Schaltplan, Beschreibung und Code
- Arduino-Schnellstart-Kapitel
- Kompakter Programmierkurs