• Tutte
  • Portfolio
  • Sviluppo
  • Tecnologia
  • La GPIO del Raspberry PI, accendiamo il primo LED!

    di Denis Torresan

    Nel nostro primo articolo su Raspberry PI, abbiamo accennato alla potenzialità dello strumento, non solo perchè di fatto è un “mini PC” completo, ma soprattutto perchè monta la GPIO, una porta da 40 pin, con cui poter interfacciare qualunque tipo di dispositivo elettrico e/o elettronico esterno, comandabile via software attraverso API o comandi di sistema.

    Il GPIO è comandato tramite l’integrato BCM2835.

    raspberry_pinoutUn buon sito da cui partire per orientarsi sulla piedinatura del GPIO è http://pinout.xyz/, che offre una vista interattiva di ogni singolo PIN con la descrizione, il suo significato ecc…

    Vediamo più da vicino la piedinatura.

    Innanzitutto va detto che di 40 pin disponibili, non tutti possono essere utilizzati come input / output, nel senso che ci sono alcuni pin dedicati all’alimentazione e alla massa.

    Si può subito notare che Raspberry PI fondamentalmente permette di gestire due livelli di tensione:

    • 3,3V: è il livello di tensione in uscita a tutti i pin di tipo BCM (Broadcom SOC channel), è anche la tensione da utilizzare per leggere il valore di un sensore.
    • 5v: Alimentazione standard “VCC” per alimentare in genere circuiti integrati di vario tipo

    ATTENZIONE: L’integrato che gestisce la GPIO è abbastanza sensibile e soprattutto non è protetto da picchi di tensione. Non bisogna MAI alimentare i pin contrassegnati con BCM con tensioni superiori ai 3.3v. Più avanti vedremo quale strategia adottare nel caso in cui un sensore abbia il pin di uscita con una tensione di 5v (anzichè 3,3v).

    Tabella dei PIN:

    • Alimentazione a 3,3v: Pin 1 e 17
    • Alimentazione a 5v: Pin 2 e 4
    • Messa a terra: Pin 6, 9, 14, 20, 25, 30, 34 e 39
    • BCM (Pin GPIO effettivi): Pin 3, 5, 7, 8, 10, 11, 12, 13, 15, 16, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 35, 36, 37, 38 e 40

     

    Come collegarsi al Raspberry PI?

    In rete ci sono moltissimi tutorial sui primi passi da seguire per poter accedere al Raspberry PI, diciamo che al primo boot, sarà necessario collegare la scheda ad una presa ethernet, successivamente trovare l’IP a cui risponde il Raspberry PI.

    Io ho verificato nel nostro router quali IP erano stati assegnati, e facilmente individuato l’IP della scheda.

    A questo punto, è sufficiente accedere in SSH con Linux o via PuTTY in Windows, tramite il comando:

    La password di default è: raspberry

    Facciamo chiarezza sulla codifica dei pin GPIO

    La GPIO, essendo un registro hardware, è comandabile nativamente dal sistema operativo attraverso alcuni comandi, che possono essere lanciati da riga di comando, e tramite API nel caso in cui si voglia costruire un software ad-hoc.

    La parte che ho trovato più confusionaria è la codifica dei singoli PIN, infatti a seconda del tipo di sistema utilizzato per numerare i singoli registri del GPIO, la numerazione cambia.

    Ancora una volta, il sito pinout.xyz, ci viene in aiuto, elencando per ogni PIN il corrispettivo valore numerico di riferimento che servirà per poterci interfacciare via software con quel determinato pin.

    Il valore più “standard” a cui fare riferimento è il numero BCM, ma attenzione che il numero BCM non ha una corrispondenza diretta con il reale PIN. Ad esempio, al BCM 17 corrisponde il pin fisico 11.

    Una seconda nomenclatura è quella utilizzata da WiringPi, un software di terze parti, che nella versione 3 risulta però già incluso nella distribuzione. In questo caso, ancora una volta, utilizzando WiringPi, la codifica sarà ancora diversa, nell’esempio precedente infatti, al BCM 17, corrisponde WiringPi 0!

    Riassumendo:

    • La piedinatura fisica della GPIO funziona contando da sinistra a destra e a scendere, in modo che tutti i numeri dispari corrispondano ai Pin di sinistra, e tutti i numeri pari corrispondano ai Pin di destra.
    • La codifica BCM è la codifica “nativa” di Raspberry PI, ed in particolare del chip BCM2835, e viene utilizzata per comandare i singoli Pin da linguaggi come ad esempio Python o altre librerie.
    • La codifica WiringPi, viene utilizzata solamente da WiringPi e quindi quando si vuole comandare una uscita da riga di comando (shell) e numera sostanzialmente tutti i Pin utili (quindi togliendo vcc e massa) in ordine crescente.

     

    Il nostro primo circuito

    Il circuito più “basic” possibile è sicuramente l’accensione di un LED tramite GPIO. Fin qui nulla di eclatante, sono cose che si possono fare tranquillamente anche con Arduino, ma da una base bisogna pur sempre partire 🙂

    Innanzitutto, come ricordato in precedenza, i pin del GPIO vanno sempre protetti con una resistenza al fine di limitare la corrente (sia in ingresso che in uscita). Per un LED è sufficiente una resistenza da 330 Ω – 1k Ω.

    L’esempio qui di seguito è uno schema completo. Per realizzarlo è sufficiente:

    • Il Raspberry PI (ovviamente) 🙂
    • 1 resistenza da 330 Ω (va bene anche 1KΩ)
    • 1 LED (colore indifferente, il rosso è il più comune)
    • 1 Breadboard dove implementare il circuito
    • 2 pezzi di filo di rame (isolato)

    raspberrypi_led

    Nel nostro circuito abbiamo collegato il pin 6 (ground) alla massa e il pin 11 (BCM 17) al segnale (+).

    NOTA: Il LED ha un orientamento, infatti le due estremità di collegamento hanno lunghezze diverse. Il catodo (-) è più corto, mentre l’anodo (+) è più lungo. Fare quindi attenzione al verso, il catodo andrà collegato al pin 6 (massa), mentre l’anodo andrà collegato alla resistenza e quindi al pin 11.

     

    Interfacciarsi con la GPIO

    Vediamo ora, dopo aver realizzato il circuito, in che modo ci si possa interfacciare al Pin 11 (BCM 17, oppure WiringPi 0), direttamente da sistema operativo.

    Usare WiringPi

    WiringPi è fondamentalmente il metodo più semplice per accedere alla GPIO, se non altro perchè si esegue direttamente da shell (SSH).

    Per prima cosa ci si deve assicurare di aver WiringPi installato, eseguiamo quindi i seguenti comandi (via SSH):

    A questo punto avremo un nuovo comando a disposizione, gpio, e per verificare che funzioni correttamente lanciamo i comandi:

    Qualunque pin del GPIO (tranne ovviamente i vcc e massa), può essere adoperato sia in ingresso che in uscita. Quindi prima di utilizzare il GPIO è necessario istruire il registro specifico ed indicare la modalità desiderata, in questo caso ‘out’.

    La sintassi è la seguente:

    gpio mode <PIN> out   :

    Il pin 0, corrisponde nell’esempio al pin fisico 11, BCM 17.

    Successivamente andiamo ad accendere e spegnere il pin con la sintassi:

    gpio write <pin> <stato>  , dove stato è il livello binario 0 o 1 che il pin corrispondente deve assumere:

    WiringPi permette attraverso il parametro “-g” di utilizzare la sintassi BCM di GPIO anzichè quella propria:

    Le due sintassi sono identiche, in quanto WiringPi 0 = BCM 17.

     

    Usare Python

    Python è il linguaggio di sviluppo predefinito in Raspberry PI, nel senso che storicamente è il primo linguaggio che ha avuto out-of-the-box l’integrazione con la GPIO.

    Oggi è possibile integrarsi alla GPIO anche in Node.js, linguaggio che preferisco, ma per questo ho in programma un articolo dedicato.

    Per Python bisogna ricordare che il modo più indicato (anche perchè ci sono molti più esempi in giro) è quello di utilizzare la codifica BCM.

    Usare un linguaggio anzichè dei comandi di sistema è certamente più interessante, perchè permette di integrare il GPIO all’interno di una logica (software) decisamente più complessa e realizzare delle applicazioni più interessanti.

    Vediamo lo stesso esempio di prima (accensione e spegnimento di un LED) pilotato tramite Python:

    Creare un nuovo file di testo chiamato “LED.py” scrivendo:

    Quindi inserire il seguente codice:

    Questo codice accende il led per 1 secondo quindi lo spegne.

    Per lanciare il codice utilizzare il comando (per accedere al GPIO servono i privilegi di admin, quindi è necessario usare il sudo):

    E’ chiaro che utilizzare un linguaggio di programmazione permette di fare molteplici cose, ad esempio si potrebbe realizzare un REST Server che opportunamente invocato permetta l’accensione e spegnimento di uno o più periferiche.

    Per il momento accontentiamoci di questo primo passo, ma a breve ho intenzione di scrivere un articolo specifico su un progetto che abbiamo sviluppato per un nostro cliente proprio utilizzando RaspberryPI, di cui rilasceremo anche il codice open souce che abbiamo sviluppato.

    Leggi anche...