Raspberry Pi Servo Motor Steuerung

Neben Schrittmotoren gibt es auch die kleinen und günstigen Servomotoren. Die Ansteuerung von Raspberry Pi Servo Motoren ist sehr einfach und dank der geringen Größe und Gewichts finden sie in vielen Bereichen Anwendung.
Im Gegensatz zu Schrittmotoren können Servomotoren mit nur einem einzigen GPIO gesteuert werden.

In diesem Tutorial zeige ich ein Beispiel, wie man mittels Python einen oder mehrere Servomotoren steuert.

Zubehör

Es ist natürlich möglich den Servomotor mittels einer externen Stromquelle zu versorgen, jedoch macht dies erst beim Einsatz mehrerer Motoren Sinn. Dafür würden ein Akku /Batterien noch benötigt werden.

 

Aufbau

In den meisten Fällen sind die Farben des Servos wie folgt und werden so an den Pi angeschlossen:

Schwarz – kommt an GND (Pin 6) vom Pi
Rot –  kommt an 3V3 (Pin 1) vom Pi
Gelb/Orange – an einen freien GPIO Pin (z.B. GPIO17, Pin 11)

Raspberry Pi Servo Motor Anschluss

Wer auf Nummer sicher gehen will, kann zwischen den Data Pin (gelb/orange) und den Pi einen ~1kΩ Widerstand setzen. Normalerweise ist das aber nicht nötig.

Falls der Servo Motor sich nicht korrekt dreht, kann dies u.U. auch an der Stromversorgung des Raspberry Pi’s liegen (einfach mal ins Datenblatt schauen, was der Motor verbraucht). In so einem Fall macht eine externe Stromversorgung Sinn (meistens sind es 4 bis 6V).

 

Software zum steuern der Raspberry Pi Servo Motoren

Anders als bei Schrittmotoren werden bei Servomotoren nicht etliche GPIO Pins besetzt um eine Bewegung zu befehlen. Dafür wird die Rotation über die Länge des Impulses gesteuert.

Der Winkel des Motors wird über die Länge des Impulses gesetzt, daher bietet sich PWM besonders an, womit wiederholende Signale in gleichmäßigen Abständen geschickt werden (Die Raspberry Pi Python Bibliothek muss installiert sein).

Wir starten entweder python (sudo python) oder eröffnen ein neues Skript (sudo nano servomotor.py) mit folgendem Inhalt:

import RPi.GPIO as GPIO
import time

servoPIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)

p = GPIO.PWM(servoPIN, 50) # GPIO 17 als PWM mit 50Hz
p.start(2.5) # Initialisierung
try:
  while True:
    p.ChangeDutyCycle(5)
    time.sleep(0.5)
    p.ChangeDutyCycle(7.5)
    time.sleep(0.5)
    p.ChangeDutyCycle(10)
    time.sleep(0.5)
    p.ChangeDutyCycle(12.5)
    time.sleep(0.5)
    p.ChangeDutyCycle(10)
    time.sleep(0.5)
    p.ChangeDutyCycle(7.5)
    time.sleep(0.5)
    p.ChangeDutyCycle(5)
    time.sleep(0.5)
    p.ChangeDutyCycle(2.5)
    time.sleep(0.5)
except KeyboardInterrupt:
  p.stop()
  GPIO.cleanup()

Sollte der Servo Motor etwas zittern, während er sich nicht bewegt, kannst du den Puls mit p.ChangeDutyCycle(0) ruhig stellen.

 

Bei Servomotoren und dessen Treiberboards wird die Angabe der Periode und des Tastgrads meist im Datenblatt gemacht. Im Beispiel eines MG996R haben wir folgendes vorliegen: Die Periode ist 20ms lang. Außerdem wird ein Tasgrad von zwischen 5% und 10% der Periode erwartet. Somit die die Impulsdauer zwischen 1ms und 2ms. Üblicherweise können Servos zwischen 0 und 180° rotieren. Daher müssen wir die Impulslänge dazwischen anpassen. Eine Länge von 1,5ms (7,5%) ergibt somit einen Winkel von 90°. Und das ganze eben 50x pro Sekunde (50Hz).

 

Falls es den ein oder anderen stört, dass der Servo (SG90) sich nicht um 360° drehen lässt, so gibt es dazu einen „Hack„.

81 Kommentare

  1. Hallo Felix

    Mein Kollege Tobias und ich arbeiten mit dem Raspberry Pi an einer Servomotorsteuerung ( Schulprojekt). Nun stellt sich uns die Frage ob wir unsere 6 Servomotoren unabhängig von einander steuern können.

    Lg Felix und Tobias

    Antworten
    • Hallo ihr beidem,
      prinzipiell denke ich, dass es möglich ist. Die Python GPIO Library hat die GPIO.PWM(pin, freq) Funktion, womit man einen Pin und die Frequenz (in Hz) angeben kann. Es sollte also auch möglich sein, verschiedene Instanzen mit unterschiedlichen GPIOs zu erstellen.

      p1 = GPIO.PWM(18, 50)
      p2 = GPIO.PWM(25, 50)
      ...

      LG Felix

      Antworten
      • Felix, gibt es einen Grund warum mein MG995 Metallgetriebe-Servos 15KG digitale High-Speed sehr langsam rotiert? Gab es auch für dich solche Probleme, ich bräuchte einen Servo für Genauigkeit und schnelligkeit :/ hab schon zwei bestellt und schon wieder zurückgeschickt, als nächstes knüpfe ich mir deinen vor

      • Genug Stromstärke liefert dein netzteil? Ich habe da ähnliche Erfahrungen, nämlich dass man bei den Servos lieber nicht am falschen Ende sparen sollte. Für normale Anwendungen noch in Ordnung aber z.B. für meinen Roboarm ließ die Genauigkeit schon teilweise zu wünschen übrig.

      • Ich meine das externe Netzteil nur für den Servo. Der Pi liefert nicht genug Strom für stärkere Motoren.

      • Gibt es ein Gerät mit dem man die Pins des Servos an eine externe Quelle anschließen kann? Verstehe, dachte laut dem Datenblatt wäre es genug

      • Die Pins des Raspberry Pi’s solltest du an keine höhere Spannung anschließen, wenn du nicht willst, dass sie durchbrennen.

      • Ich würde gerne eine permanenten Anschluss bevorzugen, Batterien/Akkus wären für mein Projekt nicht ideal :c
        [Ganz nebenbei, .-. so ein Aufklapp Funktion in den Kommentaren(nach 3 Kommentaren) wäre gut =)]