Populárny protokol I2C umožňuje komunikáciu dvoch alebo viacerých dosiek Arduino. Zistite, ako ich pripojiť a kódovať.
Zatiaľ čo jedno Arduino môže vykonávať mnoho úloh, niektoré projekty môžu vyžadovať použitie viac ako jednej dosky na zvládnutie rôznych funkcií. Aby sa umožnil prenos údajov medzi dvoma mikrokontrolérmi, musí byť nastavený komunikačný protokol ako CAN, SPI, I2C alebo UART.
V tejto príručke sa budeme zaoberať základmi fungovania I2C, hardvérovými pripojeniami a softvérovou implementáciou potrebnou na nastavenie dvoch dosiek Arduino ako I2C master a slave zariadení.
čo je I2C?
Inter-Integrated Circuit (I2C) je široko používaný komunikačný protokol vo vstavaných systémoch a mikrokontroléroch, ktorý umožňuje prenos dát medzi elektronickými zariadeniami. Na rozdiel od SPI (Serial Peripheral Interface), I2C umožňuje pripojiť viac ako jedno hlavné zariadenie na zbernicu s jedným alebo viacerými podriadenými zariadeniami. Prvýkrát ho použila spoločnosť Philips a je známy aj ako komunikačný protokol TWI (Two Wire Interface).
Ako funguje I2C komunikácia?
I2C používa dve obojsmerné linky: Serial Data (SDA) a Serial Clock (SCL) na prenos dát a synchronizáciu komunikácie medzi zariadeniami. Každé zariadenie pripojené na zbernicu I2C má jedinečnú adresu, ktorá ho identifikuje počas komunikácie. Protokol I2C umožňuje viacerým zariadeniam zdieľať rovnakú zbernicu a každé zariadenie môže fungovať ako master alebo slave.
Komunikácia je iniciovaná nadradeným zariadením a nesprávne adresovanie podriadených zariadení môže spôsobiť chyby pri prenose. Pozrite si nášho podrobného sprievodcu na ako funguje sériová komunikácia UART, SPI a I2C aby som ti dal nejaký kontext.
Hlavnou výhodou I2C komunikácie, ktorá stojí za zmienku, je flexibilita, ktorú ponúka, pokiaľ ide o správu napájania. Zariadenia, ktoré pracujú na rôznych úrovniach napätia, môžu stále efektívne komunikovať pomocou napäťových meničov. To znamená, že zariadenia pracujúce pri 3,3 V potrebujú na pripojenie k 5V I2C zbernici menič napätia.
The Wire Library
Knižnica Wire je vstavaná knižnica Arduino, ktorá poskytuje funkcie na komunikáciu cez I2C. Používa dva kolíky – SDA a SCL – na doske Arduino na komunikáciu I2C.
I2C kolíky na Arduino Uno:
Kolíky Arduino Nano I2C:
Ak chcete používať knižnicu, musíte zahrnúť Wire.h hlavičkový súbor na začiatku vášho náčrtu Arduino.
#zahŕňajú
Knižnica Wire poskytuje funkcie na spustenie komunikácie so zariadením I2C, odosielanie údajov a prijímanie údajov. Niektoré dôležité funkcie, ktoré by ste mali vedieť, zahŕňajú:
- Wire.begin(): používa sa na pripojenie k zbernici I2C a spustenie komunikácie.
- Wire.beginTransmission(): používa sa na zadanie adresy podriadeného zariadenia a spustenie prenosu.
- Wire.write(): používa sa na odosielanie údajov do zariadenia I2C.
- Wire.endTransmission(): používa sa na ukončenie prenosu a kontrolu chýb.
- Wire.requestFrom(): používa sa na vyžiadanie údajov zo zariadenia I2C.
- Wire.available(): používa sa na kontrolu, či sú k dispozícii údaje na čítanie zo zariadenia I2C.
- Wire.read(): používa sa na čítanie údajov zo zariadenia I2C.
Použi Wire.beginTransmission() funkcia na nastavenie adresy senzora, ktorá sa vloží ako argument. Napríklad, ak je adresa snímača 0x68, použili by ste:
Drôt.začaťPrenos(0x68);
Nastavenie hardvéru Arduino I2C
Na pripojenie dvoch dosiek Arduino pomocou I2C budete potrebovať nasledujúce hardvérové komponenty:
- Dve dosky Arduino (hlavná a podriadená)
- Breadboard
- Štartovacie káble
- Dva 4,7kΩ pull-up odpory
Pripojte SDA a SCL kolíky oboch dosiek Arduino na doštičku. Pripojte pull-up odpory medzi SDA a SCL špendlíky a 5V napájacia koľajnica na doske. Nakoniec spojte dve dosky na pečenie pomocou prepojovacích káblov.
Obvod Arduino Uno
Nano obvod Arduino
Nastavenie dosiek Arduino ako I2C Master a Slave zariadení
Použi Wire.requestFrom() funkciu na zadanie adresy podriadeného zariadenia, s ktorým chceme komunikovať. Potom použite Wire.read() funkcia na získanie údajov z podriadeného zariadenia.
Kód hlavného zariadenia:
#zahŕňajú
neplatnénastaviť(){
Drôt.začať(); // pripojiť sa k i2c zbernici
Serial.začať(9600); // spustiť sériové pre výstup
}
neplatnéprijímať údaje(){
int adresa = 8;
int bytesToRead = 6;
Drôt.žiadosťOd(adresa, bytesToRead);
zatiaľ čo (Drôt.k dispozícii()) {
char údaje = Drôt.čítať();
Serial.vytlačiť(údaje);
}
meškanie(500);
}
neplatnéslučka(){
prijmiData();
}
The Wire.onReceive() funkcia sa používa na určenie toho, čo sa má robiť, keď podriadené zariadenie prijme údaje z hlavného zariadenia. Vo vyššie uvedenom kóde je Wire.available() funkcia skontroluje, či sú dostupné údaje, a Wire.read() funkcia načíta údaje odoslané nadriadeným zariadením.
Kód podriadeného zariadenia:
#zahŕňajú
neplatnénastaviť(){
Drôt.začať(8); // pripojte sa k zbernici I2C s adresou 8
Drôt.onReceive(receiveEvent); // volanie udalosti prijmu, keď sa prijmú dáta
}
neplatnéslučka(){
meškanie(100);
}
neplatnépríjemUdalosť(int bajtov){
Drôt.písať("Ahoj "); // odpovedzte správou o veľkosti 6 bajtov, ako očakáva master
}
Odosielanie a prijímanie údajov pomocou I2C
V tomto príklade si prečítajte teplotu z teplotného senzora DHT11 prepojeného s podriadeným Arduinom a vytlačte ju na sériový monitor hlavného Arduina.
Upravme kód, ktorý sme napísali predtým, aby obsahoval meranie teploty, ktoré potom pošleme do hlavnej dosky cez zbernicu I2C. Hlavná doska potom môže prečítať hodnotu, ktorú sme poslali, a potom ju zobraziť na sériovom monitore.
Kód hlavného zariadenia:
#zahŕňajú
neplatnénastaviť(){
Drôt.začať();
Serial.začať(9600);
Serial.println("Master inicializovaný!");
}
neplatnéslučka(){
Drôt.žiadosťOd(8, 1); // Vyžiadanie údajov o teplote od podriadeného
ak (Drôt.k dispozícii()) {
byte teplota = Drôt.čítať(); // Čítanie údajov o teplote z podriadeného zariadenia
Serial.vytlačiť("Teplota: ");
Serial.vytlačiť(teplota);
Serial.println("°C");
}
meškanie(2000); // Pred opätovným vyžiadaním teploty počkajte 2 sekundy
}
Kód podriadeného zariadenia:
#zahŕňajú
#zahŕňajú#definovať DHTPIN 4 // Pin pripojený k senzoru DHT
#definovať DHTTYPE DHT11 // Typ snímača DHT
DHT dht(DHTPIN, DHTTYPE);
byte teplota;neplatnénastaviť(){
Drôt.začať(8); // Adresa otroka je 8
Drôt.NA ZNAMENIE(requestEvent);
dht.začať();
}neplatnéslučka(){
meškanie(2000); // Počkajte 2 sekundy, kým sa DHT stabilizuje
teplota = dht.readTeplota(); // Čítanie teploty zo snímača DHT
}
neplatnérequestEvent(){
Drôt.písať(teplota); // Odoslanie údajov o teplote master
}
Tento kód môžete prispôsobiť tak, aby vyhovoval akýmkoľvek senzorom, ktoré môžete mať vo svojom projekte, alebo dokonca zobraziť hodnoty senzorov na module displeja, aby vyrobte si vlastný izbový teplomer a vlhkomer.
Podriadené adresovanie s I2C na Arduine
Na čítanie hodnôt z komponentov pridaných do zbernice I2C v takomto projekte je dôležité, aby ste pri kódovaní zahrnuli správnu adresu podriadeného zariadenia. Našťastie Arduino ponúka knižnicu skenerov, ktorá zjednodušuje proces identifikácie otroka adresy, čím sa eliminuje potreba preosievať zdĺhavé dátové listy snímačov a mätúce online dokumentáciu.
Pomocou nasledujúceho kódu identifikujte adresu akéhokoľvek podriadeného zariadenia na zbernici I2C.
#zahŕňajú
// Zahrňte knižnicu Wire pre komunikáciu I2C neplatnénastaviť(){
Drôt.začať(); // Inicializujte komunikáciu I2C
Serial.začať(9600); // Inicializujte sériovú komunikáciu s prenosovou rýchlosťou 9600
zatiaľ čo (!Serial); // Počkajte, kým sa vytvorí sériové pripojenie
Serial.println("\nI2C skener"); // Vytlačte správu označujúcu začiatok skenovania I2C
}neplatnéslučka(){
byte chyba, adresa; // Deklarovanie premenných na ukladanie chýb a adries zariadení
int nDevices; // Deklarujte premennú na uloženie počtu nájdených zariadeníSerial.println("Skenovanie..."); // Vytlačte správu označujúcu začiatok skenovania I2C
nZariadenia = 0; // Nastavte počet nájdených zariadení na 0
pre (adresa = 1; adresa < 127; adresa++) { // Iterácia cez všetky možné adresy I2C
Drôt.začaťPrenos(adresa); // Spustenie prenosu na aktuálnu adresu
chyba = Drôt.koniecPrenos(); // Ukončite prenos a uložte všetky chybyak (chyba == 0) { // Ak neboli nájdené žiadne chyby
Serial.vytlačiť("Zariadenie I2C nájdené na adrese 0x"); // Vytlačí správu o nájdení zariadenia
ak (adresa < 16) Serial.vytlačiť("0"); // Ak je adresa menšia ako 16, pridajte úvodnú 0 na účely formátovania
Serial.vytlačiť(adresa, HEX); // Tlač adresy v hexadecimálnom formáte
Serial.println(" !"); // Vytlačí správu o nájdení zariadenia
nDevices++; // Zvýšte počet nájdených zariadení
}
inakak (chyba == 4) { // Ak sa našla chyba
Serial.vytlačiť("Neznáma chyba na adrese 0x"); // Vytlačí hlásenie, že sa našla chyba
ak (adresa < 16) Serial.vytlačiť("0"); // Ak je adresa menšia ako 16, pridajte úvodnú 0 na účely formátovania
Serial.println(adresa, HEX); // Tlač adresy v hexadecimálnom formáte
}
}
ak (nZariadenia == 0) { // Ak sa nenašli žiadne zariadenia
Serial.println("Nenašli sa žiadne I2C zariadenia\n"); // Vytlačí správu, že sa nenašli žiadne zariadenia
}
inak { // Ak boli nájdené zariadenia
Serial.println("hotovo\n"); // Vytlačte správu označujúcu koniec skenovania I2C
}
meškanie(5000); // Odloženie o 5 sekúnd pred spustením ďalšieho skenovania
}
Rozšírte svoj projekt ešte dnes
Prepojenie dvoch dosiek Arduino pomocou komunikačného protokolu I2C ponúka flexibilný a efektívny spôsob dosiahnutia zložitých úloh, ktoré nedokáže zvládnuť jedna doska. Pomocou knižnice Wire je komunikácia medzi dvoma doskami pomocou I2C jednoduchá, čo vám umožňuje pridať do projektu ďalšie komponenty.