Präzise Servo-Kalibrierung mit Arduino UNO & Adafruit PWM Shield
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| Adafruit PWM Servo Driver Shield | × | 1 |
| M3 Schraube | × | 8 |
| M3 Unterlegscheibe | × | 8 |
| LM2596 DC-DC Step-Down Spannungswandler | × | 1 |
| Rotes PLA-Filament | × | 1 |
| Weißes PLA-Filament | × | 1 |
| 180° Geodreieck (transparent) | × | 1 |
| Drehpotentiometer (allgemein) | × | 1 |
| 9g Servomotor | × | 1 |
Benötigte Werkzeuge und Maschinen
- 3D-Drucker (allgemein)
Apps und Online-Dienste
- Arduino IDE
- Autodesk Fusion 360
Über dieses Projekt
In einem früheren Hackster-Beitrag verglich ich, wie verschiedene Servos derselben Charge auf identische PWM-Signale reagieren – sie zeigen deutliche Unterschiede. Das Bild zeigt Servos, die alle im äußersten gegen den Uhrzeigersinn starteten und das gleiche PWM-Signal erhielten; alle verhalten sich leicht anders.

Warum nicht bestehende Arduino-Servo-Bibliotheken?
Ich nutze den Adafruit PWM Servo Driver, um viele Servos über nur zwei Pins (I2C) anzusteuern, statt jedem Servo einen eigenen Arduino-Pin zu widmen. Zudem habe ich erlebt, dass die Standard-Servo-Bibliothek beim Ansteuern der 0-Grad-Position manchmal den Servo bis zum mechanischen Anschlag fährt und die Getriebe knirschen lässt. Die billigen 9g-Servos sind nicht für Präzision ausgelegt, aber für meinen Laufroboter brauche ich vorhersehbareres Verhalten.
Wie kann ich Hobby-Servos präziser steuern?
Ich baute ein Kalibriergerät, das zwei einfache Konzepte kombiniert:
- Servo wird mit der Mitte eines Geodreiecks ausgerichtet, sodass die Winkelstellung ablesbar ist.
- Ein Potentiometer an einem analogen Arduino-Eingang steuert den PWM-Wert, der an den Servo gesendet wird.
Für diese Version lasse ich den PWM-Wert im Serial Monitor der Arduino IDE anzeigen und notiere ihn manuell.
Ich entwarf in Autodesk 123D eine Halterung für Potentiometer, Geodreieck, Servo, Arduino, Adafruit Shield und Netzteil.

Aufbau des Geräts
Alle Teile wurden gedruckt und mit M3-Schrauben und Unterlegscheiben verschraubt. Die Montagelöcher sind auf meine Komponenten angepasst; bei anderen Bauteilen können Abweichungen nötig sein.
Elektronik: Mittlerer Pin des Potentiometers an Arduino A0, äußere Pins an 0V und 5V. Adafruit Shield auf Arduino gesteckt. DC-DC-Wandler (9V auf 5V eingestellt) angeschlossen. 9g-Servo an ersten Slot des Shields. Sketch hochladen.
Das Ergebnis: Durch Drehen am Potentiometer-Knopf wird der Servo bewegt; der Serial Monitor zeigt den PWM-Wert für jeden Winkel.


Was verrät das Gerät?
Ich drehte den Servo zum äußersten Uhrzeigersinn-Anschlag und setzte den Hebel so, dass er knapp über 180° am Geodreieck zeigte. Dann justierte ich den Potentiometer, bis der Hebel auf 0° zeigte, und notierte den PWM-Wert. Dies wiederholte ich alle 10° bis 180°.

Ein Diagramm zeigt den stark linearen Zusammenhang zwischen PWM und Winkel.

Jetzt habe ich charakteristische PWM-Winkel-Paare für diesen Servo. Andere Servos ähneln sich, sind aber nicht identisch.
Zwei Optionen für präzisere Steuerung:
- Wertpaare in einem Array speichern und beim Anfahren eines Winkels (z. B. 90°) den zugehörigen PWM-Wert senden. Nachteil: nur Vielfache von 10° möglich.
- Lineare Regression auf den Datensatz anwenden, um Formel zu erhalten (für diesen Servo: PWM = 2,35 × Winkel + 159,4). Damit lässt sich jeder Winkel programmatisch berechnen.
Beide Methoden ermöglichen präzisere und sicherere Steuerung. Der Kalibrieraufwand pro Servo lohnt sich für mein Projekt.
Wichtig: Beim Ausbau des Servos muss der Hebel in der kalibrierten Position verbleiben, da die Messungen auf dieser Montage basieren.
Verbesserungen für die nächste Version
- Schnellverschluss für Servo (z. B. Clip mit Neodym-Magneten statt M3-Schrauben).
- Kompakteres Design (Neuausrichtung von Arduino und Netzteil).
- Netzschalter zwischen 9V-Batterie und Wandler.
- Weniger Einzelteile beim 3D-Druck.
- Sensor zur automatischen Winkelerkennung statt manuellem Ablesen (vermeidet Parallaxenfehler).
- LCD-Display für Ergebnisse, damit kein PC nötig ist.
Fazit
Billige Hobby-Servos sind für viele Anwendungen okay. Mit diesem Kalibriergerät hole ich mehr Genauigkeit und Wiederholbarkeit heraus.
Code
Sketch für Servo-Kalibriergerät (C/C++)
#include <Adafruit_PWMServoDriver.h>
#define analogIn A0
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int inputValue = 0;
int tmpPwmValue = 0;
void setup() {
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(60);
}
void loop() {
inputValue = analogRead(analogIn); // 0-1024
// Servo min/max PWM typischerweise 100-612
int pwmValue = (int)(100 + (inputValue / 2));
pwm.setPWM(0, 0, pwmValue);
if (pwmValue != tmpPwmValue) {
Serial.print("Potentiometer Input = ");
Serial.print(inputValue);
Serial.print(", PWM = ");
Serial.println(pwmValue);
}
tmpPwmValue = pwmValue;
delay(15);
}
Eigene Teile und Gehäuse
Repo für Servo-Kalibriergerät-Teile
Herstellungsprozess
- PLA 3D-Druck: Der umfassende Leitfaden für Profis
- Echtzeit Pan/Tilt Gesichtstracking auf Raspberry Pi – Praktischer Leitfaden
- PLA vs. ABS vs. Nylon: Das richtige 3D-Druck-Filament wählen
- Walbi: Stabiler zweibeiniger Roboter mit Arduino und LX-16A Servos
- Arduino Yun 5-DOF Roboterarm mit IoT & Blynk-Steuerung
- PLA vs. ABS im 3D-Druck: Unterschiede, Eigenschaften & Entscheidungshilfe
- Umstieg auf DC-Antriebe: Zuverlässige Alternative zu AC-Servos in der industriellen Motion Control
- PLA: Wirklich recycelbar und biologisch abbaubar?
- Löst sich PLA in Wasser auf? Bedingungen & Tipps zur Wasserdichtigkeit
- Leitet PLA-Filament Strom? Leitfähige Varianten & Druckherausforderungen