Come Comunicazione I2C Funziona e Come utilizzarlo con Arduino

In questo tutorial impareremo come il protocollo di comunicazione I2C opere e 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

L’interfaccia I2C bus di comunicazione è molto popolare e ampiamente utilizzato da molti dispositivi elettronici, in quanto può essere facilmente implementato in molti disegni elettronici che richiedono la comunicazione tra un master e più slave o anche di 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 utilizza l’indirizzamento a 7 bit e fino a quasi 1024 (1008) dispositivi quando si utilizza l’indirizzamento a 10 bit.,

Come funziona

Come è possibile, una comunicazione tra tanti dispositivi con solo fili? Bene, ogni dispositivo ha un ID preimpostato o un indirizzo univoco del dispositivo in modo che il master possa scegliere con quali dispositivi comunicherà.

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 ed è 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 di 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 vanno da 2K per velocità più elevate a circa 400 kbps, a 10K per velocità inferiori a circa 100 kbps.

Protocollo I2C

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 di riconoscimento nella maggior parte dei casi arriva un’altra sequenza di indirizzamento, ma questa volta per i registri interni del dispositivo slave. Subito dopo le sequenze di indirizzamento segue le sequenze di dati come molti fino a quando i dati sono completamente inviati e termina con una condizione di arresto speciale.

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

La sequenza di indirizzamento del dispositivo inizia con il bit più significativo (MSB) per primo e termina con il bit meno significativo (LSB) ed è in realtà composta da 7 bit perché l’8 ° bit viene utilizzato per indicare se il master scriverà sullo slave (logic low) o leggerà da esso (logic high).,

Il bit successivo AKC / NACK viene utilizzato dal dispositivo slave per indicare se ha ricevuto correttamente la sequenza di bit precedente. 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, tirerà la linea SDA fino alla condizione chiamata Acknowledge., Se lo slave non abbassa la linea SDA, la condizione viene chiamata Not Acknowledge e significa che non ha ricevuto con successo la sequenza precedente che può essere causata da diversi motivi. Ad esempio, lo slave potrebbe essere occupato, potrebbe non comprendere i dati o il comando ricevuti, non ricevere più dati e così via. In tal caso il dispositivo master decide come procedere.

Il prossimo è l’indirizzamento dei registri interni. I registri interni sono posizioni nella memoria dello slave contenenti varie informazioni o dati., Ad esempio, l’accelerometro ADX345 ha un indirizzo univoco del dispositivo e l’aggiunta di indirizzi di registri interni per gli assi X, Y e Z. Quindi, se vogliamo leggere i dati dell’asse X, prima dobbiamo inviare l’indirizzo del dispositivo e quindi il particolare indirizzo di 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 stop che si verifica quando la linea SDA passa da bassa ad alta mentre la linea SCL è alta.

Esempio Arduino I2C

Ad esempio userò la breakout board GY-80 composta da 5 diversi sensori e la breakout board GY-521 composta da 3 diversi sensori. Quindi possiamo ottenere dati da 8 diversi sensori con solo due fili con il bus I2C.,

You can get these components from any of the sites below:

  • ADXL345 3-Axis Accelerator……………………………………………………… Amazon / Banggood / AliExpress
  • 2 in 1: MPU6050 6-Axis Gyroscope & Accelerometer ………………… Amazon / Banggood / AliExpress
  • 3 in 1: GY-80 9-Axis Magnetic Field Acceleration Gyroscope……… Amazon
  • 3 in 1: GY-86 10DOF MS5611 HMC5883L MPU6050 Module……… Banggood / AliExpress

Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.,

Ecco come collegheremo le schede. Il pin dell’orologio seriale della scheda Arduino sarà collegato ai pin dell’orologio seriale delle due schede di breakout, lo stesso vale per i pin dei dati seriali e noi 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 abbiamo bisogno di conoscere i loro indirizzi univoci. Possiamo trovarli dalle schede dei sensori., Per la breakout board GY – 80 abbiamo i seguenti 4 indirizzi: un esadecimale 0x53 per il sensore accelerometro a 3 assi, un esadecimale 0x69 per il giroscopio a 3 assi, un esadecimale 0x1E per il magnetometro a 3 assi e un esadecimale 0x77 per il sensore Barometro e termometro.

Vedi Anche

Arduino e MPU6050 Accelerometro e Giroscopio Tutorial

Per la GY-521 breakout board abbiamo solo l’indirizzo e esadecimale 0x68., Possiamo anche ottenere o controllare gli indirizzi utilizzando lo schizzo dello scanner Arduino I2C che può essere trovato dal sito ufficiale di Arduino. Quindi qui se carichiamo ed eseguiamo quello schizzo, otterremo gli indirizzi dei dispositivi collegati sul bus I2C.,

Sensore Numero di Parte I2C Indirizzo

3 Assi Accelerometro Dispositivi Analogici ADXL345 0x53 Foglio dati

3 Asse GyroST Microelettronica L3G4200D 0x69 Foglio dati

3 Asse Magnetometro Honeywell MC5883L 0x1E Foglio dati

Barometro Termometro Bosch BMP085 0x77 Foglio dati

Dopo aver trovato gli indirizzi dei dispositivi che abbiamo anche bisogno di trovare gli indirizzi dei loro registri interni per leggere i dati da loro., Ad esempio, se vogliamo leggere i dati per l’asse X dal sensore Accelerometro a 3 assi della scheda di sblocco GY-80, dobbiamo trovare l’indirizzo del registro interno in cui sono memorizzati i dati dell’asse X. Dalla scheda tecnica del sensore, possiamo vedere che i dati per l’asse X sono effettivamente memorizzati in due registri, DATAX0 con un indirizzo esadecimale 0x32 e DATAX1 con un indirizzo esadecimale 0x33.

Arduino I2C Code

Ora facciamo il codice che otterrà i dati per l’asse X., Quindi useremo la libreria Arduino Wire che deve essere inclusa nello schizzo. Qui per prima cosa dobbiamo definire l’indirizzo del sensore e i due indirizzi dei registri interni che abbiamo precedentemente trovato. filo.begin () funzione avvierà la libreria filo e anche abbiamo bisogno di avviare la comunicazione seriale perché useremo il monitor seriale per mostrare i dati dal sensore.

Nel loop() inizieremo con il Filo.beginTransmission () funzione che inizierà la trasmissione al particolare sensore, l’accelerometro a 3 assi nel nostro caso. Poi con il filo.,funzione write () chiederemo i dati particolari dai due registri dell’asse X. filo.endTransmission() terminerà la trasmissione e trasmetterà i dati dai registri. Ora con il filo.Funzione requestFrom () richiederemo i dati trasmessi o i due byte dai due registri.

Il filo.la funzione available () restituirà il numero di byte disponibili per il recupero e se quel numero corrisponde ai nostri byte richiesti, nel nostro caso 2 byte, usando il Filo.funzione read () leggeremo i byte dai due registri dell’asse X., Alla fine stamperemo i dati nel monitor seriale. Ecco quei dati, ma tieni presente che si tratta di dati grezzi e che è necessario eseguire alcuni calcoli matematici per ottenere i giusti valori dell’asse X. Potete trovare maggiori dettagli per questo nel mio prossimo tutorial per l’utilizzo di accelerometri con la scheda Arduino perché non voglio sovraccaricare questo tutorial perché il suo obiettivo principale era quello di spiegare come funziona la comunicazione Arduino I2C.

Author: admin

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *