RS-485 to przemysłowy standard komunikacji szeregowej, który umożliwia niezawodny przesył danych na duże odległości. W przeciwieństwie do klasycznego RS-232, RS-485 charakteryzuje się wyższą odpornością na zakłócenia oraz możliwością przesyłania sygnału do 1200 metrów. Standard ten jest szczególnie przydatny w systemach automatyki domowej, monitoringu i zbierania danych, gdzie urządzenia znajdują się na znacznych odległościach od siebie.

Aby podłączyć Arduino do magistrali RS-485, niezbędny jest konwerter UART na RS-485, który transformuje sygnały logiczne mikrokontrolera na sygnały różnicowe odpowiednie do przesyłania po długich przewodach.

Konwerter UART na RS-485 – kluczowy element systemu

Konwerter UART na RS-485 to kompaktowe rozwiązanie oparte na układach MAX485 lub SN75176. Urządzenie pełni funkcję pośrednika między Arduino a magistralą RS-485, konwertując sygnały TTL (transistor–transistor logic) na sygnały różnicowe charakterystyczne dla RS-485.

Najważniejsze parametry typowego konwertera prezentuje poniższa tabela:

Parametr Wartość
Napięcie zasilania 3–30 V
Poziomy logiczne 3,3 V oraz 5 V
Szybkość transmisji do 10 Mb/s (praktycznie stabilnie ~500 kB/s)
Tryb pracy half-duplex (komunikacja naprzemienna)
Interfejsy goldpiny, złącza ARK, gniazdo Grove
Wymiary 44 × 14 mm
Sygnalizacja zasilania dioda LED

Urządzenie posiada wbudowaną diodę LED sygnalizującą prawidłowe zasilanie modułu, co ułatwia szybką diagnostykę.

Schemat podłączenia konwertera do Arduino

Prawidłowe podłączenie konwertera UART na RS-485 jest fundamentem niezawodnej komunikacji. Schemat podłączenia jest niezwykle prosty i wymaga połączenia zaledwie kilku pinów:

Połączenia z Arduino:

  • połącz TX (transmisja) Arduino z DI (data input) konwertera,
  • połącz RX (odbiór) Arduino z RO (receiver output) konwertera,
  • połącz GND Arduino z GND konwertera,
  • połącz VCC Arduino z VCC konwertera.

Sterowanie kierunkiem transmisji: połącz sygnały DE (driver enable) i RE (receiver enable) razem i podłącz do wybranego pinu mikrokontrolera (np. D8), aby przełączać tryb nadawania/odbierania.

Linia RS-485: wyprowadzenia A (nieodwracający) i B (odwracający) podłącz do dwuprzewodowej magistrali. Stosuj rezystory terminujące 120 Ω na obu końcach magistrali; w długich instalacjach warto dodać rezystory polaryzujące (biasing), aby zapewnić stabilny stan spoczynkowy.

Zasada działania RS-485 – magistrala wielowęzłowa

RS-485 umożliwia podłączenie wielu urządzeń do jednej wspólnej linii transmisyjnej. Każde urządzenie może zarówno wysyłać, jak i odbierać dane, ale w danym momencie najwyżej jedno urządzenie może nadawać.

Master–slave i kontrola dostępu do magistrali

Aby zagwarantować prawidłową komunikację w systemie wielowęzłowym, często stosuje się schemat master–slave. Sterownik master cyklicznie wysyła do poszczególnych urządzeń slave zezwolenie na transmisję. Po otrzymaniu zgody slave przełącza interfejs RS-485 w tryb nadawania, wysyła dane, po czym wraca do trybu odbioru.

Przesyłanie zmiennych przez RS-485

Przygotowanie danych do transmisji

Zanim przystąpisz do przesyłania zmiennych, zdefiniuj prosty protokół komunikacyjny. Zmienna do przesłania musi zostać:

  1. Zserializowana – przekonwertowana na bajty;
  2. Sformatowana – opatrzona informacją o typie i długości;
  3. Wysłana – przesłana przez port szeregowy UART.

Konfiguracja portu szeregowego

Aby Arduino mogło komunikować się przez konwerter RS-485, zainicjalizuj port szeregowy z odpowiednią szybkością transmisji (baud rate). Typowe wartości to 9600 lub 115200 baudów:

void setup() {
Serial.begin(9600); // Inicjalizacja portu szeregowego
pinMode(DE_PIN, OUTPUT); // Pin sterujący kierunkiem transmisji (DE i RE połączone razem)
digitalWrite(DE_PIN, LOW); // Domyślnie odbieranie
}

Przełączanie między wysyłaniem a odbieraniem

Ze względu na charakter half-duplex, niezbędne jest aktywne sterowanie kierunkiem transmisji. Przed wysłaniem danych włącz tryb nadawania, a po zakończeniu wróć do trybu odbioru:

void setRS485SendMode() {
digitalWrite(DE_PIN, HIGH); // Włączenie nadawania
}

void setRS485ReceiveMode() {
digitalWrite(DE_PIN, LOW); // Włączenie odbierania
}

void sendData(int value) {
setRS485SendMode();
delay(5); // Czekanie na stabilizację
Serial.print(value);
Serial.println();
delay(10);
setRS485ReceiveMode();
}

Wysyłanie różnych typów zmiennych

Zmienne całkowite (int) – prosty zapis tekstowy z prefiksem klucza:

int temperature = 25;
Serial.print("TEMP:");
Serial.println(temperature);

Zmienne zmiennoprzecinkowe (float) – kontrola precyzji po przecinku:

float voltage = 12.45;
Serial.print("VOLT:");
Serial.println(voltage, 2); // 2 cyfry po przecinku

Ciągi znakowe (String) – szybkie komunikaty statusu:

String status = "OK";
Serial.print("STATUS:");
Serial.println(status);

Struktury danych – wydajna transmisja binarna całej struktury:

struct SensorData {
int temperature;
float humidity;
int pressure;
};

SensorData data = {25, 65.5, 1013};
Serial.write((byte*)&data, sizeof(data));

Odbiór i interpretacja danych

Po stronie odbiorczej dekoduj przychodzące ramki. Najprostsza metoda to odczyt linii zakończonych znakiem nowej linii i parsowanie po prefiksach:

void loop() {
if (Serial.available() > 0) {
String receivedData = Serial.readStringUntil('\n');
if (receivedData.startsWith("TEMP:")) {
int temperature = receivedData.substring(5).toInt();
Serial.print("Odebrana temperatura: ");
Serial.println(temperature);
}
}
}

Praktyczne zastosowania

Systemy automatyki domowej

RS-485 to idealne rozwiązanie dla automatyki domowej, gdzie wiele czujników i sterowników pracuje w różnych pomieszczeniach. Temperatura, wilgotność czy poziom oświetlenia mogą być przesyłane po jednej magistrali.

Systemy monitoringu

W systemach profesjonalnych, gdzie wymagana jest niezawodna komunikacja między urządzeniami różnych standardów, konwerter RS-485 umożliwia bezpośrednią konwersję z interfejsu przemysłowego na sygnały TTL kompatybilne z mikrokontrolerami.

Projekty DIY

Dla hobbystów i inżynierów konwerter RS-485 jest niezastąpiony, zwłaszcza gdy wymagana jest stabilna komunikacja na większych odległościach.

Rozwiązywanie problemów

Problem: brak komunikacji

Przed rozpoczęciem diagnostyki sprawdź podstawy:

  • sprawdź poprawność podłączenia przewodów A i B magistrali,
  • upewnij się, że konwerter jest prawidłowo zasilany (dioda LED powinna świecić),
  • zweryfikuj szybkość transmisji (9600 lub 115200 baudów) – musi być identyczna po obu stronach,
  • sprawdź połączenia pinów TX, RX i GND,
  • potwierdź terminację 120 Ω na końcach magistrali oraz poprawny biasing linii.

Problem: zniekształcone dane

Jeśli dane wyglądają na zakłócone, zacznij od tych kroków:

  • zredukuj szybkość transmisji (spróbuj 9600 zamiast 115200),
  • skrót przewody lub użyj przewodów ekranowanych,
  • sprawdź, czy konwerter pracuje w odpowiednim trybie (half-duplex).

Problem: urządzenie przechodzi w tryb uśpienia

Zaimplementuj mechanizm keep‑alive (regularne wysyłanie pustych pakietów) oraz zweryfikuj konfigurację zasilania i oszczędzania energii konwertera.