- Co je komunikační protokol I2C?
- Jak funguje komunikace I2C?
- Kde použít komunikaci I2C?
- I2C v Arduinu
- Požadované komponenty
- Kruhový diagram
- Pracovní vysvětlení
- Programování I2C v Arduinu
- Vysvětlení programování Master Arduino
- Vysvětlení programování Slave Arduino
V našem předchozím tutoriálu jsme se dozvěděli o komunikaci SPI v Arduinu. Dnes se dozvíme o dalším protokolu sériové komunikace: I2C (Inter Integrated Circuits). Při srovnání I2C s SPI má I2C pouze dva vodiče, zatímco SPI používá čtyři a I2C může mít více Master a Slave, zatímco SPI může mít pouze jeden Master a více Slave. Takže v projektu je více než jeden mikrokontrolér, který musí být mistrem, pak se používá I2C. Komunikace I2C se obvykle používá ke komunikaci s gyroskopem, akcelerometrem, senzory barometrického tlaku, LED displeji atd.
V tomto výukovém programu Arduino I2C použijeme komunikaci I2C mezi dvěma deskami arduino a budeme si navzájem posílat (0 až 127) hodnoty pomocí potenciometru. Hodnoty se zobrazí na 16x2 LCD připojeném ke každému z Arduino. Zde bude jedno Arduino působit jako Master a další jako Slave. Začněme tedy úvodem o komunikaci I2C.
Co je komunikační protokol I2C?
Termín IIC znamená „ Inter Integrated Circuits “. Obvykle se na některých místech označuje jako I2C nebo I na druhou C nebo dokonce jako 2vodičový protokol rozhraní (TWI), ale všechno to znamená totéž. I2C je synchronní komunikační protokol, což znamená, že obě zařízení, která sdílejí informace, musí sdílet společný hodinový signál. Má pouze dva vodiče ke sdílení informací, z nichž jeden se používá pro kohoutkový signál a druhý pro odesílání a příjem dat.
Jak funguje komunikace I2C?
Komunikaci I2C poprvé představil Phillips. Jak již bylo řečeno, má dva vodiče, tyto dva vodiče budou připojeny přes dvě zařízení. Zde se jedno zařízení nazývá hlavní a druhé zařízení se nazývá slave. Komunikace by měla a vždy proběhne mezi dvěma Master a Slave. Výhodou komunikace I2C je, že k Master může být připojeno více než jeden slave.
Kompletní komunikace probíhá prostřednictvím těchto dvou vodičů, jmenovitě Serial Clock (SCL) a Serial Data (SDA).
Serial Clock (SCL): Sdílí hodinový signál generovaný nadřízeným s podřízeným
Serial Data (SDA): Sends the data to and from between the Master and slave.
Komunikaci může kdykoli zahájit pouze nadřízený. Protože ve sběrnici je více než jeden slave, musí master odkazovat na každého slave pomocí jiné adresy. Pokud je adresován pouze otrok s touto konkrétní adresou, odpoví zpět s informacemi, zatímco ostatní budou ukončeni. Tímto způsobem můžeme použít stejnou sběrnici ke komunikaci s více zařízeními.
Tyto úrovně napětí na I2C nejsou předdefinované. Komunikace I2C je flexibilní, to znamená, že zařízení, které je napájeno 5 V, může používat 5 V pro I2C a zařízení 3,3 V mohou používat 3 V pro komunikaci I2C. Ale co když dvě zařízení, která běží na různých napětích, potřebují komunikovat pomocí I2C? 5V I2C bus nemůže být spojen s 3,3 zařízením. V tomto případě se měniče napětí používají k přizpůsobení úrovní napětí mezi dvěma sběrnicemi I2C.
Existuje několik podmínek, které rámcují transakci. Inicializace přenosu začíná sestupnou hranou SDA, která je definována jako podmínka „START“ v níže uvedeném diagramu, kdy master ponechává SCL vysokou při nastavování nízké SDA.
Jak ukazuje výše uvedený diagram, Klesající hrana SDA je hardwarová spoušť pro podmínku START. Poté všechna zařízení na stejné sběrnici přejdou do režimu poslechu.
Stejným způsobem zastaví náběžná hrana SDA přenos, který je ve výše uvedeném diagramu zobrazen jako stav „STOP“, kde hlavní jednotka ponechá SCL vysoko a také uvolní SDA, aby dosáhla HIGH. Náběžná hrana SDA tedy zastaví přenos.
Bit R / W udává směr přenosu následujících bajtů, pokud je HIGH znamená, že slave bude vysílat, a pokud je nízký, bude vysílat master.
Každý bit se přenáší v každém taktu, takže přenos bajtu trvá 8 hodinových cyklů. Po každém odeslaném nebo přijatém bajtu je pro ACK / NACK zadržen devátý hodinový cyklus (potvrzeno / nepotvrzeno). Tento bit ACK je generován slave nebo master v závislosti na situaci. Pro ACK bit, SDA je nastavena na minimum tím, master nebo slave v 9 -tého taktu. Takže je nízká, považuje se to za ACK, jinak NACK.
Kde použít komunikaci I2C?
Komunikace I2C se používá pouze pro komunikaci na krátkou vzdálenost. Určitě je do jisté míry spolehlivý, protože má synchronizovaný hodinový puls, aby byl chytrý. Tento protokol se používá hlavně ke komunikaci se senzorem nebo jinými zařízeními, která musí odesílat informace hlavnímu zařízení. Je velmi užitečné, když mikrokontrolér musí komunikovat s mnoha dalšími podřízenými moduly pomocí minimálně pouze vodičů. Pokud hledáte komunikaci na velkou vzdálenost, měli byste zkusit RS232 a pokud hledáte spolehlivější komunikaci, zkuste použít protokol SPI.
I2C v Arduinu
Obrázek níže ukazuje piny I2C přítomné v Arduino UNO.
Linka I2C | Připojte Arduino |
SDA | A4 |
SCL | A5 |
Než začneme programovat I2C pomocí dvou Arduino. Musíme se naučit o knihovně Wire používané v Arduino IDE.
knihovna
1. Wire.begin (adresa):
Použití: Tato knihovna se používá pro komunikaci se zařízeními I2C. Tím se inicializuje knihovna Wire a připojí se ke sběrnici I2C jako master nebo slave.
Adresa: Adresa 7-bit slave je volitelná a pokud není zadána adresa, připojí se k této sběrnici jako master.
2. Wire.read ():
Použití: Tato funkce se používá ke čtení bajtu, který byl přijat z hlavního nebo podřízeného zařízení, a to buď z podřízeného zařízení do hlavního zařízení po volání requestFrom (), nebo z hlavního zařízení do podřízeného zařízení.
3. Wire.write ():
Použití: Tato funkce se používá k zápisu dat na podřízené nebo hlavní zařízení.
Slave to Master: Slave zapisuje data do masteru, když je v masteru použit Wire.RequestFrom () .
Hlavní jednotky k podřízené: Pro přenos z hlavní jednotky k podřízené zařízení Wire.write () se používá v-mezi hovory na Wire.beginTransmission () a Wire.endTransmission ().
Wire.write () lze zapsat jako:
- Wire.write (hodnota)
hodnota: hodnota, která se má odeslat jako jeden bajt.
- Wire.write (řetězec):
řetězec: řetězec, který se má odeslat jako řada bajtů.
- Wire.write (data, délka):
data: pole dat, která se mají odeslat jako bajty
délka: počet bajtů k přenosu.
4. Wire.beginTransmission (adresa):
Použití: Tato funkce se používá k zahájení přenosu do zařízení I2C s danou podřízenou adresou. Následně vytvořte frontu bajtů pro přenos pomocí funkce write () a poté je přeneste voláním funkce endTransmission () . Přenáší se 7bitová adresa zařízení.
5. Wire.endTransmission ();
Použití: Tato funkce se používá k ukončení přenosu do podřízeného zařízení, které bylo zahájeno metodou beginTransmission (), a vysílá bajty, které byly zařazeny do fronty funkcí Wire.write ().
6. Wire.onRequest ();
Použití: Tato funkce se zavolá, když master požaduje data pomocí Wire.requestFrom () z podřízeného zařízení. Tady můžeme zahrnout funkci Wire.write () pro odesílání dat do masteru.
7. Wire.onReceive ();Použití: Tato funkce je volána, když podřízené zařízení přijímá data z nadřízeného. Zde můžeme zahrnout Wire.read (); funkce pro čtení dat odeslaných z masteru.
8. Wire.requestFrom (adresa, množství);
Použití: Tato funkce se používá v masteru k vyžádání bytů z podřízeného zařízení. Funkce Wire.read () se používá ke čtení dat odeslaných z podřízeného zařízení.
address (adresa): 7bitová adresa zařízení, od kterého se mají žádat bajty
množství: počet bajtů, které mají být vyžádány
Požadované komponenty
- Arduino Uno (2 nosy)
- Modul LCD displeje 16X2
- 10K potenciometr (4-nos)
- Nepájivá deska
- Připojení vodičů
Kruhový diagram
Pracovní vysvětlení
Zde pro demonstraci komunikace I2C v Arduinu používáme dva Arduino UNO se dvěma LCD displejem 16X2 připojeným k sobě a pomocí dvou potenciometrů na obou arduino určujeme hodnoty odesílání (0 až 127) z master na slave a slave na master změnou potenciometr.
Vezmeme vstupní analogovou hodnotu na arduino pin A0 od (0 do 5 V) pomocí potenciometru a převedeme je na analogovou na digitální hodnotu (0 až 1023). Poté jsou tyto hodnoty ADC dále převedeny na (0 až 127), protože prostřednictvím komunikace I2C můžeme odesílat pouze 7bitová data. Komunikace I2C probíhá prostřednictvím dvou vodičů na pinech A4 a A5 obou arduino.
Hodnoty na displeji Slave Arduino se budou měnit změnou POT na straně master a naopak.
Programování I2C v Arduinu
Tento výukový program má dva programy, jeden pro hlavní Arduino a druhý pro podřízené Arduino. Kompletní programy pro obě strany jsou uvedeny na konci tohoto projektu s ukázkovým videem.
Vysvětlení programování Master Arduino
1. Nejprve musíme zahrnout knihovnu Wire pro používání komunikačních funkcí I2C a knihovnu LCD pro používání funkcí LCD. Také definujte piny LCD pro 16x2 LCD. Další informace o propojení LCD s Arduino se dozvíte zde.
#zahrnout
2. V neplatném nastavení ()
- Zahajujeme sériovou komunikaci s přenosovou rychlostí 9600.
Serial.begin (9600);
- Dále zahájíme komunikaci I2C na pinu (A4, A5)
Wire.begin (); // Začíná komunikace I2C na pinu (A4, A5)
- Dále inicializujeme modul LCD displeje v režimu 16X2 a zobrazíme uvítací zprávu a po pěti sekundách zmizíme.
lcd.begin (16,2); // Inicializace LCD displeje lcd.setCursor (0,0); // Nastaví kurzor na první řádek displeje lcd.print ("Přehled okruhů"); // Vytiskne CIRCUIT DIGEST na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý řádek displeje lcd.print ("I2C 2 ARDUINO"); // Vytiskne I2C ARDUINO na LCD zpoždění (5000); // Zpoždění o 5 sekund lcd.clear (); // Vymaže LCD displej
3. V prázdné smyčce ()
- Nejprve musíme získat data ze Slave, takže použijeme requestFrom () s podřízenou adresou 8 a požadujeme jeden bajt
Wire.requestFrom (8,1);
Přijatá hodnota se čte pomocí Wire.read ()
byte MasterReceive = Wire.read ();
- Dále musíme načíst analogovou hodnotu z hlavního arduino POT připojeného k pinu A0
int potvalue = analogRead (A0);
Tuto hodnotu převedeme na jeden bajt jako 0 až 127.
byte MasterSend = mapa (potvalue, 0,1023,0,127);
- Dále musíme poslat tyto převedené hodnoty, abychom zahájili přenos se slave arduino s 8 adresami
Wire.beginTransmission (8); Wire.write (MasterSend); Wire.endTransmission ();
- Dále zobrazíme tyto přijaté hodnoty od slave arduino se zpožděním 500 mikrosekund a tyto hodnoty průběžně přijímáme a zobrazujeme.
lcd.setCursor (0,0); // Nastaví kurzor na první řádek LCD lcd.print (">> Master <<"); // Vytiskne >> Master << na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý řádek LCD lcd.print ("SlaveVal:"); // Vypíše SlaveVal: na LCD lcd.print (MasterReceive); // Vytiskne MasterReceive na LCD přijatý od Slave Serial.println ("Master přijatý od Slave"); // Tiskne v Serial Monitoru Serial.println (MasterReceive); zpoždění (500); lcd.clear ();
Vysvětlení programování Slave Arduino
1. Stejně jako master musíme nejdříve zahrnout knihovnu Wire pro používání komunikačních funkcí I2C a knihovnu LCD pro používání funkcí LCD. Také definujte piny LCD pro 16x2 LCD.
#zahrnout
2. V neplatném nastavení ()
- Zahajujeme sériovou komunikaci s přenosovou rychlostí 9600.
Serial.begin (9600);
- Dále zahájíme komunikaci I2C na pinu (A4, A5) s podřízenou adresou jako 8. Zde je důležité zadat podřízenou adresu.
Wire.begin (8);
Dále musíme zavolat funkci, když Slave obdrží hodnotu od masteru a když Master požaduje hodnotu od Slave
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
- Dále inicializujeme modul LCD displeje v režimu 16X2 a zobrazíme uvítací zprávu a po pěti sekundách zmizíme.
lcd.begin (16,2); // Inicializace LCD displeje lcd.setCursor (0,0); // Nastaví kurzor na první řádek displeje lcd.print ("Přehled okruhů"); // Vytiskne CIRCUIT DIGEST na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý řádek displeje lcd.print ("I2C 2 ARDUINO"); // Vytiskne I2C ARDUINO na LCD zpoždění (5000); // Zpoždění o 5 sekund lcd.clear (); // Vymaže LCD displej
3. Dále máme dvě funkce, jednu pro událost požadavku a jednu pro událost přijetí
Na vyžádání Událost
Když bude hodnota požadavku Master od slave provedena tato funkce. Tato funkce přebírá vstupní hodnotu ze Slave POT a převádí ji na 7bitové a posílá tuto hodnotu na master.
void requestEvent () { int potvalue = analogRead (A0); byte SlaveSend = mapa (potvalue, 0,1023,0,127); Wire.write (SlaveSend); }
Pro příjem události
Když Master pošle data slave s adresou slave (8), bude tato funkce provedena. Tato funkce čte přijatou hodnotu z masteru a ukládá ji do proměnné typu byte .
void receiveEvent (int howMany { SlaveReceived = Wire.read (); }
4. Ve smyčce Void ():
Přijímanou hodnotu z masteru zobrazujeme průběžně v modulu LCD displeje.
void loop (void) { lcd.setCursor (0,0); // Nastaví kurzor na první řádek LCD lcd.print (">> Slave <<"); // Tiskne >> Slave << na LCD lcd.setCursor (0,1); // Nastaví kurzor na druhý řádek LCD lcd.print ("MasterVal:"); // Vytiskne MasterVal: na LCD lcd.print (SlaveReceived); // Vypíše SlaveReceived hodnotu na LCD přijatou z Master Serial.println ("Slave Received From Master:"); // Tiskne v Serial Monitoru Serial.println (SlaveReceived); zpoždění (500); lcd.clear (); }
Tím, otáčením potenciometru na jedné straně, můžete vidět různé hodnoty na displeji na druhé straně:
Takto tedy probíhá komunikace I2C v Arduinu, zde jsme použili dvě Arduina, abychom demonstrovali nejen odesílání dat, ale také příjem dat pomocí komunikace I2C. Nyní tedy můžete propojit jakýkoli snímač I2C s Arduinem.
Kompletní kódování pro Master a Slave Arduino je uvedeno níže s ukázkovým videem