- Różnica między komunikacją UART i RS485
- Wymagane składniki
- Schemat obwodu dla komunikacji przewodowej na duże odległości
- Moduł konwertera MAX485 UART-RS485
- Kabel Ethernet CAT-6E
- Objaśnienie kodu Arduino
- Wniosek
Od dłuższego czasu używamy płytek rozwojowych mikrokontrolerów, takich jak Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430 itp. W naszych małych projektach, w których przez większość czasu odległość między czujnikami a płytką nie przekracza kilku centymetrów przy max i przy takich odległościach komunikacja między różnymi modułami czujników, przekaźnikami, siłownikami i sterownikami może być łatwo przeprowadzona za pomocą prostych przewodów połączeniowych, bez obaw o zniekształcenia sygnału w medium i przenikające do niego szumy elektryczne. Ale jeśli budujesz system sterowania z tymi płytkami rozwojowymi na odległość większą niż 10 do 15 metrów, powinieneś wziąć pod uwagę szum i moc sygnału, ponieważ jeśli chcesz, aby Twój system działał niezawodnie, nie możesz sobie pozwolić na utratę dane podczas przesyłania.
Istnieje wiele różnych typów protokołów komunikacji szeregowej, takich jak I2C i SPI, które można łatwo zaimplementować za pomocą Arduino, a dziś przyjrzymy się innemu najczęściej używanemu protokołowi o nazwie RS485, który jest bardzo powszechnie używany w środowiskach przemysłowych o wysokim poziomie szumów do przesyłania danych. duża odległość. W tym samouczku dowiemy się o protokole komunikacyjnym RS485 oraz o tym, jak wdrożyć go z dwoma Arduino Nano, które mamy u nas, oraz jak korzystać z modułu konwersji MAX485 RS485 na UART. Wcześniej wykonaliśmy również komunikację MAX485 z Arduino, a także komunikację MAX485 z Raspberry pi, możesz je również sprawdzić, jeśli jesteś zainteresowany.
Różnica między komunikacją UART i RS485
Większość tanich czujników i innych modułów, takich jak GPS, Bluetooth, RFID, ESP8266 itp., Które są powszechnie używane z Arduino, Raspberry Pi na rynku wykorzystuje komunikację opartą na UART TTL, ponieważ wymaga tylko 2 przewodów TX (nadajnik) i RX (Odbiorca). Nie jest to standardowy protokół komunikacyjny, ale jest to fizyczny obwód, za pomocą którego można przesyłać i odbierać dane szeregowe z innymi urządzeniami peryferyjnymi. Może przesyłać / odbierać dane tylko szeregowo, więc najpierw konwertuje dane równoległe na dane szeregowe, a następnie przesyła dane.
UART jest asynchronicznym urządzeniem transmisyjnym, dlatego nie ma sygnału zegarowego do synchronizacji danych między dwoma urządzeniami, zamiast tego używa bitów startu i stopu odpowiednio na początku i na końcu każdego pakietu danych, aby oznaczyć końce przesyłanych danych. Dane przesyłane przez UART są organizowane w pakiety. Każdy pakiet zawiera 1 bit startu, 5 do 9 bitów danych (w zależności od UART), opcjonalny bit parzystości i 1 lub 2 bity stopu. Jest bardzo dobrze udokumentowany i szeroko stosowany, a także ma bit parzystości, aby umożliwić sprawdzanie błędów. Ale są pewne ograniczenia, ponieważ nie może obsługiwać wielu niewolników i wielu mistrzów a maksymalna ramka danych jest ograniczona do 9 bitów. W celu przesłania danych szybkości transmisji danych Master i Slave muszą wynosić między 10%. Poniżej pokazano przykład, w jaki sposób znak jest nadajnikiem w linii danych UART. Sygnał wysoki i niski są mierzone względem poziomu GND, więc zmiana poziomu GND będzie miała katastrofalny wpływ na transfer danych.
Z drugiej strony RS485 jest komunikacją opartą na przemyśle, opracowaną dla sieci wielu urządzeń, które mogą być używane na duże odległości i przy większych prędkościach. Działa na zasadzie pomiaru różnicowego, a nie pomiaru napięcia z pinem GND. Sygnały RS485 są zmienne, a każdy sygnał jest przesyłany linią Sig + i Sig-line.
Odbiornik RS485 porównuje różnicę napięć między obiema liniami zamiast bezwzględnego poziomu napięcia na linii sygnałowej. Działa to dobrze i zapobiega istnieniu pętli masy, które są częstym źródłem problemów komunikacyjnych. Najlepsze wyniki uzyskuje się, jeśli linie Sig + i Sig- są skręcone, ponieważ skręcenie niweluje efekt szumu elektromagnetycznego indukowanego w kablu i zapewnia znacznie lepszą odporność na szum, co pozwala RS485 na przesyłanie danych na odległość do 1200 m. Skrętka umożliwia również znacznie wyższe prędkości transmisji niż jest to możliwe w przypadku prostych kabli. Przy małych odległościach transmisji można osiągnąć prędkość do 35 Mb / s za pomocą RS485, chociaż prędkość transmisji będzie się zmniejszać wraz z odległością. Przy prędkości transmisji 1200 m możesz użyć tylko 100 kb / s szybkości transmisji. Do realizacji tego protokołu komunikacyjnego potrzebny jest specjalny kabel Ethernet. Istnieje wiele kategorii kabli Ethernet, których możemy używać, takich jak CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A itp. W naszym poradniku będziemy używać kabla CAT-6E który ma 4 skręcone pary przewodów 24AWG i może obsługiwać do 600 MHz. Jest zakończony na obu końcach złączem RJ45. Typowe poziomy napięcia liniowego ze sterowników liniowych wynoszą od minimum ± 1,5 V do maksimum około ± 6 V. Czułość wejściowa odbiornika wynosi ± 200 mV. Hałas w zakresie ± 200 mV jest zasadniczo blokowany dzięki redukcji szumów w trybie wspólnym. Przykład przesyłania bajtu (0x3E) przez dwie linie komunikacji RS485.
Wymagane składniki
- Moduł konwertera 2 × MAX485
- 2 × Arduino Nano
- Alfanumeryczny wyświetlacz LCD 2 × 16 * 2
- Potencjometry wycieraczek 2 x 10k
- Kabel Ethernet Cat-6E
- Płyty do krojenia chleba
- Przewody połączeniowe
Schemat obwodu dla komunikacji przewodowej na duże odległości
Poniższy obraz przedstawia schemat obwodu nadajnika i odbiornika dla komunikacji przewodowej na duże odległości Arduino. Zwróć uwagę, że zarówno obwody nadajnika, jak i odbiornika wyglądają identycznie, jedyną różnicą jest zapisany w nich kod. Również do demonstracji używamy jednej płytki jako nadajnika i jednej płytki jako odbiornika, ale możemy łatwo zaprogramować płytki tak, aby działały zarówno jako nadajnik, jak i odbiornik z tą samą konfiguracją
Schemat połączeń dla powyższego obwodu jest również podany poniżej.
Jak widać powyżej, istnieją dwie prawie identyczne pary obwodów, z których każdy ma Arduino nano, 16 * 2 alfanumeryczny wyświetlacz LCD i układ scalony konwertera MAX485 UART na RS485 podłączony do każdego końca kabla Ethernet Cat-6E za pomocą złącza RJ45. Kabel, którego użyłem w tutorialu ma 25m długości. Część danych od strony nadajnika prześlemy kablem z Nano, który jest konwertowany na sygnały RS485 poprzez moduł MAX RS485 pracujący w trybie Master.
Na końcu odbiorczym moduł konwertera MAX485 pracuje jako Slave i odsłuchując transmisję od Mastera ponownie konwertuje otrzymane dane RS485 na standardowe sygnały 5V TTL UART do odczytu przez odbierający Nano i wyświetlanych na 16 * Podłączony 2 alfanumeryczny wyświetlacz LCD.
Moduł konwertera MAX485 UART-RS485
Ten moduł konwertera UART-RS485 ma wbudowany układ MAX485, który jest urządzeniem nadawczo-odbiorczym o niskiej mocy i ograniczonej szybkości narastania używanym do komunikacji RS-485. Działa przy pojedynczym zasilaniu + 5V, a prąd znamionowy to 300 μA. Działa na komunikacji półdupleksowej, realizując funkcję konwersji poziomu TTL na poziom RS-485, co oznacza, że może przesyłać lub odbierać w dowolnym momencie, nie jednocześnie, może osiągnąć maksymalną prędkość transmisji 2,5 Mb / s. Transceiver MAX485 pobiera prąd zasilający od 120μA do 500μA w stanie nieobciążonym lub w pełni obciążonym, gdy sterownik jest wyłączony. Sterownik jest ograniczony prądem zwarciowym, a wyjścia sterownika mogą być ustawione w stanie wysokiej impedancji przez obwód wyłącznika termicznego. Wejście odbiornika posiada funkcję zabezpieczenia przed awarią, która gwarantuje wysoki poziom logiki, jeśli wejście jest w obwodzie otwartym.Ponadto ma silne działanie przeciwzakłóceniowe. Posiada również wbudowane diody LED, które wyświetlają aktualny stan chipa, tj. Czy chip jest zasilany, czy przesyła lub odbiera dane, co ułatwia debugowanie i używanie.
Schemat obwodu podany powyżej wyjaśnia, w jaki sposób wbudowany układ MAX485 IC jest podłączony do różnych komponentów i zapewnia 0,1-calowe standardowe nagłówki odstępów do użycia z płytą stykową, jeśli chcesz.
Kabel Ethernet CAT-6E
Kiedy myślimy o transmisji danych na duże odległości, od razu myślimy o połączeniu z Internetem za pomocą kabli Ethernet. Obecnie do połączenia z Internetem używamy głównie Wi-Fi, ale wcześniej używaliśmy kabli Ethernet prowadzących do każdego komputera osobistego, aby połączyć go z Internetem. Głównym powodem używania tych kabli Ethernet zamiast zwykłych przewodów jest to, że zapewniają znacznie lepszą ochronę przed przenikaniem szumów i zniekształceniami sygnału na dużych odległościach. Posiadają płaszcz ekranujący na warstwie izolacyjnej, aby chronić przed zakłóceniami elektromagnetycznymi, a także każda para przewodów jest skręcona razem, aby zapobiec tworzeniu się pętli prądowej, a tym samym znacznie lepszą ochronę przed szumami. Często są zakończone 8-pinowymi złączami RJ45 na każdym końcu. Istnieje wiele kategorii kabli Ethernet, których możemy używać, takich jak CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, itp. W naszym poradniku użyjemy kabla CAT-6E, który ma 4 skręcone pary przewodów 24AWG i może obsługiwać do 600MHz.
Zdjęcie pokazujące, jak para przewodów jest skręcona wewnątrz warstwy izolacyjnej kabla CAT-6E
Złącze RJ-45 przeznaczone do kabla Ethernet CAT-6E
Objaśnienie kodu Arduino
W tym projekcie używamy dwóch Arduino Nano, jednego jako nadajnika i jednego jako odbiornika, z których każdy steruje alfanumerycznym wyświetlaczem LCD 16 * 2 do wyświetlania wyników. Tak więc w kodzie Arduino skupimy się na wysyłaniu danych i wyświetlaniu wysłanych lub odebranych danych na ekranie LCD.
Po stronie nadajnika:
Zaczynamy od włączenia standardowej biblioteki do sterowania wyświetlaczem LCD i deklarujemy pin D8 Arduino Nano jako pin wyjściowy, którego później użyjemy do zadeklarowania modułu MAX485 jako nadajnika lub odbiornika.
int enablePin = 8; int potval = 0; #zawierać
Teraz przejdźmy do części konfiguracyjnej. Wyciągniemy wysoki pin włącznika, aby ustawić moduł MAX485 w trybie nadajnika. Ponieważ jest to półdupleksowy układ scalony, nie może więc jednocześnie przesyłać i odbierać. Tutaj również zainicjujemy wyświetlacz LCD i wydrukujemy wiadomość powitalną.
Serial.begin (9600); // inicjalizacja portu szeregowego przy szybkości transmisji 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("PRZEGLĄD OBWODU"); lcd.setCursor (0,1); lcd.print ("Nadajnik Nano"); opóźnienie (3000); lcd.clear ();
Teraz w pętli piszemy stale rosnącą wartość całkowitą w liniach szeregowych, która jest następnie przesyłana do drugiego nano. Ta wartość jest również drukowana na wyświetlaczu LCD w celu wyświetlenia i debugowania.
Serial.print ("Wartość wysłana ="); Serial.println (potval); // Szeregowy zapis POTval na magistrali RS-485 lcd.setCursor (0,0); lcd.print ("Wartość wysłana"); lcd.setCursor (0,1); lcd.print (potval); opóźnienie (1000); lcd.clear (); potval + = 1;
Strona odbiornika:
Tutaj ponownie zaczynamy od włączenia standardowej biblioteki do sterowania wyświetlaczem LCD i deklarujemy pin D8 Arduino Nano jako pin wyjściowy, którego później użyjemy do zadeklarowania modułu MAX485 jako nadajnika lub odbiornika.
int enablePin = 8; #zawierać
Teraz przejdźmy do części konfiguracyjnej. Wyciągniemy wysoki pin włącznika, aby ustawić moduł MAX485 w trybie odbiornika. Ponieważ jest to układ półdupleksowy, nie może jednocześnie przesyłać i odbierać. Tutaj również zainicjujemy wyświetlacz LCD i wydrukujemy wiadomość powitalną.
Serial.begin (9600); // inicjalizacja portu szeregowego przy szybkości transmisji 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("PRZEGLĄD OBWODU"); lcd.setCursor (0,1); lcd.print ("Odbiornik Nano"); opóźnienie (3000); digitalWrite (enablePin, LOW); // (Pin 8 zawsze NISKI, aby otrzymać wartość od Mastera)
Teraz w pętli sprawdzamy, czy coś jest dostępne na porcie szeregowym, a następnie odczytujemy dane, a ponieważ przychodzące dane są liczbą całkowitą, parsujemy je i wyświetlamy na podłączonym wyświetlaczu LCD.
int pwmval = Serial.parseInt (); // Odbierz wartość INTEGER od Mastera poprzez RS-485 Serial.print ("Mam wartość"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Wartość otrzymana"); lcd.setCursor (0,1); lcd.print (pwmval); opóźnienie (1000); lcd.clear ();
Wniosek
Konfigurację testową, której użyliśmy w tym projekcie, można znaleźć poniżej.
Pełne działanie tego projektu można znaleźć w poniższym filmie wideo. Ta metoda jest jedną z prostych i łatwych do wdrożenia metod przesyłania danych na duże odległości. W tym projekcie użyliśmy tylko szybkości transmisji 9600, która jest znacznie poniżej maksymalnej prędkości transferu, jaką możemy osiągnąć dzięki modułowi MAX-485, ale ta prędkość jest odpowiednia dla większości modułów czujników i tak naprawdę nie potrzebujemy wszystkie maksymalne prędkości podczas pracy z Arduino i innymi płytami rozwojowymi, chyba że używasz kabla jako połączenia Ethernet i potrzebujesz całej przepustowości i szybkości transferu, jaką możesz uzyskać. Poeksperymentuj samodzielnie z szybkością transferu i wypróbuj także inne typy kabli Ethernet. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy poniżej lub skorzystaj z naszych forów, a ja postaram się na nie odpowiedzieć. Do tego czasu, adios!