Jak zeskanować adres I2C za pomocą Arduino nano

Jak zeskanować adres I2C za pomocą Arduino nano
Arduino Nano to kompaktowa płyta mikrokontrolera, która wykorzystuje ATMEGA328 do przetwarzania instrukcji. Ma podobną formę do Arduino Uno i jest kompatybilny ze wszystkimi sprzętem i czujnikami zaprojektowanymi dla UNO. Za pomocą Arduino Nano możemy interfejs urządzenia I2C za pomocą pinów SDA i SCL. Każde urządzenie I2C musi być podłączone do określonego adresu I2C.

Dzisiaj omówimy, w jaki sposób możemy połączyć wiele urządzeń I2C z Arduino Nano i skanować ich adres I2C za pomocą kodu IDE Arduino.

Wprowadzenie do komunikacji I2C

Arduino nano może komunikować się z innymi urządzeniami za pomocą protokołu obwodu międzyintegrowanego (I2C). Dane są wymieniane przez dwa przewody za pomocą protokołu I2C. Jest szeroko stosowany w elektronice, ponieważ pozwala wielu urządzeniom udostępniać ograniczoną liczbę połączeń bez potrzeby osobnego kanału komunikacyjnego.

Aby użyć I2C na Arduino nano używane SDA (PIN DANE) i SCL (PIN CLOCK). Na większości tablic nano, te piny to odpowiednio A4 i A5. Będziesz także musiał dołączyć bibliotekę drutu do szkicu i zainicjować komunikację I2C za pomocą przewodu.Funkcja początkowa ().

I2C jest podobny w pracy do UART i SPI. Na przykład, podobnie jak SPI Protocol I2C ma również obsługę pojedynczych głównych i wielu urządzeń niewolników. Podobnie I2C jest w jakiś sposób podobny do UART również z powodu dwóch przewodów do komunikacji. UART używa dwóch przewodów do komunikacji, czyli TX i RX, I2C używa również dwóch przewodów SDA i SCL do komunikacji i przesyłania danych.

Powyższy obraz reprezentuje kontrolowanie dwóch urządzeń niewolników za pomocą jednego mistrza. Tutaj rezystor podciągający jest podłączony zarówno do SDA, jak i SCL. I2C daje sygnały o dwóch poziomach niskim i otwartym obwodzie. I2C na Arduino Nano jest w trybie otwartego obwodu. Podciągnij rezystor, którego użyliśmy, pociągnie I2C na wysoki poziom.

Arduino Nano używa dwóch linii do komunikacji I2C:

  • SDA (dane szeregowe) - Pin A4: Link, które wymieniają dane między głównym a niewolnikiem
  • SCL (zegar szeregowy) - Pin A5: Aby wysłać sygnał do określonego niewolnika, stosuje się sygnał zegara

Jak skanować adres I2C w Arduino Nano za pomocą Arduino IDE

Adres I2C urządzenia musi być wyjątkowy, ponieważ służy do identyfikacji urządzenia w magistrali I2C. Gdy urządzenie wysyła lub odbiera dane w magistrali I2C, robi to przy użyciu unikalnego adresu I2C. Jeśli dwa urządzenia w tym samym autobusie I2C mają ten sam adres, nie będzie możliwe rozróżnienie między nimi, co prowadzi do błędów komunikacyjnych i nierzetelnego zachowania.

Aby upewnić się, że każde urządzenie w magistrali I2C ma unikalny adres, urządzenia I2C są zwykle przypisywane stałym adresowi przez producenta. Te adresy są zazwyczaj 7-bitowe lub 10-bitowe, w zależności od określonego protokołu I2C.

Urządzenia korzystające z protokołu I2C mają unikalne adresy od 0 do 127. Na przykład, jeśli mamy ekran LCD z tym samym adresem I2C, nie będziemy w stanie komunikować się między nimi za pomocą tej samej płyty Arduino.

Teraz będziemy interfejs dwa urządzenia I2C z Arduino Nano i znajdziemy adres I2C za pomocą kodu Arduino.

