Praktycznym rozwiązaniem, szczególnie w projektach automatyki domowej, może być komunikacja pomiędzy kilkoma urządzeniami. Jedną z powszechnie stosowanych technik jest protokół I2C (lub TWI). Protokół I2C jest metodą pozwalającą na połączenie kilku kart „Master” i kilku kart „Slave” oraz na komunikację do 128 urządzeń. Umożliwia on asynchroniczne połączenia pomiędzy kilkoma komponentami w celu wymiany informacji poprzez „wspólną magistralę”. Wcześniej widzieliśmy komunikację przez port szeregowy (zwany UART), który jest używany do wysyłania kodu do Arduino przez komputer lub do połączenia dwóch urządzeń, w szczególności przez Bluetooth.
Sprzęt
- Komputer
- Arduino UNO x2 lub więcej
- Kabel zworkowy M / M x3 razy ilość kart
Schemat połączenia magistrali I2C pomiędzy płytkami Arduino
Za pomocą protokołu I2C możliwa jest również komunikacja pomiędzy różnymi systemami (czujniki, ekran LCD, Raspberry Pi, itp.). Ciekawym przykładem jest komunikacja pomiędzy kilkoma płytkami Arduino. W tym celu musimy napisać co najmniej dwa programy, jeden dla karty „Mistress” (Master), a drugi dla kart „Slaves”.
Komunikacja I2C jest zdefiniowana przez dwuprzewodową magistralę (czasami nazywaną TWI, Two Wire Interface) oraz adres. Piny wykorzystywane przez komunikację I2C są zazwyczaj stałe dla każdego urządzenia. Jeden, na którym wysyłane są dane (SDA Serial Data Line), a na drugim zegar synchronizujący (SLC Serial Clock Line).
Piny I2C / TWI:
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
W tym przykładzie wykorzystujemy płytkę Arduino Uno, a więc piny A4 i A5.
Aby obie karty mogły się ze sobą komunikować, muszą być prawidłowo połączone (A4 z A4 i A5 z A5) i nie zapomnij o połączeniu mas (GND), jak pokazano na poniższym schemacie.
Uwaga: Jeśli piny A4 i A5 zostaną podłączone do pinów niezasilanej karty, kod zostanie zamrożony w momencie transmisji.
Generalnie, jedna karta będzie wysyłać informacje (Writer), a druga je odbierać (Reader).
Kod konfiguracyjny magistrali I2C
Biblioteka Wire.h pozwala w prosty sposób zdefiniować komunikację szeregową na magistrali I2C. Funkcje są podobne do tych z biblioteki Serial.
- Wire.begin () inicjalizuje adres urządzenia. 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. Bardzo łatwo jest rozszerzyć ten przykład na kilka płytek Arduino (Leonardo, Mini, itp.) poprzez dostosowanie okablowania i adresów elementów w kodzie „Slave”.
Kod identyfikujący urządzenia podłączone do magistrali I2C
Dobrym testem, aby wiedzieć czy Twoje urządzenia dobrze się ze sobą komunikują jest użycie poniższego kodu (I2CScanner) ), który zwraca wszystkie adresy urządzeń podłączonych do karty Master.