Adresacja urządzeń I2C

Podczas pracy czy też zabawy z Arduino prędzej czy później przyjdzie Wam się zetknąć z rozwiązaniem jakim jest magistrala I2C (IIC). Jest to rozwiązanie pozwalające na podpinanie w szeregu wielu urządzeń (wyświetlacze, zegary RTC, moduły rozszerzeń czujniki itp). Przy tej okazji pojawiają się więc problemy jeśli chodzi o adresowanie urządzeń .

Magistrala I2C rozwiązuje problem nadmiernej ilości kabli oraz zajmowania dodatkowych pinów w arduino. Aby podłączyć do niej urządzenie potrzebne są 4 przewody (5V, GND, SCL, oraz SDA). SDA (data) znajduje się na Arduino (nano, uno) na pinie A4 natomiast SCL (clock) znajduje się na pinie A5.

Sposób podłączenia wyświetlacza wyposażonego w moduł I2C do arduino przedstawia poniższy przykład:

LCD I2C

Kolejne urządzenia mogą zostać podłączone do niej szeregowo. Jedyną rzeczą która podczas podłączania jest dla nas niewiadomą jest adres urządzenia. Pomimo tego, iż teoretycznie mamy w ręce dwa takie same urządzenia mogą one się różnić pomiędzy sobą układami scalonymi lub też połączonymi zworkami. Szukanie ich adresów „na ślepo” jest bardzo nieefektywne. Po prostu jest to strata czasu. Istnieje jednak bardzo proste i skuteczne rozwiązanie. Jest to bowiem skrypt wyświetlający nam na monitorze szeregowym informacje dotyczące podłączonych urządzeń.

Skrypt przedstawia się następująco:

#include <Wire.h>
void setup()
  {
    Wire.begin();
    Serial.begin(9600);
    Serial.println("\nI2C Scanner");
  }
void loop()
  {
    byte error, address;
    int nDevices;
    Serial.println("Scanning...");
    nDevices = 0;
    for(address = 1; address < 127; address++ ) 
      {
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
        if (error == 0)
          {
            Serial.print("I2C device found at address 0x");
            if (address<16) 
            Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
            nDevices++;
          }
        else if (error==4) 
          {
            Serial.print("Unknow error at address 0x");
            if (address<16) 
            Serial.print("0");
            Serial.println(address,HEX);
          } 
      }
    if (nDevices == 0)
    Serial.println("No I2C devices found\n");
    else
    Serial.println("done\n");
    delay(5000); // wait 5 seconds for next scan
    //site mn-tech.pl
    //youtube https://www.youtube.com/user/mntechpl
    //facebook https://www.facebook.com/mntechpl
  }

Po wgraniu sketcha do arduino (jak to zrobić pokazywałem tutaj) uruchamiamy monitor szeregowy. Jeśli poprawnie wszystko zostało przez nas podłączone – pojawią się informacje o adresach poszczególnych urządzeń. Najrozsądniej jest podpinać po jednym i sprawdzić jaki adres dane urządzenie posiada. Jeśli nie jesteśmy pewni czy to na pewno to urządzenie – można wypiąć z niego któryś z kabli (np zasilający) i sprawdzić który adres przestał się pojawiać na monitorze.

Zmiana adresu I2C

Niektóre z urządzeń (jak np moduły wyświetlacza) występują w kilku wariantach (mających różne adresy)  i mają dodatkowo zworki pozwalające na zmianę tych adresów (np A0, A1, A2). PO zwarciu odpowiednich zworek (zlutowaniu ich) można uzyskać 8 różnych adresów i dzięki temu powielić ilość zbieranych bądź też wyświetlanych informacji.

Przykładowymi adresami z którymi możecie się spotkać będą:

  • 0x27 – wyświetlacz
  • 0x3F – wyświetlacz
  • 0x68 – zegar DS1307

To oczywiście jest tylko drobny ułamek tego co możecie spotkać. Mam nadzieję, że ten poradnik pomoże Wam w samodzielnym zbudowaniu urządzenia.