- Kas yra „I2C“ ryšio protokolas?
- Kaip veikia „I2C Communication“?
- Kur naudoti I2C ryšį?
- „I2C“ Arduino mieste
- Būtini komponentai
- Grandinės schema
- Darbinis paaiškinimas
- „I2C“ programavimas „Arduino“
- Pagrindinio „Arduino“ programavimo paaiškinimas
- Vergų „Arduino“ programavimo paaiškinimas
Ankstesnėje mūsų pamokoje sužinojote apie SPI bendravimą „Arduino“. Šiandien mes sužinosime apie kitą nuosekliojo ryšio protokolą: I2C (Inter Integrated Circuits). Lyginant „I2C“ su „SPI“, „I2C“ turi tik du laidus, o „SPI“ naudoja keturis, o „I2C“ gali turėti „Multiple Master“ ir „Slave“, o SPI - tik vieną pagrindinį ir kelis vergus. Taigi projekte yra daugiau nei vienas mikrovaldiklis, kuris turi būti meistras, tada naudojamas I2C. I2C ryšys paprastai naudojamas bendraujant su giroskopu, akselerometru, barometrinio slėgio jutikliais, LED ekranais ir kt.
Šioje „ Arduino I2C“ pamokoje naudosime „ I2C“ ryšį tarp dviejų „Arduino“ plokščių ir siųsime (0–127) reikšmes vieni kitiems naudodami potenciometrą. Vertės bus rodomos 16x2 LCD ekrane, prijungtame prie kiekvieno „Arduino“. Čia vienas Arduino veiks kaip Mokytojas, o kitas - kaip Vergas. Taigi pradėkime nuo įvado apie I2C ryšį.
Kas yra „I2C“ ryšio protokolas?
Terminas IIC reiškia „ Inter Integrated Circuits “. Kai kuriose vietose jis paprastai žymimas kaip I2C arba I kvadratas arba net kaip 2 laidų sąsajos protokolas (TWI), tačiau visa tai reiškia tą patį. „I2C“ yra sinchroninio ryšio protokolo reikšmė, abu prietaisai, kurie dalijasi informacija, turi turėti bendrą laikrodžio signalą. Ji turi tik du laidus dalytis informacija, iš kurių vienas naudojamas gaidžio signalui, o kitas - duomenims siųsti ir priimti.
Kaip veikia „I2C Communication“?
Pirmą kartą „I2C“ ryšį pradėjo Phillipsas. Kaip minėta anksčiau, jis turi du laidus, šie du laidai bus sujungti per du įrenginius. Čia vienas įrenginys vadinamas pagrindiniu, o kitas - kaip vergas. Bendravimas turėtų ir visada vyks tarp dviejų šeimininkų ir vergų. „I2C“ ryšio pranašumas yra tas, kad prie „Master“ galima prijungti daugiau nei vieną vergą.
Pilnas ryšys vyksta per šiuos du laidus, ty nuoseklųjį laikrodį (SCL) ir nuoseklius duomenis (SDA).
Serijinis laikrodis (SCL): dalijasi pagrindinio kompiuterio sukurtu laikrodžio signalu su vergu
Serijos duomenys (SDA): siunčia duomenis į pagrindinį ir pavaldinį ir iš jų.
Bet kuriuo metu tik kapitonas galės pradėti ryšį. Kadangi magistralėje yra daugiau nei vienas vergas, kapitonas turi nurodyti kiekvieną vergą naudodamas kitą adresą. Kai kreipiamasi, tik vergas, turintis tą konkretų adresą, atsakys atgal į informaciją, o kiti išjungs. Tokiu būdu mes galime naudoti tą pačią magistralę, kad galėtume bendrauti su keliais įrenginiais.
Kad įtampos lygių I2C yra ne iš anksto apibrėžtas. „I2C“ ryšys yra lankstus, tai reiškia, kad prietaisas, maitinamas 5 V įtampa, gali naudoti 5 V įtampą I2C, o 3.3 V prietaisai - 3 V I2C ryšiui. Bet ką daryti, jei du skirtingos įtampos įrenginiai turi bendrauti naudodami I2C? 5V magistralės I2c negali būti prijungtas su 3,3 "prietaiso. Šiuo atveju įtampos keitikliai naudojami įtampos lygiams tarp dviejų I2C magistralių suderinti.
Yra keletas sąlygų, kurios sudaro sandorį. Perdavimas pradedamas krentant SDA kraštui, kuris žemiau esančioje diagramoje apibrėžiamas kaip „START“ sąlyga, kai pagrindinis atstovas palieka aukštą SCL, tuo tarpu nustatydamas žemą SDA.
Kaip parodyta aukščiau pateiktoje diagramoje, Krintantis SDA kraštas yra apatinis paleidiklis sąlygai START. Po to visi toje pačioje magistralėje esantys įrenginiai pereina į klausymo režimą.
Tuo pačiu būdu kylantis SDA kraštas sustabdo transmisiją, kuri aukščiau pateiktoje diagramoje rodoma kaip „STOP“ sąlyga, kai pagrindinis atstovas palieka aukštą SCL ir taip pat išleidžia SDA, kad jis eitų HIGH. Taigi kylantis SDA kraštas sustabdo perdavimą.
R / W bitai nurodo sekančių baitų perdavimo kryptį, jei jis yra HIGH, reiškia, kad vergas perduos, o jei jis yra žemas, tai reiškia, kad pagrindinis perduos.
Kiekvienas bitas yra perduodamas kiekvienu laikrodžio ciklu, todėl baitui perduoti reikia 8 laikrodžio ciklų. Po kiekvieno išsiųsto ar gauto baito, ACK / NACK laikomas devintasis laikrodžio ciklas (patvirtinta / nepatvirtinta). Šį ACK bitą sukuria vergas arba pagrindinis, priklausomai nuo situacijos. ACK bitų atveju SDA nustatomas žemas pagal pagrindinį arba pavaldųjį 9 -ojo laikrodžio ciklą. Taigi yra mažai, jis laikomas ACK, kitaip NACK.
Kur naudoti I2C ryšį?
I2C ryšys naudojamas tik trumpam atstumui. Tai tikrai tam tikru mastu, nes turi sinchronizuotą laikrodžio impulsą, kad būtų protingas. Šis protokolas daugiausia naudojamas bendrauti su jutikliais ar kitais prietaisais, kurie turi siųsti informaciją kapitonui. Labai patogu, kai mikrovaldiklis turi bendrauti su daugeliu kitų vergo modulių, naudodamas mažiausiai tik laidus. Jei ieškote tolimojo ryšio, turėtumėte išbandyti RS232, o jei norite patikimesnio ryšio, išbandykite SPI protokolą.
„I2C“ Arduino mieste
Žemiau pateiktame paveikslėlyje parodyti „I2C“ kaiščiai, esantys „Arduino UNO“.
I2C linija | Prisegti „Arduino“ |
SDA | A4 |
SCL | A5 |
Prieš pradedant programuoti I2C naudojant du „Arduino“. Turime sužinoti apie „ Wire“ biblioteką, naudojamą „Arduino IDE“.
biblioteka
1. „Wire.begin“ (adresas):
Naudojimas: Ši biblioteka naudojama užmegzti ryšį su „I2C“ įrenginiais. Tai inicijuokite „Wire“ biblioteką ir prisijungkite prie „I2C“ magistralės kaip pagrindinis ar vergas.
Adresas: 7 bitų vergo adresas yra neprivalomas, o jei adresas nenurodytas, jis prisijungia prie magistralės kaip šis pagrindinis.
2. Wire.read ():
Naudojimas: ši funkcija naudojama nuskaityti baitą, gautą iš pagrindinio ar vergo įrenginio, kuris buvo perduotas iš vergo įrenginio į pagrindinį įrenginį po skambučio to requestFrom () arba buvo perduotas iš pagrindinio vergui.
3. „Wire.write“ ():
Naudojimas: ši funkcija naudojama duomenims rašyti į vergo ar pagrindinį įrenginį.
„Slave to Master“: „ Slave“ rašo duomenis valdikliui, kai „ Wire.RequestFrom“ () naudojama pagrindiniame kompiuteryje.
„Master to Slave“: perdavimui iš pagrindinio į vergo įrenginį „ Wire.write“ () naudojamas tarp skambučių į „ Wire.beginTransmission“ () ir „ Wire.endTransmission“ ().
„Wire.write“ () gali būti parašytas taip:
- „Wire.write“ (vertė)
reikšmė: vertė, kurią reikia siųsti kaip vieną baitą.
- Wire.write (string):
eilutė: eilutė, kurią norite siųsti kaip baitų seriją.
- Wire.write (duomenys, ilgis):
duomenys: duomenų masyvas, kurį reikia siųsti kaip baitus
ilgis: perduotinų baitų skaičius.
4. „Wire.beginTransmission“ (adresas):
Naudojimas: ši funkcija naudojama perdavimui į I2C įrenginį pradėti nurodytu vergo adresu. Vėliau sukurkite perdavimo baitų eilę naudodamiesi rašymo () funkcija ir tada perduokite juos iškviesdami funkciją „endTransmission ()“ . Perduodamas 7 bitų įrenginio adresas.
5. „Wire.endTransmission“ ();
Naudojimas: ši funkcija naudojama norint užbaigti perdavimą į vergo įrenginį, kurį pradėjo „ startTransmission“ (), ir perduoda „ Wire.write“ () eilėje esančius baitus.
6. Viela.onRequest ();
Naudojimas: ši funkcija iškviečiama, kai meistras prašo duomenų iš vergo įrenginio naudodamas „ Wire.requestFrom“ () . Čia galime įtraukti „ Wire.write“) funkciją, kad duomenys būtų siunčiami pagrindiniam kompiuteriui.
7. Viela.onReceive ();Naudojimas: ši funkcija iškviečiama, kai vergo įrenginys gauna duomenis iš pagrindinio. Čia galime įtraukti „ Wire.read“ (); funkcija nuskaityti iš pagrindinio kompiuterio atsiųstus duomenis.
8. „Wire.requestFrom“ (adresas, kiekis);
Naudojimas: Ši funkcija naudojama pagrindiniame kompiuteryje norint reikalauti baitų iš vergo įrenginio. Funkcija Wire.read () naudojama duomenims, siunčiamiems iš vergo įrenginio, nuskaityti.
adresas: 7 bitų įrenginio adresas, iš kurio prašoma baitų
kiekis: prašomų baitų skaičius
Būtini komponentai
- „Arduino Uno“ (2-jų)
- 16X2 LCD ekranas
- 10K potenciometras (4-nosiai)
- Bandomoji Lenta
- Laidų sujungimas
Grandinės schema
Darbinis paaiškinimas
Norėdami parodyti „ I2C“ ryšį „Arduino“, mes naudojame du „Arduino UNO“ su dviem 16X2 LCD ekranais, pritvirtintais vienas prie kito, ir naudodamiesi dviem potenciometrais abiejuose „Arduino“ nustatome siuntimo vertes (nuo 0 iki 127) nuo pagrindinio iki vergo ir iš vergo į valdovą, keisdami potenciometras.
Panaudojant potenciometrą, įvesties analoginę vertę prie „arduino“ kaiščio A0 (nuo 0 iki 5 V) paverčiame analogine į skaitmeninę reikšmę (nuo 0 iki 1023). Tada šios ADC reikšmės dar konvertuojamos į (0–127), nes per I2C ryšį galime siųsti tik 7 bitų duomenis. „I2C“ ryšys vyksta dviem laidais abiejų arduino A4 ir A5 kaiščiuose.
„Slave Arduino“ skystųjų kristalų ekrano vertės bus pakeistos keičiant POT pagrindinėje pusėje ir atvirkščiai.
„I2C“ programavimas „Arduino“
Šioje pamokoje yra dvi programos, skirtos meistrui „Arduino“, kitos - vergui „Arduino“. Užbaigtos abiejų šalių programos pateikiamos šio projekto pabaigoje su demonstraciniu vaizdo įrašu.
Pagrindinio „Arduino“ programavimo paaiškinimas
1. Pirmiausia turime įtraukti „Wire“ biblioteką, skirtą naudoti „I2C“ ryšio funkcijas, ir „LCD“ biblioteką, skirtą naudoti „LCD“ funkcijoms. Taip pat nustatykite 16x2 LCD ekranui skirtus LCD kaiščius. Sužinokite daugiau apie LCD sąsają su „Arduino“ čia.
# įtraukti
2. Neteisingoje sąrankoje ()
- Nuoseklią komunikaciją pradedame 9600 perdavimo sparta.
Serijos pradžia (9600);
- Tada mes pradedame I2C ryšį kaiščiu (A4, A5)
Viela.prasideda (); // Pradeda I2C ryšį kaiščiu (A4, A5)
- Tada inicijuojame LCD ekrano modulį 16X2 režimu, rodome pasveikinimo pranešimą ir išvalome po penkių sekundžių.
lcd.prade (16,2); // Inicijuoti LCD ekraną lcd.setCursor (0,0); // Nustato žymeklį pirmoje „Display lcd.print“ eilutėje („Circuit Digest“); // Spausdina CIRCUIT DIGEST LCD ekrane lcd.setCursor (0,1); // Nustato žymeklį antroje ekrano lcd.print eilutėje ("I2C 2 ARDUINO"); // Spausdina „I2C ARDUINO“ LCD delsoje (5000); // Vėluoja 5 sekundes lcd.clear (); // Išvalo LCD ekraną
3. Tuščiajame cikle ()
- Pirmiausia turime gauti duomenis iš „Slave“, todėl mes naudojame „ requestFrom“ () su vergo adresu 8 ir prašome vieno baito
Wire.requestFrom (8,1);
Gauta vertė nuskaitoma naudojant „Wire.read“ ()
baitas MasterReceive = Wire.read ();
- Tada turime perskaityti analoginę vertę iš pagrindinio arduino POT, pritvirtinto prie kaiščio A0
int potvalue = analogRead (A0);
Konvertuojame tą vertę pagal vieną baitą nuo 0 iki 127.
baitas MasterSend = žemėlapis (potvalue, 0,1023,0,127);
- Tada turime išsiųsti tas konvertuotas reikšmes, kad mes pradėtume perduoti vergo „Arduino“ su 8 adresu
„Wire.beginTransmission“ (8); „Wire.write“ („MasterSend“); „Wire.endTransmission“ ();
- Toliau mes rodome tas gautas vergo „arduino“ reikšmes su 500 mikrosekundžių vėlavimu ir nuolat gauname ir rodome tas vertes.
lcd.setCursor (0,0); // Currsor nustatomas vienoje LCD lcd.print eilutėje (">> Master <<"); // Spaudiniai >> Pagrindinis << prie LCD lcd.setCursor (0,1); // Nustato žymeklį antroje LCD lcd.print eilutėje ("SlaveVal:"); // Spausdina „SlaveVal“: skystųjų kristalų ekrane. Spausdinti („MasterReceive“); // Spausdina „MasterReceive“ skystųjų kristalų ekrane, gautą iš „Slave Serial.println“ („Šeimininkas gautas iš vergo“); // Spausdina serijiniame monitoriuje Serial.println (MasterReceive); vėlavimas (500); lcd.clear ();
Vergų „Arduino“ programavimo paaiškinimas
1. Tas pats kaip meistras, pirmiausia turime įtraukti „Wire“ biblioteką, kad galėtumėte naudotis „I2C“ ryšio funkcijomis, ir „LCD“ biblioteką, skirtą naudoti „LCD“ funkcijoms. Taip pat nustatykite 16x2 LCD ekranui skirtus LCD kaiščius.
# įtraukti
2. Neteisingoje sąrankoje ()
- Nuoseklią komunikaciją pradedame 9600 perdavimo sparta.
Serijos pradžia (9600);
- Tada mes pradedame I2C ryšį kaiščiu (A4, A5) su vergo adresu kaip 8. Čia svarbu nurodyti vergo adresą.
Viela.prasideda (8);
Toliau turime iškviesti funkciją, kai „Slave“ gauna vertę iš pagrindinio ir kai „Master“ reikalauja vertės iš „Slave“
„Wire.onReceive“ („acceptEvent“); „Wire.onRequest“ (requestEvent);
- Tada inicijuojame LCD ekrano modulį 16X2 režimu, rodome pasveikinimo pranešimą ir išvalome po penkių sekundžių.
lcd.prade (16,2); // Inicijuoti LCD ekraną lcd.setCursor (0,0); // Nustato žymeklį pirmoje „Display lcd.print“ eilutėje („Circuit Digest“); // Spausdina CIRCUIT DIGEST LCD ekrane lcd.setCursor (0,1); // Nustato žymeklį antroje ekrano lcd.print eilutėje ("I2C 2 ARDUINO"); // Spausdina „I2C ARDUINO“ LCD delsoje (5000); // Vėluoja 5 sekundes lcd.clear (); // Išvalo LCD ekraną
3. Toliau mes turime dvi funkcijas, vieną - prašymo įvykiui ir kitą - gaunamam įvykiui
Užklausos įvykis
Kai pagrindinė užklausos vertė iš vergo bus vykdoma. Ši funkcija iš „Slave POT“ ima įvesties vertę ir konvertuoja ją į 7 bitų reikšmę ir siunčia šią vertę valdikliui.
negaliojantis requestEvent () { int potvalue = analogRead (A0); baitas „SlaveSend“ = žemėlapis (potvalue, 0,1023,0,127); „Wire.write“ („SlaveSend“); }
Gauti renginį
Kai „Master“ siunčia duomenis vergui su vergo adresu (8), ši funkcija bus vykdoma. Ši funkcija nuskaito gautą vertę iš pagrindinio ir saugomo tipo baito kintamajame.
void acceptEvent (int howMany { SlaveReceived = Wire.read (); }
4. Void loop ():
Mes nuolat rodome gautą vertę iš pagrindinio ekrano LCD ekrane.
void loop (void) { lcd.setCursor (0,0); // Nustato Currsorą vienoje LCD lcd.print eilutėje (">> Slave <<"); // Spausdina >> Slave << prie LCD lcd.setCursor (0,1); // Nustato žymeklį antroje LCD lcd.print eilutėje ("MasterVal:"); // Spausdina „MasterVal“: LCD lcd.print („SlaveReceived“); // Spausdina „SlaveReceived“ reikšmę LCD, gautą iš „Master Serial.println“ („Slave Received From Master:“); // Spausdina serijiniame monitoriuje Serial.println (SlaveReceived); vėlavimas (500); lcd.clear (); }
Iki sukasi potenciometras vienoje pusėje, jūs galite pamatyti įvairius vertybes LCD kitoje pusėje:
Taigi „Arduino“ vyksta „I2C“ ryšys, čia mes naudojome du „Arduino“, kad pademonstruotume ne tik duomenų siuntimą, bet ir duomenų gavimą naudojant „I2C“ ryšį. Taigi dabar galite susieti bet kurį „I2C“ jutiklį su „Arduino“.
Pilnas „Master and Slave Arduino“ kodavimas pateiktas žemiau su demonstraciniu vaizdo įrašu