Raspberry PI Tutorial #7: Servomotor steuern

In diesem Beitrag möchte ich dir zeigen wie einfach es ist einen Servomotor mit einem Raspberry PI zu steuern.

Servomotor SG90 am Raspberry PI
Servomotor SG90 am Raspberry PI

Im Beitrag Arduino, Lektion 16: Servo ansteuern habe ich bereits gezeigt wie einfach man einen Servomotor mit einem Arduino steuern kann.
Beim Raspberry Pi ist es fast genauso einfach.

benötigte Bauteile

Zum Nachbau dieses kleinen Projektes benötigst du

  • einen Raspberry Pi,
  • drei Breadboardkabel, männlich – weiblich, 20cm
  • einen Servomotor zbsp. SG90

Für das erste Beispiel verwende ich den recht kleinen Servomotor SG90, dieser hat eine geringe Leistungsaufnahme und kann somit direkt an den Raspberry Pi angeschlossen werden. Des Weiteren verwende ich zum basteln einen Raspberry Pi Model B+.

Raspberry PI Model B+
Raspberry PI Model B+

Dieses Raspberry Model ist schon alt aber funktioniert noch und sollte doch einmal etwas schiefgehen ist es nicht so ein wirtschaftlicher Schaden wie bei einem Raspberry Pi 3 oder 4.

Anschluß und aufbau der Schaltung

Der Servomotor verfügt über 3 Anschlüße (VCC, GND, Signal). Wie bereits erwähnt verwende ich den Servomotor SG90 welcher mit einer Spannung von 4.8 V (also rund 5V) betrieben wird.

Aufbau der Schaltung - Raspberry PI & Servomotor
Aufbau der Schaltung – Raspberry PI & Servomotor

Solltest du einen 12V Servomotor wie den MG996 oder MG955R verwenden so muss die Spannung über ein externes Netzteil erfolgen, wobei GND bzw. Minus zum Potentialausgleich verbunden werden muss.

Programmieren

Einrichten des Pins

Für den Betrieb eines Servomotors müssen wir den GPIO Pin als PWM Pin mit 50Hz einrichten. Dieses erfolgt in dem wir zunächst die GPIO Bibliothek importieren und nachfolgende Einstellungen setzen:

import RPi.GPIO as GPIO

servoPIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 50)

In meinem Beispiel ist der Servomotor am GPIO Pin 18 angeschlossen. Des Weiteren wird der Pin über die Nummer am Board Referenziert (GPIO.BCM).  Danach erfolgt das setzen das der Pin als Ausgang dient sowie das setzen einer Variable das der Pin als PWM Pin mit 50 Hz dient.

Sollte dein Servo eine andere Frequenz benötigen (hier hilft ein blick in das Datenblatt zum Servomotor), musst du den Wert hier ändern.

Liste mit Positionen

Zunächst wollen wir einfach eine kleine Liste mit Positionen erstellen welche wir später über eine For-Schleife ablaufen lassen möchten.

Für die Bestimmung der Positionen müssen wir diese berechnen, dabei nutzen wir die Formel „DC = Länge/Periodendauer“. 
Wobei die „Länge“ die dauer des Signals ist und die Periodendauer die Zeit für einen kompletten PWM Intervall ist (in Millisekunden). Um nun das Tastverhältnis zu ermitteln müssen wir das Ergebnis mal 100 nehmen. Somit ergibt sich:

0 Grad am Servo 2.5 % Tastverhältnis (2.5% = 0.5/20*100)
90 Grad am Servo 7.5% Tastverhältnis (7.5% = 1.5/20*100)
180 Grad am Servo 12.5% Tastverhältnis (12.5% = 2.5/20*100)

servoPositions = [2.5,5,7.5,10,12.5]

Funktion zum setzen einer Servoposition

Damit wir später nur eine Referenz von unserem Pin sowie die gewünschte Servoposition setzen wollen lagern wir doppelten Quellcode in eine extra Funktion aus.

def setServoCycle(p, position):
  p.ChangeDutyCycle(position)
  time.sleep(0.5)

Die Pause welche mit der Funktion „sleep“ auf dem Time Objekt erstellt wird kann in meinem Fall nicht kleiner sein als 150ms.

Setzen von Positionen

Nachdem wir unseren Code für das setzen der Servoposition erstellt haben müssen wir nun unsere Liste einmal „vorwärts“ sowie einmal „rückwärts“ durchlaufen.

