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
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.
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+
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
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.
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 =
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 =
# 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) # 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()
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
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.
Read the full article