Arduino Servo-Motor Steuerung: Schritt-für-Schritt Anleitung
Einführung
In diesem Tutorial lernen Sie, wie Servomotoren funktionieren und wie man sie mit Arduino steuert. Servos sind in Arduino-Projekten sehr beliebt, da sie einfach anzusteuern sind und präzise Positionen ermöglichen.
Typische Anwendungen: Robotik, Automatisierung, RC-Modelle. Ich habe sie in vielen Projekten genutzt:
- DIY Arduino Roboterarm mit Smartphone-Steuerung
- Arduino Ameisen-Hexapod-Roboter
- DIY Arduino RC-Luftkissenboot
- SCARA-Roboter | Eigenbau Arduino-Roboter
- DIY Mars Perseverance Rover Nachbau
Video ansehen oder schriftliches Tutorial unten lesen. Enthält Verdrahtung, Codes und Anleitung für Mehrfach-Servo-Steuerung mit PCA9685 PWM-Treiber.
Was ist ein Servomotor?
Ein Servomotor ist ein geschlossenes Regelkreissystem, das Positionsrückführung nutzt, um Bewegung und Endposition zu kontrollieren. Hauptmerkmal: präzise Wellenpositionierung.
Industrielle Servos nutzen hochpräzise Encoder, Hobby-/RC-Servos meist ein einfaches Potentiometer. Die Ist-Position wird mit der Soll-Position verglichen; der Regler korrigiert über eine H-Brücke die Motordrehung bis Abweichung ≈ 0.
Dieses Tutorial fokussiert auf Hobby-Servos: Funktionsweise und Arduino-Steuerung.
Hobby-Servos sind kleine Aktuatoren für RC-Autos, Boote, Flugzeuge. Auch in Robotik-Prototyping (Roboterarme, bio-inspirierte Roboter, Humanoide) verbreitet.
Wie funktionieren Servomotoren?
Vier Hauptkomponenten im Hobby-Servo:
- DC-Motor (hohe Drehzahl, niedriges Drehmoment)
- Getriebe (reduziert auf ~60 U/min, erhöht Drehmoment)
- Potentiometer (an Endwelle → Spannung proportional zum Winkel)
- Steuerplatine (vergleicht Poti-Spannung mit Signalleitung, steuert H-Brücke)
Steuerung: Pulssignal (50 Hz → alle 20 ms ein Puls). Pulsbreite bestimmt Winkel (typisch 180° mechanischer Anschlag).
- 1 ms → 0° (manchmal 0,5 ms)
- 1,5 ms → 90°
- 2 ms → 180° (manchmal 2,5 ms)
Min/Max können je Hersteller abweichen.
Beliebte RC/Hobby-Servos für Arduino
Wichtige Kriterien: Drehmoment, Betriebsspannung, Stromaufnahme, Größe. Zwei Klassiker:
SG90 Micro Servo – Technische Daten
| Stall-Drehmoment | 1,2 kg·cm @ 4,8 V / 1,6 kg·cm @ 6 V |
| Betriebsspannung | 3,5 – 6 V |
| Leerlaufstrom | 100 mA |
| Stallstrom | 650 mA |
| Max. Geschwindigkeit | 60° in 0,12 s |
| Gewicht | 9 g |
MG996R Servo – Technische Daten
| Stall-Drehmoment | 11 kg·cm @ 4,8 V / 13 kg·cm @ 6 V |
| Betriebsspannung | 4,8 – 7,2 V |
| Leerlaufstrom | 220 mA @ 4,8 V / 250 mA @ 6 V |
| Stallstrom | 650 mA (Original: bis 2,5 A!) |
| Max. Geschwindigkeit | 60° in 0,20 s |
| Gewicht | 55 g |
Arduino Servomotor Steuerung
Praxisbeispiel mit MG996R (hohes Drehmoment, Metallgetriebe). Wichtig: Separate Stromversorgung nötig! Arduino 5 V Pin liefert max. 500 mA (USB) bis 1 A (Netzteil) – Servo kann deutlich mehr ziehen.
Schaltplan
- Servo Signal → beliebiger digitaler Arduino-Pin (z. B. 9)
- Servo GND → externe 5 V Masse & Arduino GND (gemeinsame Masse!)
- Servo VCC → externe 5 V / 2 A Netzteil
Kleinerer SG90 kann direkt an Arduino 5 V (Vorsicht: Stallstrom ~500–700 mA). Empfehlung: Immer externe Versorgung für stabilen Betrieb.
Benötigte Bauteile
- MG996R Servo oder SG90 Micro Servo
- Arduino Board
- 5 V 2 A DC-Netzteil
Servo Motor Arduino Code
Variante 1: Manuelle 50 Hz Puls-Erzeugung (ohne Library)
/* Servo Motor Control - 50Hz Pulse Train Generator
* by Dejan, https://howtomechatronics.com
*/
#define servoPin 9
void setup() {
pinMode(servoPin, OUTPUT);
}
void loop() {
// Ein Puls alle 20 ms
digitalWrite(servoPin, HIGH);
delayMicroseconds(1450); // Pulsdauer µs (1450 ≈ 90°)
digitalWrite(servoPin, LOW);
delayMicroseconds(18550); // Rest bis 20 ms
// Getestete Werte: 600 µs=0°, 1450 µs=90°, 2300 µs=180°
}
Variante 2: Arduino Servo Library (empfohlen)
/* Servo Motor Control using Arduino Servo Library
* by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9, 600, 2300); // Pin, Min-Puls(µs), Max-Puls(µs)
}
void loop() {
myservo.write(0); delay(1000);
myservo.write(90); delay(500);
myservo.write(135); delay(500);
myservo.write(180); delay(1500);
}
attach(pin, min, max) erlaubt Anpassung der Pulsbreiten an den jeweiligen Servo. write(winkel) setzt Position 0–180°.
Mehrere Servomotoren mit Arduino steuern
Die Servo-Bibliothek unterstützt bis zu 12 Servos (meiste Boards) bzw. 48 (Arduino Mega). Steuerung ist genauso einfach:
/* Controlling multiple servo motors with Arduino
* by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo servo1, servo2, servo3, servo4, servo5;
void setup() {
servo1.attach(8); servo2.attach(9); servo3.attach(10);
servo4.attach(11); servo5.attach(12);
}
void loop() {
// Alle auf 0°
servo1.write(0); servo2.write(0); servo3.write(0);
servo4.write(0); servo5.write(0); delay(2000);
// Alle auf 90°
servo1.write(90); servo2.write(90); servo3.write(90);
servo4.write(90); servo5.write(90); delay(2000);
// Alle auf 180°
servo1.write(180); servo2.write(180); servo3.write(180);
servo4.write(180); servo5.write(180); delay(2000);
}
Beispiel: Mein Arduino Ameisen-Hexapod nutzt Arduino Mega für 22 Servos.
Arduino & PCA9685 PWM/Servo-Treiber
Für noch mehr Servos: PCA9685 – 16-Kanal 12-Bit PWM/Server-Treiber über I²C. Ein Arduino kann bis zu 62 Treiber kaskadieren → theoretisch 992 Servos an nur 2 Pins (SDA/SCL).
Adresswahl über 6 Lötbrücken (A0–A5):
Schaltplan
Wieder: Separate Servo-Stromversorgung nötig!
Benötigte Bauteile
- MG996R Servo(s)
- PCA9685 PWM Servo Driver
- Arduino Board
- 5 V 6 A DC-Netzteil
Arduino & PCA9685 Code
Bibliothek: PCA9685-Arduino (GitHub)
/* Servo Motor Control using Arduino and PCA9685 Driver
* by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver;
// 12-bit = 4096 Schritte
// 0,5 ms (2,5% von 20 ms) → 102 Schritte
// 2,5 ms (12,5%) → 512 Schritte
PCA9685_ServoEvaluator pwmServo(102, 470); // -90° bis +90° (angepasst)
void setup() {
Wire.begin();
Wire.setClock(400000); // 400 kHz I²C
driver.resetDevices();
driver.init(B000000); // Adresse A5-A0 = 0
driver.setPWMFrequency(50); // 50 Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90)); delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0)); delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90)); delay(1000);
}
Erklärung: ServoEvaluator(min, max) mappt Winkel auf PWM-Schritte. Unterschiedliche Servos → eigene Evaluator-Instanzen mit angepassten Min/Max/Nullpunkt.
Viele Servos mit mehreren PCA9685
Treiber kaskadieren, Adressen setzen, je Treiber ein PCA9685-Objekt erstellen. Code analog – nur mehrere Driver-Instanzen mit verschiedenen I²C-Adressen.
Fehlerbehebung (Troubleshooting)
Servo zittert / setzt Arduino zurück
Ursache: Hoher Strombedarf beim Anlauf/Last → Arduino-Spannung bricht ein. Lösung: Elko (z. B. 470–1000 µF) parallel zu Servo-Versorgung (GND/5 V) als Pufferkondensator.
Servo fährt nicht vollen Bereich (0–180°)
Pulsbreiten-Min/Max weichen ab. Lösung: In attach(pin, min, max) anpassen. Default: 544 µs / 2400 µs. Beispiel: myservo.attach(9, 600, 2300);
Abmessungen & 3D-Modelle
3D-Modelle (STL/STEP) für SG90 und MG996R zum Download auf Thangs.
SG90 Micro Servo
MG996R Servo
Fazit
Wir haben Servo-Grundlagen, Arduino-Steuerung (Library & manuell), Mehrfach-Steuerung, PCA9685-Erweiterung und Fehlerbehebung abgedeckt. Hersteller-/Modellunterschiede beachten – passenden Servo für die Anwendung wählen.
Viel Spaß beim Bauen! Fragen in den Kommentaren. Siehe auch meine Arduino-Projektsammlung.
Häufige Fragen (FAQ)
- Wie benutze ich einen Servomotor mit Arduino?
- Servo hat 3 Drähte: GND, 5 V (Strom), Signal → Arduino Digitalpin. Mit Servo-Bibliothek:
myservo.attach(pin); myservo.write(winkel); - Kann Arduino Servomotoren direkt betreiben?
- Kleine Servos (SG90) gehen notfalls direkt an 5 V Pin, aber bei >500 mA droht Arduino-Reset. Besser: Immer separate Stromquelle für Servos.
- Wie viele Servos kann ein Arduino steuern?
- Servo-Library: bis 12 (Uno/Nano), 48 (Mega). PCA9685 über I²C: 16 pro Treiber, bis 62 Treiber kaskadierbar. Immer externe Stromversorgung!
Herstellungsprozess
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- Servogesteuerter Hindernisvermeidungs-Roboter: Bauen mit Arduino & HC-SR04
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Zwei Schrittmotoren mit Arduino Nano & Joystick steuern – Einfaches Tutorial
- Arduino & MPU6050: Präzise Servomotor-Steuerung mit SG90 & MG996R
- ThimbleKrox: Fingermontierte Maussteuerung mit Arduino Micro & MPU-6050
- Musikalische Töne mit Arduino erzeugen: Schritt-für-Schritt-Anleitung
- Arduino an NMEA‑0183 anschließen: Schritt-für-Schritt-Anleitung
- Aluminiumlöten meistern: Expertentechniken & praktische Anleitung
- Die Mechanik von Kupplungen: Umfassender Industrie-Leitfaden