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.
- Grundlagen zum SG90 - Servo-Motor
- Servo-Motor SG90 steuern und testen
- Raspberry Pi Pico: Grundlagen zur PWM
Aufbau und Bauteile
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:
- 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: Servo-Motor SG90 mit Drehschalter KY-040 steuern
- Raspberry Pi Pico: Servo-Motor SG90 mit IR-Sensor FC-51 berührungslos Schalten
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.