Suosittu I2C-protokolla mahdollistaa kahden tai useamman Arduino-levyn viestinnän. Tutustu niiden yhdistämiseen ja koodaamiseen.
Vaikka yksi Arduino voi suorittaa monia tehtäviä, jotkut projektit voivat vaatia useamman kuin yhden levyn käyttöä eri toimintojen käsittelemiseksi. Joten tiedonsiirron mahdollistamiseksi kahden mikro-ohjaimen välillä on määritettävä tietoliikenneprotokolla, kuten CAN, SPI, I2C tai UART.
Tässä oppaassa käydään läpi I2C: n toiminnan perusteet, laitteistoliitännät ja ohjelmistototeutus, joka tarvitaan kahden Arduino-levyn asettamiseen I2C-isäntä- ja orjalaitteiksi.
Mikä on I2C?
Inter-Integrated Circuit (I2C) on laajalti käytetty viestintäprotokolla sulautetuissa järjestelmissä ja mikro-ohjaimissa tiedonsiirron mahdollistamiseksi elektronisten laitteiden välillä. Toisin kuin SPI (Serial Peripheral Interface), I2C mahdollistaa useamman kuin yhden isäntälaitteen liittämisen väylään, jossa on yksi tai useampi orjalaite. Sitä käytti ensin Philips, ja se tunnetaan myös nimellä Two Wire Interface (TWI) -viestintäprotokolla.
Kuinka I2C-viestintä toimii?
I2C käyttää kahta kaksisuuntaista linjaa: SDA (Serial Data) ja Serial Clock (SCL) tiedonsiirtoon ja laitteiden välisen viestinnän synkronointiin. Jokaisella I2C-väylään kytketyllä laitteella on yksilöllinen osoite, joka tunnistaa sen viestinnän aikana. I2C-protokolla sallii useiden laitteiden jakaa saman väylän, ja jokainen laite voi toimia isäntänä tai orjana.
Tietoliikenteen aloittaa isäntälaite, ja orjalaitteiden väärä osoitus voi aiheuttaa virheitä siirrossa. Tutustu perusteelliseen oppaaseemme kuinka UART-, SPI- ja I2C-sarjaviestintä toimii antaakseen sinulle kontekstin.
I2C-viestinnän suuri etu, joka kannattaa huomioida, on sen tarjoama joustavuus virranhallinnan suhteen. Eri jännitetasoilla toimivat laitteet voivat silti kommunikoida tehokkaasti jännitteensiirtimien avulla. Tämä tarkoittaa, että 3,3 V: n jännitteellä toimivat laitteet tarvitsevat jännitteensiirtimiä kytkeytyäkseen 5 V: n I2C-väylään.
Wire Library
Wire-kirjasto on sisäänrakennettu Arduino-kirjasto, joka tarjoaa toimintoja viestintään I2C: n kautta. Se käyttää kahta nastaa - SDA ja SCL - Arduino-kortilla I2C-viestintään.
I2C-nastat Arduino Unossa:
Arduino Nano I2C -nastat:
Jotta voit käyttää kirjastoa, sinun on sisällytettävä Wire.h otsikkotiedosto Arduino-luonnoksen alussa.
#sisältää
Wire-kirjasto tarjoaa toimintoja tiedonsiirron aloittamiseksi I2C-laitteen kanssa, tiedon lähettämiseksi ja tiedon vastaanottamiseksi. Joitakin tärkeitä toimintoja, jotka sinun pitäisi tietää, ovat:
- Wire.begin(): käytetään liittymään I2C-väylään ja aloittamaan viestintä.
- Wire.beginTransmission(): käytetään orja-osoitteen määrittämiseen ja lähetyksen aloittamiseen.
- Wire.write(): käytetään tietojen lähettämiseen I2C-laitteeseen.
- Wire.endTransmission(): käytetään lähetyksen lopettamiseen ja virheiden tarkistamiseen.
- Wire.requestFrom(): käytetään tietojen pyytämiseen I2C-laitteelta.
- Wire.available(): käytetään tarkistamaan, onko tietoja saatavilla luettavaksi I2C-laitteesta.
- Wire.read(): käytetään tietojen lukemiseen I2C-laitteesta.
Käytä Wire.beginTransmission() funktio asettaa anturin osoitteen, joka lisätään argumenttina. Esimerkiksi jos anturin osoite on 0x68, käyttäisit:
Lanka.aloitaTransmission(0x68);
Arduino I2C -laitteiston asennus
Kahden Arduino-levyn yhdistämiseen I2C: llä tarvitset seuraavat laitteistokomponentit:
- Kaksi Arduino-levyä (master ja slave)
- Leipälauta
- Jumper johdot
- Kaksi 4,7kΩ vetovastusta
Yhdistä SDA ja SCL molempien Arduino-levyjen nastat leipälautaan. Liitä vetovastukset väliin SDA ja SCL nastat ja 5V leipälaudan virtakisko. Yhdistä lopuksi kaksi leipälautaa yhteen hyppyjohtimilla.
Arduino Uno piiri
Arduino Nano Circuit
Arduino-levyjen asettaminen I2C-isäntä- ja orjalaitteiksi
Käytä Wire.requestFrom() toiminto määrittää sen orjalaitteen osoitteen, jonka kanssa haluamme olla yhteydessä. Käytä sitten Wire.read() toiminto tietojen saamiseksi orjalaitteesta.
Päälaitteen koodi:
#sisältää
mitätönperustaa(){
Lanka.alkaa(); // liity i2c-väylään
Sarja.alkaa(9600); // aloita sarja ulostulolle
}
mitätönvastaanottaaData(){
int osoite = 8;
int bytesToRead = 6;
Lanka.pyyntöLähettäjä(osoite, bytesToRead);
sillä aikaa (Lanka.saatavilla()) {
hiiltyä data = Lanka.lukea();
Sarja.Tulosta(tiedot);
}
viive(500);
}
mitätönsilmukka(){
vastaanotaData();
}
The Wire.onReceive() -toimintoa käytetään määrittämään mitä tehdään, kun orja vastaanottaa dataa isäntälaitteelta. Yllä olevassa koodissa Wire.available() toiminto tarkistaa, onko tietoja saatavilla, ja Wire.read() toiminto lukee päälaitteen lähettämät tiedot.
Orjalaitteen koodi:
#sisältää
mitätönperustaa(){
Lanka.alkaa(8); // liity I2C-väylään osoitteella 8
Lanka.onReceive(receiveEvent); // kutsu vastaanotettu tapahtuma, kun tietoja vastaanotetaan
}
mitätönsilmukka(){
viive(100);
}
mitätönvastaanota Tapahtuma(int tavua){
Lanka.kirjoittaa("Hei "); // vastaa 6 tavun viestillä, kuten isäntä odottaa
}
Tietojen lähettäminen ja vastaanottaminen I2C: n avulla
Tässä esimerkissä luetaan lämpötila DHT11-lämpötila-anturista, joka on liitetty orja-Arduinoon, ja tulostetaan se pää-Arduinon sarjanäytölle.
Muokkaamme aiemmin kirjoittamaamme koodia sisältämään lämpötilamittauksen, jonka lähetämme sitten pääkortille I2C-väylän kautta. Päälevy voi sitten lukea lähettämämme arvon ja näyttää sen sitten sarjanäytössä.
Päälaitteen koodi:
#sisältää
mitätönperustaa(){
Lanka.alkaa();
Sarja.alkaa(9600);
Sarja.println("Mestari alustettu!");
}
mitätönsilmukka(){
Lanka.pyyntöLähettäjä(8, 1); // Pyydä lämpötilatietoja orjalta
jos (Lanka.saatavilla()) {
tavu lämpötila = Lanka.lukea(); // Lue lämpötilatiedot orjasta
Sarja.Tulosta("Lämpötila:");
Sarja.Tulosta(lämpötila);
Sarja.println("° C");
}
viive(2000); // Odota 2 sekuntia ennen kuin pyydät lämpötilaa uudelleen
}
Orjalaitteen koodi:
#sisältää
#sisältää#määritellä DHTPIN 4 // Nasta kytketty DHT-anturiin
#määritellä DHTTYYPPI DHT11 // DHT-anturin tyyppi
DHT dht(DHTPIN, DHTTYPE);
tavu lämpötila;mitätönperustaa(){
Lanka.alkaa(8); // Orjaosoite on 8
Lanka.pyynnöstä(requestEvent);
dht.alkaa();
}mitätönsilmukka(){
viive(2000); // Odota 2 sekuntia, jotta DHT vakiintuu
lämpötila = dht.Lue lämpötila(); // Lue lämpötila DHT-anturista
}
mitätönrequestEvent(){
Lanka.kirjoittaa(lämpötila); // Lähetä lämpötilatiedot masterille
}
Voit mukauttaa tämän koodin sopimaan projektissasi mahdollisesti oleville antureille tai jopa näyttää anturiarvot näyttömoduulissa tee itse huonelämpö- ja kosteusmittari.
Slave Addressing I2C: llä Arduinossa
Jos haluat lukea arvoja komponenteista, jotka on lisätty I2C-väylään tällaisessa projektissa, on tärkeää, että sisällytät oikean orjaosoitteen koodattaessa. Onneksi Arduino tarjoaa skannerikirjaston, joka yksinkertaistaa orjan tunnistamisprosessia osoitteita, mikä eliminoi tarpeen selata pitkiä anturitietolehtiä ja hämmentää verkossa dokumentointi.
Käytä seuraavaa koodia tunnistaaksesi minkä tahansa I2C-väylässä olevan orjalaitteen osoitteen.
#sisältää
// Sisällytä Wire-kirjasto I2C-viestintää varten mitätönperustaa(){
Lanka.alkaa(); // Alusta I2C-viestintä
Sarja.alkaa(9600); // Alusta sarjaliikenne 9600 baudinopeudella
sillä aikaa (!Sarja); // Odota, että sarjayhteys muodostuu
Sarja.println("\nI2C-skanneri"); // Tulosta viesti, joka ilmoittaa I2C-skannauksen alkamisesta
}mitätönsilmukka(){
tavu virhe, osoite; // Ilmoita muuttujat virheiden ja laiteosoitteiden tallentamiseksi
int nLaitteet; // Määritä muuttuja löydettyjen laitteiden määrän tallentamiseksiSarja.println("Skannataan..."); // Tulosta viesti, joka ilmoittaa I2C-skannauksen alkamisesta
nLaitteet = 0; // Aseta löydettyjen laitteiden määräksi 0
varten (osoite = 1; osoite < 127; osoite++) { // Iteroi kaikki mahdolliset I2C-osoitteet
Lanka.aloitaTransmission(osoite); // Aloita lähetys nykyiseen osoitteeseen
virhe = Lanka.End Transmission(); // Lopeta lähetys ja tallenna mahdolliset virheetjos (virhe == 0) { // Jos virheitä ei löytynyt
Sarja.Tulosta("I2C-laite löydetty osoitteesta 0x"); // Tulosta viesti, joka ilmoittaa, että laite on löydetty
jos (osoite < 16) Sarja.Tulosta("0"); // Jos osoite on pienempi kuin 16, lisää alkuun 0 muotoilua varten
Sarja.Tulosta(osoite, HEX); // Tulosta osoite heksadesimaalimuodossa
Sarja.println(" !"); // Tulosta viesti, joka ilmoittaa, että laite on löydetty
nDevices++; // Kasvata löydettyjen laitteiden määrää
}
muujos (virhe == 4) { // Jos virhe löytyi
Sarja.Tulosta("Tuntematon virhe osoitteessa 0x"); // Tulosta viesti, joka ilmoittaa virheestä
jos (osoite < 16) Sarja.Tulosta("0"); // Jos osoite on pienempi kuin 16, lisää alkuun 0 muotoilua varten
Sarja.println(osoite, HEX); // Tulosta osoite heksadesimaalimuodossa
}
}
jos (nLaitteet == 0) { // Jos laitteita ei löytynyt
Sarja.println("I2C-laitteita ei löytynyt\n"); // Tulosta viesti, jonka mukaan laitteita ei löytynyt
}
muu { // Jos laitteita löytyi
Sarja.println("tehty\n"); // Tulosta viesti, joka ilmoittaa I2C-skannauksen päättymisestä
}
viive(5000); // Viive 5 sekuntia ennen seuraavan skannauksen aloittamista
}
Laajenna projektiasi jo tänään
Kahden Arduino-levyn liittäminen I2C-tiedonsiirtoprotokollalla tarjoaa joustavan ja tehokkaan tavan saavuttaa monimutkaisia tehtäviä, joita ei voida käsitellä yhdellä levyllä. Wire-kirjaston avulla tiedonsiirto kahden kortin välillä I2C: n avulla on helppoa, jolloin voit lisätä projektiisi enemmän komponentteja.