- Kas ir I2C sakaru protokols?
- Kā darbojas I2C komunikācija?
- Kur izmantot I2C sakarus?
- I2C Arduino
- Nepieciešamās sastāvdaļas
- Ķēdes shēma
- Darba skaidrojums
- I2C programmēšana Arduino
- Master Arduino programmēšanas skaidrojums
- Slave Arduino programmēšanas skaidrojums
Mūsu iepriekšējā apmācībā uzzināja par SPI komunikāciju Arduino. Šodien mēs uzzināsim par vēl vienu sērijas sakaru protokolu: I2C (Inter Integrated Circuits). Salīdzinot I2C ar SPI, I2C ir tikai divi vadi, savukārt SPI izmanto četrus un I2C var būt vairāki Master un Slave, savukārt SPI var būt tikai viens galvenais un vairāki vergi. Tātad projektā ir vairāk nekā viens mikrokontrolleris, kam jābūt meistariem, tad tiek izmantots I2C. I2C komunikāciju parasti izmanto, lai sazinātos ar žiroskopu, akselerometru, barometriskā spiediena sensoriem, LED displejiem utt.
Šajā Arduino I2C apmācībā mēs izmantosim I2C sakarus starp divām arduino plāksnēm un nosūtīsim (0 līdz 127) vērtības viena otrai, izmantojot potenciometru. Vērtības tiks parādītas uz 16x2 LCD, kas savienots ar katru Arduino. Šeit viens Arduino darbosies kā Skolotājs, bet otrs - kā Vergs. Tātad sāksim ar ievadu par I2C komunikāciju.
Kas ir I2C sakaru protokols?
Termins IIC nozīmē “ Inter Integrated Circuits ”. Parasti to dažās vietās apzīmē kā I2C vai I kvadrātu C, vai pat kā divu vadu interfeisa protokolu (TWI), bet tas viss nozīmē to pašu. I2C ir sinhrona sakaru protokola nozīme, abām ierīcēm, kas koplieto informāciju, ir jābūt kopīgam pulksteņa signālam. Tam ir tikai divi vadi informācijas apmaiņai, no kuriem vienu izmanto gailis signālam, bet otru - datu sūtīšanai un saņemšanai.
Kā darbojas I2C komunikācija?
Pirmo reizi I2C komunikāciju ieviesa Filipss. Kā minēts iepriekš, tam ir divi vadi, šie divi vadi tiks savienoti divās ierīcēs. Šeit vienu ierīci sauc par galveno, bet otru - par vergu. Saziņai vienmēr vajadzētu notikt un tā notiks starp diviem kapteiņiem un vergiem. I2C komunikācijas priekšrocība ir tā, ka vairāk nekā vienu vergu var savienot ar Master.
Pilnīga saziņa notiek caur šiem diviem vadiem, proti, seriālo pulksteni (SCL) un sērijas datiem (SDA).
Seriālais pulkstenis (SCL): koplieto galvenā signāla ģenerēto pulksteņa signālu ar vergu
Seriālie dati (SDA): nosūta datus uz galveno un vergu un no tā.
Jebkurā brīdī tikai kapteinis varēs sākt saziņu. Tā kā autobusā ir vairāk nekā viens vergs, kapteinim ir jāatsaucas uz katru vergu, izmantojot citu adresi. Ja uzrunā tikai vergs ar konkrēto adresi, atbildēs ar informāciju, bet pārējie turpinās iziet. Tādā veidā mēs varam izmantot to pašu kopni, lai sazinātos ar vairākām ierīcēm.
Par sprieguma līmeņi I2C nav iepriekš definēti. I2C sakari ir elastīgi, tas nozīmē, ka ierīce, kuru darbina 5 V spriegums, I2C var izmantot 5 V un 3.3 V ierīces I2C sakariem - 3 V. Bet ko tad, ja divām ierīcēm, kas darbojas ar dažādu spriegumu, ir jāsazinās, izmantojot I2C? 5V I2C autobusu nevar saistīt ar 3.3V ierīci. Šajā gadījumā sprieguma pārslēdzējus izmanto, lai saskaņotu sprieguma līmeņus starp divām I2C kopnēm.
Ir daži nosacījumu kopumi, kas veido darījumu. Pārraides inicializēšana sākas ar SDA krišanas malu, kas zemāk redzamajā diagrammā ir definēts kā “START” nosacījums, kur galvenais atstāj SCL augstu, vienlaikus nosakot SDA zemu.
Kā parādīts zemāk esošajā diagrammā, SDA krītošā mala ir aparatūras trigeris START nosacījumam. Pēc tam visas ierīces vienā autobusā nonāk klausīšanās režīmā.
Tādā pašā veidā SDA augšējā mala pārtrauc pārraidi, kas iepriekšējā diagrammā tiek parādīta kā “STOP” nosacījums, kur galvenais atstāj SCL augstu un arī atbrīvo SDA, lai ietu HIGH. Tātad pieaugošā SDA mala pārtrauc pārraidi.
R / W bits norāda nākamo baitu pārraides virzienu, ja tas ir HIGH, tas nozīmē, ka vergs pārraidīs, un, ja tas ir zems, tas nozīmē, ka galvenais raidīs.
Katrs bits tiek pārraidīts katrā pulksteņa ciklā, tāpēc baita pārsūtīšanai nepieciešami 8 pulksteņu cikli. Pēc katra nosūtītā vai saņemtā baita tiek turēts devītais pulksteņa cikls ACK / NACK (apstiprināts / nav apstiprināts). Šo ACK bitu rada vai nu vergs, vai galvenais, atkarībā no situācijas. Par ACK bit, SDA ir iestatīts zems kapteiņa vai vergu 9 th pulksteni ciklā. Tāpēc tas ir zems, to uzskata par ACK, citādi NACK.
Kur izmantot I2C sakarus?
I2C sakari tiek izmantoti tikai neliela attāluma sakariem. Tas noteikti ir uzticams zināmā mērā, jo tam ir sinhronizēts pulksteņa impulss, lai padarītu to gudru. Šo protokolu galvenokārt izmanto, lai sazinātos ar sensoru vai citām ierīcēm, kurām informācija jānosūta kapteinim. Tas ir ļoti ērti, ja mikrokontrollerim ir jāsazinās ar daudziem citiem vergu moduļiem, izmantojot vismaz tikai vadus. Ja jūs meklējat tālsatiksmes komunikāciju, jums vajadzētu izmēģināt RS232 un, ja vēlaties drošāku komunikāciju, izmēģiniet SPI protokolu.
I2C Arduino
Zemāk redzamajā attēlā redzamas I2C tapas, kas atrodas Arduino UNO.
I2C līnija | Piesprauž Arduino |
SDA | A4 |
SCL | A5 |
Pirms mēs sākam programmēt I2C, izmantojot divus Arduino. Mums jāzina par Wire bibliotēku, kas tiek izmantota Arduino IDE.
bibliotēka
1. Wire.begin (adrese):
Lietošana: Šī bibliotēka tiek izmantota saziņas veidošanai ar I2C ierīcēm. Tas Inicializējiet Wire bibliotēku un pievienojieties I2C kopnei kā galvenais vai vergs.
Adrese: 7 bitu vergu adrese nav obligāta, un, ja adrese nav norādīta, tā pievienojas kopnei kā galvenā.
2. Wire.read ():
Lietošana: šo funkciju izmanto, lai nolasītu baitu, kas tika saņemts no galvenā vai pakārtotās ierīces, vai nu pārsūtīts no vergu ierīces uz galveno ierīci pēc zvana to requestFrom (), vai pārsūtīts no galvenā uz vergu.
3. Wire.write ():
Lietošana: šo funkciju izmanto, lai ierakstītu datus vergu vai galvenajā ierīcē.
Slave to Master: Slave raksta datus galvenajam, kad Wire.RequestFrom () tiek izmantots master.
Master to Slave: lai pārsūtītu no galvenā uz vergu ierīci, Wire.write () tiek izmantots starpzvanos starp Wire.beginTransmission () un Wire.endTransmission ().
Wire.write () var rakstīt šādi:
- Wire.write (vērtība)
vērtība: vērtība, kas jānosūta kā viens baits.
- Wire.write (virkne):
virkne: virkne, kas jānosūta kā baitu sērija.
- Wire.write (dati, garums):
dati: datu masīvs, kas jānosūta kā baiti
garums: pārsūtāmo baitu skaits.
4. Wire.beginTransmission (adrese):
Lietošana: šo funkciju izmanto, lai sāktu pārsūtīšanu uz I2C ierīci ar norādīto verga adresi. Pēc tam izveidojiet baitu rindu pārraidei ar rakstīšanas () funkciju un pēc tam pārsūtiet tos, izsaucot funkciju endTransmission () . Tiek pārsūtīta ierīces 7 bitu adrese.
5. Wire.endTransmission ();
Izmantošana: šo funkciju izmanto, lai pārtrauktu pārsūtīšanu uz vergu ierīci, kuru sāka ar startTransmission (), un pārsūta baitus, kurus rindā bija izveidojusi Wire.write ().
6. Vads.onRequest ();
Lietošana: Šī funkcija tiek izsaukta, kad kapteinis pieprasa datus, izmantojot vergu ierīci, izmantojot Wire.requestFrom () . Šeit mēs varam iekļaut funkciju Wire.write (), lai nosūtītu datus kapteinim.
7. Vads.onReceive ();Lietošana: Šī funkcija tiek izsaukta, kad vergu ierīce saņem datus no kapteiņa. Šeit mēs varam iekļaut Wire.read (); funkcija, lai nolasītu no kapteiņa nosūtītos datus.
8. Wire.requestFrom (adrese, daudzums);
Lietošana: šo funkciju galvenajā ierīcē izmanto, lai pieprasītu baitus no vergu ierīces. Funkcija Wire.read () tiek izmantota, lai nolasītu datus, kas nosūtīti no vergu ierīces.
adrese: ierīces 7 bitu adrese, no kuras pieprasīt baitus
daudzums: pieprasāmo baitu skaits
Nepieciešamās sastāvdaļas
- Arduino Uno (2-Nos)
- 16X2 LCD displeja modulis
- 10K potenciometrs (4-nos)
- Maizes dēlis
- Vadu savienošana
Ķēdes shēma
Darba skaidrojums
Lai demonstrētu I2C komunikāciju Arduino, mēs izmantojam Two Arduino UNO ar diviem 16X2 LCD displejiem, kas piestiprināti viens otram, un izmantojam divus potenciometrus abos arduino, lai noteiktu sūtīšanas vērtības (no 0 līdz 127) no kapteiņa līdz vergam un vergam uz kapteini, mainot potenciometrs.
Izmantojot potenciometru, arduino tapas A0 ieejas analogā vērtība ir no (0 līdz 5 V) un tiek pārveidota par analogo uz digitālo vērtību (no 0 līdz 1023). Tad šīs ADC vērtības tālāk tiek pārveidotas par (0 līdz 127), jo caur I2C komunikāciju mēs varam nosūtīt tikai 7 bitu datus. I2C sakari notiek caur diviem vadiem abu arduino A4 un A5 tapās.
Slave Arduino LCD vērtības tiks mainītas, mainot POT pie galvenā un otrādi.
I2C programmēšana Arduino
Šajā apmācībā ir divas programmas, viena - meistaram Arduino, bet otra - vergam Arduino. Pilnīgas programmas abām pusēm ir norādītas šī projekta beigās ar demonstrācijas video.
Master Arduino programmēšanas skaidrojums
1. Vispirms mums jāiekļauj Wire bibliotēka I2C sakaru funkciju izmantošanai un LCD bibliotēka LCD funkciju izmantošanai. Definējiet arī LCD tapas 16x2 LCD. Uzziniet vairāk par LCD saskarni ar Arduino šeit.
# iekļaut
2. Tukšajā iestatījumā ()
- Mēs sākam sērijveida saziņu ar Baud likmi 9600.
Sērijas sākums (9600);
- Pēc tam mēs sākam I2C sakarus ar tapu (A4, A5)
Wire.begin (); // Sākas I2C sakari ar tapu (A4, A5)
- Pēc tam mēs inicializējam LCD displeja moduli 16X2 režīmā, parādām sveiciena ziņojumu un notīriet pēc piecām sekundēm.
lcd.begin (16,2); // Iniciēt LCD displeju lcd.setCursor (0,0); // Iestata kursoru displeja lcd.print pirmajā rindā ("Circuit Digest"); // Drukā CIRCUIT DIGEST LCD lcd.setCursor (0,1); // Kursors tiek iestatīts displeja lcd.print otrajā rindā ("I2C 2 ARDUINO"); // Izdrukā I2C ARDUINO LCD kavējumā (5000); // Aizkavēt 5 sekundes lcd.clear (); // Notīra LCD displeju
3. Tukšā lokā ()
- Vispirms mums jāsaņem dati no verga, tāpēc mēs izmantojam requestFrom () ar verga adresi 8 un mēs pieprasām vienu baitu
Wire.requestFrom (8,1);
Saņemtā vērtība tiek nolasīta, izmantojot Wire.read ()
baits MasterReceive = Wire.read ();
- Tālāk mums jāizlasa analogā vērtība no galvenā arduino POT, kas piestiprināta pie tapas A0
int potvalue = analogRead (A0);
Mēs pārvēršam šo vērtību viena baita izteiksmē kā 0 uz 127.
baits MasterSend = karte (potvalue, 0,1023,0,127);
- Tālāk mums jānosūta šīs konvertētās vērtības, lai mēs sāktu pārraidi ar vergu arduino ar 8 adresi
Wire.beginPārraide (8); Wire.write (MasterSend); Wire.endTransmission ();
- Tālāk mēs parādīsim šīs vergu arduino saņemtās vērtības ar 500 mikrosekunžu kavēšanos, un mēs nepārtraukti saņemam un parādām šīs vērtības.
lcd.setCursor (0,0); // Currsor iestata LCD lcd.print (">> Master <<") pirmajā rindā ; // Izdrukā >> Master << pie LCD lcd.setCursor (0,1); // Iestata kursoru LCD lcd.print otrajā rindā ("SlaveVal:"); // Drukā SlaveVal: LCD lcd.print (MasterReceive); // izdrukā MasterReceive LCD, kas saņemts no Slave Serial.println ("Galvenais saņemts no verga"); // Drukāšana sērijas monitorā Serial.println (MasterReceive); kavēšanās (500); lcd.clear ();
Slave Arduino programmēšanas skaidrojums
1. Tas pats, kas meistaram, vispirms mums jāiekļauj Wire bibliotēka I2C sakaru funkciju izmantošanai un LCD bibliotēka LCD funkciju izmantošanai. Definējiet arī LCD tapas 16x2 LCD.
# iekļaut
2. Tukšajā iestatījumā ()
- Mēs sākam sērijveida saziņu ar Baud likmi 9600.
Sērijas sākums (9600);
- Tālāk mēs sākam I2C sakarus ar tapu (A4, A5) ar verga adresi kā 8. Šeit ir svarīgi norādīt verga adresi.
Stieple.sākas (8);
Tālāk mums ir jāizsauc funkcija, kad Slave saņem vērtību no galvenā un kad Master pieprasa vērtību no Slave
Wire.onReceive (gautiEvent); Wire.onRequest (requestEvent);
- Pēc tam mēs inicializējam LCD displeja moduli 16X2 režīmā, parādām sveiciena ziņojumu un notīriet pēc piecām sekundēm.
lcd.begin (16,2); // Iniciēt LCD displeju lcd.setCursor (0,0); // Iestata kursoru displeja lcd.print pirmajā rindā ("Circuit Digest"); // Drukā CIRCUIT DIGEST LCD lcd.setCursor (0,1); // Kursors tiek iestatīts displeja lcd.print otrajā rindā ("I2C 2 ARDUINO"); // Izdrukā I2C ARDUINO LCD kavējumā (5000); // Aizkavēt 5 sekundes lcd.clear (); // Notīra LCD displeju
3. Tālāk mums ir divas funkcijas: viena pieprasījuma notikumam un otra - notikuma saņemšanai
Pēc pieprasījuma Notikums
Kad galvenā pieprasījuma vērtība no verga tiks izpildīta. Šī funkcija ņem no Slave POT ieejas vērtību un pārveido to 7 bitu izteiksmē un nosūta šo vērtību galvenajam.
void requestEvent () { int potvalue = analogRead (A0); baits SlaveSend = karte (potvalue, 0,1023,0,127); Wire.write (SlaveSend); }
Saņemšanas pasākumam
Kad Master nosūta datus vergam ar verga adresi (8), šī funkcija tiks izpildīta. Šī funkcija nolasa saņemto vērtību no galvenā un glabājama tipa baita mainīgajā.
void ReceiveEvent (int howMany { SlaveReceived = Wire.read (); }
4. Void loop ():
LCD displeja modulī mēs nepārtraukti parādām saņemto vērtību no galvenā.
void loop (void) { lcd.setCursor (0,0); // Currsor iestata LCD lcd.print (">> Slave <<") vienā rindā ; // Drukā >> Slave << pie LCD lcd.setCursor (0,1); // Iestata kursoru LCD lcd.print otrajā rindā ("MasterVal:"); // Drukā MasterVal: LCD lcd.print (SlaveReceived); // Drukā SlaveReceived vērtību LCD, kas saņemta no Master Serial.println ("Slave Received From Master:"); // Drukāšana sērijas monitorā Serial.println (SlaveReceived); kavēšanās (500); lcd.clear (); }
Ar rotējošu potenciometrs vienā pusē, jūs varat redzēt dažādas vērtības LCD citā pusē:
Tātad šādi notiek I2C komunikācija Arduino, šeit mēs izmantojām divus Arduinos, lai parādītu ne tikai datu sūtīšanu, bet arī datu saņemšanu, izmantojot I2C komunikāciju. Tātad tagad jūs varat saskarni ar jebkuru I2C sensoru izmantot Arduino.
Pilns Master un Slave Arduino kodējums ir sniegts zemāk ar demonstrācijas video