I2C protokol
I2C
Viacero súčiastok v stavebnici (napr. senzor vzdialenosti VL53L0X, gyroskop BNO055) komunikuje s mikrokontrolérom cez zbernicu I2C. Táto stránka vysvetľuje, ako I2C funguje, aby ste vždy vedeli, prečo zapájame práve tieto piny a čo znamená "adresa" zariadenia.
Ako I2C funguje
I2C (Inter-Integrated Circuit) je spôsob komunikácie, kde môže na jednej dvojici vodičov komunikovať viacero zariadení naraz:
- SDA (Serial Data) – vodič, po ktorom sa prenášajú samotné dáta
- SCL (Serial Clock) – vodič s hodinovým signálom, ktorý synchronizuje, kedy sa dáta čítajú
Mikrokontrolér je v tejto komunikácii zvyčajne master (riadi komunikáciu) a jednotlivé senzory sú slave zariadenia (odpovedajú, keď sú oslovené). Keďže na tých istých dvoch vodičoch môže "počúvať" viacero zariadení, každé z nich má svoju jedinečnú I2C adresu (napr. VL53L0X má z výroby adresu 0x29) – mikrokontrolér ňou určí, s ktorým zariadením práve komunikuje.
Poznámka: ak by ste chceli pripojiť viacero zariadení s rovnakou adresou (napr. dva rovnaké senzory), musíte ich vedieť od seba odlíšiť – zvyčajne cez extra pin (napr. XSHUT), ktorým jedno zariadenie dočasne vypnete a druhému priradíte inú adresu.
Zapojenie
Na RP2350-Zero používame v našich manuáloch tieto piny pre I2C:
| Pin zariadenia | Pin na RP2350-Zero |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GP4 |
| SCL | GP5 |
Kód – I2C scanner
Vyskúšaj toto: Ak si nie ste istí, či je senzor správne zapojený, alebo neviete jeho presnú adresu, nahrajte tento program. Prejde všetky možné adresy a vypíše, na ktorých našiel odpovedajúce zariadenie.
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.setSDA(4); // GP4
Wire.setSCL(5); // GP5
Wire.begin();
Serial.println("I2C scanner spusteny");
}
void loop() {
byte count = 0;
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0) {
Serial.print("Zariadenie najdene na adrese 0x");
Serial.println(address, HEX);
count++;
}
}
if (count == 0) {
Serial.println("Ziadne zariadenie nenajdene");
}
delay(2000);
}
| Novinka | Vysvetlenie |
|---|---|
Wire.beginTransmission(address) |
Skúsi začať komunikáciu so zariadením na danej adrese |
Wire.endTransmission() |
Ukončí pokus o komunikáciu – vráti 0, ak zariadenie na danej adrese odpovedalo
|
Čo sme sa naučili?
- I2C umožňuje viacerým zariadeniam komunikovať cez rovnaké dva vodiče (SDA, SCL).
- Každé zariadenie na zbernici má svoju jedinečnú adresu, podľa ktorej ho mikrokontrolér oslovuje.
- Pomocou I2C scanneru vieme rýchlo overiť, či je senzor správne zapojený a akú má adresu.