SG90 & MG996R Servomotoren mit Arduino ansteuern: Sweep, Encoder-Steuerung & Pan-Tilt

Sensoren liefern Daten – Servomotoren liefern Bewegung. Ob Roboterarm, Pan-Tilt-Kamerahalterung oder automatische Futterklappe: Mit einem einzigen Steuersignal lassen sich Servos präzise auf eine gewünschte Winkelposition fahren. In diesem Tutorial steuerst du den kompakten SG90 und den kräftigeren MG996R mit Metallgetriebe an, baust eine Drehregler-Steuerung und eine Pan-Tilt-Halterung mit zwei Servos.

Wie ein Servomotor funktioniert

Anders als ein normaler DC-Motor oder Schrittmotor dreht ein Servomotor nicht endlos, sondern fährt eine feste Winkelposition an und hält sie – meist zwischen 0° und 180°. Intern steckt ein kleiner DC-Motor mit Getriebe und ein Potentiometer, das die aktuelle Position zurückmeldet. Ein eingebauter Regelkreis vergleicht Soll- und Istposition ständig und korrigiert die Motoransteuerung, bis der Zielwinkel erreicht ist.

Angesteuert wird der Servo über ein PWM-Signal mit exakt 50Hz, bei dem die Pulsbreite (üblicherweise 1-2ms) die Zielposition codiert: 1ms entspricht meist 0°, 1,5ms der Mittelstellung und 2ms 180°. Die Arduino Servo-Bibliothek übernimmt diese Timing-Details komplett und reduziert die Ansteuerung auf einen einzigen, einfachen Funktionsaufruf.

Im MAKEROO-Sortiment gibt es zwei gängige Typen: den kompakten SG90 (Kunststoffgetriebe, ca. 1,8kg·cm Drehmoment – ideal für leichte Aufbauten wie Kamerahalterungen oder kleine Klappen) und den MG996R (Metallgetriebe, bis zu 11kg·cm Drehmoment – für Roboterarme, RC-Lenkung oder alles, was mehr Kraft braucht).

Was du brauchst

Bauteil Menge ca. Preis Link
SG90 9G Micro Servo Motor (2er Set) 1 Set ab 3,49 € Zum Produkt
MG996R Digitaler Servomotor mit Metallgetriebe 1x (für Kraft-Projekte) ab 4,85 € Zum Produkt
UNO R3 Board 1x ab 4,99 € Zum Produkt
Rotary Encoder KY-040 (für manuelle Steuerung) 1x ab 2,79 € Zum Produkt
5er-Set AA Batteriehalter (externe Stromversorgung MG996R) 1x ab 1,93 € Zum Produkt
Breadboard 400 Kontakte 1x ab 3,49 € Zum Produkt

Schaltungsaufbau

Servo Kabel UNO R3 Pin Funktion
Braun/Schwarz (GND) GND Masse
Rot (VCC) 5V (SG90) / externe 5-6V Quelle (MG996R) Spannungsversorgung
Orange/Gelb (Signal) Pin 9 (PWM) Steuersignal

⚠️ Stromversorgung beachten: Ein einzelner SG90 lässt sich meist noch direkt vom Arduino-5V-Pin versorgen. Der MG996R zieht im Stillstand schon ca. 500-900mA und unter Last deutlich mehr – das übersteigt, was der USB-Port des Arduino liefern kann. Nutze für den MG996R (und für mehrere Servos gleichzeitig) unbedingt eine externe 5-6V Stromquelle, z. B. aus dem AA-Batteriehalter, und verbinde deren Masse zusätzlich mit der Arduino-GND.

Code 1: Einfacher Sweep

Der klassische Einstieg: Der Servo fährt kontinuierlich zwischen 0° und 180° hin und her.

#include <Servo.h>

Servo meinServo;
const int SERVO_PIN = 9;

void setup() {
  meinServo.attach(SERVO_PIN);
}

void loop() {
  for (int winkel = 0; winkel <= 180; winkel++) {
    meinServo.write(winkel);
    delay(15);
  }
  for (int winkel = 180; winkel >= 0; winkel--) {
    meinServo.write(winkel);
    delay(15);
  }
}

So funktioniert's

meinServo.write(winkel) setzt die Zielposition in Grad (0-180). Die delay(15) zwischen den Schritten sorgt für eine gleichmäßige, sanfte Bewegung statt eines abrupten Sprungs – ohne Verzögerung würde der Servo den Zielwinkel zwar trotzdem erreichen, die Bewegung wirkt aber ruckartig und belastet das Getriebe stärker.

Code 2: Manuelle Steuerung per Rotary Encoder

Statt eines automatischen Sweeps steuerst du den Winkel jetzt live mit dem Rotary Encoder aus unserem KY-040-Tutorial – jede Rastung dreht den Servo um einen festen Schritt weiter.

#include <Servo.h>

Servo meinServo;
const int SERVO_PIN = 9;
const int PIN_CLK = 2;
const int PIN_DT = 3;

int servoWinkel = 90;
int letzterClkZustand;

void setup() {
  meinServo.attach(SERVO_PIN);
  meinServo.write(servoWinkel);

  pinMode(PIN_CLK, INPUT);
  pinMode(PIN_DT, INPUT);

  letzterClkZustand = digitalRead(PIN_CLK);
}

