- Što je I2C komunikacijski protokol?
- Kako I2C Komunikacija radi?
- Gdje koristiti I2C komunikaciju?
- I2C u Arduinu
- Komponente potrebne
- Kružni dijagram
- Objašnjenje u radu
- I2C programiranje u Arduinu
- Objašnjenje master Arduino programiranja
- Objašnjenje programiranja slave Arduino programa
U našem prethodnom vodiču saznali smo o SPI komunikaciji u Arduinu. Danas ćemo naučiti o još jednom protokolu serijske komunikacije: I2C (Inter integrirani krugovi). Uspoređujući I2C sa SPI, I2C ima samo dvije žice, dok SPI koristi četiri, a I2C može imati više glavnih i podređenih, dok SPI može imati samo jednog glavnog i više podređenih. Dakle, u projektu postoji više od jednog mikrokontrolera koji treba biti majstor, a zatim se koristi I2C. I2C komunikacija obično se koristi za komunikaciju s žiroskopom, akcelerometrom, barometrijskim senzorima tlaka, LED zaslonima itd.
U ovom uputstvu za Arduino I2C koristit ćemo I2C komunikaciju između dvije arduino ploče i međusobno ćemo slati (0 do 127) vrijednosti pomoću potenciometra. Vrijednosti će se prikazati na LCD-u dimenzija 16x2 spojenom na svaki od Arduina. Ovdje će jedan Arduino djelovati kao Gospodar, a drugi kao Slave. Pa krenimo s uvodom o I2C komunikaciji.
Što je I2C komunikacijski protokol?
Izraz IIC označava " Inter integrirani krugovi ". Obično se na nekim mjestima označava kao I2C ili I na kvadrat C ili čak kao protokol dvožilnog sučelja (TWI), ali sve to znači isto. I2C je sinkroni komunikacijski protokol što znači da oba uređaja koji dijele informacije moraju dijeliti zajednički signal sata. Ima samo dvije žice za razmjenu informacija od kojih se jedna koristi za signal pijetla, a druga za slanje i primanje podataka.
Kako I2C Komunikacija radi?
I2C komunikaciju prvi je predstavio Phillips. Kao što je ranije rečeno, ima dvije žice, te dvije žice bit će povezane preko dva uređaja. Ovdje se jedan uređaj naziva master, a drugi uređaj slave. Komunikacija bi se trebala i uvijek će se odvijati između dvoje Učitelja i Roba. Prednost I2C komunikacije je u tome što se na Master može povezati više od jednog slave.

Kompletna komunikacija odvija se kroz ove dvije žice, naime, serijski sat (SCL) i serijski podatak (SDA).
Serijski sat (SCL): Dijeli signal sata koji generira master s podređenim uređajem
Serijski podaci (SDA): šalje podatke glavnom i pomoćnom uređaju i iz njega.
U bilo kojem trenutku samo će zapovjednik moći započeti komunikaciju. Budući da je u sabirnici više od jednog podređenog uređaja, master mora uputiti svakog podređenog koristeći drugu adresu. Kad im se obrati samo rob s tom određenom adresom, odgovorit će s informacijama, dok ostali nastavljaju s prestankom. Na taj način možemo koristiti istu sabirnicu za komunikaciju s više uređaja.
Razine napona I2C nisu unaprijed definirane. I2C komunikacija je fleksibilna, znači uređaj koji se napaja naponom od 5v, može koristiti 5v za I2C, a uređaji od 3.3v mogu koristiti 3v za I2C komunikaciju. Ali što ako dva uređaja koji rade na različitim naponima trebaju komunicirati pomoću I2C? 5V I2C sabirnice ne može biti povezan sa 3.3V uređaja. U tom se slučaju mjenjači napona koriste za usklađivanje nivoa napona između dvije I2C sabirnice.
Postoje neki uvjeti koji uokviruju transakciju. Inicijalizacija prijenosa započinje padajućim rubom SDA, što je definirano kao uvjet 'START' na donjem dijagramu gdje master ostavlja SCL visok, a SDA nisko.

