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.
Indice del Post...
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.
Prima di accendere il Raspberry, collega il semaforo in modo che i pin si colleghino ai pin della GPIO evidenziati in rosso (vedi figura):
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).
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:
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 e 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.