În acest tutorial vom invata cum I2C protocol de comunicare funcționează și, de asemenea, vom face un exemplu practic cu Placa Arduino si un senzor care utilizează acest protocol. Puteți viziona următorul videoclip sau puteți citi tutorialul scris mai jos.,
magistrala de comunicare I2C este foarte populară și folosită pe scară largă de multe dispozitive electronice, deoarece poate fi ușor implementată în multe modele electronice care necesită comunicare între un master și mai multe dispozitive slave sau chiar mai multe dispozitive master. Implementările easy vine cu faptul că doar două fire sunt necesare pentru comunicarea între până la aproape 128 (112) dispozitive atunci când se utilizează 7 biți de adresare și până la aproape 1024 (1008) dispozitive atunci când se utilizează 10 biți de adresare.,
Cum Funcționează
Cum este posibil, o comunicare între atât de multe dispozitive cu doar la fire? Ei bine, fiecare dispozitiv are un ID presetat sau o adresă unică a dispozitivului, astfel încât comandantul poate alege cu ce dispozitive vor comunica.
cele două fire sau linii sunt numite ceas Serial (sau SCL) și date seriale (sau SDA). Linia SCL este semnalul de ceas care sincronizează transferul de date între dispozitivele de pe magistrala I2C și este generat de dispozitivul principal. Cealaltă linie este linia SDA care poartă datele.,
Cele două linii sunt „open-drain”, ceea ce înseamnă că trage rezistențe trebuie să fie atașate la acestea, astfel încât liniile sunt mari pentru dispozitivele de pe magistrala I2C sunt active în low. Valorile utilizate în mod obișnuit pentru rezistențe sunt de la 2k pentru viteze mai mari la aproximativ 400 kbps, la 10k pentru viteze mai mici la aproximativ 100 kbps.
Protocolul I2C
semnalul de date este transferat în secvențe de 8 biți., Deci, după ce apare o condiție specială de pornire, apare prima secvență de biți 8 care indică adresa sclavului la care sunt trimise datele. După fiecare secvență de biți 8 urmează un pic numit recunoașteți. După primul bit de recunoaștere, în majoritatea cazurilor vine o altă secvență de adresare, dar de data aceasta pentru registrele interne ale dispozitivului slave. Imediat după secvențele de adresare urmează secvențele de date cât mai multe până când datele sunt trimise complet și se termină cu o condiție specială de oprire.
Să aruncăm o privire mai atentă la aceste evenimente., Condiția de pornire apare atunci când linia de date scade scăzut în timp ce linia de ceas este încă mare. După aceasta, ceasul pornește și fiecare bit de date este transferat în timpul fiecărui impuls de ceas.
secvența de adresare a dispozitivului are mai întâi bitul cel mai semnificativ (MSB) și se termină cu bitul cel mai puțin semnificativ (LSB) și este de fapt compus din biți 7, deoarece bitul 8 este utilizat pentru a indica dacă maestrul va scrie sclavului (logic low) sau va citi din acesta (logic high).,
următorul bit AKC/ NACK este utilizat de dispozitivul slave pentru a indica dacă a primit cu succes secvența anterioară de biți. Deci, în acest moment dispozitivul master mâinile controlul de linia SDA la dispozitivul slave și dacă dispozitivul slave a primit cu succes de secvența anterioară se va trage linia SDA la boala numita Recunosc., Dacă sclavul nu trage linia SDA în jos, condiția se numește nu recunoaște și înseamnă că nu a primit cu succes secvența anterioară, care poate fi cauzată de mai multe motive. De exemplu, sclavul ar putea fi ocupat, s-ar putea să nu înțeleagă datele primite sau comanda, nu poate primi alte date și așa mai departe. Într-un astfel de caz, dispozitivul principal decide cum va proceda.
Următorul este registrele interne de adresare. Registrele interne sunt locații din memoria sclavului care conțin diverse informații sau date., De exemplu, accelerometrul ADX345 are o adresă unică a dispozitivului și adrese de registre interne de adăugare pentru axa X, Y și Z. Deci, dacă vrem să citim datele axei X, mai întâi trebuie să trimitem adresa dispozitivului și apoi adresa registrului intern special pentru axa X. Aceste adrese pot fi găsite în fișa tehnică a senzorului.
după adresare, secvențele de transfer de date încep fie de la master, fie de la slave, în funcție de modul selectat la bitul R/W., După ce datele sunt trimise complet, transferul se va încheia cu o condiție de oprire care apare atunci când linia SDA trece de la scăzut la mare, în timp ce linia SCL este ridicată.
Arduino I2C Example
ca exemplu, voi folosi placa de breakout GY-80 care constă din 5 senzori diferiți și placa de breakout GY-521 care constă din 3 senzori diferiți. Deci, putem obține date de la 8 senzori diferiți cu doar două fire cu magistrala 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.,
Iată cum vom conecta plăcile. Pinul ceasului Serial al plăcii Arduino va fi conectat la pinii ceasului Serial ai celor două plăci de spargere, același lucru este valabil și pentru pinii de date seriale și vom alimenta plăcile cu Gnd și pinul 5V de pe placa Arduino. Notă aici nu folosim rezistențe pull-up, deoarece plăcile breakout au deja.
acum, pentru a comunica cu aceste cipuri sau senzori, trebuie să cunoaștem adresele lor unice. Le putem găsi din fișele tehnice ale senzorilor., Pentru GY-80 breakout bord avem următoarele 4 adrese: hexazecimal 0x53 pentru cele 3 Axe Accelerometru senzor, hexazecimal 0x69 pentru 3 Axe, Giroscop, hexazecimal 0x1E pentru 3 Axe, Magnetometru și hexazecimal 0x77 pentru Barometru și Termometru senzor.
Arduino și MPU6050 Accelerometru și Giroscop Tutorial
Pentru GY-521 breakout bord avem doar o singură adresă și că este o hexazecimal 0x68., De asemenea, putem obține sau verifica adresele folosind schița scanerului Arduino I2C, care poate fi găsită de pe site-ul oficial Arduino. Deci, dacă încărcăm și rulăm acea schiță, vom primi adresele dispozitivelor conectate în magistrala I2C.,
Senzor Parte Numărul I2C Adresa
3 Axe Accelerometru Analogic Dispozitive ADXL345 0x53 Datasheet
3 Axe GyroST Microelectronică L3G4200D 0x69 Datasheet
3 Axe Magnetometru Honeywell MC5883L 0x1E Datasheet
Barometru + Termometru Bosch BMP085 0x77 Datasheet
După ce am găsit adresele de dispozitive noi, de asemenea, nevoie pentru a găsi adresele lor internă, registre, în scopul de a citi datele de la ei., De exemplu, dacă dorim să citim datele pentru axa X de la senzorul accelerometrului axei 3 al plăcii de spargere GY-80, trebuie să găsim adresa registrului intern unde sunt stocate datele axei X. Din fisa tehnica a senzorului, putem vedea că datele pentru axa X este, de fapt stocate în două registre, DATAX0 cu o hexazecimal adresa 0x32 și DATAX1 cu o hexazecimal adresa 0x33.
cod Arduino I2C
acum să facem codul care va obține datele pentru axa X., Așa că vom folosi biblioteca de sârmă Arduino care trebuie inclusă în schiță. Aici mai întâi trebuie să definim adresa senzorului și cele două adrese de registre interne pe care le-am găsit anterior. Firul.funcția begin () va iniția Biblioteca de sârmă și, de asemenea, trebuie să inițiem comunicarea serială, deoarece vom folosi monitorul Serial pentru a afișa datele de la senzor.
în buclă () vom începe cu firul.beginTransmission () funcția care va începe transmiterea către senzorul special, accelerometrul cu 3 axe în cazul nostru. Apoi cu firul.,scrie () funcția vom cere datele particulare din cele două registre ale axei X. Firul.endTransmission () va încheia transmisia și va transmite datele din registre. Acum cu sârma.requestFrom () funcția vom solicita datele transmise sau cei doi octeți din cele două registre.
firul.funcția available () va returna numărul de octeți disponibili pentru regăsire și dacă acest număr se potrivește cu octeții solicitați, în cazul nostru 2 octeți, folosind firul.read () funcția vom citi octeții din cele două registre ale axei X., La final vom imprima datele în Monitorul serial. Iată aceste date, dar rețineți că acestea sunt date brute și este nevoie de o anumită matematică pentru a obține valorile corecte ale axei X. Puteți găsi mai multe detalii pentru asta în următorul meu tutorial pentru utilizarea accelerometrelor cu placa Arduino, deoarece nu vreau să supraîncărc acest tutorial, deoarece scopul său principal a fost să explice cum funcționează comunicarea Arduino I2C.