Gestione efficiente delle porte GPIO del Raspberry Pi con interrupt e chiamate asincrone

raspberry-pi

Nonostante la libreria RPi.GPIO disponga già da diversi anni di funzioni per gestire le porte GPIO in maniera asincrona spesso vedo ancora tutorial che suggeriscono, ad esempio, di rilevare la pressione di un tasto utilizzando il semplice polling.

Cioè, per esemplificare, qualcosa del genere:

import RPi.GPIO as GPIO

while True:
    if (GPIO.input(25)):
        print("Click!")

Come primo approccio può andare anche bene ma se vogliamo che il nostro programma sia efficiente e non sovraccarichi troppo il sistema con un loop infinito lasciandolo libero anche di svolgere altre funzioni è consigliabile utilizzare un’altra tecnica.

Possiamo usare la funzione add_event_detect() per chiedere alla libreria di eseguire una nostra procedura al verificarsi di un determinato evento:

import RPi.GPIO as GPIO

def click(channel):
    print("Click!")

GPIO.add_event_detect(25, GPIO.RISING, callback=click)

In questo caso la funzione click() verrà eseguita in un thread separato al presentarsi di un fronte di salita sulla porta 25.

Tale fronte di salita, ad esempio, potrebbe essere determinato dal rilascio di un pulsante collegato alla porta se questa è stata collegata con una resistenza di pull-up.

Una volta agganciata la funzione di callback all’evento che ci interessa, nel nostro programma potremo tranquillamente dedicarci ad altri compiti o anche solo non fare nulla, risparmiando energia, nel caso il sistema sia alimentato a batteria.

Al verificarsi dell’evento richiesto, la nostra routine di gestione verrà comunque sempre messa in esecuzione in maniera asincrona e in un thread indipendente dal resto del programma.

{Come impostare la configurazione di una porta o anche come gestire la molteplicità di fronti di salita provenienti da un singolo rilascio del pulsante, come quasi sempre capita quando meccanica ed elettronica interagiscono, con tecniche di debouncing o antirimbalzo lo vedremo magari in un altro post. Se ti interessa qualcuno di questi argomenti o approfondire quelli trattati nel post scrivimi una nota nei commenti. :-)}

 

 

4 pensieri su “Gestione efficiente delle porte GPIO del Raspberry Pi con interrupt e chiamate asincrone”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *