Komunikacja szeregowa jest jednym z najpowszechniejszych sposobów wymiany danych pomiędzy urządzeniami elektronicznymi. Jednakże, gdy odległości się zwiększają lub w środowisku występują zakłócenia elektromagnetyczne, sygnały komunikacyjne mogą być podatne na błędy. Tutaj właśnie pojawia się standard komunikacji RS485, oferujący solidną i skuteczną alternatywę. Arduino, dzięki swojej wszechstronności, pozwala nam w dość prosty sposób w pełni wykorzystać możliwości tego protokołu.
W tym artykule zobaczymy, jak można zrealizować komunikację RS485 pomiędzy kilkoma Arduino przy użyciu modułów opartych na zintegrowanym MAX485, chipie konwertującym sygnały TTL (z Arduino) na RS485 i odwrotnie. W tym samouczku omówimy zarówno podstawowe pojęcia, jak i praktyczne przykłady, które pozwolą Ci zaimplementować komunikację simpleksową, półdupleksową i pełnodupleksową pomiędzy mikrokontrolerami Arduino oraz wyjaśnimy, w jaki sposób możesz rozszerzyć ten system komunikacji, aby obsługiwał wiele urządzeń w jednym Magistrala RS485.
Co to jest RS485?
RS485 jest standardem komunikacyjnym szeroko stosowanym w branży, znanym z krzepa i jego zdolność do wytrzymania długi dystans transmisji, nawet w hałaśliwym środowisku przemysłowym. W przeciwieństwie do innych typów komunikacji szeregowej, takich jak RS232, RS485 umożliwia podłączenie wielu urządzeń do tej samej magistrali, co czyni go idealnym rozwiązaniem do zastosowań w automatyce przemysłowej i sterowaniu.
Protokół ten jest odporny na szum elektromagnetyczny dzięki temu, że wykorzystuje m.in różnicowy system sygnalizacji, co oznacza, że ​​dane są przesyłane dwoma przewodami, A i B, o przeciwnych napięciach. Pozwala to na łatwe wyeliminowanie szumów wychwyconych w kablach, zapewniając integralność sygnału.
Jedną z głównych zalet RS485 jest to obsługuje odległości do 1200 metrów i prędkość do 35 Mb/s na krótkich dystansach, co czyni go idealnym protokołem do zastosowań przemysłowych i kontrolnych w środowiskach, w których konieczne jest długie okablowanie.
Tryby komunikacji RS485

W komunikacji RS485 możemy skonfigurować system na trzy różne sposoby: simplex, half-duplex i full-duplex. Każdy z nich ma swoją specyfikę i jest wdrażany zgodnie z potrzebami projektu.
Komunikacja Simplex
W trybie simplex komunikacja odbywa się tylko w jednym kierunku, to znaczy, że działa jedno urządzenie emitent i kolejny podobny receptor. Jest to przydatne w sytuacjach, gdy chcesz po prostu wysłać lub odebrać dane bez potrzeby przesyłania informacji zwrotnej.
Możemy na przykład skonfigurować system, w którym Arduino odczytuje wartość czujnika i wysyła ją do innego urządzenia, które po prostu ją odbiera. W tym przypadku, ponieważ dane przesyłane są tylko w jednym kierunku, można zrezygnować z niektórych dodatkowych elementów sterujących, co czyni system prostszym i bardziej ekonomicznym.
Komunikacja półdupleksowa
Większość aplikacji RS485 na Arduino jest zaimplementowanych w trybie half-duplex, ponieważ tego wymaga dwa przewodyi umożliwia zarówno wysyłanie, jak i odbieranie danych, chociaż nie jednocześnie. Oznacza to, że jeśli jedno urządzenie wysyła dane, pozostałe urządzenia muszą znajdować się w trybie odbioru i odwrotnie.
Aby przełączać się między trybami nadawania i odbioru, użyj dodatkowe piny (RE/DE) w module MAX485, którym będziesz sterował za pomocą kodu, aby określić, czy urządzenie powinno w danym momencie wysyłać, czy odbierać.
Ten tryb jest szczególnie przydatny, jeśli na tej samej magistrali znajduje się wiele urządzeń, które muszą komunikować się ze sobą, ale nie jednocześnie.
Komunikacja w trybie pełnego dupleksu
W trybie pełnego dupleksu urządzenia mogą jednocześnie wysyłać i odbierać dane. Jednakże, aby wdrożyć tryb pełnego dupleksu w RS485, dwie pary skręconych przewodów, co zwiększa koszt i złożoność okablowania. Dodatkowo potrzebne będą dwa moduły MAX485 dla każdego urządzenia, aby oddzielnie zarządzać kanałami nadawczymi i odbiorczymi.
Komponenty wymagane do komunikacji RS485 z Arduino
Aby zaimplementować system komunikacji RS485 na Arduino, potrzebne będą następujące komponenty:
- Jeden lub więcej Arduino: Zrobi to dowolny model Arduino, ale w tym samouczku użyjemy Arduino UNO i Arduino MEGA jako przykłady.
- Moduły MAX485: Moduły te umożliwiają konwersję sygnałów TTL z Arduino na RS485 i odwrotnie. Są bardzo tanie i łatwe do znalezienia w sklepach takich jak AliExpress czy eBay.
- Rezystory końcowe: Aby uniknąć odbić sygnału, na każdym końcu magistrali umieszcza się zwykle rezystor o wartości od 120 omów. Na krótkich dystansach można się bez nich obejść, natomiast w dłuższych instalacjach są one niezbędne do zachowania integralności sygnału.
- Kable skrętkowe: Zaleca się stosowanie skrętek dwużyłowych, aby zminimalizować zakłócenia elektromagnetyczne, zwłaszcza w hałaśliwym środowisku przemysłowym.
Ogólny schemat połączeń
Podłącz moduły MAX485 do Arduino jest całkiem proste. Najważniejsze piny to A i B, które odpowiadają liniom magistrali RS485. Piny te muszą być podłączone do wszystkich urządzeń na magistrali. Dodatkowo moduł posiada piny RE i DE sterujące tym czy moduł znajduje się w trybie odbiornika czy nadajnika.
Generalnie podłączenie modułów do Arduino odbywa się w następujący sposób:
- VCC i GND modułu łączą się z VCC i GND w Arduino.
- DI (data input) modułu podłącza się do pinu TX Arduino, jeżeli moduł ma pełnić funkcję emitera.
- RO (Receiver Output) modułu podłączamy do pinu RX Arduino, jeżeli moduł ma pełnić funkcję odbiornika.
- Aby przełączać się między trybami nadawania i odbioru, DE i RE muszą być sterowane za pomocą cyfrowego pinu Arduino.
Jeśli potrzebujesz modułu tylko do działania jako nadawca lub odbiornik, możesz podłączyć RE i DE bezpośrednio do HIGH lub LOW. Jednakże w przypadku bardziej złożonej komunikacji, w której urządzenie musi przełączać się między nadawaniem i odbiorem, najlepiej sterować tymi pinami z poziomu oprogramowania.
Przykłady kodu dla komunikacji RS485
Poniżej znajduje się kilka przykładów obejmujących różne konfiguracje komunikacji z RS485 w Arduino.
Komunikacja Simplex
Kod wydawcy
W przypadku podstawowego systemu simplex, w którym mamy tylko jednego nadawcę i jednego odbiorcę, kod nadawcy może wyglądać następująco:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Kod odbiorcy
Odbiornik po prostu odczyta dane przychodzÄ…ce przez port szeregowy:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Komunikacja półdupleksowa
W tym przykładzie wdrażamy system półdupleksowy, w którym urządzenia naprzemiennie wysyłają i odbierają dane.
Kod nauczyciela
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, HIGH); Serial.write('H'); delay(100); digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Kod niewolnika
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); delay(100); digitalWrite(reDePin, HIGH); Serial.write(data + 1); } }
Komunikacja w trybie pełnego dupleksu
Aby wdrożyć komunikację w trybie pełnego dupleksu, potrzebne będą dwa moduły MAX485 na każde Arduino. Każda para modułów będzie obsługiwać jedną linię danych: jedną do nadawania i jedną do odbioru.
Kod będzie podobny do poprzednich przykładów, ale w tym przypadku oba urządzenia będą zawsze jednocześnie nadawały i odbierały.
Rozszerzenie na wiele urządzeń w standardzie RS485
RS485 ma możliwość podłączenia do 32 urządzeń na jednej magistrali, a w szczególnych przypadkach może osiągnąć więcej. To sprawia, że ​​jest to doskonały wybór do projektów obejmujących wiele mikrokontrolerów lub urządzeń. Aby zidentyfikować każde z nich w sieci, powszechnie stosuje się adres lub identyfikator dla każdego urządzenia.
W tym przypadku master wyśle ​​wiadomość z adresem urządzenia, z którym chce się komunikować, i tylko to urządzenie będzie odpowiedzialne za przetworzenie komunikatu i udzielenie odpowiedzi.
Do tego dochodzi możliwość wykorzystania bardziej złożone protokoły takich jak MODBUS, które pozwalają na tworzenie wysoce wydajnych i bezpiecznych sieci w przemyśle.
W przypadku projektów domowych lub mniej wymagających aplikacji możesz po prostu przypisać identyfikator do każdego Arduino i sprawić, by reagowało tylko na przeznaczone dla niego komunikaty.