Raspberry Pi Pico: Servo-Motor SG90 mit Tastern steuern

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.

Bei diesem Aufbau wollen wir den Servo-Motor SG90 mit zwei Tastern manuell steuern. Mit den Tastern wollen wir die Motorachse schrittweise nach links bzw. nach rechts drehen lassen.

Hierfür brauchen wir eine Software-Steuerung für den Servo-Motor und eine prellfreie Taster-Auswertung.

Aufbau und Bauteile

Raspberry Pi Pico mit SG90 und Tastern

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

Die Positionierung des SG90 erfolgt in diesem Programmcode über den Wertebereich von 0 bis 180 Grad. Man kann natürlich einen engeren Wertebereich wählen, wenn der Bedarf besteht.

Das Programm kann jederzeit mit der Tasten-Kombination Strg + C beendet werden. Nur dann wird das PWM-Signal abgeschaltet.

Der vergleichsweise umfangreiche Programmcode enthält zu Anfang einige Parameter, die aber nur bedarfsweise geändert werden sollten:

  • valueMin: Das ist der minimal zu erreichende Wert in Grad (in der Regel 0).
  • valueMax: Das ist der maximal zu erreichende Wert in Grad (in der Regel 180).
  • value: Das ist die Variable, in der die aktuelle Position der Motor-Achse gespeichert wird. Am Anfang ist ein sinnvoller Wert zwischen 0 und 180 zu wählen (Mittelstellung = 90).
  • step: Schrittgröße in Grad pro Tasterbetätigung. Der kleinste Wert ist 1. Größter sinnvoller Wert ist 180.

Anschließend werden die GPIOs für die Taster und das PWM-Signal initialisiert, mit denen der Servo gesteuert wird. Dann folgen die Funktionen für die Taster-Auswertung und die Servo-Steuerung.
Das Hauptprogramm am Ende bringt den Servo in seine Grundposition und initialisiert die Interrupts für die Taster-Steuerung. Eine Endlosschleife sorgt dafür, dass der Programmcode nicht beendet wird.

# Bibliotheken laden
from machine import Pin, PWM
import time

# GPIO für Steuersignal
servo_pin = 28

# GPIO für Taster
btn_pin_up = 14
btn_pin_down = 15

# Wert für 0 Grad
valueMin = 0

# Wert für 180 Grad
valueMax = 180

# Position in Grad
value = 90

# Positionsänderung in Grad
step = 10

# Initialisierung der Taster
btn_up = Pin(btn_pin_up, Pin.IN, Pin.PULL_UP)
btn_up_last = time.ticks_ms()
btn_down = Pin(btn_pin_down, Pin.IN, Pin.PULL_UP)
btn_down_last = time.ticks_ms()

# Initialisierung PWM-Signal
servo = PWM(Pin(servo_pin))
servo.freq(50)

# Taster-Auswertung UP
def push_up(pin):
    global value, valueMin, valueMax, step, btn_up, btn_up_last
    if pin is btn_up:
        # Taster entprellen
        if time.ticks_diff(time.ticks_ms(), btn_up_last) > 200:
            value = value + step
            # Begrenzung des Wertebereichs
            if value < valueMin: value = valueMin
            if value > valueMax: value = valueMax
            servo_control(value)
            btn_up_last = time.ticks_ms()

# Taster-Auswertung DOWN
def push_down(pin):
    global value, valueMin, valueMax, btn_down, btn_down_last
    if pin is btn_down:
        # Taster entprellen
        if time.ticks_diff(time.ticks_ms(), btn_down_last) > 200:
            value = value - step
            # Begrenzung des Wertebereichs
            if value < valueMin: value = valueMin
            if value > valueMax: value = valueMax
            servo_control(value)
            btn_down_last = time.ticks_ms()

# Funktion: Servo steuern
def servo_control(value, minDuty=1638, maxDuty=8192):
    # Tastverhältnis berechnen
    newDuty = int(maxDuty - (value - valueMin) * (maxDuty - minDuty) / (valueMax - valueMin) )
    # Datenausgabe
    print('Grad:', value)
    print('Duty:', newDuty)
    print()
    # PWM-Signal ändern
    servo.duty_u16(newDuty)

# Hauptprogramm
print('STRG + C zum Benden')
print()

try:
    # Grundposition
    servo_control(value)
    # Interrupt für Taster UP
    btn_up.irq(trigger=Pin.IRQ_FALLING, handler=push_up)
    # Interrupt für Taster DOWN
    btn_down.irq(trigger=Pin.IRQ_FALLING, handler=push_down)
    # Wiederholung (damit das Programm weiterläuft)
    while True:
        time.sleep(1)
except (KeyboardInterrupt):
    pass
finally:
    servo.deinit()
    print('Beendet')

Darf es ein bisschen mehr sein?

Statt zwei Taster eignet sich ein Drehschalter (Rotary Encoder) viel besser. Mit dem Drehschalter wollen wir die Motorachse schrittweise nach links bzw. nach rechts drehen.

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