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.
- Grundlagen zum SG90 - Servo-Motor
- Servo-Motor SG90 steuern und testen
- Mehr Informationen zum KY-040 - Drehschalter (Rotary Encoder)
- Drehschalter / Rotary Encoder ansteuern (KY-040)
Aufbau und Bauteile

| 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:
- Raspberry Pi Pico: DC-Motor steuern (mit ULN2003A)
- Raspberry Pi Pico: Servo-Motor SG90 steuern und testen
- Raspberry Pi Pico: Taste auf Tastatur mit Servo-Motor SG90 betätigen
- Raspberry Pi Pico: Zeigersteuerung für eine analoge Anzeige
- Raspberry Pi Pico: Funktionsauswahl mit WS2812-RGB-LEDs und Rotary Encoder programmieren (KY-040)
Frag Elektronik-Kompendium.de
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
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
Online-Workshop: 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.
Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.