void loop() {
  int clkZustand = digitalRead(PIN_CLK);

  if (clkZustand != letzterClkZustand) {
    if (digitalRead(PIN_DT) != clkZustand) {
      servoWinkel += 5; // im Uhrzeigersinn
    } else {
      servoWinkel -= 5; // gegen den Uhrzeigersinn
    }

    servoWinkel = constrain(servoWinkel, 0, 180);
    meinServo.write(servoWinkel);

    Serial.print("Winkel: ");
    Serial.println(servoWinkel);
  }

  letzterClkZustand = clkZustand;
}

constrain() verhindert, dass der berechnete Winkel den gültigen Bereich von 0-180° verlässt – ohne diese Absicherung könnten negative oder zu hohe Werte den Servo an seinen mechanischen Anschlag fahren und das Getriebe beschädigen.

Code 3: Pan-Tilt-Halterung mit zwei Servos

Zwei Servos übereinander montiert – einer für die horizontale Drehung (Pan), einer für die vertikale Neigung (Tilt) – ergeben eine einfache Kamera- oder Sensorhalterung, die per Seriellem Monitor gesteuert wird.

#include <Servo.h>

Servo servoPan;
Servo servoTilt;

const int PIN_PAN = 9;
const int PIN_TILT = 10;

int winkelPan = 90;
int winkelTilt = 90;

void setup() {
  Serial.begin(9600);
  servoPan.attach(PIN_PAN);
  servoTilt.attach(PIN_TILT);

  servoPan.write(winkelPan);
  servoTilt.write(winkelTilt);

  Serial.println("Eingabe: 'a'/'d' = Pan links/rechts, 'w'/'s' = Tilt hoch/runter");
}

void loop() {
  if (Serial.available()) {
    char eingabe = Serial.read();

    switch (eingabe) {
      case 'a': winkelPan = constrain(winkelPan - 5, 0, 180); break;
      case 'd': winkelPan = constrain(winkelPan + 5, 0, 180); break;
      case 'w': winkelTilt = constrain(winkelTilt + 5, 0, 180); break;
      case 's': winkelTilt = constrain(winkelTilt - 5, 0, 180); break;
    }

    servoPan.write(winkelPan);
    servoTilt.write(winkelTilt);

    Serial.print("Pan: ");
    Serial.print(winkelPan);
    Serial.print("  Tilt: ");
    Serial.println(winkelTilt);
  }
}

Tippe im seriellen Monitor die Buchstaben a/d/w/s gefolgt von Enter, um die Halterung Schritt für Schritt auszurichten. Für flüssigere Bewegungen kannst du die Schrittweite (aktuell 5°) reduzieren oder eine sanfte Interpolation zwischen Start- und Zielwinkel ergänzen.

Praxistipps

⚙️ Mittelstellung vor Montage: Fahre den Servo per Code auf 90° bevor du den Hebel (Horn) mechanisch aufsteckst – so nutzt du den vollen Bewegungsbereich in beide Richtungen, statt gegen den Anschlag zu fahren.

🔌 Mehrere Servos, eine Versorgung: Bei mehreren gleichzeitig aktiven Servos addieren sich die Stromspitzen beim Anfahren neuer Positionen. Plane die externe Stromversorgung großzügig (mind. 1A pro MG996R) und puffere sie mit einem Elektrolytkondensator (100-470µF) nahe an den Servos.

🎯 Feinjustierung: Manche Servohörner sitzen nicht exakt in 90°-Rasterung auf der Achse. Kalibriere in Software mit einem festen Offset pro Servo, statt die Mechanik gewaltsam zu verstellen.

Troubleshooting

⚠️ Servo zittert/jittert ständig: Fast immer ein Stromversorgungsproblem – entweder liefert der Arduino-5V-Pin nicht genug Strom, oder das Steuersignal ist verrauscht. Externe Stromversorgung mit gemeinsamer Masse zum Arduino löst die meisten Fälle.

⚠️ Arduino resettet beim Servo-Start: Der Einschaltstrom mehrerer Servos (oder eines MG996R unter Last) kann kurzzeitig die USB-Stromversorgung einbrechen lassen. Trenne die Servo-Stromversorgung komplett vom Arduino-VCC und nutze nur eine gemeinsame Masse.

⚠️ Servo bewegt sich nur in eine Richtung / dreht durch: Prüfe, ob es sich tatsächlich um einen Positions-Servo (0-180°) und nicht um einen modifizierten Endlos-Servo handelt – beide Bauarten sehen von außen identisch aus, verhalten sich in Software aber völlig unterschiedlich.

🦾 Baue dein Bewegungs-Projekt

Alle Bauteile für dieses Tutorial findest du bei MAKEROO.

Kombiniere die Servosteuerung mit unserem Rotary-Encoder-Tutorial für eine intuitive manuelle Steuerung.

Fazit

Ob leichtgewichtiger SG90 oder kräftiger MG996R – mit der Arduino Servo-Bibliothek reduziert sich präzise Winkelsteuerung auf einen einzigen Funktionsaufruf. Vom einfachen Sweep über die manuelle Drehregler-Steuerung bis zur Pan-Tilt-Halterung mit zwei Servos liefert dieses Tutorial den kompletten Baukasten für deine ersten beweglichen Projekte.

Zurück zum Blog