I2C

In questo tutorial impareremo come funziona il protocollo di comunicazione I2C e ne faremo un esempio pratico con la scheda Arduino e un sensore che utilizza questo protocollo. Puoi guardare il seguente video o leggere il tutorial scritto qui sotto.

Panoramica

Il bus di comunicazione I2C è molto popolare e ampiamente utilizzato da molti dispositivi elettronici perché può essere facilmente implementato in molti progetti elettronici che richiedono la comunicazione tra un master e più dispositivi slave o anche più dispositivi master. Le facili implementazioni derivano dal fatto che sono necessari solo due fili per la comunicazione tra fino a quasi 128 (112) dispositivi quando si utilizzano indirizzi a 7 bit e fino a quasi 1024 (1008) dispositivi quando si utilizza l'indirizzamento a 10 bit.

Come funziona

Com'è possibile, una comunicazione tra così tanti dispositivi con solo i fili? Bene ogni dispositivo ha un ID preimpostato o un indirizzo univoco del dispositivo in modo che il master possa scegliere con quali dispositivi saranno in comunicazione.

I due fili o linee sono chiamati Serial Clock (o SCL) e Serial Data (o SDA). La linea SCL è il segnale di clock che sincronizza il trasferimento dei dati tra i dispositivi sul bus I2C e viene generato dal dispositivo master. L'altra linea è la linea SDA che trasporta i dati.

Le due linee sono "open-drain", il che significa che i resistori pull up devono essere collegati a loro in modo che le linee siano alte perché i dispositivi sul bus I2C sono attivi bassi. I valori comunemente usati per i resistori sono da 2K per velocità più elevate a circa 400 kbps, a 10K per velocità più bassa a circa 100 kbps.

Protocollo

Il segnale dati viene trasferito in sequenze di 8 bit. Quindi, dopo che si verifica una condizione di avvio speciale, arriva la prima sequenza di 8 bit che indica l'indirizzo dello slave a cui vengono inviati i dati. Dopo ogni sequenza di 8 bit segue un bit chiamato Acknowledge. 

Dopo il primo bit Acknowledge nella maggior parte dei casi arriva un'altra sequenza di indirizzamento ma questa volta per i registri interni del dispositivo slave. Dopo che le sequenze di indirizzamento seguono le sequenze di dati fino a quando i dati sono completamente inviati e finiscono con una condizione di arresto speciale.
 

Diamo un'occhiata più da vicino a questi eventi. La condizione di avvio si verifica quando la linea dati scende a livelli bassi mentre la linea dell'orologio è ancora alta. Dopo questo l'orologio inizia e ogni bit di dati viene trasferito durante ogni impulso di clock.

La sequenza di indirizzamento del dispositivo viene contrassegnata con il bit più significativo (MSB) e termina con il bit meno significativo (LSB) ed è composta da 7 bit poiché l'8 ° bit viene utilizzato per indicare se il master scrive sullo slave (logica basso) o letto da esso (alto logico).

Il bit successivo AKC / NACK viene utilizzato dal dispositivo slave per indicare se ha ricevuto correttamente la precedente sequenza di bit. Quindi, in questo momento il dispositivo master passa il controllo della linea SDA al dispositivo slave e se il dispositivo slave ha ricevuto con successo la sequenza precedente, trascinerà la linea SDA nella condizione chiamata Riconoscimento. Se lo slave non trascina la linea SDA verso il basso, la condizione viene chiamata Non riconoscere e significa che non ha ricevuto correttamente la sequenza precedente che può essere causata da diversi motivi. Ad esempio, lo slave potrebbe essere occupato, potrebbe non comprendere i dati ricevuti o il comando, non può ricevere altri dati e così via. In tal caso, il dispositivo master decide come procedere.

Di seguito sono riportati i registri interni. I registri interni sono posizioni nella memoria dello slave contenenti varie informazioni o dati. Ad esempio, l'accelerometro ADX345 ha un indirizzo di dispositivo univoco e indirizzi di registri interni aggiuntivi per l'asse X, Y e Z. Quindi, se vogliamo leggere i dati dell'asse X, per prima cosa dobbiamo inviare l'indirizzo del dispositivo e quindi il particolare indirizzo del registro interno per l'asse X. Questi indirizzi possono essere trovati dalla scheda tecnica del sensore .

Dopo l'indirizzamento, le sequenze di trasferimento dati iniziano dal master o dallo slave a seconda della modalità selezionata al bit R / W.Dopo che i dati sono stati inviati completamente, il trasferimento terminerà con una condizione di arresto che si verifica quando la linea SDA passa da bassa ad alta mentre la linea SCL è alta.

 

 

I2C e Arduino

I2C e Arduino

Ad esempio userò la scheda di sblocco GY-80 che consiste in 5 diversi sensori e la scheda di sblocco GY-521 che consiste in 3 diversi sensori. Quindi possiamo ottenere dati da 8 diversi sensori con solo due fili con il bus I2C.

È possibile acquistare questi componenti da ICStation, un rivenditore consigliato da HowToMechatronics:

·         Acceleratore a 3 assi ADXL345 ..................... .. Amazon  / Aliexpress

·         L3G4200D Giroscopio a 3 assi ...................... Amazon  / Aliexpress

·         Bussola elettronica 3 assi HMC5883L ......  Amazon / Aliexpress

·         3 in 1: Giroscopio a 3 assi con accelerazione magnetica a 3 assi GY-80 BMP085 .......... Amazon  /Aliexpress

·         2 in 1: Giroscopio e acceleratore a 6 assi MPU6050 ............. Amazon / Aliexpress

* Nota: questi sono collegamenti di affiliazione. Potrei fare una commissione se acquisti i componenti tramite questi collegamenti. 
Apprezzerei il tuo supporto in questo modo!

Ecco come collegheremo le schede. Il pin Serial Clock della scheda Arduino sarà collegato ai pin Serial Clock delle due schede breakout, lo stesso vale per i pin Serial Data e alimenteremo le schede con il Gnd e il pin 5V dalla scheda Arduino. Nota qui non stiamo usando resistori pull-up perché le schede breakout hanno già.

 

 

Ora per comunicare con questi chip o sensori dobbiamo conoscere i loro indirizzi unici. Li possiamo trovare dai datasheet dei sensori. Per la scheda di breakout GY-80 abbiamo i seguenti 4 indirizzi: un 0x53 esadecimale per il sensore dell'accelerometro a 3 assi, un 0x69 esadecimale per il giroscopio a 3 assi, un 0x1E esadecimale per il magnetometro a 3 assi e un 0x77 esadecimale per il barometro e il termometro sensore. Per la scheda breakout GY-521 abbiamo un solo indirizzo e questo è un 0x68 esadecimale.Possiamo anche ottenere o controllare gli indirizzi usando lo schizzo I2C Scanner che può essere trovato dal sito ufficiale di Arduino. Quindi, se carichiamo ed eseguiamo questo schizzo, otterremo gli indirizzi dei dispositivi collegati sul bus I2C.

Numero di parte del sensore Indirizzo I2C

Scheda tecnica ADXL345 0x53 Analog Devices 3 Accelerometer Axis                  

Scheda tecnica 3 Axis GyroST Microelectronics L3G4200D 0x69                  

Scheda tecnica del magnete 3 assi Honeywell MC5883L 0x1E                  

Barometro + termometro Bosch BMP085 0x77