Det kan vara praktiskt, särskilt i hemautomationsprojekt, att kommunicera mellan flera enheter. En av de vanligaste teknikerna är I2C-protokollet (eller TWI-protokollet). I2C-protokollet är en metod som gör det möjligt att ansluta flera ”Master”-kort och flera ”Slave”-kort och kommunicera upp till 128 enheter. Det möjliggör asynkrona anslutningar mellan flera komponenter för att dela information via en ”gemensam buss”. Vi hade sett kommunikationen via den seriella porten (kallad UART) som används för att skicka koden till Arduino från en dator eller för att ansluta två enheter i synnerhet i Bluetooth.
Utrustning
- Dator
- Arduino UNO x2 eller mer
- Kopplingskabel M / M x3 gånger antalet kort
Anslutningsdiagram för I2C-bussen mellan Arduinokort
Med I2C-protokollet kan man också kommunicera mellan olika system (sensorer, LCD-skärm, Raspberry Pi, etc.). Ett intressant exempel är kommunikationen mellan flera Arduinokort. För det måste vi skriva minst två program, ett för ”Mistress”-kortet (Master) och det andra för ”Slaves”-korten.
En I2C-kommunikation definieras av en tvåtrådig buss (ibland kallad TWI, Two Wire Interface) och en adress. De stift som används för I2C-kommunikation är vanligtvis fasta för varje enhet. En på vilken data skickas (SDA Serial Data Line) och på den andra synkroniseringsklockan (SLC Serial Clock Line).
I2C / TWI-stift:
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
I det här exemplet använder vi ett Arduino Uno-kort, så stift A4 och A5.
För att de två korten ska kunna kommunicera med varandra måste de anslutas korrekt (A4 med A4 och A5 med A5) och glöm inte att ansluta jordförbindelserna (GND) enligt följande diagram.
Varning: Om stift A4 och A5 är anslutna till stift på ett kort som inte är strömförsörjt kommer koden att frysa vid överföringen.
I allmänhet sänder ett kort information (Writer) och ett annat tar emot den (Reader).
Konfigurationskod för I2C-bussen
Med biblioteket Wire.h kan du enkelt definiera den seriella kommunikationen på I2C-bussen. Funktionerna liknar Serial-biblioteket.
- Wire.begin () initialiserar enhetsadressen. Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Code of the ”Master” card
”Slave” card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the ”Master” card:
In the serial monitor of the ”Slave 1” card:
We can see that the two cards are exchanging information. Det är mycket enkelt att utöka detta exempel till flera Arduinokort (Leonardo, Mini, etc.) genom att anpassa ledningarna och adressen på komponenterna i ”Slave”-koden.
Kod för att identifiera enheterna som är anslutna till I2C-bussen
Ett bra test för att veta om dina enheter kommunicerar bra med varandra är att använda koden nedan (I2CScanner) ) som returnerar alla adresser till enheterna som är anslutna till Master-kortet.