Può essere pratico, soprattutto nei progetti di domotica, comunicare tra diversi dispositivi. Una delle tecniche comunemente usate è il protocollo I2C (o TWI). Il protocollo I2C è un metodo che permette di collegare diverse schede “Master” e diverse schede “Slave” e di comunicare fino a 128 dispositivi. Permette connessioni asincrone tra diversi componenti per condividere informazioni tramite un “bus comune”. Avevamo visto la comunicazione tramite la porta seriale (chiamata UART) che viene utilizzata per inviare il codice ad Arduino da un computer o per collegare due dispositivi in particolare in Bluetooth.
Apparecchiatura
- Computer
- Arduino UNO x2 o più
- Cavo jumper M/M x3 volte il numero di schede
Schema di collegamento del bus I2C tra schede Arduino
Con il protocollo I2C, è anche possibile comunicare tra diversi sistemi (sensori, schermo LCD, Raspberry Pi, ecc). Un esempio interessante è la comunicazione tra diverse schede Arduino. Per questo, dobbiamo scrivere almeno due programmi, uno per la scheda “Mistress” (Master) e l’altro per le schede “Slaves”.
Una comunicazione I2C è definita da un bus a due fili (talvolta chiamato TWI, Two Wire Interface) e un indirizzo. I pin utilizzati dalla comunicazione I2C sono di solito fissi per ogni dispositivo. Uno su cui vengono inviati i dati (SDA Serial Data Line) e l’altro il clock di sincronizzazione (SLC Serial Clock Line).
I2C / TWI pins:
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
In questo esempio usiamo una scheda Arduino Uno, quindi i pin A4 e A5.
Per far sì che le due schede comunichino tra loro, devono essere collegate correttamente (A4 con A4 e A5 con A5) e non dimenticate di collegare le masse (GND) come mostrato nello schema seguente.
Attenzione: Se i pin A4 e A5 sono collegati ai pin di una scheda non alimentata, il codice si bloccherà al momento della trasmissione.
Generalmente, una scheda invierà informazioni (writer) e un’altra le riceverà (reader).
Codice di configurazione del bus I2C
La libreria Wire.h permette di definire facilmente la comunicazione seriale sul bus I2C. Le funzioni sono simili alla libreria Serial.
- Wire.begin () inizializza l’indirizzo del dispositivo. Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Code of the “Master” card
“Slave” card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the “Master” card:
In the serial monitor of the “Slave 1” card:
We can see that the two cards are exchanging information. È molto facile estendere questo esempio a diverse schede Arduino (Leonardo, Mini, ecc.) adattando il cablaggio e l’indirizzo dei componenti nel codice “Slave”.
Codice per identificare i dispositivi collegati al bus I2C
Un buon test per sapere se i vostri dispositivi comunicano bene tra loro è quello di utilizzare il codice qui sotto (I2CScanner) ) che restituisce tutti gli indirizzi dei dispositivi collegati alla scheda Master.