Schematyczny
Poniżej obraz pokazuje schemat Arduino nano z wyświetlaczem LCD OLED i I2C podłączonym w A4 i A5 Pin Arduino Nano. SDA PIN jest na A4, a pin SCL odpowiada A5 Arduino Nano.

Pinki połączeń Arduino nano z OLED i I2C LCD to:

Wyświetlacz OLED Arduino Nano Pin
VCC 3v3
GND GND
Scl A5
SDA A4
Wyświetlacz LCD I2C Arduino Nano Pin
VCC 5v
GND GND
Scl A5
SDA A4

Kod
Otwórz Arduino IDE, podłącz nano płytę i prześlij dany kod, aby zeskanować adres I2C na ekranie LCD OLED i I2C.

#Include /*biblioteka druciana importowana* /
void Setup ()

Drut.zaczynać(); /*I2C Komunikacja zaczyna się*/
Seryjny.rozpocząć (9600); /*stawka za kradzieży dla komunikacji UART*/
chwila (!Seryjny); /*Poczekaj na wyjście szeregowe*/
Seryjny.println („\ ni2c skaner”);

Void Loop ()

bajt err, ADR; /*zmienna do przechowywania adresu I2C*/
int number_of_devices;
Seryjny.println („Skanowanie.");
numer_of_devices = 0;
dla (ADR = 1; ADR < 127; adr++)

Drut.początkowa transmisja (ADR);
err = drut.endtransmission ();
if (err == 0)

Seryjny.drukuj („urządzenie I2C pod adresem 0x”);
if (ADR < 16)
Seryjny.druk („0”);
Seryjny.Drukuj (ADR, Hex);
Seryjny.println (" !");
numer_of_devices ++;

else if (err == 4)

Seryjny.print („Nieznany błąd pod adresem 0x”);
if (ADR < 16)
Seryjny.druk („0”);
Seryjny.println (ADR, hex);


if (numer_of_devices == 0)
Seryjny.println („nie załączone urządzenia I2C \ n”);
w przeciwnym razie
Seryjny.println („Done \ n”);
opóźnienie (5000); /*Poczekaj 5 sekund po każdym skanowaniu I2C*/

Kod rozpoczął się od włączenia biblioteki drutu, która pomaga Nano w ustaleniu komunikacji I2C z urządzeniami. Kolejny wskaźnik transmisji jest zdefiniowany dla komunikacji szeregowej.

W zmiennej sekcji pętli błądzić I ADR definiuje. Dwie zmienne będą przechowywać adres I2C po skanowaniu. A dla pętli jest zdefiniowane, które skanują adresy I2C urządzeń dołączonych do Arduino Nano.

Po skanowaniu adresu I2C zostanie wydrukowany na monitorie szeregowym Arduino. Wyświetlany adres I2C będzie w formacie sześciokątnym.

Sprzęt komputerowy
Poniżej obrazu pokazuje OLED 0.96-calowy wyświetlacz I2C i ekran LCD I2C jest podłączony do Arduino Nano w Pins GPIO A4 i A5. VCC i GND obu wyświetlaczy są podłączone do Arduino Nano 3V3/5v i Pin GND.

Wyjście
Monitor szeregowy wyświetlał adres I2C wyświetlaczy LCD OLED i I2C. Oba mają osobne adresy I2C, co oznacza, że ​​możemy je używać razem na tej samej płycie Arduino Nano.

Jeśli jednak mamy urządzenia z tym samym adresem I2C, możemy zmienić ich adres. Aby to szukać arkusza danych określonego czujnika.

Zarówno adresy OLED, jak i LCD I2C są uzyskiwane za pomocą Arduino nano.

Wniosek

Skanowanie adresu I2C przed podłączeniem wielu urządzeń I2C z Arduino jest ważne, ponieważ dwa urządzenia z tym samym adresem nie mogą komunikować się przez pojedynczy autobus I2C. Ten artykuł zawiera kod skanowania I2C za pomocą którego można znaleźć dowolny z adresów urządzeń I2C.