În acest tutorial vă propun un exemplu simplu şi clar de a comunica pe protocolul I2C între două sau mai multe plăcuțe de dezvoltare Arduino. O astfel de configuraţie poate fi foarte utilă într-o reţea de senzori, pentru o extensie de porturi etc.

1.Necesar:
-două sau mai multe plăcuţe de dezvoltare Arduino
-fire pentru conexiuni
-2 rezistente de 220Ω
-2 leduri

2.Ce reprezintă I2C?
Acronimul I2C vine de la “Inter-Integrated Circuit”. Acest tip de comunicare a fost definit de Philips în 1970 din dorinţa de simplificare şi standardizare a liniilor de date din produsele lor. Prin această soluţie s-a redus numărul de linii la două (SDA – date şi SCL – ceas). Popular această interfaţă este cunoscută şi sub numele de „comunicare pe doua fire” sau „two wire interface”.

I2C presupune:
Rata de transfer: 10 Kb/s – 100Kb/s
SDA – Serial Data line
SCL – Serial Clock line
128 de adrese posibile
16 adrese rezervate
112 dispozitive se pot conecta pe I2C

Dispozitivele conectate trebuie sa aibă masa comuna (GND)

I2C-ARDU
3.Modul de conectare:
După cum spuneam şi în partea introductivă pentru acest exemplu vom folosi două plăcuțe de dezvoltare Arduino (nu prea contează modelul) între care vom realiza o comunicare bi-direcțională pe I2C. Prima plăcuţa v-a fi denumită MASTER iar cea de-a doua SLAVE. Plăcuţa MASTER v-a putea interoga oricare port al plăcuţei SLAVE atât ca intrare cât şi ca ieşire. Conceptul MASTER SLAVE presupune următoarele lucruri: dispozitivul MASTER este responsabil de controlul semnalului de ceas precum și de generarea semnalului de START și STOP; dispozitivul SLAVE este responsabil de interpretarea și oferirea răspunsul aferent comenzilor venite de la MASTER. Schema de mai sus arată modul de legare a mai mult de două plăcuţe SLAVE la o plăcuţă MASTER. În cazul în care se leagă doar o plăcuţă MASTER cu una SLAVE cele două rezistenţe de pullup nu sunt necesare (cazul nostru).

I2C-EX
Din teste am observat ca alimentarea de pe USB a plăcuţei MASTER provoacă erori în comunicarea pe I2C. De aceea în cazul meu am folosit o alimentare externă. S-ar putea să nu aveţi aceiaşi problemă ca şi mine.

4.Partea software
În programul următor placa MASTER v-a trimite comanda către placa SLAVE de a aprinde ledurile de pe pinul 10 și 8. Placa SLAVE la rândul ei v-a trimite răspuns că a înţeles comanda şi a executat-o.

master_i2c

 

slave_i2c

Cam asa arata aplicaţia la mine:

Terminalul serial pe plăcuța master

I2C-master-term

Cele două plăcuțe conectate

I2C-reszult

Programele de mai sus se pot modifica astfel încât să corespundă nevoilor voastre. Dacă aveţi nelămuriri sau alte întrebări legate de acest subiect, secţiunea de comentarii sau cea de suport vă stă la dispoziţie.

Spor la treaba!

Comunicarea I2C
Etichetat pe:            

