Raspberry Pi Servo Motor

GPIO

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 18 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.

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„.



, , , , ,


26 Kommentare

  1. Felix Tobias sagt:

    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

    • Felix sagt:

      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

  2. Jan sagt:

    Ich muss bei meinem Pi für ein Projekt 3 Servos, ein 8 Kanalrelaisboard, 3 Ultraschalsensoren und den 2×16 LCD Display anschließen. Ist das ohne weiters möglich?

    • Felix sagt:

      Ja, du solltest aber mal schauen, wie viele GPIOs du dafür brauchst. Wenn du das LCD Display ohne I2C benutzt brauchst du recht viele GPIOs. Dazu nochmals einen GPIO für jedes Relais und für die Servos. Schau dir am besten mal folgende beiden Tutorials an:
      Um das Display per I2C anzusteuern:
      HD44780 LCD Display per I2C mit dem Raspberry Pi ansteuern
      Falls die GPIOs nicht reichen: Raspberry Pi GPIOs mittels I2C Port Expander erweitern – Teil 1

    • Jan sagt:

      Vielen dank.
      Trozdem hätte ich noch eine Frage zur Stromverteilung. Da ich ja für 3 Servos 3x mal den 3v3 Power Pin benötige und nur einer vorhanden ist. Oder kann ich alle Servos an einen 3v3 Power Pin Anschließen. Oder brauche ich eine Externe Stromversorgung. Das gleiche auch mit den 3 Ultraschall Sensoren und dem 5v Power Pin.
      Entschuldigung für die frage aber das ist das erste mal das ich so viel an den Raspberry anschließen muss. 🙂

    • Felix sagt:

      Von der Spannung her kannst du beliebig viele Geräte an einen VCC Pin anschließen. Wichtig ist nur, dass nicht zu viel Stromstärke (mA) verbraucht wird.

  3. Samuel Eickmann sagt:

    Hey, ich probiere zurzeit einen Roboter zusteuern, mit W A S D. Doch ich muss immer wieder nach jeder Eingabe Enter drücken. So lässt sich natürlich kein Roboter gut steuern. Nun zu meiner Frage, kannst du mir sagen was ich machen muss, damit er gerade aus fährt wenn ich W drücke, und er stehen bleibt wenn ich loslasse?! LG Sammy

  4. Jan sagt:

    Vielen dank.
    Trozdem hätte ich noch eine frage zur Stromverteilung kann ich alle 3 Servos bzw Ultraschall Sensoren an einen Power Pin anschließen?
    Oder brauche ich eine externe Stromversorgung. Da es ja nur einen 3v3 bzw 5v Power Pin gibt.
    Und wenn ja, wie mache ich das mit der externen Stromversorgung?

    • Felix sagt:

      Ja, wie gesagt: Der Strom „teilt sich auf“, die Spannung ist bei allen Geräten die selbe (3.3V oder 5V) nur die Stromstärke variiert.

  5. LimettenLike sagt:

    Hallo Felix,
    Mein Servo rattert nur bei dem Programm, aber er bewegt sich nicht:‘-(.
    Ich bin ratlos. Kannst du mir Helfen?

  6. max_s sagt:

    Hallo – ich möchte mehrere Servos (ca. 30) einzeln ansteuern.
    Natürlich mit einer externen Spannungsquelle. wie viele kann ich jedoch von Haus aus mit dem Pi ansteuern? Und gibt es eine Möglichkeit, dass ich den Rasperry erweitere um mehr Steuerpins zu bekommen?

    Danke
    LG

    • Felix sagt:

      Ein Raspberry Pi B+ / 2 bzw. 3 hat 26 steuerbare GPIOs. Du kannst zb. einen Port Expander verwenden, allerdings weiß ich nicht ob diese für PWM geeignet sind. Eventuell gibt es aber Bibliotheken auf Github für den MCP23017 und PWM.

  7. Anton sagt:

    Hallo; wie kann ich vom Servomotor die genaue Position zurückbekommen?

    Danke
    LG

  8. V. Schmidt sagt:

    Hallo und danke für diese schöne Seite,
    habe mir einen RPI3 (bin nach ersten Tests begeistert) und einen 3.5 “ RPI LCD zugelegt und den Pi nach erstem Grübeln auch zum Laufen gebracht (LCD noch nicht). Möchte meine bisherige manuelle Einstellung mit einem Tester/und einem kleinen Servomotor (Conrad) mit dem PI möglichst exakt auf bestimmte Winkel (entsprechend einer bestimmten Wellenlänge) ansteuern. Dafür ist doch die hier vorgstellte Lösung mit Anpassung sicher nutzbar. Bisher stelle ich mit dem Tester manuell die ungefähre Winkelstellung eines Liniengitters (1200linien/mm)anhand einer aufgezeichneten Skala ein. Es soll in einem selbstgebauten Spektrometer für Sternenbeobachtungen seinen Platz bekommen. Wie schliesse ich den Motor an, wenn schon das LCD-Display eingesteckt ist – brauche ich einen Adapter ?
    Vielen Dank

    • Ingo sagt:

      Hallo Volker ,
      nimm für den Motor einen anderen, freien Pin und ändere diesem im Python-Script:
      servoPIN = 17
      anstelle der 17 dann den neuen PIN.

  9. V. Schmidt sagt:

    Erst mal herzlichen Dank für die Rückantwort. Da ich nicht so bewandert bin mit Schaltungen noch die Frage, ob ich den Servomotor extern mit 3,3V versorgen kann und der neue freie Pin vom Raspberry dann ausreicht, um den Motor zu steuern, oder ob grd und 3,3V auch vom Raspberry kommen muss – wenn das der Fall wäre muss ich dann ggf. Verbindungen „für den Servomotor rausführen – anlöten “ ?. Das 3.5LCD habe ich zum Laufen gebracht, leider hat das Gehäuse nicht richtig zur Platine gepasst, sodass das Gehäuse angepasst werden musste.

    • Felix sagt:

      An 3.3V kannst du so viele Geräte anschließen wie du möchtest, solange der gesamte Strom (in Ampere) nicht den verfügbaren übersteigt. Bei normalen Modulen/Sensoren ist also keine externe Stromversorgung nötig (bei z.B. stärkeren Schrittmotoren allerdings schon, da diese oftmals 1A benötigen).
      Du brauchst also effektiv nur einen GPIO Pin, da VCC und GND auch an andere Module angeschlossen werden können.

  10. Mustafa K. sagt:

    Hallo,
    erst mal bei beste Seite für einsteiger sehr gut erklärt weiter so.

    zu meiner Frage ich möchte eigentlich ein 12V Lüftermotor über PWM und einen
    externen Temperatursensor steuern.

    sind die PWM Signale die selben ??

    mfg mustafa K.

    • Felix sagt:

      Hey Mustafa,
      was meinst du mit die selben Signale? 12V kann das Raspberry Pi nicht liefern und bei einer externen Stromversorgung würde ich eine Diode zwischenschalten, um die GPIOs ggf. zu schützen. Ansonsten sollte es möglich sein auch einen 12V Motor mit PWM zu steuern.
      LG, Felix

    • Mustafa K. sagt:

      Hallo Felix,

      Ich habe ein 12V 5A LED Trafo für die Spannungsversorgung der Lüfter.
      Ich wollte nur wissen ob die Signalleitung der Lüfter, auch nur einen 3,3V Signal benötigen.(Wie ein Servo Motor)

      Bin ein Totaler einsteiger,ich glaube ich habe mir ein zu großes Ziel Gesetz.
      Ich möchte über zwei Temperatur Sensoren, zwei Gruppen von Lüfter Regeln.

      Kannst du mir etwas Empfehlen womit ich anfangen kann??

    • Felix sagt:

      Wie viel Spannung die Signalleitung des Motors braucht weiß ich leider nicht, aber das sollte im Datenblatt stehen.
      Du könntest ggf. Transistoren bzw. Relais (sofern diese schnell genug für PWM schalten) verwenden, um auf die entsprechende Signalspannung zu kommen.

  11. Gruß Volker sagt:

    Hallo Ingo,

    Ergebnis meiner Versuche bzgl. Schrittmotorsteuerung + RPI3. Externe Stromversorgung und z.B. ein Gpio Pin 21 für die Servomotorsteuerung funktioniert bei mir nicht, dagegen läuft das Programm, wenn 5V, Ground und Pin21 direkt vom Raspberry kommen, leider fehlt mir die Idee, wie ich nun das LCD nutzen kann, da ich das nun ja nicht einstecken kann, da die Verbindungsleitungen für die Servomotorsteuerung schon dort sind – habe das mit dem HDMI Anschluss und TV getestet. Würde schon gern das LCD auch im Raspberry nutzen.

  12. Georg sagt:

    Hi Felix ,
    ich habe vollgendes Problem.
    Ich möchte gerne mit dem Raspberry Pi einen kleinen Getriebemotor steuern .
    Folgende Sachen habe ich schon besorgt : Pi , Stromquellen , Breadboard , T Cobbler , H Brücke , Taster und Jumpwires.
    Meine Frage wäre ,dass ich den Motor anhand zB 2 oder 3 Taster verschiedene Drehzahlen beim betätigen fahren will.
    Sprich Taster 1 betätigt = 30 U/min
    Dann Taster 2 betätigt = 20U/min
    Ich habe Schwierigkeiten beim Software programmieren und weis nicht wie ich anfangen soll.
    Ich wäre sehr dankbar für Deine Hilfe .

    Mit freundlichen Grüßen
    Georg

    • Felix sagt:

      Bist du sicher, dass es ein Servomotor und kein Schrittmotor ist? Du müsstest bei einem Servo sehr kleine Schritte machen und dann jeweils warten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!