Raspberry Pi Pico: Servo-Motor SG90 mit Drehschalter KY-040 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 einem Drehschalter (Rotary Encoder) manuell steuern. Mit dem Drehschalter wollen wir die Motorachse schrittweise nach links bzw. nach rechts drehen.

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

Aufbau und Bauteile

Raspberry Pi Pico mit SG90 und Drehschalter KY-040

Raspberry Pi Pico SG90
Pin 40 +5V VBUS VCC
Pin 38 GND GND
Pin 34 GPIO 28 PWM
Raspberry Pi Pico KY-040
Pin 23 GND GND
Pin 36 VCC +3,3V +
Pin 22 GPIO 17 SW
Pin 25 GPIO 19 CLK
Pin 24 GPIO 18 DT

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

Externe Bibliothek für den Drehschalter (Rotary Encoder)

Zur Software-seitigen Ansteuerung bzw. Auswertung des Drehschalter bzw. Rotary Encoders ist eine externe Bibliothek erforderlich, weil keine direkte Unterstützung in MicroPython vorgesehen ist. Die Bibliothek macht die Auswertung des Drehschalters im Programmcode spielend einfach. Dazu muss die Bibliothek in Form einer Datei auf den Raspberry Pi Pico gespeichert werden, damit die Einbindung im folgenden Programmcode funktioniert.

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 Drehschalter-Drehschritt. Der kleinste Wert ist 1. Größter sinnvoller Wert ist 180.

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

# Bibliotheken laden
from machine import Pin, PWM
from rotary import Rotary
import time

# GPIO für Steuersignal
servo_pin = 28

# GPIOs zum Rotary Encoder
pin_dt = 18
pin_clk = 19
pin_sw = 17

# 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

# Initialiserung Rotary Encoder
rotary = Rotary(pin_dt, pin_clk, pin_sw)

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

# Funktion
def rotary_changed(change):
    global value, valueMin, valueMax, step
    if change == Rotary.ROT_CW:
        value = value + step
        print('Rechts')
    elif change == Rotary.ROT_CCW:
        value = value - step
        print('Links')
    # Begrenzung des Wertebereichs
    if value < valueMin: value = valueMin
    if value > valueMax: value = valueMax
    servo_control(value)

# 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)
    # Wenn der Encoder bedient wird
    rotary.add_handler(rotary_changed)
    # 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?

Man kann einen SG90 auch einfach mit zwei Tastern manuell steuern.

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