Raspberry Pi - Knop - Debounce

Wanneer een knop wordt ingedrukt of losgelaten, of wanneer een schakelaar wordt omgezet, denken beginners vaak dat de status simpelweg verandert van LOW naar HIGH of van HIGH naar LOW. In werkelijkheid is dit niet het geval. Door mechanische en fysieke eigenschappen kan de status van de knop (of schakelaar) meerdere keren snel wisselen tussen LOW en HIGH. Dit fenomeen staat bekend als chattering. Chattering kan ertoe leiden dat één keer drukken wordt gelezen als meerdere drukken, wat in bepaalde toepassingen problemen kan veroorzaken.

chattering fenomeen

De methode om dit probleem te voorkomen wordt debounce of debouncing genoemd. In deze tutorial leert u hoe u dit toepast bij het gebruik van een knop met de Raspberry Pi. We doorlopen de volgende stappen:

Hardware Benodigd

1×Raspberry Pi 5
1×Breadboard-mount knop met dop
1×Breadboard-mount knop kit
1×Paneel-mount drukknop
1×Drukknopmodule
1×Breadboard (experimenteerprint)
1×Jumper draadjes
1×(Aanbevolen) Schroefklem Block Shield voor Raspberry Pi
1×(Aanbevolen) Raspberry Pi Prototyping Basisplaat & Breadboard Kit
1×(Aanbevolen) HDMI-Touchscreen-Monitor voor Raspberry Pi

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de Knop

Als u niet bekend bent met knoppen, inclusief hun pinout, werking en programmering, kunnen de volgende tutorials u meer informatie bieden:

Aansluitschema

Raspberry Pi Knop aansluitschema

This image is created using Fritzing. Click to enlarge image

Laten we de verschillen bekijken tussen Raspberry Pi code MET en ZONDER debounce, en hun respectievelijke gedragingen.

Knop uitlezen zonder Debounce

Voordat u debouncing begrijpt, bekijkt u eerst de code zonder debounce en observeert u het gedrag.

Snel Starten

  • Zorg dat u Raspbian of een ander Raspberry Pi compatibel besturingssysteem op uw Pi hebt geïnstalleerd.
  • Zorg dat uw Raspberry Pi verbonden is met hetzelfde lokale netwerk als uw pc.
  • Zorg dat uw Raspberry Pi met internet is verbonden als u libraries moet installeren.
  • Bent u nieuw met Raspberry Pi? Bekijk dan hoe u de Raspberry Pi installeert.
  • Verbind uw pc via SSH met de Raspberry Pi, gebruikmakend van de ingebouwde SSH client op Linux of macOS, of PuTTY op Windows. Zie hoe u pc met Raspberry Pi verbindt via SSH.
  • Controleer of de RPi.GPIO bibliotheek geïnstalleerd is. Zo niet, installeer deze met het volgende commando:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Maak een Python scriptbestand aan met de naam button_without_debounce.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/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()
  • Sla het bestand op en voer het script uit met het volgende commando in de terminal:
python3 button_without_debounce.py

Het script draait in een oneindige lus totdat u in de terminal Ctrl + C indrukt.

  • Druk de knop in en houd deze enkele seconden ingedrukt, laat daarna los.
  • Bekijk de uitvoering in de terminal.
PuTTY - Raspberry Pi
Button pressed Button pressed Button pressed Button released Button released

Soms heeft u de knop maar één keer ingedrukt en losgelaten, maar registreert de Raspberry Pi dit als meerdere drukken en loslatingen. Dit is het hierboven beschreven chattering fenomeen. Laten we zien hoe we dit oplossen in het volgende deel.

Knop uitlezen met Debounce

Snel Starten

  • Maak een Python scriptbestand aan met de naam button_debounce.py en voeg de volgende code toe:
# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/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()
  • Sla het bestand op en voer het script uit met het volgende commando in de terminal:
python3 button_debounce.py
  • Druk de knop in en houd deze een paar seconden ingedrukt en laat los.
  • Bekijk het resultaat in de terminal.
PuTTY - Raspberry Pi
Button pressed Button released

Zoals u ziet, heeft u de knop slechts één keer ingedrukt en losgelaten. De Raspberry Pi registreert dit als een enkele druk en loslating, waardoor onnodige ruis wordt geëlimineerd.

Raspberry Pi Knop Debounce voor Meerdere Knoppen

# Deze Raspberry Pi code is ontwikkeld door newbiely.nl # Deze Raspberry Pi code wordt zonder enige beperking aan het publiek beschikbaar gesteld. # Voor volledige instructies en schema's, bezoek: # https://newbiely.nl/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()

Het volgende schema toont de bedrading voor de genoemde code:

Raspberry Pi Knop multiple debounce bedrading

This image is created using Fritzing. Click to enlarge image

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt u stap voor stap het debounce principe te begrijpen en toe te passen met de Raspberry Pi.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!