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.

come installare raspbian su raspberry

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.

Raspberry tutorial per principianti

Antonio Lamorgese

Amministratore di rete e sviluppatore. Dopo anni di esperienza nel settore, ho ideato un sistema di gestione dati MYSQL in PHP senza scrivere una sola riga di codice. Scopri di piĆ¹....