I2C protokol

Zo stránky 3D liga wiki
Prejsť na navigáciu Prejsť na vyhľadávanie

I2C

Späť k zoznamu

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.