Jak używać wielu urządzeń I2C z Arduino

Jak używać wielu urządzeń I2C z Arduino

Arduino to elektroniczna tablica zbudowana do projektowania projektów. Podczas budowania projektów Arduino komunikacja odgrywa ważną rolę. Arduino ma wiele protokołów komunikacyjnych, takich jak serial USART, SPI i I2C. Protokoły te zwiększają funkcjonalność i wykorzystanie Arduino w wielu produktach. Jeśli nasze urządzenie nie obsługuje konkretnego protokołu, mamy zaletę, że użycie pozostałych dwóch. Wśród tych wszystkich I2C jest jeden z najbardziej zaawansowanych protokołów stosowanych w tablicach Arduino. Omówmy, jak skonfigurować protokół I2C dla wielu urządzeń.

I2C z Arduino

I2C znany również jako obwód zintegrowany jest protokołem komunikacyjnym stosowanym w tablicach Arduino. Używa tylko dwóch linii do komunikacji i jednego z najbardziej złożonych protokołów do wdrożenia z płytą Arduino. Korzystając z I2C, możemy podłączyć do 128 urządzeń z płytą Arduino na jednej linii danych.

I2C używa dwóch linii, które są SDA i SCL. Wraz z tymi dwiema liniami stosuje się rezystor podciągający do utrzymania zarówno linii SDA, jak i SCL wysokiej.

Protokoły I2C obsługują wiele konfiguracji niewolników głównych, co oznacza, że ​​używając pojedynczego master Arduino.

Jak używać wielu I2C z Arduino

Ponieważ I2C ma obsługę konfiguracji mistrzowskiej, abyśmy mogli kontrolować wiele urządzeń jednocześnie. W niektórych projektach używamy różnych modułów, czujników i sprzętu, które obsługują komunikację I2C, wszystkie z nich można podłączyć w pojedynczym autobusie I2C, jeśli mają unikalny adres I2C. Ale jeśli mamy więcej niż jedno urządzenie, które udostępnia ten sam adres I2C, może to powodować problemy dla obu urządzeń i nie możemy ich kontrolować za pomocą tej samej magistrali I2C. Jednak ten problem można rozwiązać za pomocą TCA9548A Multiplekser I2C, ten Mux używa pojedynczej magistrali I2C z Arduino i przekształca na 8 różnych kanałów, a wszystkie oddzielne adresy.

Wszystkie adresy I2C to głównie dwa typy albo 7 bitów lub 10 bitów. Większość urządzeń czasowych używa 7 bitów i2c, jednak 10-bit I2C jest rzadko używany w urządzeniach. Oznacza to więc użycie 7-bitowego adresu Arduino może podłączyć 128 urządzeń.

Teraz połączymy dwa różne urządzenia o unikalnych protokołach I2C z linami Arduino Uno I2C.

Schemat obwodu

Poniższy rysunek pokazuje ekran OLED przymocowany do Arduino za pomocą linii I2C SDA i SCL. Podczas gdy ekran LCD 16x2 jest również podłączony za pomocą tej samej magistrali I2C równolegle z ekranem OLED. Jedną ważną rzeczą, na którą należy zwrócić uwagę, jest to, że LCD 16x2 używa tylko 4 przewodów I2C zamiast 8 przewodów do sterowania. Wraz z LCD użyliśmy modułu I2C z Arduino, który potrzebuje tylko 4 pinów do wyświetlania LCD: VCC, GND, SDA, SCL. Korzystając z modułu I2C z LCD, zapisaliśmy 4 cyfrowe szpilki na Arduino, co zmniejszy całe okablowanie i poprawi funkcjonalność Arduino.

Jak sprawdzić adresy urządzeń I2C

Zanim połączymy jakieś urządzenie I2C z Arduino, należy zauważyć, pod którym adresem jest podłączone określone urządzenie. Niektóre moduły mają domyślne adresy I2C zapisane, podczas gdy niektóre z nich nie mają instrukcji sprawdzania adresów I2C. Aby rozwiązać ten problem, mamy drut Kod biblioteki, który sprawdza wszystkie podłączone urządzenia I2C i pod jakim adresem są one podłączone do Arduino. Pomoże to w debugowaniu i ulepszeniu obwodu Arduino.

Kod

#include /*zawiera przewód.Biblioteka H*/
void Setup ()

Drut.zaczynać(); /*Wire I2C Komunikacja Start*/
Seryjny.rozpocząć (9600); /*Zestaw stawki BAUD dla komunikacji szeregowej*/
chwila (!Seryjny); /*Oczekiwanie na wyjście szeregowe na monitorze szeregowym*/
Seryjny.println („\ ni2c skaner”);

Void Loop ()

bajt err, ADR; /*Błąd zmiennej jest zdefiniowany za pomocą 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 na następny skanowanie I2C*/

Ten kod pomoże znaleźć liczbę urządzeń I2C i ich adres, pod którym są połączone. Ten kod jest powszechnie określany jako kod skanera I2C.

Po pierwsze, dołączyliśmy "Drut.H" biblioteka. Następnie w części instalacji kodu zaczęliśmy tę bibliotekę. Następnie inicjujemy komunikację szeregową, definiując wskaźnik transmisji 9600. Pomoże to zobaczyć wyjście przez monitor szeregowy.

W sekcji pętli zdefiniowaliśmy dwie zmienne "błądzić" I „ADR”. Następnie zdefiniowaliśmy inną zmienną "Urządzenia" i ustaw go na zero. Po tym Do pętla jest inicjowana z wartościami od 0 do 127.

Następnie wprowadzamy adres do przewodu za pomocą drut.początkowaTransmission (), Skaner I2C będzie szukał potwierdzenia urządzeń i ich adresu. Odczyt wartości będzie przechowywany w zmiennej "błąd". Wartość zwracana będzie równa 0, jeśli urządzenie potwierdzi, że wartość adresu będzie 4. Następnie użyliśmy warunku IF, który wydrukuje adres urządzenia I2C, jeśli wartość jest <16. Final address of the device is printed in Hexadecimal form.

Okrążenie

Wyjście

Wyjście urządzeń przymocowanych do Arduino przez protokoły I2C będą wyglądać jak pokazano na schemacie poniżej. Tutaj 0x3c to adres I2C LCD chwila 0x27 to adres OLED ekran.

Wniosek

Podłączanie urządzeń za pomocą I2C w Arduino może zapisać wiele pinów. Wiele urządzeń można podłączyć za pomocą I2C w konfiguracji master-niewolnicy, ale najważniejsze do rozważenia jest to, że wszystkie urządzenia muszą mieć unikalny adres I2C, żadnych dwóch urządzeń o tym samym adresie nie może być obsługiwane za pomocą pojedynczej magistrali I2C. Sugerujemy więc, aby rozwiązaniem tego problemu jest użycie TCA9548A Multiplekser I2C, może przekonwertować pojedynczą magistralę I2C na 8 różnych kanałów.