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)
Teilen:
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.
Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)