Populaarne I2C-protokoll võimaldab kahel või enamal Arduino plaadil suhelda. Avastage, kuidas neid ühendada ja kodeerida.
Kuigi üks Arduino suudab täita palju ülesandeid, võivad mõned projektid nõuda erinevate funktsioonide haldamiseks rohkem kui ühe tahvli kasutamist. Seega tuleb kahe mikrokontrolleri vahelise andmeedastuse võimaldamiseks seadistada sideprotokoll, nagu CAN, SPI, I2C või UART.
Selles juhendis käsitleme I2C tööpõhimõtteid, riistvaraühendusi ja tarkvara rakendamist, mis on vajalik kahe Arduino plaadi seadistamiseks I2C ülem- ja alamseadmetena.
Mis on I2C?
Inter-Integrated Circuit (I2C) on manussüsteemides ja mikrokontrollerites laialdaselt kasutatav sideprotokoll, mis võimaldab andmeedastust elektrooniliste seadmete vahel. Erinevalt SPI-st (Serial Peripheral Interface), võimaldab I2C ühe või mitme alluvseadmega siiniga ühendada rohkem kui ühe peaseadme. Seda kasutas esmakordselt Philips ja seda tuntakse ka kahe juhtmeliidese (TWI) sideprotokollina.
Kuidas I2C suhtlus toimib?
I2C kasutab andmete edastamiseks ja seadmetevahelise suhtluse sünkroonimiseks kahte kahesuunalist liini: jadaandmed (SDA) ja Serial Clock (SCL). Igal I2C siiniga ühendatud seadmel on kordumatu aadress, mis tuvastab selle side ajal. I2C-protokoll võimaldab mitmel seadmel jagada sama siini ja iga seade võib toimida ülem- või alamseadmena.
Side algatab ülemseade ja alamseadmete vale adresseerimine võib põhjustada edastusvigu. Vaadake meie põhjalikku juhendit kuidas UART, SPI ja I2C jadaside töötavad et anda teile veidi konteksti.
I2C-suhtluse suur eelis, mida väärib märkimist, on selle pakutav paindlikkus toitehalduse osas. Erinevatel pingetasemetel töötavad seadmed suudavad pingelülitite abil siiski tõhusalt suhelda. See tähendab, et seadmed, mis töötavad pingel 3,3 V, vajavad 5 V I2C siiniga ühendamiseks pingemuundureid.
Juhtmete raamatukogu
Wire raamatukogu on sisseehitatud Arduino teek, mis pakub funktsioone I2C kaudu suhtlemiseks. See kasutab I2C-suhtluseks Arduino plaadil kahte kontakti - SDA ja SCL.
Arduino Uno I2C tihvtid:
Arduino Nano I2C tihvtid:
Teegi kasutamiseks peate lisama Traat.h päisefail oma Arduino visandi alguses.
#sisaldama
Juhtmeteek pakub funktsioone I2C-seadmega suhtlemise alustamiseks, andmete saatmiseks ja andmete vastuvõtmiseks. Mõned olulised funktsioonid, mida peaksite teadma, on järgmised:
- Wire.begin(): kasutatakse I2C siiniga liitumiseks ja side algatamiseks.
- Wire.beginTransmission(): kasutatakse alam-aadressi määramiseks ja edastuse alustamiseks.
- Wire.write(): kasutatakse andmete saatmiseks I2C-seadmesse.
- Wire.endTransmission(): kasutatakse edastuse lõpetamiseks ja vigade kontrollimiseks.
- Wire.requestFrom(): kasutatakse andmete küsimiseks I2C seadmelt.
- Wire.available(): kasutatakse selleks, et kontrollida, kas andmed on I2C-seadmest lugemiseks saadaval.
- Wire.read(): kasutatakse andmete lugemiseks I2C seadmest.
Kasuta Wire.beginTransmission() funktsioon anduri aadressi määramiseks, mis sisestatakse argumendina. Näiteks kui anduri aadress on 0x68, kasutaksite:
Traat.alusta ülekannet(0x68);
Arduino I2C riistvara seadistamine
Kahe Arduino plaadi ühendamiseks I2C abil vajate järgmisi riistvarakomponente:
- Kaks Arduino plaati (master ja slave)
- Leivalaud
- Jumper juhtmed
- Kaks 4,7kΩ tõmbetakistit
Ühendage SDA ja SCL mõlema Arduino plaadi tihvtid leivalaua külge. Ühendage tõmbetakistid vahel SDA ja SCL tihvtid ja 5V toitesiin leivalaual. Lõpuks ühendage kaks leivalauda omavahel, kasutades hüppaja juhtmeid.
Arduino Uno ringrada
Arduino nanoring
Arduino plaatide seadistamine I2C ülem- ja alluvseadmetena
Kasuta Wire.requestFrom() funktsioon, et määrata alamseadme aadress, millega tahame suhelda. Seejärel kasutage Wire.read() funktsioon alluvast seadmest andmete hankimiseks.
Peaseadme kood:
#sisaldama
tühineseadistamine(){
Traat.alustada(); // liituda i2c siiniga
Sari.alustada(9600); // väljundi seeria käivitamine
}
tühinesaada andmeid(){
int aadress = 8;
int bytesToRead = 6;
Traat.taotlusFrom(aadress, bytesToRead);
samal ajal (Traat.saadaval()) {
char andmed = Traat.lugeda();
Sari.printida(andmed);
}
viivitus(500);
}
tühinesilmus(){
ReceiveData();
}
The Wire.onReceive() funktsiooni kasutatakse selleks, et määrata, mida teha, kui alamseade võtab ülemseadmelt andmeid vastu. Ülaltoodud koodis on Wire.available() funktsioon kontrollib, kas andmed on saadaval, ja Wire.read() funktsioon loeb põhiseadme saadetud andmeid.
Slave seadme kood:
#sisaldama
tühineseadistamine(){
Traat.alustada(8); // liituge aadressiga 8 I2C siiniga
Traat.kättesaamisel(receiveEvent); // helistage andmete vastuvõtmisel vastuvõtusündmusele
}
tühinesilmus(){
viivitus(100);
}
tühinesaada Sündmus(int baiti){
Traat.kirjutada("Tere "); // vastake 6-baidise sõnumiga, nagu master eeldas
}
Andmete saatmine ja vastuvõtmine I2C abil
Selles näites loeme temperatuuri DHT11 temperatuuriandurilt, mis on liidestatud alam-Arduinoga, ja printige see Arduino peamise jadamonitorile.
Muudame varem kirjutatud koodi, et see hõlmaks temperatuuri mõõtmist, mille saadame seejärel I2C siini kaudu põhiplaadile. Põhiplaat saab seejärel lugeda meie saadetud väärtust ja seejärel kuvada selle jadamonitoril.
Peaseadme kood:
#sisaldama
tühineseadistamine(){
Traat.alustada();
Sari.alustada(9600);
Sari.println("Meister on initsialiseeritud!");
}
tühinesilmus(){
Traat.taotlusFrom(8, 1); // Temperatuuriandmete küsimine alluvalt
kui (Traat.saadaval()) {
bait temperatuur = Traat.lugeda(); // Temperatuuriandmete lugemine alluvalt
Sari.printida("Temperatuur:");
Sari.printida(temperatuur);
Sari.println("° C");
}
viivitus(2000); // Oodake 2 sekundit, enne kui küsite uuesti temperatuuri
}
Slave seadme kood:
#sisaldama
#sisaldama#määratleda DHTPIN 4 // DHT-anduriga ühendatud tihvt
#määratleda DHTTYPE DHT11 // DHT-anduri tüüp
DHT dht(DHTPIN, DHTTYPE);
bait temperatuur;tühineseadistamine(){
Traat.alustada(8); // Slave aadress on 8
Traat.nõudmisel(requestEvent);
dht.alustada();
}tühinesilmus(){
viivitus(2000); // Oodake 2 sekundit, kuni DHT stabiliseerub
temperatuur = dht.loe Temperatuuri(); // Temperatuuri lugemine DHT-andurilt
}
tühinetaotluse sündmus(){
Traat.kirjutada(temperatuur); // Temperatuuriandmete saatmine meistrile
}
Saate seda koodi kohandada nii, et see sobiks teie projektis kasutatavate anduritega või isegi kuvada anduri väärtusi kuvamoodulil, et tehke ise ruumitermomeeter ja niiskusmõõtur.
Slave aadressimine I2C-ga Arduinos
Sellise projekti puhul I2C siinile lisatud komponentide väärtuste lugemiseks on oluline lisada kodeerimisel õige alam-aadress. Õnneks pakub Arduino skanneriteeki, mis lihtsustab orja tuvastamise protsessi aadressid, välistades vajaduse pikki andurite andmelehti sõeluda ja tekitada võrgus segadust dokumentatsioon.
Kasutage järgmist koodi, et tuvastada mis tahes I2C siinis oleva alamseadme aadress.
#sisaldama
// Kaasake juhtmeteek I2C suhtluse jaoks tühineseadistamine(){
Traat.alustada(); // Initsialiseerige I2C side
Sari.alustada(9600); // Initsialiseerige jadaühendus edastuskiirusega 9600
samal ajal (!Sari); // Oodake jadaühenduse loomist
Sari.println("\nI2C skanner"); // Printige teade, mis näitab I2C-skannimise algust
}tühinesilmus(){
bait viga, aadress; // Muutujate deklareerimine vigade ja seadme aadresside salvestamiseks
int nSeadmed; // Leitud seadmete arvu salvestamiseks deklareerige muutujaSari.println("Skannimine..."); // Printige teade, mis näitab I2C-skannimise algust
nSeadmed = 0; // Määrake leitud seadmete arvuks 0
jaoks (aadress = 1; aadress < 127; aadress++) { // Itereerige üle kõik võimalikud I2C-aadressid
Traat.alusta ülekannet(aadress); // Käivitage edastus praegusele aadressile
viga = Traat.end Transmission(); // Lõpetage edastus ja salvestage kõik veadkui (viga == 0) { // Kui vigu ei leitud
Sari.printida("I2C seade leitud aadressilt 0x"); // Printige teade, mis näitab, et seade leiti
kui (aadress < 16) Sari.printida("0"); // Kui aadress on väiksem kui 16, lisage vormindamise eesmärgil 0
Sari.printida(aadress, HEX); // Trüki aadress kuueteistkümnendsüsteemis
Sari.println(" !"); // Printige teade, mis näitab, et seade leiti
nSeadmed++; // Leitud seadmete arvu suurendamine
}
muidukui (viga == 4) { // Kui leiti viga
Sari.printida("Tundmatu viga aadressil 0x"); // Trüki teade, mis näitab, et leiti viga
kui (aadress < 16) Sari.printida("0"); // Kui aadress on väiksem kui 16, lisage vormindamise eesmärgil 0
Sari.println(aadress, HEX); // Trüki aadress kuueteistkümnendsüsteemis
}
}
kui (nSeadmed == 0) { // Kui seadmeid ei leitud
Sari.println("I2C-seadmeid ei leitud\n"); // Printige teade, mis näitab, et seadmeid ei leitud
}
muidu { // Kui leiti seadmeid
Sari.println("tehtud\n"); // Printige teade, mis näitab I2C-skannimise lõppu
}
viivitus(5000); // Viivitage 5 sekundit enne järgmise skannimise alustamist
}
Laiendage oma projekti juba täna
Kahe Arduino plaadi liidestamine I2C sideprotokolli abil pakub paindlikku ja tõhusat viisi keeruliste ülesannete saavutamiseks, mida üks plaat ei suuda lahendada. Wire teegi abil on kahe plaadi vaheline suhtlus I2C abil lihtsaks tehtud, võimaldades teil projektile rohkem komponente lisada.