Raspberry Pi Pico: Servo-Motor SG90 steuern und testen

Der Servo-Motor SG90 ist ein kleiner Servo-Motor, der oft unter der Bezeichnung Micro- oder Mini-Servo bekannt ist. Er eignet sich überall dort, wo mit wenig Kraftaufwand etwas bewegt werden soll.
Der SG90 ist ein per PWM-Signal gesteuerter Servo-Motor. Die Position wird über den Winkel in Grad definiert. Der Drehbereich liegt ungefähr zwischen 0 und 180 Grad.

Es geht darum, den Servo-Motor SG90 zu testen und die Zubehörteile, die auf die Achse gesteckt werden können auszurichten.
Wenn Du noch nicht mit dem Servo-Motor SG90 gearbeitet hast, dann schaue Dir bitte die grundlegenden Informationen zum SG90 an.

Warn- und Sicherheitshinweise

Es gibt gute Gründe, warum Anlagen und Aufbauten über Notausschalter verfügen (meist gelber Kasten mit rotem Druckknopf). Selbst kleine Motoren können genug Kraft haben, um Dinge zu beschädigen oder Personen zu verletzen.
Wenn Du die folgenden Warnhinweis nicht befolgst, wirst Du zwangsläufig mit zerstörten oder beschädigten Teilen oder Objekten rechnen müssen.

  1. Wenn Du mit den folgenden Programmcodes experimentierst, dann sollte der angeschlossen Motor ausgebaut sein. Gemeint ist, die Motorachse sollte sich frei bewegen können. Warum? Wenn Du versehentlich falsche Werte im Programmcode verwendest, Dein Programmcode einen Fehler enthält oder der Motor in einer unbekannten Stellung steht, dann kann Dein Motor das zerstören was an ihm befestigt ist oder in Kontakt kommt, sobald er ein Steuerungssignal bekommt und zu drehen beginnt.
  2. Wenn Dein Motor nicht das macht, was Du erwartest, dann NICHT den Programmcode unterbrechen oder beenden, sondern die Betriebsspannung des Motors unterbrechen. Warum? Wenn Du falsche Werte im Programmcode verwendest, dann dreht der Motor sich unter Umständen immer weiter, weil das PWM-Signal immer noch anliegt. Der Motor hört erst dann auf zu drehen, wenn seine Stromversorgung unterbrochen wird.
  3. Bei Programmende sollte immer ein Abschalten des PWM-Signals im Programmcode erfolgen.

Aufbau und Bauteile

Raspberry Pi Pico mit SG90

Raspberry Pi Pico SG90
Pin 40 +5V VBUS VCC
Pin 38 GND GND
Pin 34 GPIO 28 PWM

Sicherheitshinweis: Dein Aufbau sollte eine leicht zugängliche Unterbrechung der VCC-Leitung des Motors vorsehen, damit der Motor im Notfall schnell außer Betrieb genommen werden kann (Notaus).

Schnell und einfach alle Bauteile zusammen bestellen

Programmcode: Steuerung über die Pulsdauer (Zeit)

Im Programmcode sind verschiedene Werte für bestimmte Positionen definiert. Außerdem wird ein PWM-Signal für den Motor initialisiert.
Anschließend wird das Duty Cycle des PWM-Signals mehrmals verändert, um dem Motor die Positionsänderung mitzuteilen.

Bitte vor dem Ausführen des Programmcodes die oben genannten Sicherheitshinweise beachten.

# Bibliotheken laden
from machine import Pin, PWM
from time import sleep

# GPIO für Steuersignal
servo_pin = 28

# 0 Grad
grad000 = 500000
# 45 Grad
grad045 = 1000000
# 90 Grad
grad090 = 1500000
# 135 Grad
grad135 = 2000000
# 180 Grad
grad180 = 2500000

pwm = PWM(Pin(servo_pin))
pwm.freq(50)

print('Position: Mitte (90 Grad)')
pwm.duty_ns(grad090)
sleep(2)

print('Position: Ganz Links (0 Grad)')
pwm.duty_ns(grad000)
sleep(2)

print('Position: Mitte (90 Grad)')
pwm.duty_ns(grad090)
sleep(2)

