- Čo je komunikačný protokol I2C?
- Ako funguje komunikácia I2C?
- Kde využiť komunikáciu I2C?
- I2C v Arduine
- Súčasti sú povinné
- Schéma zapojenia
- Pracovné vysvetlenie
- Programovanie I2C v Arduine
- Vysvetlenie programovania Master Arduino
- Vysvetlenie programovania Slave Arduino
V našom predchádzajúcom tutoriáli sme sa dozvedeli o komunikácii SPI v Arduine. Dnes sa dozvieme o ďalšom protokole sériovej komunikácie: I2C (Inter Integrated Circuits). V porovnaní I2C s SPI má I2C iba dva vodiče, zatiaľ čo SPI používa štyri a I2C môže mať viac hlavných a podriadených, zatiaľ čo SPI môže mať iba jedného hlavného a viacerých podriadených. Takže v projekte existuje viac ako jeden mikrokontrolér, ktorý musí byť pánom, potom sa použije I2C. Komunikácia I2C sa zvyčajne používa na komunikáciu s gyroskopom, akcelerometrom, snímačmi barometrického tlaku, LED displejmi atď.
V tomto výučbe Arduino I2C použijeme komunikáciu I2C medzi dvoma doskami arduino a budeme si navzájom posielať (0 až 127) hodnoty pomocou potenciometra. Hodnoty sa zobrazia na 16x2 LCD pripojenom ku každému z Arduino. Tu bude jedno Arduino pôsobiť ako Majster a ďalšie ako Slave. Začnime teda úvodom o komunikácii I2C.
Čo je komunikačný protokol I2C?
Pojem IIC znamená „ integrované obvody “. Normálne sa na niektorých miestach označuje ako I2C alebo I na druhú C alebo dokonca ako 2-vodičový protokol rozhrania (TWI), ale všetko to znamená to isté. I2C je synchrónny komunikačný protokol, čo znamená, že obe zariadenia, ktoré zdieľajú informácie, musia zdieľať spoločný hodinový signál. Má iba dva vodiče na zdieľanie informácií, z ktorých jeden sa používa na signál kohútika a druhý na odosielanie a prijímanie údajov.
Ako funguje komunikácia I2C?
Komunikáciu I2C prvýkrát predstavil Phillips. Ako už bolo povedané, má dva vodiče, tieto dva vodiče budú prepojené cez dve zariadenia. Tu sa jedno zariadenie nazýva hlavný a druhé zariadenie sa nazýva slave. Komunikácia by mala a vždy bude prebiehať medzi dvoma Master a Slave. Výhodou I2C komunikácie je, že k Master môže byť pripojených viac ako jeden slave.
Kompletná komunikácia prebieha prostredníctvom týchto dvoch káblov, a to Serial Clock (SCL) a Serial Data (SDA).
Serial Clock (SCL): Zdieľa hodinový signál generovaný hlavnou jednotkou s podradenou jednotkou
Serial Data (SDA): Sends the data to and from between the Master and slave.
V ktoromkoľvek okamihu bude môcť komunikáciu zahájiť iba hlavný server. Pretože v zbernici je viac ako jeden slave, musí master odkazovať na každého slave pomocou inej adresy. Ak je adresovaný iba otrok s touto konkrétnou adresou, odpovie späť informáciami, zatiaľ čo ostatní zostanú bez ukončenia. Týmto spôsobom môžeme použiť rovnakú zbernicu na komunikáciu s viacerými zariadeniami.
Tieto úrovne napätia na I2C nie sú preddefinované. Komunikácia I2C je flexibilná, to znamená, že zariadenie, ktoré je napájané 5 V, môže používať 5 V pre I2C a zariadenia 3,3 V môžu používať 3 V pre komunikáciu I2C. Čo však v prípade, keď dve zariadenia bežiace na rôzne napätia musia komunikovať pomocou I2C? 5V I2C bus nemôže byť spojený s 3,3 zariadením. V takom prípade sa na zosúladenie úrovní napätia medzi dvoma zbernicami I2C používajú meniče napätia.
Existuje niekoľko podmienok, ktoré rámcujú transakciu. Inicializácia prenosu začína klesajúcou hranou SDA, ktorá je definovaná ako podmienka „ŠTART“ v nasledujúcom diagrame, kde master ponecháva SCL vysokú pri nastavovaní nízkej SDA.
Ako je znázornené na vyššie uvedenom diagrame, Klesajúca hrana SDA je hardvérová spúšť pre podmienku START. Potom všetky zariadenia na tej istej zbernici prejdú do režimu počúvania.
Rovnakým spôsobom zastaví nábežná hrana SDA prenos, ktorý sa vo vyššie uvedenom diagrame zobrazuje ako stav „STOP“, kde hlavná jednotka ponechá SCL vysoko a tiež uvoľní SDA, aby vyšla HIGH. Nábežná hrana SDA teda zastaví prenos.
Bit R / W označuje smer vysielania nasledujúcich bajtov, ak je HIGH znamená, že slave bude vysielať a ak je nízky, znamená to, že master bude vysielať.
Každý bit sa prenáša v každom hodinovom cykle, takže prenos bajtu trvá 8 hodinových cyklov. Po každom odoslanom alebo prijatom bajte sa pre ACK / NACK drží deviaty hodinový cyklus (potvrdený / nepotvrdený). Tento bit ACK je generovaný podradeným alebo riadiacim zariadením v závislosti od situácie. Pre ACK bit, SDA je nastavená na minimum tým, master alebo slave v 9 -tého takte. Takže je nízka, považuje sa to za ACK, inak NACK.
Kde využiť komunikáciu I2C?
Komunikácia I2C sa používa iba na komunikáciu na krátke vzdialenosti. Je to do istej miery spoľahlivé, pretože má synchronizovaný hodinový impulz, aby bol inteligentný. Tento protokol sa používa hlavne na komunikáciu so senzorom alebo inými zariadeniami, ktoré musia odosielať informácie nadriadenému. Je to veľmi užitočné, keď mikrokontrolér musí komunikovať s mnohými ďalšími podradenými modulmi pomocou minimálne iba drôtov. Ak hľadáte komunikáciu na veľké vzdialenosti, mali by ste vyskúšať RS232 a ak hľadáte spoľahlivejšiu komunikáciu, vyskúšajte protokol SPI.
I2C v Arduine
Obrázok nižšie ukazuje I2C piny prítomné v Arduino UNO.
Linka I2C | Pripnite si Arduino |
SDA | A4 |
SCL | A5 |
Než začneme programovať I2C pomocou dvoch Arduino. Musíme sa dozvedieť viac o knižnici Wire použitej v Arduino IDE.
knižnica
1. Wire.begin (adresa):
Použitie: Táto knižnica sa používa na komunikáciu so zariadeniami I2C. Toto inicializuje knižnicu Wire a pripojí sa na zbernicu I2C ako master alebo slave.
Adresa: Adresa 7-bit slave je voliteľná a ak nie je zadaná, pripojí sa k zbernici ako tento.
2. Wire.read ():
Použitie: Táto funkcia sa používa na načítanie bajtu, ktorý bol prijatý z nadradeného alebo podriadeného zariadenia, a to buď z podriadeného zariadenia do nadradeného zariadenia po volaní requestFrom (), alebo z hlavného zariadenia do podriadeného zariadenia.
3. Wire.write ():
Použitie: Táto funkcia sa používa na zápis údajov do podradeného alebo nadradeného zariadenia.
Slave to Master: Slave zapisuje dáta na master, keď sa v masteri používa Wire.RequestFrom () .
Master to Slave: Na prenos z zariadenia master do slave sa používa Wire.write () medzi hovormi na Wire.beginTransmission () a Wire.endTransmission ().
Wire.write () možno zapísať ako:
- Wire.write (hodnota)
hodnota: hodnota, ktorá sa má odoslať ako jeden bajt.
- Wire.write (reťazec):
string: reťazec, ktorý sa má odoslať ako séria bajtov.
- Wire.write (údaje, dĺžka):
údaje: pole údajov, ktoré sa majú odoslať ako bajty
dĺžka: počet bajtov na prenos.
4. Wire.beginTransmission (adresa):
Použitie: Táto funkcia sa používa na začatie prenosu do zariadenia I2C s danou adresou slave. Následne zostavte rad bajtov na prenos pomocou funkcie write () a potom ich preneste volaním funkcie endTransmission () . Prenáša sa 7-bitová adresa zariadenia.
5. Wire.endTransmission ();
Použitie: Táto funkcia sa používa na ukončenie prenosu do podradeného zariadenia, ktorý bol zahájený metódou beginTransmission (), a prenáša bajty, ktoré boli zaradené do frontu pomocou funkcie Wire.write ().
6. Wire.onRequest ();
Použitie: Táto funkcia sa zavolá, keď hlavný server požaduje údaje pomocou funkcie Wire.requestFrom () od podradeného zariadenia. Tu môžeme zahrnúť funkciu Wire.write () na zasielanie údajov do hlavnej jednotky.
7. Wire.onReceive ();Použitie: Táto funkcia sa zavolá, keď pomocné zariadenie prijme údaje z hlavnej jednotky. Sem môžeme zahrnúť Wire.read (); funkcia na načítanie údajov odoslaných z hlavného počítača.
8. Wire.requestFrom (adresa, množstvo);
Použitie: Táto funkcia sa používa v hlavnom počítači na vyžiadanie bajtov od podradeného zariadenia. Funkcia Wire.read () sa používa na načítanie údajov odoslaných z podradeného zariadenia.
address: 7-bitová adresa zariadenia, od ktorého sa majú vyžadovať bajty
množstvo: počet bajtov, ktoré sa majú vyžiadať
Súčasti sú povinné
- Arduino Uno (2-nosové)
- Modul LCD displeja 16X2
- 10K potenciometer (4-nosy)
- Nepál
- Pripojenie drôtov
Schéma zapojenia
Pracovné vysvetlenie
Tu na demonštráciu komunikácie I2C v Arduine používame dva Arduino UNO s dvomi pripojenými LCD displejmi 16X2 a pomocou dvoch potenciometrov na oboch arduino určujeme hodnoty odosielania (0 až 127) z mastera na slave a slave na mastera variáciou potenciometer.
Vstupnú analógovú hodnotu na arduino kolíku A0 odoberieme z (0 na 5 V) pomocou potenciometra a prevedieme na analógovo-digitálnu hodnotu (0 až 1023). Potom sa tieto hodnoty ADC ďalej konvertujú na (0 až 127), pretože prostredníctvom komunikácie I2C môžeme posielať iba 7-bitové údaje. Komunikácia I2C prebieha cez dva vodiče na pinoch A4 a A5 oboch arduino.
Hodnoty na displeji Slave Arduino sa budú meniť zmenou POT na strane nadriadeného a naopak.
Programovanie I2C v Arduine
Tento tutoriál má dva programy, jeden pre hlavné Arduino a druhý pre podradené Arduino. Kompletné programy pre obe strany sú uvedené na konci tohto projektu s ukážkovým videom.
Vysvetlenie programovania Master Arduino
1. Najprv musíme zahrnúť knižnicu Wire pre používanie komunikačných funkcií I2C a knižnicu LCD pre používanie funkcií LCD. Definujte tiež kolíky LCD pre 16x2 LCD. Viac informácií o prepojení LCD s Arduino sa dozviete tu.
#include
2. V neplatnom nastavení ()
- Sériovú komunikáciu začíname prenosovou rýchlosťou 9600.
Serial.begin (9600);
- Ďalej začneme komunikáciu I2C na pinu (A4, A5)
Wire.begin (); // Začína komunikácia I2C na kolíku (A4, A5)
- Ďalej inicializujeme modul LCD displeja v režime 16X2 a zobrazíme uvítaciu správu a po piatich sekundách zmizneme.
lcd.začiatok (16,2); // Inicializácia LCD displeja lcd.setCursor (0,0); // Nastaví kurzor na prvý riadok displeja lcd.print ("Prehľad okruhov"); // Vypíše CIRCUIT DIGEST na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý riadok displeja lcd.print ("I2C 2 ARDUINO"); // Vypíše I2C ARDUINO v LCD oneskorení (5000); // Oneskorenie o 5 sekúnd lcd.clear (); // Vymaže LCD displej
3. V neplatnej slučke ()
- Najprv musíme získať dáta zo Slave, takže použijeme requestFrom () s podradenou adresou 8 a požadujeme jeden bajt
Wire.requestFrom (8,1);
Prijatá hodnota sa načíta pomocou funkcie Wire.read ()
byte MasterReceive = Wire.read ();
- Ďalej musíme načítať analógovú hodnotu z hlavného arduino POT pripojeného k pinu A0
int potvalue = analogRead (A0);
Túto hodnotu konvertujeme na jeden bajt ako 0 až 127.
byte MasterSend = mapa (potvalue, 0,1023,0,127);
- Ďalej musíme poslať tieto prevedené hodnoty, aby sme začali vysielať s slave arduino s 8 adresami
Wire.beginTransmission (8); Wire.write (MasterSend); Wire.endTransmission ();
- Ďalej zobrazujeme tieto prijaté hodnoty od slave arduino s oneskorením 500 mikrosekúnd a tieto hodnoty kontinuálne prijímame a zobrazujeme.
lcd.setCursor (0,0); // Nastaví kurzor na prvý riadok LCD lcd.print (">> Master <<"); // Vytlačí >> Master << na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý riadok LCD lcd.print ("SlaveVal:"); // Vypíše SlaveVal: na LCD lcd.print (MasterReceive); // Vytlačí MasterReceive na LCD prijatom od Slave Serial.println ("Master prijatý od Slave"); // Tlač v Serial Monitor Serial.println (MasterReceive); oneskorenie (500); lcd.clear ();
Vysvetlenie programovania Slave Arduino
1. Rovnako ako master, v prvom rade musíme zahrnúť knižnicu Wire pre používanie komunikačných funkcií I2C a LCD knižnicu pre používanie funkcií LCD. Definujte tiež kolíky LCD pre 16x2 LCD.
#include
2. V neplatnom nastavení ()
- Sériovú komunikáciu začíname prenosovou rýchlosťou 9600.
Serial.begin (9600);
- Ďalej začneme komunikáciu I2C na pinu (A4, A5) s adresou slave ako 8. Tu je dôležité určiť adresu slave.
Wire.begin (8);
Ďalej musíme zavolať funkciu, keď Slave prijme hodnotu od mastera a keď Master požiada o hodnotu od slave
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
- Ďalej inicializujeme modul LCD displeja v režime 16X2 a zobrazíme uvítaciu správu a po piatich sekundách zmizneme.
lcd.začiatok (16,2); // Inicializácia LCD displeja lcd.setCursor (0,0); // Nastaví kurzor na prvý riadok displeja lcd.print ("Prehľad okruhov"); // Vypíše CIRCUIT DIGEST na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý riadok displeja lcd.print ("I2C 2 ARDUINO"); // Vypíše I2C ARDUINO v LCD oneskorení (5000); // Oneskorenie o 5 sekúnd lcd.clear (); // Vymaže LCD displej
3. Ďalej máme dve funkcie, jednu pre udalosť žiadosti a jednu pre udalosť príjmu
Na vyžiadanie Udalosť
Keď bude Master požadovaná hodnota od slave, bude vykonaná táto funkcia. Táto funkcia berie vstupnú hodnotu z podriadeného POT a prevádza ju na 7-bitové hodnoty a odosiela túto hodnotu do mastera.
void requestEvent () { int potvalue = analogRead (A0); byte SlaveSend = mapa (potvalue, 0,1023,0,127); Wire.write (SlaveSend); }
Pre príjem udalosti
Keď Master pošle dáta slave s adresou slave (8), táto funkcia sa vykoná. Táto funkcia načíta prijatú hodnotu z hlavnej jednotky a uloží ju do premennej typu byte .
void receiveEvent (int howMany { SlaveReceived = Wire.read (); }
4. Vo Void loop ():
Prijatú hodnotu z mastera nepretržite zobrazujeme v module LCD.
void loop (void) { lcd.setCursor (0,0); // Nastaví kurzor na prvý riadok LCD lcd.print (">> Slave <<"); // Vytlačí >> Slave << na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý riadok LCD lcd.print ("MasterVal:"); // Vypíše MasterVal: na LCD lcd.print (SlaveReceived); // Vypíše SlaveReceived hodnota na LCD prijatá z Master Serial.println ("Slave Received From Master:"); // Tlač v Serial Monitor Serial.println (SlaveReceived); oneskorenie (500); lcd.clear (); }
Tým, otáčaním potenciometra na jednej strane, môžete vidieť rôzne hodnoty na displeji na druhej strane:
Takto teda prebieha komunikácia I2C v Arduine, tu sme pomocou dvoch Arduin demonštrovali nielen odosielanie dát, ale aj ich príjem pomocou komunikácie I2C. Takže teraz môžete prepojiť akýkoľvek snímač I2C s Arduinom.
Kompletné kódovanie pre Master a Slave Arduino je uvedené nižšie s ukážkovým videom