Kao što je prikazano na gornjem dijagramu u nastavku, Pad SDA je hardverski okidač za stanje START. Nakon toga svi uređaji na istoj sabirnici prelaze u način slušanja.
Na isti način, uzlazni rub SDA zaustavlja prijenos koji je prikazan kao uvjet 'STOP' na gornjem dijagramu, gdje master ostavlja SCL visoko i također pušta SDA da ide VISOKO. Dakle, uzlazni rub SDA zaustavlja prijenos.

R / W bit označava smjer prijenosa sljedećih bajtova, ako je HIGH, znači da će slave prenositi, a ako je nizak, znači da će master prenositi.
Svaki se bit prenosi na svakom taktu, pa je potrebno 8 ciklusa takta da bi se prenio bajt. Nakon svakog poslanog ili primljenog bajta, održava se deveti ciklus takta za ACK / NACK (potvrđeno / neprihvaćeno). Ovaj ACK bit generira slave ili master, ovisno o situaciji. Za ACK bit, SDA je postavljen na najnižu razinu od strane glavni ili podređeni u 9 -og sat ciklusa. Dakle, nisko se smatra ACK, inače NACK.

Gdje koristiti I2C komunikaciju?
I2C komunikacija koristi se samo za kratku udaljenost. Svakako je pouzdan u određenoj mjeri jer ima sinkronizirani impuls sata koji ga čini pametnim. Ovaj se protokol uglavnom koristi za komunikaciju sa senzorom ili drugim uređajima koji moraju slati informacije glavnom računaru. Vrlo je zgodno kada mikrokontroler mora komunicirati s mnogim drugim pomoćnim modulima koristeći najmanje samo žice. Ako tražite komunikaciju na daljinu, probajte RS232, a ako tražite pouzdaniju komunikaciju isprobajte SPI protokol.
I2C u Arduinu
Slika ispod prikazuje I2C pinove prisutne u Arduinu UNO.

| I2C linija | Prikvači u Arduinu |
| SDA | A4 |
| SCL | A5 |
Prije nego započnemo s programiranjem I2C pomoću dva Arduina. Moramo naučiti o knjižnici Wire koja se koristi u Arduino IDE-u.
knjižnica
1. Wire.begin (adresa):
Upotreba: Ova se knjižnica koristi za uspostavljanje komunikacije s I2C uređajima. Ovo pokreće knjižnicu žica i pridružuje se I2C sabirnici kao master ili slave.
Adresa: 7-bitna pomoćna adresa nije obavezna i ako adresa nije navedena, pridružuje se sabirnici kao glavna kao što je ova.
2. Wire.read ():
Upotreba: Ova se funkcija koristi za čitanje bajta koji je primljen od glavnog ili podređenog uređaja, bilo da je premješten s podređenog uređaja na glavni uređaj nakon poziva na requestFrom () ili je premješten s glavnog na podređeni uređaj.
3. Wire.write ():
Upotreba: Ova se funkcija koristi za upisivanje podataka na podređeni ili glavni uređaj.
Slave to Master: Slave zapisuje podatke u master kada se Wire.RequestFrom () koristi u masteru.
Master to Slave: Za prijenos s master na slave uređaj Wire.write () koristi se između poziva Wire.beginTransmission () i Wire.endTransmission ().
Wire.write () može se zapisati kao:
- Wire.write (vrijednost)
vrijednost: vrijednost koju treba poslati kao jedan bajt.
- Wire.write (string):
string: niz koji se šalje kao niz bajtova.
- Wire.write (podaci, duljina):
podaci: niz podataka za slanje u bajtovima
duljina: broj bajtova za prijenos.
4. Wire.beginTransmission (adresa):
Upotreba: Ova se funkcija koristi za započinjanje prijenosa na I2C uređaj s danom slave adresom. Nakon toga, izgradite red bajtova za prijenos s funkcijom write (), a zatim ih prenesite pozivom funkcije endTransmission () . Prenosi se 7-bitna adresa uređaja.
5. Wire.endTransmission ();
Upotreba: Ova se funkcija koristi za kraj prijenos na uređaj robljem koji je započeo beginTransmission () i prenosi bajtova koje su na čekanju od strane Wire.write ().
6. Wire.onRequest ();
Upotreba: Ova se funkcija poziva kada master zahtijeva podatke pomoću podređenog uređaja pomoću Wire.requestFrom () . Ovdje možemo uključiti funkciju Wire.write () za slanje podataka glavnom.
7. Wire.onReceive ();Upotreba: Ova se funkcija poziva kada pomoćni uređaj primi podatke od glavnog. Ovdje možemo uključiti Wire.read (); funkcija za čitanje podataka poslanih od glavnog.
8. Wire.requestFrom (adresa, količina);
Upotreba: Ova se funkcija koristi u masteru za traženje bajtova od pomoćnog uređaja. Funkcija Wire.read () koristi se za čitanje podataka poslanih s slave uređaja.
adresa: 7-bitna adresa uređaja za zahtijevanje bajtova
količina: broj bajtova koji se traži
Komponente potrebne
- Arduino Uno (2 br.)
- Modul LCD zaslona 16X2
- 10K potenciometar (4 br.)
- Breadboard
- Spajanje žica
Kružni dijagram