for pos in servoPositions:
  setServoCycle(p, pos)
for pos in reversed(servoPositions):
  setServoCycle(p, pos)

Quellcode

Hier nun der vollständige Quellcode mit Kommentaren:

import RPi.GPIO as GPIO
import time

servoPIN = 18 # der Servomotor wurde an den GPIO Pin 18 angeschlossen
# moegliche Servopositionen fuer dieses Beispiel
servoPositions = [2.5,5,7.5,10,12.5]

# Funktion zum setzen eines Winkels
# als Parameter wird die Position erwartet
def setServoCycle(p, position):
  p.ChangeDutyCycle(position)
  # eine Pause von 0,5 Sekunden
  time.sleep(0.5)

# versuche
try:
  # damit wir den GPIO Pin ueber die Nummer referenzieren koennen
  GPIO.setmode(GPIO.BCM)
  # setzen des GPIO Pins als Ausgang
  GPIO.setup(servoPIN, GPIO.OUT)

  p = GPIO.PWM(servoPIN, 50) # GPIO als PWM mit 50Hz
  p.start(servoPositions[0]) # Initialisierung mit dem ersten Wert aus unserer Liste

  # eine Endlos Schleife
  while True:
    # fuer jeden Wert in der Liste, mache...
    for pos in servoPositions:
      # setzen der Servopostion
      setServoCycle(p, pos)
      # durchlaufen der Liste  in umgekehrter Reihenfolge
    for pos in reversed(servoPositions):
      setServoCycle(p, pos)
# wenn das Script auf dem Terminal / der Konsole abgebrochen wird, dann...
except KeyboardInterrupt:
  p.stop()
  # alle Pins zuruecksetzen
  GPIO.cleanup()

Video

Fazit & Vorschau

Das steuern eines Servomotors mit dem Raspberry PI ist nicht so schwierig. Man muss nur berechnen welchen Winkel man anstrebt und man muss auch in das Datenblatt schauen um die korrekten Werte zu haben. Beides ist jedoch mit einer ordentlichen Google Suche kein Problem.

Als nächstes werde ich mich nun daran machen mehr als einen Servomotor zu betreiben dazu werde ich das Modul PCA9685 verwenden. 

PCA9685 16 Kanal Servo Driver Shield
PCA9685 16 Kanal Servo Driver Shield

An diesem Modul können 16 Servos (bzw. 16 Geräte welche über ein PWM Signal gesteuert) angeschlossen werden.

Ziel soll es dann sein den kleinen Roboterarm aus dem Beitrag Arduino – Aluminium 2DOF Klaue auch mit dem Raspberry PI zu steuern.

2DOF Aluminium Klaue (fertig aufgebaut)

Jedoch werde ich für das zukünftige Projekt dem Arm noch ein weiteres Gelenk in form eines 2DOF Moduls spendieren. 

Das 2DOF Modul soll spätestens am 30.03.2020 erscheinen und dann wird das Projekt starten. Daher bitte ich um etwa Gedult.

 

5 Gedanken zu „Raspberry PI Tutorial #7: Servomotor steuern

  • 11. März 2020 um 20:55
    Permalink

    Ich arbeite noch nicht lange mit einem Raspberry Pi aber dank deinen tollen Anleitungen komme ich schnell voran, weiter so!
    Grüße Patrick

    Antwort
    • 12. März 2020 um 19:12
      Permalink

      Vielen Dank für dein Feedback.

      Antwort
  • 25. März 2020 um 12:43
    Permalink

    Ich hätte echt gerne einen Rasperry Pi zum basteln aber irgendwie traue ich mir das noch nicht zu. Durch deine Anleitungen wirkt das dann alles wieder so einfach.

    Antwort
    • 25. März 2020 um 12:51
      Permalink

      Hi Bernd,

      ich würde dir empfehlen einen günstigen, gebrauchten 2er Pi zu erwerben. Wenn du dann doch einmal was falsch machst und ggf. das Gerät kaputt geht ist die Investition nicht ganz so hoch.
      Ansonsten kann ich dir einen Arduino empfehlen wenn du noch ganz am Anfang bist.

      Gruß,

      Stefan

      Antwort
      • 26. März 2020 um 12:27
        Permalink

        Ich werde mich mal über Arduino informieren. Vielen Dank!

        Antwort

Schreibe einen Kommentar

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