- Mikä on I2C Communication Protocol?
- Kuinka I2C-viestintä toimii?
- Missä käyttää I2C-viestintää?
- I2C Arduinossa
- Tarvittavat komponentit
- Piirikaavio
- Toimiva selitys
- I2C-ohjelmointi Arduinossa
- Master Arduino -ohjelmoinnin selitys
- Orja-Arduino-ohjelmoinnin selitys
Edellisessä opetusohjelmassa oppimme SPI-viestinnästä Arduinossa. Tänään opimme toisesta sarjaliikenneprotokollasta: I2C (Inter Integrated Circuits). Verrattaessa I2C: tä SPI: hen, I2C: llä on vain kaksi johtoa, kun taas SPI käyttää neljää johtoa ja I2C: llä voi olla useita isäntä- ja orjalaitteita, kun taas SPI: llä voi olla vain yksi isäntä ja useita orjia. Joten projektissa on enemmän kuin yksi mikro-ohjain, jonka on oltava päälliköitä, niin käytetään I2C: tä. I2C-tiedonsiirtoa käytetään yleensä kommunikointiin gyroskoopin, kiihtyvyysmittarin, barometristen paineanturien, LED-näyttöjen jne. Kanssa.
Tässä Arduino I2C -oppaassa käytämme I2C-tiedonsiirtoa kahden arduino-kortin välillä ja lähetämme (0-127) arvoja toisilleen potentiometrillä. Arvot näytetään 16x2-nestekidenäytössä, joka on kytketty Arduinoon. Täällä yksi Arduino toimii mestarina ja toinen orjana. Joten aloitetaan I2C-viestinnän johdannosta.
Mikä on I2C Communication Protocol?
Termi IIC tarkoittaa ” integroituja piirejä ”. Sitä kutsutaan yleensä I2C: ksi tai I-neliöksi C tai jopa 2-johdinliitäntäprotokollaksi (TWI) joissakin paikoissa, mutta se kaikki tarkoittaa samaa. I2C on synkroninen tietoliikenneprotokolla, mikä tarkoittaa, että molemmilla laitteilla, jotka jakavat tietoa, on oltava yhteinen kellosignaali. Siinä on vain kaksi johtoa tietojen jakamiseksi, joista toista käytetään kukkosignaaliin ja toista datan lähettämiseen ja vastaanottamiseen.
Kuinka I2C-viestintä toimii?
I2C-viestinnän otti ensimmäisen kerran käyttöön Phillips. Kuten aiemmin mainittiin, sillä on kaksi johtoa, nämä kaksi johtoa kytketään kahden laitteen yli. Tällöin yhtä laitetta kutsutaan isännäksi ja toista laitetta orjaksi. Viestinnän tulisi tapahtua ja tapahtuu aina kahden isännän ja orjan välillä. I2C-tiedonsiirron etuna on, että Masteriin voidaan liittää useampi kuin yksi orja.
Täydellinen tiedonsiirto tapahtuu näiden kahden johdon, nimittäin sarjakellon (SCL) ja sarjatietojen (SDA), kautta.
Sarjakello (SCL): Jakaa isännän tuottaman kellosignaalin orjan kanssa
Sarjatiedot (SDA): Lähettää tietoja isännälle ja orjalle.
Milloin tahansa vain päällikkö voi aloittaa viestinnän. Koska väylässä on useampi kuin yksi orja, isännän on viitattava kuhunkin orjaan eri osoitteella. Kun osoitetaan vain orja, jolla on kyseinen osoite, vastaa takaisin tietoihin, kun taas muut pitävät lopettaa. Tällä tavalla voimme käyttää samaa väylää kommunikoimaan useiden laitteiden kanssa.
Jännitetasot I2C ei ole määritetty valmiiksi. I2C-tiedonsiirto on joustavaa, tarkoittaa, että laite, joka saa virtansa 5 voltin jännitteestä, voi käyttää 5 voltin jännitettä I2C: ssä ja 3,3 voltin laitteet voivat käyttää 3v: tä I2C-viestinnässä. Entä jos kahden eri jännitteellä toimivan laitteen täytyy kommunikoida I2C: n avulla? 5V I2C bus ei voida liittää 3.3V laitteeseen. Tässä tapauksessa jännitteensiirtimiä käytetään kahden I2C-väylän jännitetasojen sovittamiseen.
On joitain ehtoja, jotka muodostavat tapahtuman. Lähetyksen alustus alkaa SDA: n putoavalla reunalla, joka määritetään START-ehdoksi alla olevassa kaaviossa, jossa isäntä jättää SCL: n korkeaksi asettamalla SDA: n matalaksi.
Kuten yllä olevassa kaaviossa on esitetty, SDA: n putoava reuna on START-tilan laitteistolaite. Tämän jälkeen kaikki saman väylän laitteet siirtyvät kuuntelutilaan.
Samalla tavalla SDA: n nouseva reuna pysäyttää lähetyksen, joka näkyy STOP-tilana yllä olevassa kaaviossa, jossa isäntä jättää SCL: n korkealle ja vapauttaa myös SDA: n siirtymään HIGH. Joten SDA: n nouseva reuna pysäyttää lähetyksen.
R / W-bitti ilmaisee seuraavien tavujen lähetyssuunnan, jos se on KORKEA, orja lähettää ja jos se on matala, master lähettää.
Jokainen bitti lähetetään jokaisella kellojaksolla, joten tavun lähettäminen kestää 8 kellosykliä. Jokaisen lähetetyn tai vastaanotetun tavun jälkeen ACK / NACK: lle pidetään yhdeksäs kellosykli (kuitattu / ei kuitattu). Tämän ACK-bitin tuottaa joko orja tai isäntä tilanteen mukaan. ACK bitti, SDA asetetaan matalaksi master tai slave 9 th kellojaksossa. Joten se on matala, sitä pidetään ACK: na muuten NACK.
Missä käyttää I2C-viestintää?
I2C-viestintää käytetään vain lyhyen matkan viestintään. Se on varmasti jossain määrin luotettava, koska sillä on synkronoitu kellopulssi, joka tekee siitä älykkään. Tätä protokollaa käytetään pääasiassa kommunikoimaan anturin tai muiden laitteiden kanssa, joiden on lähetettävä tietoja päällikölle. On erittäin kätevää, kun mikro-ohjaimen on oltava yhteydessä moniin muihin orjamoduuleihin käyttämällä vähintään vain johtoja. Jos etsit pitkän kantaman tiedonsiirtoa, kokeile RS232: ta ja jos etsit luotettavampaa tiedonsiirtoa, kokeile SPI-protokollaa.
I2C Arduinossa
Alla olevassa kuvassa näkyvät Arduino UNO: ssa olevat I2C-nastat.
I2C-linja | Kiinnitä Arduinoon |
SDA | A4 |
SCL | A5 |
Ennen kuin aloitamme I2C: n ohjelmoinnin kahdella Arduinolla. Meidän on opittava Wire-kirjastosta, jota käytetään Arduino IDE: ssä.
kirjasto
1. Wire.begin (osoite):
Käyttö: Tätä kirjastoa käytetään yhteydenpitoon I2C-laitteiden kanssa. Tämä aloittaa Wire-kirjasto ja liity I2C-väylään isäntänä tai orjana.
Osoite: 7-bittinen orjaosoite on valinnainen, ja jos osoitetta ei ole määritetty, se liittyy väylään isäntänä näin.
2. Wire.read ():
Käyttö: Tätä toimintoa käytetään isäntä- tai orjalaitteelta vastaanotetun tavun lukemiseen, joko lähetetyksi orjalaitteelta isäntälaitteelle pyynnön fromFrom () kutsun jälkeen tai lähetettynä isännältä orjalle.
3. Wire.write ():
Käyttö: Tätä toimintoa käytetään tietojen kirjoittamiseen orja- tai isäntälaitteelle.
Slave to Master: Orja kirjoittaa tietoja isännälle, kun Wire.RequestFrom () -ominaisuutta käytetään masterissa.
Master to Slave: Lähetettäessä isännältä orjalaitteelle Wire.write () -sovellusta käytetään Wire.beginTransmission () - ja Wire.endTransmission () -puheluiden välillä.
Wire.write () voidaan kirjoittaa seuraavasti:
- Wire.write (arvo)
arvo: arvo, joka lähetetään yhtenä tavuna.
- Wire.write (merkkijono):
merkkijono: merkkijono, joka lähetetään tavusarjana.
- Wire.write (tiedot, pituus):
data: joukko tietoja, jotka lähetetään tavuina
pituus: lähetettävien tavujen määrä.
4. Wire.beginTransmission (osoite):
Käyttö: Tätä toimintoa käytetään lähettämisen aloittamiseen I2C-laitteelle annetulla orjaosoitteella. Rakenna sitten tavujono lähetystä varten kirjoitus () -toiminnolla ja lähetä ne sitten kutsumalla endTransmission () -toiminto. Laitteen 7-bittinen osoite lähetetään.
5. Wire.endTransmission ();
Käyttö: Tätä toimintoa käytetään lopettamaan lähetys orjalaitteelle, jonka aloitti startTransmission () ja joka lähettää tavut, jotka Wire.write () oli jonossa .
6. Wire.onRequest ();
Käyttö: Tätä toimintoa kutsutaan, kun isäntä pyytää tietoja Wire.requestFrom () : n avulla orjalaitteelta. Tässä voimme sisällyttää Wire.write () -toiminnon tietojen lähettämiseen päällikölle.
7. Wire.onReceive ();Käyttö: Tätä toimintoa kutsutaan, kun orjalaite vastaanottaa tietoja isännältä. Tässä voimme sisällyttää Wire.read (); toiminto päälliköltä lähetettyjen tietojen lukemiseen.
8. Wire.requestFrom (osoite, määrä);
Käyttö: Tätä toimintoa käytetään isännässä tavujen pyytämiseen orjalaitteelta. Toimintoa Wire.read () käytetään orjalaitteelta lähetettyjen tietojen lukemiseen.
osoite: laitteen 7-bittinen osoite, jolta tavuja pyydetään
määrä: pyydettävien tavujen lukumäärä
Tarvittavat komponentit
- Arduino Uno (2-nenäinen)
- 16X2 LCD-näyttömoduuli
- 10K-potentiometri (4-nastainen)
- Leipälauta
- Johtojen liittäminen
Piirikaavio
Toimiva selitys
Tässä I2C-viestinnän esittelemiseksi Arduinossa käytämme kahta Arduino UNO: ta, joissa on kaksi 16X2 LCD-näyttöä toisiinsa, ja käytämme kahta potentiometriä molemmissa arduinoissa määrittämään lähetysarvot (0-127) isännältä orjalle ja orja isännälle vaihtelemalla potentiometri.
Otamme analogisen tulon arvon arduino-nastassa A0 (0 - 5 V) potentiometrillä ja muunnamme ne analogiseksi digitaaliseksi arvoksi (0-1023). Sitten nämä ADC-arvot muunnetaan edelleen (0 - 127): ksi, koska voimme lähettää vain 7-bittistä dataa I2C-tietoliikenteen kautta. I2C-tiedonsiirto tapahtuu kahden johdon kautta molempien arduinojen nastoilla A4 ja A5.
Slave Arduinon nestekidenäytön arvot muuttuvat muuttamalla POT: ta pääpuolella ja päinvastoin.
I2C-ohjelmointi Arduinossa
Tässä opetusohjelmassa on kaksi ohjelmaa, yksi Arduinon päällikölle ja toinen orja Arduinolle. Molempien osapuolten täydelliset ohjelmat annetaan tämän projektin lopussa esittelyvideolla.
Master Arduino -ohjelmoinnin selitys
1. Ensinnäkin meidän on sisällytettävä lankakirjasto I2C-viestintätoimintojen käyttämiseen ja LCD-kirjasto LCD-toimintojen käyttöön. Määritä myös LCD-nastat 16x2 LCD: lle. Lisätietoja LCD-näytön liittämisestä Arduinoon on täällä.
#sisältää
2. Tyhjässä asennuksessa ()
- Aloitamme sarjaliikenteen tiedonsiirtonopeudella 9600.
Sarjan alku (9600);
- Seuraavaksi aloitamme I2C-viestinnän tapilla (A4, A5)
Wire.begin (); // Aloittaa I2C-tiedonsiirron tapilla (A4, A5)
- Seuraavaksi alustamme LCD-näyttömoduulin 16X2-tilassa ja näytämme tervetuloviestin ja tyhjennämme viiden sekunnin kuluttua.
lcd-alku (16,2); // Alusta LCD-näyttö lcd.setCursor (0,0); // Asettaa kohdistimen näytön lcd.print ("Circuit Digest") ensimmäiselle riville ; // Tulostaa CIRCUIT DIGEST LCD-näytöllä lcd.setCursor (0,1); // Asettaa kohdistimen näytön lcd.print toiselle riville ("I2C 2 ARDUINO"); // Tulostaa I2C ARDUINO LCD- viiveellä (5000); // Viive 5 sekunnin ajan lcd.clear (); // Tyhjentää LCD-näytön
3. Tyhjässä silmukassa ()
- Ensin meidän on haettava tietoja orjalta, joten käytämme requestFrom () : tä orjaosoitteella 8 ja pyydämme yhtä tavua
Wire.requestFrom (8,1);
Vastaanotettu arvo luetaan käyttämällä Wire.read ()
tavu MasterReceive = Wire.read ();
- Seuraavaksi meidän on luettava analoginen arvo nastalle A0 kiinnitetystä pääarduino POT: sta
int potvalue = analogRead (A0);
Muunamme tämän arvon yhden tavun muodossa arvoksi 0 - 127.
tavu MasterSend = kartta (potvalue, 0,1023,0127);
- Seuraavaksi meidän on lähetettävä nämä muunnetut arvot, jotta aloitamme lähetyksen orja-orduinolla, jolla on 8 osoitetta
Wire.beginLähetys (8); Wire.write (MasterSend); Wire.endTransmission ();
- Seuraavaksi näytämme orja-arduinolta vastaanotetut arvot 500 mikrosekunnin viiveellä ja vastaanotamme ja näytämme jatkuvasti näitä arvoja.
lcd.setCursor (0,0); // Asettaa Currsorin LCD- lcd.print- rivin ensimmäiselle riville (">> Master <<"); // Tulostaa >> Master << LCD- lcd.setCursorissa (0,1); // Asettaa kohdistimen LCD lcd.print -rivin toiselle riville ("SlaveVal:"); // Tulostaa SlaveVal: LCD- näytössä lcd.print (MasterReceive); // Tulostaa MasterReceive LCD: n, joka on vastaanotettu Slave Serial.println: ltä ("Master vastaanotettu orjalta"); // Tulostaa sarjamonitorissa Serial.println (MasterReceive); viive (500); lcd.clear ();
Orja-Arduino-ohjelmoinnin selitys
1. Sama kuin master, ensinnäkin meidän on sisällytettävä Wire-kirjasto I2C-viestintätoimintojen käyttämiseen ja LCD-kirjasto LCD-toimintojen käyttöön. Määritä myös LCD-nastat 16x2 LCD: lle.
#sisältää
2. Tyhjässä asennuksessa ()
- Aloitamme sarjaliikenteen tiedonsiirtonopeudella 9600.
Sarjan alku (9600);
- Seuraavaksi aloitamme I2C-tiedonsiirron nastasta (A4, A5) orjaosoitteella 8. Tässä on tärkeää määritellä orjaosoite.
Lanka alkaa (8);
Seuraavaksi meidän on kutsuttava toiminto, kun orja saa arvon isännältä ja kun isäntä pyytää arvoa orjalta
Wire.onReceive (vastaanottaaEvent); Wire.onRequest (requestEvent);
- Seuraavaksi alustamme LCD-näyttömoduulin 16X2-tilassa ja näytämme tervetuloviestin ja tyhjennämme viiden sekunnin kuluttua.
lcd-alku (16,2); // Alusta LCD-näyttö lcd.setCursor (0,0); // Asettaa kohdistimen näytön lcd.print ("Circuit Digest") ensimmäiselle riville ; // Tulostaa CIRCUIT DIGEST LCD-näytöllä lcd.setCursor (0,1); // Asettaa kohdistimen näytön lcd.print toiselle riville ("I2C 2 ARDUINO"); // Tulostaa I2C ARDUINO LCD- viiveellä (5000); // Viive 5 sekunnin ajan lcd.clear (); // Tyhjentää LCD-näytön
3. Seuraavaksi meillä on kaksi toimintoa, yksi pyynnötapahtumalle ja toinen vastaanottotapahtumalle
Pyyntötapahtuma
Kun isäntä kysyy arvoa orjalta, tämä toiminto suoritetaan. Tämä toiminto ottaa syöttöarvon Slave POT: sta ja muuntaa sen 7-bittisenä ja lähettää kyseisen arvon masterille.
void requestEvent () { int potvalue = analogRead (A0); tavu SlaveSend = kartta (potvalue, 0,1023,0,127); Wire.write (SlaveSend); }
Vastaanottotapahtumaan
Kun päällikkö lähettää tietoja orjalle orjaosoitteella (8), tämä toiminto suoritetaan. Tämä toiminto lukee isännältä ja varastoilta vastaanotetun arvon tyypin tavuiseen muuttujaan.
void acceptEvent (int kuinkaMany { SlaveReceived = Wire.read (); }
4. Void-silmukassa ():
Näytämme isännältä vastaanotetun arvon jatkuvasti LCD-näyttömoduulissa.
void loop (void) { lcd.setCursor (0,0); // Asettaa Currsorin LCD- lcd.print- rivin ensimmäiselle riville (">> Slave <<"); // Tulostaa >> Orja << LCD-näytöllä lcd.setCursor (0,1); // Asettaa kohdistimen LCD- lcd.print- rivin toiselle riville ("MasterVal:"); // Tulostaa MasterVal: LCD- näytössä lcd.print (SlaveReceived); // Tulostaa SlaveReceived-arvon LCD: ltä, joka on saatu Master Serial.println: ltä ("Orja vastaanotettu isännältä:"); // Tulostaa sarjamonitorissa Serial.println (SlaveReceived); viive (500); lcd.clear (); }
By pyörittämällä Potentiometri toiselle puolelle, näet vaihtelevat arvot LCD toisella puolella:
Joten näin I2C-viestintä tapahtuu Arduinossa, tässä olemme käyttäneet kahta Arduinoa osoittamaan paitsi tietojen lähettämisen myös tietojen vastaanottamisen I2C-viestinnän avulla. Joten nyt voit liittää minkä tahansa I2C-anturin Arduinoon.
Master- ja Slave Arduinon täydellinen koodaus on esitetty alla esittelyvideolla