Met de GPIO-pinnen van Raspberry Pi kun je de bijvoorbeeld knoppen en schakelaars aansluiten. Door de toestand van de gebruikte pinnen uit te lezen, houd je de knop of schakelaar in de gaten. Zo doe je dat in Python.
Je kunt op verschillende manier de toestand van pinnen in de gaten houden in Python. Lees hieronder wat je beter niet kunt doen en een manier die wel werkt.
GPIO-pinnen uitlezen met een lus
Misschien wil je pinnen controleren in een while-lus. Maar het opvragen van de toestand van een pin met een while-lus heeft een zeer ernstig neveneffect: het zorgt dat de SoC (System-on-Chip) van de Raspberry Pi heet wordt en het systeem volledig belast wordt – de Raspberry Pi is alleen maar bezig met het opvragen van de toestand van de pin.
Voor de hand liggend, maar uit den boze is het om time.sleep() te gebruiken om de lus te vertragen. Als je dit doet reageert de Pi alleen met een vertraging bij het indrukken van de knop.
De verstandige oplossing is dat de Pi zelf voor het monitoren zorgt en aan het programma laat weten wanneer de toestand van de pin verandert, zoals hieronder.
Ontvang gratis meer info over Raspberry Pi en Python, schrijf je in voor de nieuwsbrief:
GPIO-pinnen Raspberry Pi via event uitlezen
Om de Raspberry Pi zelf de pin te laten monitoren, moet je:
- voor de gewenste pin een event registreren;
- een functie beschikbaar stellen die wordt aangeroepen zodra er iets gebeurt op de pin.
Het volgende Python-voorbeeld sluit de Raspberry Pi af wanneer je op de aan-uit-knop drukt die verbonden is met pin 5. De functie buttonPress wordt daarbij aangeroepen.
import RPi.GPIO as GPIO
import time
from subprocess import call
def buttonPress(pin):
if not GPIO.input(5):
print(“Shutdown”)
call([‘shutdown’, ‘-h’,
‘now’], shell=False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(5, GPIO.IN)
GPIO.add_event_detect(
5, GPIO.BOTH,
callback=buttonPress
)
while True:
time.sleep(5)
Aanroepen van de functie – gebruiken voor aan-uit knop Raspberry Pi
Het aanroepen van de functie GPIO.add_event_detect() registreert met de parameter GPIO.BOTH de functie buttonPress() bij de event-handler in het geval dat Raspian op pin 5 een vallend ( GPIO.FALLING ) of een stijgend ( GPIO.RISING ) spanningsniveau detecteert.
Daarbij ontvangt buttonPress() het nummer van de pin waar de spanningsverandering op werd gedetecteerd.
Je kunt dit voorbeeldprogramma opslaan onder de naam pishutdown.py en vervolgens aanroepen met sudo python3 pishutdown.py. Je kunt je Raspberry Pi dan afsluiten door op de knop te drukken en op dezelfde manier weer opstarten.
Hieronder zie je nog een overzicht van de GPIO-pinnen Raspberry Pi:
Meer doen met de GPIO-pinnen Raspberry Pi
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
- Toestand van een pin (deze pagina)
- Potentiaal van de 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)