16 gânduri despre „Comunicarea I2C

  • 05/01/2014 la 10:25
    Legătură permanentă

    super articolul.. trebuie sa-l fac si eu, cand fac rost de alt Arduino sau imi fac unu’ de casa

    Răspunde
  • 05/01/2014 la 10:25
    Legătură permanentă

    Salut.
    Am alimentat Master din sursa Slave si merge f bine. (cu 2 LED nu este atinsa limita de curent).

    Răspunde
  • 05/01/2014 la 10:26
    Legătură permanentă

    De ce legatura intre master si slave se face pe pinii analogigi A4si A5 ,si nu pe pinii SCL,SDA. Cum se dau adresele?

    Răspunde
  • 05/01/2014 la 10:26
    Legătură permanentă

    Pini A4 si A5 sunt pinii SCL si SDA. Nu exista un criteriu de a stabili adresele. Trebuie doar sa ai grija sa nu pui doua dispozitive pe aceiasi adresa.

    Răspunde
  • 05/01/2014 la 10:27
    Legătură permanentă

    pagina e tare multumesc mult eu nu aveam abar cum mergea i2c acum e clar eu vreau sa citesc ce coduri trimite o cetrala de alarma paradox cum comunica cu tastatura de la alarma
    vreau sa armez alarma din arduino

    Răspunde
  • 05/01/2014 la 10:28
    Legătură permanentă

    si eu vreau sa incerc sa citesc codurile de pe magistrala de date la o centrala paradox. a reusit careva pana acum?

    Răspunde
  • 22/01/2014 la 18:11
    Legătură permanentă

    Salut,

    Am un proiect care ar face legatura intre 2 AVR microcontrolere (dupa cite inteleg ARDUINO tot pe AVR e bazat) M-ar interesa care ar fi distanta maxima de conectare intre Master si Slave. Sa zicem ca as folosi un fir Ethernet.

    Răspunde
    • 22/01/2014 la 22:01
      Legătură permanentă

      Salut,

      Personal nu am testat pe distante mai mari de cativa centimetri. Din cate am mai citit I2C merge pe max 6m. Totusi am auzit si de cazuri in care cu un cablu UTP( 2 fire twistate) a mers pe distante de pana la 200m, dar cu rezistorii de pull-up corect dimensionati si cu ceva modificari de soft. Daca nu poti folosi alt tip de comunicare gen RS485, iti sugerez sa folosesti un repeater I2C http://www.tme.eu/ro/details/p82b715pn/microcontrolere-nxp-8051/nxp/p82b715pn112/# si rezistente de pullup.

      Răspunde
  • 24/03/2014 la 13:01
    Legătură permanentă

    Salut,

    Felicitari pentru articol, este cel ma explicit tutorial din cate exista.
    M-ar interesa daca se pot monta in circuit doua push butone in master pt a comanda cele doua leduri din slave.

    Răspunde
    • 24/03/2014 la 19:23
      Legătură permanentă

      Salut si multumesc pentru aprecieri. Ideea ta este functionala. In viitorul apropiat am sa mai fac cateva exemple pe protocolul I2C deoarece am vazut ca multi cititori sunt interesati de acest subiect.

      Răspunde
  • 24/03/2014 la 23:28
    Legătură permanentă

    Salut,

    Referitor la exemplu dat, am inercat sa inversez comenzile de la master si slave, pentru ca slave-ul sa trimita starea (doua butoane) catre master, cand master-ul cere acest lucru si sa aprinda led-urile aferente starii butoanelor din slave-uri.
    La acest rezultat vroiam sa ajung dar nu sunt asa avansat.
    Master 4 leduri,
    Master intreaba Slave1 care e starea butoanelor
    Master intreaba Slave2 care e starea butoanelor

    Am reusit sa comunic pana in prezent cu ajutorul librariei I2C_Anything.h intre master si un slave dar, cand in circuit montaz al doilea slave, ne avand in master functia requestFrom , comunica doar slave-ul care se initializeaza primul. http://www.gammon.com.au/forum/?id=10896

    Răspunde
    • 25/03/2014 la 12:09
      Legătură permanentă

      Am intels. Dar tu ar trebuii sa intrebi in retea toate slave-urile de starea butoanelor. Cea mai simpla solutie la care ma gandesc acum e sa pui un for cu o interogare pe tot intervalul de adrese. Rezultatul ce il da mai departe sa fie adresa si starea butoanelor.

      Răspunde
      • 25/03/2014 la 13:10
        Legătură permanentă

        Salut,

        Fac o analogie:
        master = sef
        slave-uri = angajati
        Intrebare de la sef: Ce a-ti facut azi?
        Angajatii raspund in acelas timp
        Ce mai intelege sefu’?
        Diferenta e ca angazatii, se inteleg intre iei cand sa vorbeasca.

        ” Master-ul intreaba toate Slave-urile care e starea butoanelor si toate slave-urile incep sa transmita starea butoanelor aferente.
        Master-ul nu poate fie atent la fiecare in parte, decat daca, ii intreaba pe rand.”
        Ar fi extraordinar daca master-ul intreaba general toate slave-urile si acestea raspund pe rand, dupa ce fiecare spune ce are de spus.
        Iti multumesc inca odata pentru timpul acordat.

        Răspunde
        • 25/03/2014 la 13:52
          Legătură permanentă

          Din cate stiu eu pe I2C nu poti trimite o ‘intrebare’ la general. Trebuie sa o adresezi cuiva. Totusi scanarea de care am vb eu se realizeaza foarte repede si nici nu o sa-ti dai seama daca s-au intrebat toate dispozitivele odata sau pe rand. Mai trebuie sa tii cont ca I2C este comunicare de tip serial si nu paralel.

          Răspunde

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *