Espandiamo Raspberry Pi

di Ivan Scordato
Alcune volte, potremmo trovarci nella spiacevole situazione di non avere abbastanza pin GPIO a disposizione sul nostro Raspberry Pi, non potendo collegare tutti i sensori, moduli, pulsanti e relè che vogliamo. In questo articolo vedremo alcune soluzioni per espandere Raspberry Pi ed un esempio pratico di utilizzo del circuito integrato MCP23017.
Il Raspberry Pi ha un connettore GPIO con 40 pin, il Raspberry Pi 3 possiede le stesse dimensioni e pinout GPIO del Raspberry Pi 2, con la sola differenza di avere un layout leggermente differente per l’integrazione dei nuovi componenti hardware. La GPIO (General Purpose Input/Output) come dice il nome, è una porta generica di input/output collegata direttamente al processore che permette di collegare qualsiasi dispositivo che abbia un input/output digitale, potendo realizzare le più disparate applicazioni, come ad esempio controllare dei relè e leggere la temperatura da un sensore. Essendo un’interfaccia digitale, può inviare e ricevere soltanto segnali digitali, cioè alternanze, nel nostro caso, di 0 e 3.3 volt. Questo significa che se avessimo la necessità di dover utilizzare dei sensori o interfacce analogiche, è necessario utilizzare un convertitore analogico-digitale (ADC).

Figura 1: Pinout connettore GPIO Raspberry Pi 3

 
La possibilità di poter utilizzare questi pin per integrare quello di cui abbiamo bisogno in un determinato progetto o sistema personalizzato, è uno dei motivi principali per i quali il Raspberry Pi viene utilizzato nel campo della sperimentazione e progettazione di sistemi personalizzati. Bisogna prestare attenzione che i pin GPIO del Raspberry Pi lavorano a 3.3 V e collegare qualcosa che “funzioni” a 5 V su un pin GPIO equivale a compromettere il processore.

ESPANSIONE DEI PIN GPIO

Come accennato nell’introduzione, è possibile che a volte i pin nativi della board non siano abbastanza numerosi da permetterci di realizzare un progetto che necessita di più IN/OUT. Oppure il motivo per il quale si decide di espandere i pin potrebbe essere anche quello di volere realizzare una particolare breakout di collegamento, utilizzando un componente aggiuntivo per scelta progettuale.
Per espandere i pin GPIO del Raspberry Pi esistono diverse soluzioni. Nel caso in cui dovessimo collegare diversi pulsanti o relè ai pin GPIO, ma non vogliamo o più semplicemente non possiamo permetterci di collegarli direttamente al connettore GPIO, la soluzione che voglio consigliarvi è quella di utilizzare il circuito integrato MCP23017.

CARATTERISTICHE DEL CIRCUITO INTEGRATO MCP23017

Il MCP23017 viene prodotto da Microchip, ed è un expander di input/output che sfrutta il protocollo di comunicazione I2C, mettendo a disposizione 16 porte di I/O digitali. Il range di voltaggio di funzionamento del chip è di 1.8 – 5.5 V, risultando così perfetto per essere utilizzato in diversi circuiti con diverse configurazioni. Un altro aspetto interessante è anche quello di poter collegare insieme fino ad otto MCP23017, ottenendo 128 porte digitali di IN/OUT, gestibili sempre tramite i due fili del bus I2C.

Figure 2 e 3: MCP23017 e Pinout


 

IN PRATICA

In questo breve articolo vedremo come espandere Raspberry Pi 3, ma daremo le informazioni necessarie per poter espandere tutta la gamma di Rapberry in commercio (dal primissimo Raspberry Pi, fino a Raspberry Zero).

CONFIGURAZIONE SOFTWARE

Prima di potere utilizzare il MCP23017 con il nostro Raspberry Pi 3, dobbiamo abilitare il bus I2C tramite la configurazione di sistema, quindi sul terminale del Rpi digitiamo:

sudo raspi-config

Tramite l’interfaccia visuale, spostiamoci in Advanced Option e dopo avere abilitato il bus I2C, riavviamo il sistema per rendere effettive le modifiche:

sudo reboot

 

Figura 4: Abilitazione bus I2C

 
Adesso, sempre da terminale, eseguiamo i seguenti comandi per assicurarci che tutti i pacchetti siano correttamente installati ed aggiornati:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Installiamo SMBUS e il kit di sviluppo per Python:

sudo apt-get install python-smbus python3-smbus python-dev python3-dev

Installiamo i2c-tools:

sudo apt-get install i2c-tools

Per fare in modo che il software di gestione del bus I2C si avvii automaticamente all’accensione del Raspberry Pi, dobbiamo aggiungere una riga di testo contenente il comando corretto, quindi digitiamo:

sudo nano / etc / modules

Spostiamo il cursore fino ad arrivare all’ultima riga del file e aggiungiamo il seguente comando:

