Raspberry Pi Pico: Taster entprellen

Wenn Du einen Taster betätigst, dann führt das in der Regel zur Mehrfachausführung der damit verbundenen Funktion. Doch warum ist das so? Funktioniert das Programm nicht richtig? Nein. Das Problem sind die Taster. Die neigen zum Prellen.

In einem Versuch wollen wir hier aufzeigen, wie das Prellen eines Tasters sichtbar wird und wie man einen Taster wirkungsvoll entprellen kann.

Was ist Prellen und warum tun Taster das?

Mit Prellen ist gemeint, dass ein Taster bei Betätigung nicht zwangsläufig einen dauerhaften Kontakt herstellt, sondern durch den mechanischen Aufschlag zurückfedert und teilweise mehrfach und in kurzer Folge schließt und wieder öffnet, bevor er tatsächlich schließt. Das heißt, das Drücken eines Tasters kann zu einer mehrmaligen Kontaktauslösung führen. Je nach Taster tritt das Problem mehr oder weniger stark auf.

In der Praxis muss man sich zwangsläufig mit dem Prellen von Tastern beschäftigen und eine Lösung parat haben. Das ist hardwarenahes Programmieren live und in Farbe.

Aufbau und Bauteile

Raspberry Pi Pico: Taster gegen VCC schalten

Der Taster wird auf dem Steckbrett auf der einen Seite mit +3,3V (VCC) und auf der anderen Seite mit dem GPIO verbunden.

Programmcode ohne Funktion zum Entprellen des Tasters

Das folgende Programm schaltet die LED immer dann ein und wieder aus, wenn der Taster gedrückt wird. Das Programm wird nicht automatisch beendet.

# Bibliotheken laden
from machine import Pin

# Initialisierung von GPIO25 als Ausgang
led_onboard = Pin(25, Pin.OUT, value=0)

# Initialisierung von GPIO14 als Eingang
btn = Pin(14, Pin.IN, Pin.PULL_DOWN)

# Taster-Funktion
def on_pressed(timer):
    led_onboard.toggle()
    print('pressed')

# Taster-Auslösung
btn.irq(trigger=Pin.IRQ_RISING, handler=on_pressed)

Wenn man den Taster mehrmals betätigt, wird man feststellen, dass die LED manchmal mehrfach an- und ausgeht. Würde sich eine Funktion dahinter befinden, würde diese mehrfach ausgeführt werden. Das ist in der Regel nicht gewollt.

Programmcode zum Taster entprellen

Das folgende Programm schaltet die LED immer dann ein und wieder aus, wenn der Taster gedrückt wird. Das Programm wird nicht automatisch beendet.

# Bibliotheken laden
from machine import Pin, Timer

# Initialisierung von GPIO25 als Ausgang
led_onboard = Pin(25, Pin.OUT, value=0)

# Initialisierung von GPIO14 als Eingang
btn = Pin(14, Pin.IN, Pin.PULL_DOWN)

# Taster-Funktion
def on_pressed(timer):
    led_onboard.toggle()
    print('pressed')

# Entprell-Funktion
def btn_debounce(pin):
    # Timer setzen (period in Millisekunden)
    Timer().init(mode=Timer.ONE_SHOT, period=200, callback=on_pressed)

# Taster-Auslösung
btn.irq(handler=btn_debounce, trigger=Pin.IRQ_RISING)

Das besondere an diesem Programm ist eine Entprell-Funktion, die einen Timer mit einer Verzögerung von 200 ms setzt und erst danach die Funktion zur Ansteuerung der LED ausführt..

Diese Konstruktion im Programmcode führt dazu, dass wenn der Taster innerhalb der 200 ms prellt, also zwischen High und Low hin- und herschwingt, die Funktion nicht erneut ausgeführt wird.

Die Prellzeit (bounce time)

Die Prellzeit, auch Bounce Time genannt, ist die Dauer, in der der Taster prellt, also mehrfach schließt und wieder öffnet, bis er dauerhaft den Zustand geschlossen oder geöffnet einnimmt.
Diese Zeit muss man sozusagen abzuwarten, um eine versehentliche Mehrfachauslösung zu verhindern. Dann kann auch der Bediener nicht mehrfach auslösen, auch wenn der Bediener mehrmals schnell hintereinander den Taster drückt.

Die Dauer der Prellzeit ist von verschiedenen Faktoren abhängig. Zum Beispiel von Material, Bauform und Kraft bei der Betätigung.
Eine sinnvolle Prellzeit hängt auch davon ab, wie schnell ein Taster hintereinander gedrückt werden kann oder darf. Da niemand einen Einschalt-Taster im Stakkato benutzt, ist eine Prellzeit von einer halben Sekunde bzw. 500 Millisekunden kein Problem. Bei anderen Anwendungen, wie Benutzereingaben, sollte der Wert tiefer liegen. Etwa bei 100 bis 300 Millisekunden. Die Zeit muss hoch genug liegen, damit das Prellen nicht zur Mehrfachauslösung führt.

Ich habe das Problem mit dem prellenden Taster noch nicht so ganz verstanden!

Folgender Programmcode zählt in einer Endlosschleife dar, wie oft ein Taster als gedrückt gewertet wird, obwohl er tatsächlich nur ein einziges Mal gedrückt wurde.
Führe das Programm aus und drücke den Taster.

# Bibliotheken laden
from machine import Pin

# Taster initialisieren
btn = Pin(14, Pin.IN, Pin.PULL_DOWN)

# Zähler auf 0 stellen
bounced = 0

# Taster drücken
print ('Bitte Taster drücken.')
print ()

# Endlos-Schleife
while True:
    if btn.value():
        # Hochzählen
        bounced += 1
        # Anzahl ausgeben
        print(bounced, 'mal Taster gedrückt')

Wichtiger Hinweis

Schaut man sich verschiedene andere Lösung zum Entprellen an, dann sind die meisten sehr viel umfangreicher. Das liegt am vergleichsweise großen Funktionsumfang, um maximale Flexibilität zu ermöglichen. Die hier dargestellt Lösung ist vergleichsweise einfach, aber auch nicht in jedem Fall die beste Lösung. Damit kann man zumindest die meisten prellenden Taster entprellen.

Taster entprellen mit picozero

picozero ist eine MicroPython-Bibliothek mit der die Steuerung und das Programmieren von elektronischen Bauteilen und Sensoren Einsteiger-freundlich realisiert wird. Von picozero wird auch die Taster-Auswertung unterstützt, die das Entprellen übernimmt.
Bevor man eine eigene Entprell-Lösung programmiert, sollte man die Taster-Auswertung von picozero ausprobieren. Nicht nur Einsteiger, auch Fortgeschrittene profitieren von vielen Vereinfachungen, die bei jedem Programmierprojekt nützlich sind.

Im folgenden Programmcode wird die Onboard-LED und ein Button zwischen GPIO 15 und GND initialisiert. Die Funktion „when_pressed“ reagiert auf das Betätigen des Tasters. Die Funktion „when_released“ reagiert auf das Loslassen des Tasters. In diesem Beispiel geht die Onboard-LED an und aus. Man kann aber auch ein eigene Funktion auslösen.

Hinweis: Beim Aufbau den Taster vom GPIO15 (Pin 20) auf GND (z. B. Pin 18) schalten.

from picozero import pico_led, Button
button = Button(15)
button.when_pressed = pico_led.on
button.when_released = pico_led.off

Experimente mit Taster

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