In diesem Beitrag möchte ich dir zeigen wie einfach es ist einen Servomotor mit einem Raspberry Pi zu steuern.
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, 20 cm
- einen Servomotor* zum Beispiel SG90
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
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+.
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üsse (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.
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, dass der Pin als Ausgang dient sowie das Setzen einer Variable, dass 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 jetzt daran machen mehr als einen Servomotor zu betreiben, dazu werde ich das Modul PCA9685 verwenden.
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.
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.
Ich arbeite noch nicht lange mit einem Raspberry Pi aber dank deinen tollen Anleitungen komme ich schnell voran, weiter so!
Grüße Patrick
Vielen Dank für dein Feedback.
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.
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
Ich werde mich mal über Arduino informieren. Vielen Dank!
Hallo ich habe einen eine esp2866 steuerung gebaut ,der einen servomotor ansteuert die servo werden mit 5v vom esp angesteuert .Die motoren brauchen aber 12v ,ich habe auch an den roten und an den schwarzen ein 12v Spannung angeschlossen aber dann geht da nichts mehr .Bin anfänger vilvieleicht kann mir jemand helfen
Hi,
du musst den Schwarzen / GND von der 12V Leitung mit dem Mikrocontroller (GND) verbinden, damit schaffst du ein Potenzialausgleich.
Gruß,
Stefan
Hallo Bernd,
danke für deine Anleitung, ich möchte mit den Pi und Servo (mit Musik bzw Rhytmus) eine Tanzende Figur ansteuern. Hättest du einen Vorschlag (Anleitung)
LG Willi
Hi,
das hört sich lustig an. Mit dem Otto Bausatz gibt es sowas ja bereits, dieser kann zu einem zuvor programmierten Song tanzen.
Am Raspberry Pi wäre dieses recht leicht zu portieren.
Gibt es diese tanzende Figur bereits irgendwo, so das man sich diese einmal anschauen kann?
Gruß, Stefan
Habe vor Jahren dummerweise, in Venedig bei einem Straßenverkäufer eine tanzende Micky Maus Kartonfigur (tanzte vor einem Lautsprecher) gekauft, natürlich waren da nur fast unsichtbare Fäden dabei. Schon bei der Heimfahrt wurde ich von meinen Kindern, mit den Song “dein Püpchen tanzt nicht mehr” von Michelle, und heute noch immer, gemobbt. Ich hab versprochen, die Figur zum Tanzen zu bringen. habe etwas erfahrung mit dem Pi. vieleicht hat jemand eine Lösung dafür.
LG Willi