Objašnjenje u radu
Ovdje za demonstraciju I2C komunikacije u Arduinu koristimo dva Arduino UNO s dva međusobno povezana LCD zaslona od 16X2 i koristimo dva potenciometra na oba arduina za određivanje vrijednosti slanja (od 0 do 127) od glavnog do pomoćnog i od podređenog prema glavnom mijenjajući potenciometar.
Uzimamo ulaznu analognu vrijednost na arduino pinu A0 od (0 do 5V) pomoću potenciometra i pretvaramo ih u analognu u digitalnu vrijednost (0 do 1023). Zatim se ove ADC vrijednosti dalje pretvaraju u (0 do 127) jer putem I2C komunikacije možemo poslati samo 7-bitne podatke. I2C komunikacija odvija se kroz dvije žice na pinima A4 i A5 oba arduina.
Vrijednosti na LCD-u Slave Arduina promijenit će se promjenom POT-a na matičnoj strani i obrnuto.

I2C programiranje u Arduinu
Ovaj tutorial ima dva programa jedan za master Arduino i drugi za slave Arduino. Kompletni programi za obje strane dati su na kraju ovog projekta s demonstracijskim videom.
Objašnjenje master Arduino programiranja
1. Prije svega trebamo uključiti knjižnicu Wire za upotrebu I2C komunikacijskih funkcija i LCD knjižnicu za korištenje LCD funkcija. Također definirajte LCD igle za LCD 16x2. Ovdje saznajte više o povezivanju LCD-a s Arduinom.
#include
2. U void postavljanju ()
- Serijsku komunikaciju započinjemo brzinom prijenosa 9600.
Serial.begin (9600);
- Dalje započinjemo I2C komunikaciju na pin-u (A4, A5)
Wire.begin (); // Počinje I2C komunikacija na pin-u (A4, A5)
- Zatim inicijaliziramo modul LCD zaslona u načinu 16X2 i prikazujemo poruku dobrodošlice i brišemo nakon pet sekundi.
lcd.početak (16,2); // Iniciranje LCD zaslona lcd.setCursor (0,0); // Postavlja kursor u prvi red Display lcd.print ("Circuit Digest"); // Ispisuje DIGEST CIRCUIT DIGEST u LCD lcd.setCursor (0,1); // Postavlja kursor na drugi redak zaslona lcd.print ("I2C 2 ARDUINO"); // Ispisuje I2C ARDUINO u LCD odgodi (5000); // Odgoda za 5 sekundi lcd.clear (); // Briše LCD zaslon
3. U void petlji ()
- Prvo trebamo dobiti podatke od podređenog uređaja pa koristimo requestFrom () s podređenom adresom 8 i tražimo jedan bajt
Wire.requestFrom (8,1);
Primljena vrijednost očitava se pomoću Wire.read ()
bajt MasterReceive = Wire.read ();
- Dalje moramo pročitati analognu vrijednost s glavnog arduino POT-a pričvršćenog na pin A0
int potvalue = analogRead (A0);
Tu vrijednost pretvaramo u jedan bajt u 0 na 127.
bajt MasterSend = karta (potvalue, 0,1023,0,127);
- Dalje trebamo poslati te pretvorene vrijednosti pa započinjemo prijenos s slave arduinom s 8 adresa
Wire.beginTransmission (8); Wire.write (MasterSend); Wire.endTransmission ();
- Dalje prikazujemo one primljene vrijednosti iz slave arduina s kašnjenjem od 500 mikrosekundi i kontinuirano ih primamo i prikazujemo.
lcd.setCursor (0,0); // Postavlja kursor na prvom retku LCD lcd.print (">> Master <<"); // Ispisi >> Master << na LCD lcd.setCursor (0,1); // Postavlja kursor na drugi redak LCD lcd.print ("SlaveVal:"); // Ispisuje SlaveVal: u LCD lcd.print (MasterReceive); // Ispisuje MasterReceive na LCD-u primljeno od Slave Serial.println ("Master Received From Slave"); // Ispisi u Serial Monitor Serial.println (MasterReceive); kašnjenje (500); lcd.clear ();
Objašnjenje programiranja slave Arduino programa
1. Isto kao i master, prije svega moramo uključiti knjižnicu žica za upotrebu I2C komunikacijskih funkcija i LCD knjižnicu za upotrebu LCD funkcija. Također definirajte LCD igle za LCD 16x2.
#include
2. U void postavljanju ()
- Serijsku komunikaciju započinjemo brzinom prijenosa 9600.
Serial.begin (9600);
- Dalje započinjemo I2C komunikaciju na pinu (A4, A5) s slave adresom kao 8. Ovdje je važno odrediti slave adresu.
Wire.begin (8);
Dalje moramo pozvati funkciju kada Slave prima vrijednost od master-a i kada Master zahtijeva vrijednost od Slave-a
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
- Zatim inicijaliziramo modul LCD zaslona u načinu 16X2 i prikazujemo poruku dobrodošlice i brišemo nakon pet sekundi.
lcd.početak (16,2); // Iniciranje LCD zaslona lcd.setCursor (0,0); // Postavlja kursor u prvi red Display lcd.print ("Circuit Digest"); // Ispisuje DIGEST CIRCUIT DIGEST u LCD lcd.setCursor (0,1); // Postavlja kursor na drugi redak zaslona lcd.print ("I2C 2 ARDUINO"); // Ispisuje I2C ARDUINO u LCD odgodi (5000); // Odgoda za 5 sekundi lcd.clear (); // Briše LCD zaslon
3. Dalje imamo dvije funkcije jednu za događaj zahtjeva i jednu za događaj primanja
Za zahtjev Događaj
Kada se izvrši vrijednost glavnog zahtjeva od pomoćnog uređaja, ova će se funkcija izvršiti. Ova funkcija uzima ulaznu vrijednost iz podređenog POT-a i pretvara je u 7-bitnu i šalje tu vrijednost masteru.
void requestEvent () { int potvalue = analogRead (A0); bajt SlaveSend = karta (potvalue, 0,1023,0,127); Wire.write (SlaveSend); }
Za događaj primanja
Kada Master pošalje podatke slave s slave adresom (8), ova će se funkcija izvršiti. Ova funkcija čita primljenu vrijednost s master-a i pohranjuje u varijablu bajta tipa.
poništava receiveEvent (int howMany { SlaveReceived = Wire.read (); }
4. U petlji Void ():
Primljenu vrijednost od master kontinuirano prikazujemo u modulu LCD zaslona.
petlja void (void) { lcd.setCursor (0,0); // Postavlja kursor na prvom retku LCD lcd.print (">> Slave <<"); // Ispisi >> Slave << na LCD lcd.setCursor (0,1); // Postavlja kursor na drugi redak LCD lcd.print ("MasterVal:"); // Ispisuje MasterVal: u LCD lcd.print (SlaveReceived); // Ispisuje SlaveReceived vrijednost na LCD-u primljenu od Master Serial.println ("Slave Received From Master:"); // Ispisi u Serial Monitor Serial.println (SlaveReceived); kašnjenje (500); lcd.clear (); }
Do okretanjem potenciometra na jednoj strani, možete vidjeti različite vrijednosti na LCD na drugu stranu:

Dakle, ovako se odvija I2C komunikacija u Arduinu, ovdje koristimo dva Arduinosa kako bismo demonstrirali ne samo slanje podataka već i primanje podataka pomoću I2C komunikacije. Tako sada možete spojiti bilo koji I2C senzor s Arduinom.
Kompletno kodiranje za Master i Slave Arduino dato je u nastavku s demonstracijskim video zapisom