print('Position: Ganz Rechts (180 Grad)')
pwm.duty_ns(grad180)
sleep(2)

print('Position: Mitte (90 Grad)')
pwm.duty_ns(grad090)
sleep(2)

pwm.deinit()
print('Ende')

Am Ende des Programmcodes befindet sich der Servo-Motor in der Mittelstellung bzw. 90-Grad-Position.

Programmcode: Steuerung über Dezimalzahlen

Im Programmcode sind verschiedene dezimale Werte für bestimmte Positionen definiert. Außerdem wird ein PWM-Signal für den Motor initialisiert.
Anschließend wird das Duty Cycle des PWM-Signals mehrmals verändert, um dem Motor die Positionsänderung mitzuteilen.

Bitte vor dem Ausführen des Programmcodes die oben genannten Sicherheitshinweise beachten.

# Bibliotheken laden
from machine import Pin, PWM
from time import sleep

# GPIO für Steuersignal
servo_pin = 28

# 0 Grad
grad000 = 1638
# 90 Grad
grad090 = 4915
# 180 Grad
grad180 = 8192

pwm = PWM(Pin(servo_pin))
pwm.freq(50)

print('Position: Mitte (90 Grad)')
pwm.duty_u16(grad090)
sleep(2)

print('Position: Ganz Links (0 Grad)')
pwm.duty_u16(grad000)
sleep(2)

print('Position: Mitte (90 Grad)')
pwm.duty_u16(grad090)
sleep(2)

print('Position: Ganz Rechts (180 Grad)')
pwm.duty_u16(grad180)
sleep(2)

print('Position: Mitte (90 Grad)')
pwm.duty_u16(grad090)
sleep(2)

pwm.deinit()
print('Ende')

Am Ende des Programmcodes befindet sich der Servo-Motor in der Mittelstellung bzw. 90-Grad-Position.

Troubleshooting: Es kann sein, dass der Motor sich mit den definierten, dezimalen Werten im Programmcode nicht steuern lässt. Das könnte daran liegen, dass der Motor das PWM-Signal nicht akzeptiert. Dann muss man für diesen Motor durch Ausprobieren herausfinden, was die minimale und maximale Dezimalzahl ist und wo die Mittelstellung liegt.

Beobachtungen, Erklärungen und Erkenntnisse

Wenn Du Dir anschaust, in welche Richtung die Motor-Achse gedreht wird und welche Richtung in der Kommandozeile angezeigt wird, dann wird die angezeigte Richtung vermutlich falsch sein. Das könnte daran liegen, dass Du auf den Motor aus der falschen Richtung schaust. Führe den Programmcode noch einmal aus und schaue von hinten (Blick auf die Unterseite des Gehäuses) auf den Motor. Plötzlich stimmt die Richtungsangabe wieder.

Warum ist das wichtig? Im ersten Moment ist es irrelevant. Aber, für den Einsatz des Motors spielt es dann doch eine große Rolle, wie die Richtungen des Motors bezeichnet werden. Zum Beispiel Links und Rechts, Oben und Unten oder minimal und maximal. Es ist wichtig gleich am Anfang diese Richtungen zu definieren, namentlich zu benennen, ihnen Werte zuzuweisen und auch im Programmcode zu dokumentieren.
Als Werte kann die Position bzw. Winkel in Grad verwendet werden. Zum Beispiel 0 und 180 Grad. Aber auch die Zeit in Millisekunden des High-Pegels des PWM-Signals, um diese Position zu erreichen, eignet sich dafür.

Desweiteren solltest Du klären, wie herum Dein Servomotor eingebaut und befestigt werden muss. Du solltest ihn tatsächlich einbauen und testen, ob Dein Motor in der Lage ist die gewünschte Position zu erreichen und auch die notwendige Kraft hat, diese Position zu erreichen, wenn da ein kräftemäßiger Widerstand ist.

Darf es ein bisschen mehr sein?

Was kann man denn alles so mit einem Servo-Motor vom Typ SG90 bewegen oder betätigen?
Was alles mit dem Servo-Motor SG90 möglich ist, hängt von Deiner Kreativität und handwerkliche Geschicklichkeit ab. Wir möchten Dir hier ein paar Ideen genannt, die Du umsetzten kannst.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren