Controllo dei pin GPIO del Raspberry Pi da script Bash

Impareremo, in questa guida, ad utilizzare uno script Bash, quindi, senza impiegare un linguaggio di programmazione tradizionale, per azionare dei led sfruttando il controllo dei pin GPIO del Raspberry.

Materiale occorrente

Innanzitutto, ma è assodato che lo sia, abbiamo bisogno di un Raspberry Pi (io userò il Pi 3 Model B, ma qualsiasi modello con pin GPIO funzionerà a dovere – nel caso in cui volessi utilizzare un Raspberry Pi Zero dovrai effettuare alcune saldare). Presumo che tu abbia almeno un Pi 2 o 3 con 40 pin;

Un alimentatore per il tuo Pi, solitamente già fornito nella confezione;

Una custodia è solitamente consigliata per proteggere il Raspberry Pi (anche se dovrai lasciare il coperchio leggermente sollevato per esporre i pin GPIO a cui collegare i led);

Una scheda Micro SD su cui installare il sistema operativo (oppure utilizzare il sistema operativo preinstallato sulla MicroSD già fornita);

Un set di semafori a led della Low Voltage Labs;

Una tastiera USB per configurare e programmare il Raspberry;

Un monitor HDMI da collegare al Raspberry;

Fissaggio del semaforo

I semafori della Low Voltage Labs si collegano al Raspberry Pi utilizzando quattro pin. Uno di questi deve essere necessariamente collegato alla massa, gli altri tre sono 3 pin della GPIO utilizzati per controllare ogni singolo LED.

controllo dei pin GPIO

Prima di accendere il Raspberry, collega il semaforo in modo che i pin si colleghino ai pin della GPIO evidenziati in rosso (vedi figura):

controllo dei pin GPIO

Un sistema semplice per assicurarti di averlo correttamente collegato è individuare la fila di pin GPIO da utilizzare, quindi, mentre guardi il Raspberry con le porte USB orientate verso il basso, conta 8 pin e collega il semaforo esattamente come in figura).

controllo dei pin GPIO
controllo dei pin GPIO

Non accendere ancora il Raspberry, prima dovrai procurarti un’immagine del sistema operativo da installare…

Configurazione del sistema operativo

Installa il sistema operativo Raspbian (solitamente già presente sulla MicroSD) che comunque, può essere anche scaricato direttamente dal sito ufficiale Raspberry Pi.

Ho trovato un utile tool gratuito, chiamato Etcher reperibile sul sito Resin.io per trasferire l’immagine del sistema operativo direttamente sulla scheda micro SD, senza preoccuparti di doverla prima formattare o eseguire altre operazioni preliminari.

Anche questa operazione è molto semplice da effettuare, in ogni caso, guarda questo video per effettuare l’operazione in totale sicurezza.

Una volta installato il sistema operativo, assicurati di poter accedere e di avere configurato una connessione Internet cablata o wifi funzionante.

Ora puoi proseguire allo step successivo e iniziare ad accendere e spegnere i led del nostro semaforo…!

Installazione delle dipendenze

Poiché Bash viene fornito con il sistema operativo, l’unica cosa rimasta da installare è git, che ti permetterà di scaricare da internet lo script pronto per essere eseguito dal Raspberry, quindi digita le righe di comando direttamente da terminale, le quali ti permetteranno di installare git e di scaricare il codice di esempio da internet pronto per mettere in azione il nostro semaforo:

$ sudo apt-get install git
$ git –versiongit

Download del codice di esempio

Clicca su questo link e successivamente sul pulsante verde “Code” e ancora su download Zip. Oppure digita direttamente da terminale il seguente comando:

$ git clone https://github.com/simonprickett/bash-traffic-lights-pi.git

Decomprimi il file zip e al suo interno troverai la cartella “bash-traffic-lights-pi-master“ con alcuni file al suo interno tra cui anche il file “trafficlights.sh”.

A questo punto trascina sul desktop la cartella “bash-traffic-lights-pi-master“, e tienila in sospeso per qualche minuto, ci servirà successivamente.

Il file “trafficlights.sh” contiene tutti i comandi in bash per poter configurare le linee GPIO e azionare il semaforo a led.

Accesso ai pin GPIO da script Bash

Senza aggiungere ulteriori dipendenze, gli script Bash possono accedere e controllare i pin GPIO del Raspberry utilizzando sysfs. Il processo di configurazione di tali pin, si limita alla semplice gestione di un insieme di percorsi del filesystem che possono essere manipolati per configurare ogni singolo pin del GPIO come input o output e per impostare e/o leggere i loro valori. Su Raspbian, questi percorsi sono simili a questo:

/sys/class/gpio/gpio<pin_number>

e ognuno ha una /direction  (direzione ad esempio, in e out) e un /value (valore), ad esempio per GPIO 11:

/sys/class/gpio/gpio11/direction
/sys/class/gpio/gpio11/value

Come vedremo più avanti in questo articolo, la direzione e il valore possono essere impostati passando opportuni parametri a questi “percorsi” come utente root sul Raspberry.

Lo schema di numerazione dei pin utilizzato da sysfs è quello previsto dalla Broadcom (BCM), quindi i numeri dei pin che è necessario utilizzare corrisponderanno a quelli raffigurati in figura:

