Raspberry Pi - Taster - Entprellung

Wenn ein Taster gedrückt oder losgelassen wird, oder wenn ein Schalter betätigt wird, nehmen Neulinge oft an, dass sein Zustand einfach von LOW zu HIGH oder HIGH zu LOW geändert wird. In Wirklichkeit ist das nicht der Fall. Aufgrund mechanischer und physikalischer Eigenschaften kann der Zustand des Tasters (oder Schalters) mehrmals zwischen LOW und HIGH umgeschaltet werden. Dieses Phänomen ist als Prellen bekannt. Prellen kann dazu führen, dass ein einzelner Tastendruck als mehrere Drückungen gelesen wird, was in bestimmten Anwendungen zu Fehlfunktionen führt.

Ratterphänomen

Die Methode, dieses Problem zu verhindern, wird als Entprellung oder Debounce bezeichnet. Dieses Tutorial zeigt Ihnen, wie Sie es bei der Verwendung des Tasters mit dem Raspberry Pi durchführen. Wir werden die folgenden Schritte durchgehen:

Erforderliche Hardware

1×Raspberry Pi 5
1×Breadboard-Taster mit Kappe
1×Breadboard-Taster-Kit
1×Panel-Drucktaster
1×Taster-Modul
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmenblock-Shield für Raspberry Pi
1×(Empfohlen) Raspberry Pi Prototyping-Grundplatte & Breadboard-Kit
1×(Empfohlen) HDMI-Touchscreen-Monitor für Raspberry Pi

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über den Button

Wenn Sie mit Tasten nicht vertraut sind, einschließlich ihrer Pinbelegungen, wie sie funktionieren und wie man sie programmiert, können Ihnen die folgenden Tutorials weitere Informationen liefern:

Verdrahtungsdiagramm

Verdrahtungsdiagramm für Raspberry Pi-Taster

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Lassen Sie uns die Unterschiede zwischen dem Raspberry-Pi-Code mit und ohne Entprellung sowie das jeweilige Verhalten beider Codes betrachten.

Tasterauslesen ohne Entprellung

Bevor du Debouncing verstehst, sieh dir den Code ohne Debouncing an und beobachte sein Verhalten.

Schnelle Schritte

  • Stellen Sie sicher, dass auf Ihrem Pi Raspbian oder ein anderes Raspberry Pi-kompatibles Betriebssystem installiert ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit demselben lokalen Netzwerk wie Ihr PC verbunden ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit dem Internet verbunden ist, falls Sie einige Bibliotheken installieren müssen.
  • Wenn Sie den Raspberry Pi zum ersten Mal verwenden, sehen Sie sich an, wie man den Raspberry Pi einrichtet
  • Verbinden Sie Ihren PC per SSH mit dem Raspberry Pi, verwenden Sie dazu den integrierten SSH-Client unter Linux und macOS oder PuTTY unter Windows. Siehe wie Sie Ihren PC per SSH mit dem Raspberry Pi verbinden
  • Stellen Sie sicher, dass Sie die Bibliothek RPi.GPIO installiert haben. Falls nicht, installieren Sie sie mit dem folgenden Befehl:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Erstelle eine Python-Skriptdatei button_without_debounce.py und füge den folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/tutorials/raspberry-pi/raspberry-pi-button-debounce import RPi.GPIO as GPIO import time # Set the GPIO mode to BCM GPIO.setmode(GPIO.BCM) # Define the GPIO pin for your button BUTTON_PIN = 16 # Set the initial state and pull-up resistor for the button GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Initialize the button state button_state = GPIO.input(BUTTON_PIN) try: # Main loop while True: # Read the current button state current_state = GPIO.input(BUTTON_PIN) # Check if the button state has changed and print when it does if current_state != button_state: if current_state == GPIO.HIGH: print("Button released") else: print("Button pressed") button_state = current_state time.sleep(0.1) # Adjust the sleep time as needed except KeyboardInterrupt: # Clean up GPIO on exit GPIO.cleanup()
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie den folgenden Befehl im Terminal ausführen:
python3 button_without_debounce.py

Das Skript läuft kontinuierlich in einer Endlosschleife, bis Sie im Terminal Strg + C drücken.

  • Drücken Sie den Knopf einige Sekunden lang und halten Sie ihn gedrückt, dann lassen Sie ihn los.
  • Sehen Sie sich das Ergebnis im Terminal an.
PuTTY - Raspberry Pi
Button pressed Button pressed Button pressed Button released Button released

Manchmal hast du den Knopf nur einmal gedrückt und losgelassen. Dennoch erkennt der Raspberry Pi es als mehrere Druck- und Loslassvorgänge. Dies ist das Prellen-Phänomen, das am Anfang des Tutorials erwähnt wurde. Schauen wir mal, wie man das im nächsten Teil behebt.

Lesen eines Tasters mit Entprellung