i2c-dev

Usciamo salvando le modifiche.
Adesso aggiungiamo l’utente pi al gruppo I2C, digitando sul terminale:

sudo adduser pi i2c

Una volta conclusi questi passaggi, riavviamo il sistema:

subo reboot

CONFIGURAZIONE DI SISTEMA

Per collegare il chip MCP23017 al Raspberry Pi, bisogna seguire la Figura 5 di collegamento:

Figura 5: Immagine di collegamento

Come avrai notato, non è stato necessario collegare alcuna resistenza di pullup sul bus i2c, in quanto queste resistenze sono già presenti sul circuito stampato del Rpi 3. L’immagine di collegamento propone una scheda Raspberry Pi 3, al quale è collegato un MCP23017 tramite bus i2c, al quale sono stati collegati dei led per l’esempio pratico. In questo esempio pratico ci concentreremo sul controllo delle uscite. Dopo avere collegato correttamente il circuito, potremo utilizzare questo codice scritto in Python per eseguire un test dell’expander:

1. import smbus
2. import time
3.
4. bus = smbus.SMBus(1)
5.
6. DEVICE = 0x20 # Indirizzo MCP23017 (A0-A2)
7. IODIRA = 0x00
8. OLATA = 0x14 # Registro degli output
9. GPIOA = 0x12 # Registro degli input
10.
11. # Imposta tutti i pin GPA pins come output impostando tutti
12. # I bit dei registri a 0
13. bus.write_byte_data(DEVICE,IODIRA,0x00)
Fare Elettronica 380/381 - Ottobre/Novembre 2017
28
14.
15. # Imposta tutti I pin di output a 0
16. bus.write_byte_data(DEVICE,OLATA,0)
17.
18. for MyData in range(1,8):
19. # Conta da 1 a 8: in binario conterà da 001 a 111
20. bus.write_byte_data(DEVICE,OLATA,MyData)
21. print MyData
22. time.sleep(1)
23.
24. # Imposta tutti i pin a 0
25. bus.write_byte_data(DEVICE,OLATA,0)

Come accennato in precedenza, per il nostro esempio abbiamo utilizzato un Raspberry Pi 3, ma tutto ciò riportato funziona con tutta la gamma di Raspberry, tranne la prima versione del Raspberry Pi con 256 MB di RAM, dove dovrete cambiare la riga:

4. bus = smbus.SMBus(1)

in questa maniera:

4. bus = smbus.SMBus(0)

Il codice è abbastanza semplice ed intuitivo grazie anche al fatto che è stato commentato, ma spieghiamo ugualmente il suo funzionamento passo passo. Prima di tutto importa le librerie smbus e time e subito dopo crea un oggetto denominato “bus”. Setta tutti i pin GPA come output e tramite un ciclo for conteggia da 1 a 8, impostando ogni pin GPA, nello stato logico 1, uno per volta con un intervallo di un secondo. Infine imposta tutti in pin a zero. Una volta salvato e avviato il programma, vedrai i LED accendersi in sequenza. Se non avete la possibilità di utilizzare il bus I2C in quanto siete costretti a dovere espandere i pin del vostro Raspberry Pi lontano dalla board, esiste la versione con comunicazione seriale: MCP23S17.

Figura 6: Pinout MCP23S17

Questa versione, a differenza della versione che abbiamo visto in precedenza, può essere gestita tramite protocollo seriale, ovviando al problema della distanza massima di collegamento supportata dall’I2C. Come sicuramente avrete notato dall’immagine, il Pinout di quest’ultimo componente è molto simile a quello proposto in precedenza, tranne naturalmente per la presenza dei pin per la comunicazione seriale.
Nel caso in cui avete già finito il vostro progetto, e vi siete resi conto del fatto che vi basta un pin expander con soltanto 8 IN/OUT piuttosto che 16, potreste optare per il MCP23008.

Figura 7: Pinout MCP23008

 
Un consiglio che posso dare è quello di ottimizzare il più possibile l’utilizzo dei pin che si hanno a disposizione. Ad esempio, se non ho bisogno di un’accuratezza particolarmente elevata per la misurazione della temperatura e umidità ambientale, piuttosto che optare per due sensori separati, utilizzare un DHT22 che permette di misurare entrambi. Oppure opto per dei sensori I2C.

CONCLUSIONE

In questo articolo abbiamo visto come è possibile aumentare il numero di pin disponibili sul nostro Raspberry Pi 3 ed un esempio pratico con il pin expander MCP23017. Per l’esempio presentato abbiamo utilizzato un codice scritto in Python, ma è possibile scegliere il linguaggio di programmazione che si preferisce. Per la gestione del bus I2C con il Raspberry Pi esistono delle librerie ben fatte che potrebbero facilitare di molto il lavoro, come ad esempio la libreria WiringPi o OpenElectrons_i2c

Redazione Fare Elettronica