controllo dei pin GPIO

Esecuzione dello script

Avviare lo script è semplice, innanzitutto dalla decompressione, effettuata precedentemente, del file zip dal repository GitHub abbiamo ottenuto una cartella posizionata sul desktop, ricordi?

Adesso digita i seguenti comandi per poter eseguire lo script:

$ cd bash-traffic-lights-pi
$ sudo ./trafficlights.sh

Per interrompere la demo, premi Ctrl-C in qualsiasi momento.

Nota l’uso di sudo quando si avvia lo script. Ciò gli consente di funzionare come utente root con accesso per scrivere i percorsi dei file necessari per controllare i pin GPIO usando sysfs.

Come funziona

Dando un’occhiata al codice, contenuto nello script trafficlights.sh, possiamo notare che:

Le righe dalla 1 alla 13 impostano alcune variabili in modo da associare dei nomi più significativi a queste variabili che successivamente verranno richiamate nello script. 

Il LED rosso è sul pin GPIO 9, quello giallo sul pin 10 e il verde sul pin 11. Abbiamo anche astratto il percorso di base /sys/class/gpio poiché lo useremo molto spesso e quindi per evitare ripetizioni useremo la variabile associata per comodità. 

ON OFF vengono utilizzati in quanto sono più significativi dei valori booleani effettivi 1 e 0 che verranno utilizzati dallo script.

Esportazione di pin

Per poter utilizzare un pin GPIO tramite sysfs, dobbiamo prima “esportare”, attraverso il comando export, i percorsi relativi ai vari pin per rendere disponibili i successivi comandi di gestione delle linee della GPIO. 

La funzione exportPin alle righe 16–21 fa proprio questo. Ad esempio, per esportare il pin 9 utilizzerà il seguente comando:

echo “9”> /sys/class/gpio/export

Questo crea una struttura di percorsi appropriati di /sys/class/gpio per il pin 9 ma verrà sollevato un errore se tali percorsi esistono già. Per ovviare questo, la funzione exportPin  controlla prima ed esporterà un pin, solo se il percorso non esiste già.

Impostazione della direzione dei pin GPIO

I pin possono essere utilizzati, rispettivamente, per l’input o per l’output di un segnale. In questo caso dobbiamo usarli come uscite per controllare ciascuno dei tre LED sul semaforo. 

La funzione setOutput (righe 24–27) lo fa, attraverso il parametro “out” inviato alla cartella “direction” per il rispettivo pin. Esempio per impostare il pin GPIO 9 come uscita, lo si fa eseguendo il seguente comando:

echo “out”> /sys/class/gpio/gpio9/direction

Accensione e spegnimento delle luci

La funzione setLightState alle righe 30–33 gestisce l’accensione e lo spegnimento di ogni led impostando il suo rispettivo pin GPIO su high (1 – acceso) o low (0 – spento). 

E Lo fa, quindi, scrivendo il valore 1 o 0 verso il percorso “value” per il pin desiderato. Esempio per il pin 9 del GPIO il seguente comando imposta a 1 logico, quindi a 3.3 volt tale pin, e quindi accenderà il relativo led connesso:

echo “1”> /sys/class/gpio/gpio9/value

Disattivazione di tutto all’uscita

Il codice verrà eseguito in un ciclo infinito che termina quando si preme Ctrl-C e il segnale SIGINT viene inviato allo script che ne bloccherà l’esecuzione. 

Per spegnere tutte e tre i led quando questo segnale viene inviato, dobbiamo intercettare e gestire il segnale SIGINT. Ciò si ottiene con il codice alle righe 44–50 che definiscono una funzione shutdown e la registrano come gestore per il segnale SIGINT.

shutdown richiama un’altra funzione di utilità che a sua volta richiama setLightState che spegne i tre led. Quindi utilizza exit per interrompere in modo pulito lo script, restituendo, così, il controllo alla shell di Linux.

Il loop principale dello script

Il punto di ingresso dello script inizia alla riga 52 e utilizza le funzioni definite in precedenza per esportare ciascuno dei tre pin richiesti e per impostarli come output. Quindi richiama la funzione di utilità allLightsOff che ci garantisce che tutti e tre i LED del semaforo siano spenti in modo da essere nello stato richiesto per poter iniziare poi il loop.

Le righe dalla 66 alla 89 eseguono un ciclo infinito in cui utilizziamo setLightState per accendere e spegnere i singoli LED del semaforo nell’ordine. 

Il comando sleep consente al codice di mantenere lo stato del led interessato per alcuni secondi prima di passare a quello successivo.

In questo video tutorial vedrai in pratica come controllare i pin digitali GPIO del Raspberry per l’input-output provando ad accendere un led direttamente da terminale.

Fonte: https://medium.com/coinmonks/controlling-raspberry-pi-gpio-pins-from-bash-scripts-traffic-lights-7ea0057c6a90

Seguimi su

Antonio Lamorgese

Amministratore di rete, programmatore ed esperto di pratiche SEO. Dopo anni di esperienza nel settore, ho ideato un generatore di codice PHP Scopri di più su https://www.phpcodewizard.it.