Schnelle Schritte

  • Erstellen Sie eine Python-Skriptdatei button_debounce.py und fügen Sie den folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/tutorials/raspberry-pi/raspberry-pi-button-debounce import RPi.GPIO as GPIO # Set the GPIO mode to BCM GPIO.setmode(GPIO.BCM) # Define the GPIO pin for your button BUTTON_PIN = 16 # Define debounce time in milliseconds DEBOUNCE_TIME_MS = 200 # 200 milliseconds # Set the initial state and pull-up resistor for the button GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Initialize the button state and previous state button_state = GPIO.input(BUTTON_PIN) prev_button_state = button_state # Define a function to handle button presses def button_callback(channel): global button_state button_state = GPIO.input(BUTTON_PIN) # Add an event listener for the button press GPIO.add_event_detect(BUTTON_PIN, GPIO.BOTH, callback=button_callback, bouncetime=DEBOUNCE_TIME_MS) try: # Main loop while True: # Check if the button state has changed if button_state != prev_button_state: if button_state == GPIO.HIGH: print("Button released") else: print("Button pressed") prev_button_state = button_state except KeyboardInterrupt: # Clean up GPIO on exit GPIO.cleanup()
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie den folgenden Befehl im Terminal ausführen:
python3 button_debounce.py
  • Drücken Sie den Knopf für ein paar Sekunden und halten Sie ihn gedrückt, danach lassen Sie ihn los.
  • Überprüfen Sie das Terminal auf die Ergebnisse.
PuTTY - Raspberry Pi
Button pressed Button released

Wie Sie sehen können, haben Sie den Taster nur einmal gedrückt und losgelassen. Der Raspberry Pi erkennt dies als einen einzigen Tastendruck und das Loslassen, wodurch jegliches unnötiges Rauschen beseitigt wird.

Raspberry Pi Button-Entprellung für mehrere Buttons

# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/tutorials/raspberry-pi/raspberry-pi-button-debounce import RPi.GPIO as GPIO # Set the GPIO mode to BCM GPIO.setmode(GPIO.BCM) # Define the GPIO pins for your buttons BUTTON_PIN_1 = 14 BUTTON_PIN_2 = 15 BUTTON_PIN_3 = 18 # Define debounce time in milliseconds DEBOUNCE_TIME_MS = 200 # 200 milliseconds # Set the initial state and pull-up resistor for the buttons GPIO.setup(BUTTON_PIN_1, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(BUTTON_PIN_2, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(BUTTON_PIN_3, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Initialize the button states and previous states for all buttons button_state_1 = GPIO.input(BUTTON_PIN_1) button_state_2 = GPIO.input(BUTTON_PIN_2) button_state_3 = GPIO.input(BUTTON_PIN_3) prev_button_state_1 = button_state_1 prev_button_state_2 = button_state_2 prev_button_state_3 = button_state_3 # Define a function to handle button presses def button_callback_1(channel): global button_state_1 button_state_1 = GPIO.input(BUTTON_PIN_1) def button_callback_2(channel): global button_state_2 button_state_2 = GPIO.input(BUTTON_PIN_2) def button_callback_3(channel): global button_state_3 button_state_3 = GPIO.input(BUTTON_PIN_3) # Add event listeners for the buttons GPIO.add_event_detect(BUTTON_PIN_1, GPIO.BOTH, callback=button_callback_1, bouncetime=DEBOUNCE_TIME_MS) GPIO.add_event_detect(BUTTON_PIN_2, GPIO.BOTH, callback=button_callback_2, bouncetime=DEBOUNCE_TIME_MS) GPIO.add_event_detect(BUTTON_PIN_3, GPIO.BOTH, callback=button_callback_3, bouncetime=DEBOUNCE_TIME_MS) try: # Main loop while True: # Check if the button states have changed and print when they do if button_state_1 != prev_button_state_1: if button_state_1 == GPIO.HIGH: print("Button 1 released") else: print("Button 1 pressed") prev_button_state_1 = button_state_1 if button_state_2 != prev_button_state_2: if button_state_2 == GPIO.HIGH: print("Button 2 released") else: print("Button 2 pressed") prev_button_state_2 = button_state_2 if button_state_3 != prev_button_state_3: if button_state_3 == GPIO.HIGH: print("Button 3 released") else: print("Button 3 pressed") prev_button_state_3 = button_state_3 except KeyboardInterrupt: # Clean up GPIO on exit GPIO.cleanup()

Das Diagramm, das die Verkabelung des genannten Codes veranschaulicht:

Raspberry Pi Button-Bibliothek Verdrahtungsdiagramm

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Um Ihren Verdrahtungsaufbau zu vereinfachen und zu organisieren, empfehlen wir die Verwendung eines Schraubklemmenblock-Shields für Raspberry Pi. Dieses Shield gewährleistet sicherere und besser verwaltbare Verbindungen, wie unten gezeigt:

Raspberry Pi Schraubklemmenblock-Shield

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!