Raspberry Pi Pico: Zeigersteuerung für eine analoge Anzeige
Eine analoge Anzeige besteht meistens aus einem Zeiger, der sich auf einer Skala halbkreisförmig hin- und herbewegt. Für das schnelle Erfassen, in welchem Wertebereich sich ein Messwert befindet, ist das eine optimale Lösung. Digitale Anzeigen oder Displays lassen sich schwerer erfassen. Skalen lassen sich zusätzlich mit Farben markieren, damit der Anwender weiß, ob sich etwas im grünen oder roten Bereich befindet.
Da wir es beim Raspberry Pi Pico um eine digitale Verarbeitung zu tun haben, tun wir uns mit analogen Anzeigen schwer. Allerdings können wir einen Servomotor vom Typ SG90 verwenden, dessen Achse sich im Bereich von 0 bis 180 Grad positionieren lässt. An der Achse kann man dann einen Zeiger befestigen, der auf einer Skala einen Wert anzeigt.
Warn- und Sicherheitshinweise
Es gibt gute Gründe, warum Anlagen und Aufbauten über Notausschalter verfügen (meist gelber Kasten mit rotem Druckknopf). Selbst kleine Motoren können genug Kraft haben, um Dinge zu beschädigen oder Personen zu verletzen.
Wenn Du die folgenden Warnhinweis nicht befolgst, wirst Du zwangsläufig mit zerstörten oder beschädigten Teilen oder Objekten rechnen müssen.
- Wenn Du mit den folgenden Programmcodes experimentierst, dann sollte der angeschlossen Motor ausgebaut sein. Gemeint ist, die Motorachse sollte sich frei bewegen können. Warum? Wenn Du versehentlich falsche Werte im Programmcode verwendest, Dein Programmcode einen Fehler enthält oder der Motor in einer unbekannten Stellung steht, dann kann Dein Motor das zerstören was an ihm befestigt ist oder in Kontakt kommt, sobald er ein Steuerungssignal bekommt und zu drehen beginnt.
- Wenn Dein Motor nicht das macht, was Du erwartest, dann NICHT den Programmcode unterbrechen oder beenden, sondern die Betriebsspannung des Motors unterbrechen. Warum? Wenn Du falsche Werte im Programmcode verwendest, dann dreht der Motor sich unter Umständen immer weiter, weil das PWM-Signal immer noch anliegt. Der Motor hört erst dann auf zu drehen, wenn seine Stromversorgung unterbrochen wird.
- Bei Programmende sollte immer ein Abschalten des PWM-Signals im Programmcode erfolgen.
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
Dieser Programmcode ist vergleichsweise universell. In diesem Beispiel wird der interne Temperatursensor verwendet, um Werte für die analoge Anzeige zu ermitteln. Es wäre denkbar, auch Werte von einem anderen Sensor zu ermitteln.
Es gibt eigentlich nur zwei wichtige Einstellungen im Programmcode vorzunehmen, wenn man den Programmcode für eigene Zwecke verwenden will:
- valueMin: Das ist der minimal zu erwartende Wert, der auf der Skala angezeigt werden kann. Unterschreitet der tatsächliche Wert diesen Wert, dann wird der Wert von valueMin verwendet.
- valueMax: Das ist der maximal zu erwartende Wert, der auf der Skala angezeigt werden kann. Überschreitet der tatsächliche Wert diesen Wert, dann wird der Wert von valueMax verwendet.
# Bibliotheken laden from machine import Pin, ADC, PWM from time import sleep # GPIO für Steuersignal servo_pin = 28 # Wert für 0 Grad valueMin = 18 # Wert für 180 Grad valueMax = 32 # Wartezeit bis zur nächsten Messung (Sekunden) pause = 2 # Initialisierung des ADC4 (intern) sensor_temp = ADC(4) conversion_factor = 3.3 / (65535) # Initialisierung PWM-Signal servo = PWM(Pin(servo_pin)) servo.freq(50) # Funktion: Temperatursensor lesen def read_temp(): return 27 - (sensor_temp.read_u16() * conversion_factor - 0.706) / 0.001721 # Funktion: Servo steuern def servo_control(value, minDuty=1638, maxDuty=8192): # Begrenzung des Wertebereichs if value < valueMin: value = valueMin if value > valueMax: value = valueMax # Tastverhältnis berechnen step = (maxDuty - minDuty) / (valueMax - valueMin) #newDuty = int(minDuty + (value - valueMin) * step) newDuty = int(maxDuty - (value - valueMin) * step) print(newDuty) # PWM-Signal ändern servo.duty_u16(newDuty) # Hauptprogramm print('STRG + C zum Benden') print() try: # Wiederholung while True: # Temperatur umrechnen temp = read_temp() print('Temperatur (°C): ', temp) # Servo ansteuern servo_control(temp) # Warten sleep(pause) except: servo.deinit() print() print('Ende')
Hinweis: Wenn Du diesen Programmcode für einen anderen Sensor verwendest, dann entferne die Initialisierung für den ADC4 und die Funktion „read_temp“.
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: Servo-Motor SG90 mit Tastern steuern
- Raspberry Pi Pico: Servo-Motor SG90 mit Drehschalter KY-040 steuern
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.