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.

  1. 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.
  2. 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.
  3. Bei Programmende sollte immer ein Abschalten des PWM-Signals im Programmcode erfolgen.

Aufbau und Bauteile

Raspberry Pi Pico mit SG90

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:

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