Wil je de Raspberry Pi GPIO-pinnen gebruiken om knoppen aan te sluiten? Zo programmeer je dat in Python en voorkom je het probleem van ‘bouncen’ dat hierbij optreedt.
Wat is bouncen bij knoppen?
Een algemeen probleem met mechanische knoppen en schakelaars is het zogenaamde bouncen (denderen). Dit probleem wordt veroorzaakt doordat het sluitcontact de rustcontacten niet onmiddellijk en permanent overbrugt.
Het beweeglijke sluitcontact onderbreekt en sluit de contacten verschillende keren na elkaar totdat uiteindelijk een stabiele toestand is bereikt. Daar kun je bij het aansluiten op de Raspberry Pi pinnen en programmeren rekening mee houden.
Raspberry Pi GPIO-pinnen gebruiken voor knoppen
De Raspberry Pi leest de GPIO-pinnen zo snel uit dat hij de toestandsveranderingen bij bouncen interpreteert als het meervoudig snel indrukken.
Het bouncen duurt gewoonlijk slechts enkele milliseconden en is te voorkomen door een condensator van 10 tot 100 nF parallel aan de drukknop of schakelaar te solderen. Je kunt er ook bij het programmeren rekening mee houden.
De drukknop kun je bijvoorbeeld aansluiten tussen pin 5 (GPIO3) en pin 6 (massa), pin 5 is bestemd voor aansluiten van een aan-uitknop voor de Pi. Je kunt maar keuze andere pinnen gebruiken om knoppen aan te sluiten, zoals uitgelegd in het overzicht van GPIO-pinnen.
Programmeren in Python en bouncen negeren
De GPIO-pinnen gebruiken gaat het makkelijkst als je eerst de GPIO-bibliotheek toevoegt in je code met import RPi.GPIO as GPIO (zoals ook hier beschreven), die allerlei functies toevoegt voor de pinnen.
Voor de functie add_event_detect() is er de parameter bouncetime, waarmee je kunt opgeven hoeveel milliseconden de Raspberry Pi zo’n snelle toestandsverandering moet negeren – in het onderstaande voorbeeld 500 milliseconden:
GPIO.add_event_detect(
5, GPIO.BOTH,
callback=buttonPress,
bouncetime=500
)
De knop is in dit voorbeeld aangesloten op pin 5. Aangezien je de aan-uitknop normaal niet snel achter elkaar zult indrukken, is een bouncetime van een halve seconde geen probleem.
Ontvang gratis meer workshops over Raspberry Pi en Python, schrijf je in voor de nieuwsbrief:
Gebruiken voor andere soorten knoppen
Voor andere toepassingen dan een aan-uitknop, zoals gebruikersinvoer, moet je de waarde van de bouncetime verlagen, bijvoorbeeld tot 100 milliseconden, en daarnaast nog een condensator aansluiten.
Voor knoppen moet je ook overwegen of je echt op beide signaalflanken wilt reageren door GPIO.BOTH te specificeren, of slechts op één.
In het laatste geval moet je weer rekening houden met de schakellogica: bij active low betekent GPIO.FALLING dat je de knop indrukt, en GPIO.RISING dat je hem loslaat.
Knoppen uitlezen met de Raspberry Pi
Het probleem van bouncen bij het uitlezen van knoppen is te zien in onderstaande grafiek. Het beweeglijke sluitcontact onderbreekt en sluit de contacten verschillende keren na elkaar totdat uiteindelijk een stabiele toestand is bereikt.
Meer doen met de Raspberry Pi GPIO-pinnen
De Raspberry Pi dankt zijn succes in de hobbywereld aan zijn GPIO-aansluitingen. Met de juiste Python-bibliotheek en onze instructies lukken zelfs complexe taken.
In de inleiding Raspberry Pi GPIO pinnen: een overzicht van de aansluitingen wordt de lay-out van de GPIO-pinnen beschreven.
In deze serie komen de volgende onderwerpen aan bod:
- Led schakelen met GPIO-pinnen
- Bouncetime (deze pagina)
- Potentiaal van de pin
- Toestand van een pin
- Event-lussen
- Voetschakelaar
- Asynchrone functies
Meer projecten voor de Raspberry Pi vind je bij Raspberry Pi projects
(Deze informatie is afkomstig uit het artikel in c’t 4/2022, pagina 134, van Mirko Dölle en Marco den Teuling)