- Komunikacja szeregowa RS-485
- Połączenie RS-485 z Arduino
- Moduł konwertera USB na RS-485
- Po prostu oprogramowanie Modbus Master
- Wymagane narzędzia
- Schemat obwodu
- Programowanie Arduino UNO dla RS-485 MODBUS Slave
- Testowanie Arduino UNO jako Rs485 Modbus Slave
Modbus to protokół komunikacji szeregowej, który został odkryty przez firmę Modicon w 1979 roku i jest używany do przesyłania danych przez łącza szeregowe między przemysłowymi urządzeniami elektronicznymi. RS-485 Modbus wykorzystuje RS-485 do linii transmisyjnych. Należy zauważyć, że Modbus jest protokołem programowym, a nie protokołem sprzętowym. Jest podzielony na dwie części, takie jak Modbus Master i Modbus Slave. W sieci RS-485 Modbus jest jeden Master i 127 Slave, każdy z unikalnym adresem od 1 do 127. W tym projekcie MAX485 Arduino wykorzystamy Arduino Uno jako Slave do komunikacji szeregowej.
Modbus są najczęściej używane w sterownikach PLC (programowalne sterowniki logiczne). Poza tym Modbus jest również używany w służbie zdrowia, transporcie, automatyzacji domu itp. Modbus ma 255 kodów funkcji i są głównie trzy popularne wersje Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Jaka jest różnica między Modbus ASCII a Modbus RTU?
Modbus RTU i Modbus ASCII używają tego samego protokołu. Jedyną różnicą jest to, że bajty przesyłane przewodem są prezentowane jako binarne z RTU i jako czytelne ASCII z Modbus RTU. W tym samouczku zostanie użyty protokół Modbus RTU.
Ten samouczek dotyczy korzystania z komunikacji RS-485 Modbus z Arduino UNO jako Slave. Tutaj instalujemy oprogramowanie Simply Modbus Master na komputerze PC i sterujemy dwoma diodami LED i serwomotorem za pomocą RS-485 jako linii transmisyjnej. Te diody LED i silnik serwo są połączone z Slave Arduino i sterowane poprzez wysyłanie wartości za pomocą oprogramowania Master Modbus. Ponieważ ten samouczek wykorzystuje RS-485, zaleca się najpierw przejść przez komunikację szeregową RS485 między Arduino Uno i Arduino Nano. RS485 może być również używany z innymi kontrolerami do komunikacji szeregowej:
- Komunikacja szeregowa RS-485 pomiędzy Raspberry Pi i Arduino UNO
- Komunikacja szeregowa między STM32F103C8 a Arduino UNO za pomocą RS-485
Zacznijmy od zbadania tła na temat RS-485 i Modbus. Dowiedz się również więcej o różnych protokołach komunikacji szeregowej tutaj.
Komunikacja szeregowa RS-485
RS-485 to asynchroniczny protokół komunikacji szeregowej, który nie wymaga zegara. Wykorzystuje technikę zwaną sygnałem różnicowym do przesyłania danych binarnych z jednego urządzenia do drugiego.
Czym więc jest ta metoda różnicowego przesyłania sygnału?
Metoda sygnału różnicowego polega na tworzeniu napięcia różnicowego przy użyciu dodatniego i ujemnego 5V. Zapewnia komunikację w trybie półdupleksu przy użyciu dwóch przewodów, a pełny dupleks wymaga 4 czterech przewodów.
Korzystając z tej metody:
- RS-485 obsługuje większą szybkość przesyłania danych, maksymalnie 30 Mb / s.
- Zapewnia również maksymalną odległość przesyłania danych w porównaniu z protokołem RS-232. Przesyła dane na maksymalnie 1200 metrów.
- Główną zaletą RS-485 nad RS-232 jest wiele urządzeń podrzędnych z jednym urządzeniem nadrzędnym, podczas gdy RS-232 obsługuje tylko jedno urządzenie podrzędne.
- Może mieć maksymalnie 32 urządzenia podłączone do protokołu RS-485.
- Kolejną zaletą RS-485 jest odporność na szumy, ponieważ wykorzystują one metodę sygnału różnicowego do przesyłania.
- RS-485 jest szybszy w porównaniu z protokołem I2C.
Połączenie RS-485 z Arduino
Moduł RS-485 można podłączyć do dowolnego mikrokontrolera posiadającego port szeregowy. Do korzystania z modułu RS-485 z mikrokontrolerami potrzebny jest moduł o nazwie 5V MAX485 TTL na RS485 oparty na układzie Maxim MAX485, który umożliwia komunikację szeregową na odległość 1200 metrów. Jest dwukierunkowy i półdupleksowy z szybkością przesyłania danych 2,5 Mb / s. Ten moduł wymaga napięcia 5V.
Pin-Out RS-485:
Nazwa pinu |
Opis pinów |
VCC |
5V |
ZA |
Nieodwracające wejście odbiornika Wyjście sterownika nieodwracającego |
b |
Odwracanie sygnału wejściowego odbiornika Odwracanie wyjścia sterownika |
GND |
GND (0 V) |
R0 |
Wyjście odbiornika (pin RX) |
RE |
Wyjście odbiornika (LOW-Enable) |
DE |
Wyjście sterownika (WYSOKI-włączony) |
DI |
Wejście sterownika (pin TX) |
Moduł konwertera USB na RS-485
Jest to moduł konwertera USB na RS485, który obsługuje WIN7, XP, Vista, Linux, Mac OS i zapewnia łatwy w obsłudze interfejs RS485 za pomocą portu COM w komputerze . Ten moduł jest urządzeniem typu plug-and-play . Nie ma struktur poleceń, wszystko, co jest wysyłane do wirtualnego portu COM, jest automatycznie konwertowane na RS485 i odwrotnie. Moduł jest całkowicie samodzielnie zasilany z magistrali USB. Nie ma więc potrzeby zewnętrznego zasilacza do pracy.
Pojawia się jako port szeregowy / COM i jest dostępny z aplikacji lub hiperterminala. Ten konwerter zapewnia półdupleksową komunikację RS-485. Zakres szybkości transmisji wynosi od 75 bps do 115200 bps, maksymalnie do 6 Mbps.
Aby korzystać z tego urządzenia, w Internecie dostępne są różne programy Modbus. W tym samouczku używane jest oprogramowanie o nazwie Simply Modbus Software.
Po prostu oprogramowanie Modbus Master
Do przesyłania danych do urządzenia slave Modbus RS-485 Arduino przez port COM potrzebna jest aplikacja Modbus Master Software.
Simply Modbus Master to oprogramowanie do testowania komunikacji danych. Możesz pobrać Simply Modbus Master z podanego linku i dowiedzieć się więcej o nim, zapoznając się z instrukcją oprogramowania.
Przed rozpoczęciem korzystania z oprogramowania należy zapoznać się z następującą terminologią.
Identyfikator slave:
Każdy slave w sieci ma przypisany unikalny adres jednostki od 1 do 127. Kiedy master żąda danych, pierwszym bajtem, który wysyła, jest adres Slave. W ten sposób każdy slave wie po pierwszym bajcie, czy zignorować wiadomość.
Kod funkcji:
Drugi bajt wysłany przez Master to kod funkcji. Ta liczba mówi slave'owi, do której tabeli ma dostęp i czy ma czytać z tabeli, czy zapisywać do niej.
Obsługiwane kody funkcji rejestru:
Kod funkcji |
Akcja |
Nazwa tabeli |
04 (04 hex) |
Czytać |
Rejestry wejść analogowych |
03 (03 hex) |
Czytać |
Rejestry wyjściowe wyjścia analogowego |
06 (06 szesnastkowo) |
Napisz singiel |
Rejestr podtrzymania wyjścia analogowego |
16 (10 szesnastkowych) |
Napisz wiele |
Rejestry wyjściowe wyjścia analogowego |
Obsługiwane kody funkcji cewki:
Kod funkcji |
Akcja |
Nazwa tabeli |
02 (02 szesnastkowo) |
Czytać |
Dyskretne styki wejściowe |
01 (szesnastkowo 01) |
Czytać |
Dyskretne cewki wyjściowe |
05 (05 hex) |
Napisz singiel |
Dyskretna cewka wyjściowa |
15 (szesnastkowy 0F) |
Napisz wiele |
Dyskretne cewki wyjściowe |
CRC:
CRC to skrót od Cyclic Redundancy check. Są to dwa bajty dodawane na końcu każdego komunikatu Modbus w celu wykrycia błędów.
Wymagane narzędzia
Sprzęt komputerowy
- Arduino UNO
- Moduł konwertera MAX-485 TTL na RS-485
- Moduł konwertera USB na RS-485
- Dioda LED (2)
- Rezystor 1k (2)
- Wyświetlacz LCD 16x2
- Potencjometr 10 k
- Silnik serwo SG-90
Oprogramowanie
- Po prostu Modbus Master
Schemat obwodu
Połączenie obwodu między modułem konwertera MAX-485 TTL na RS-485 a Arduino UNO:
Arduino UNO |
Moduł konwertera MAX-485 TTL na RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Połączenie obwodu pomiędzy modułem MAX-485 TTL na RS-485 a konwerterem USB na RS-485:
MAX-485 TTL na RS-485 Moduł konwertera |
Moduł USB na RS-485 Połączony z komputerem |
ZA |
ZA |
b |
b |
Połączenia obwodów między Arduino UNO a wyświetlaczem LCD 16x2:
Wyświetlacz LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Do sterowania pinem potencjometru do regulacji kontrastu / jasności wyświetlacza LCD 16x2 |
RS |
8 |
RW |
GND |
mi |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
ZA |
+ 5V |
K. |
GND |
Połączenie obwodu między 2 diodami LED, serwomotorem i Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Siłownik |
2 |
Anoda przez rezystor 1k |
- |
- |
5 |
- |
Anoda przez rezystor 1k |
- |
6 |
- |
- |
Pin PWM (pomarańczowy) |
+ 5V |
- |
- |
+ 5V (CZERWONY) |
GND |
Katoda GND |
Katoda GND |
GND (brązowy) |
Programowanie Arduino UNO dla RS-485 MODBUS Slave
Arduino UNO jest skonfigurowane jako Modbus Slave. Ponadto do Arduino UNO dołączone są dwie diody LED i jeden silnik serwo. Tak więc slave Arduino jest sterowane z oprogramowania Master Modbus. Komunikacja pomiędzy Arduino UNO a oprogramowaniem Modbus Master odbywa się za pomocą modułu RS-485. Do połączenia z komputerem PC służy moduł konwertera USB na RS-485. A Arduino UNO z modułem konwertera MAX-485 TTL na RS-485, cała konfiguracja będzie wyglądać następująco:
Do korzystania z Modbus w Arduino UNO, biblioteka
Najpierw dołącz wymaganą bibliotekę. Biblioteka ModbusRTU służy do komunikacji RS-485 Modbus, a biblioteka ciekłokrystaliczna do korzystania z LCD z Arduino UNO, a biblioteka serwo do korzystania z silnika Servo z Arduino UNO.
#zawierać
Teraz piny anody LED, które są połączone z pinami 2 i 5 Arduino, są zdefiniowane jako LED1 i LED2.
# zdefiniować led1 2 # zdefiniować led2 5
Następnie zadeklarowany jest obiekt dostępu do klasy Liquid Crystal za pomocą pinów LCD (RS, E, D4, D5, D6, D7), które są połączone z Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Gdy LCD się skończy, zainicjuj obiekt serwomechanizmu dla klasy Servo. Inicjalizuj również obiekt magistrali dla klasy Modbus.
Serwo serwo; Magistrala Modbus;
Następnie do przechowywania wartości dla komunikacji Modbus deklarowana jest tablica z trzema wartościami inicjowanymi zerem.
uint16_t modbus_array = {0,0,0};
W funkcji konfiguracji najpierw wyświetlacz LCD jest ustawiony w trybie 16x2, a komunikat powitalny jest wyświetlany i kasowany.
lcd.begin (16,2); // Lcd ustawiony w trybie 16x2 lcd.print ("RS-485 Modbus"); // Wiadomość powitalna lcd.setCursor (0,1); lcd.print ("Arduino Slave"); opóźnienie (5000); lcd.clear ();
Następnie piny LED1 i LED2 ustawiane są jako piny wyjściowe.
pinMode (led1, WYJŚCIE); pinMode (led2, WYJŚCIE);
Dołączony jest pin impulsu serwomechanizmu podłączony do pinu 6 PWM Arduino.
servo.attach (6);
Teraz dla komunikacji Modbus ustawiane są następujące parametry. Pierwsza cyfra „1” oznacza identyfikator Slave, druga „1” oznacza, że używa RS-485 do przesyłania danych, a „4” oznacza pin RS-485 DE&RE podłączony do Arduino UNO.
bus = Modbus (1,1,4);
Slave Modbus jest ustawiony na 9600 bodów.
Pętla zaczyna się od definicji odpytywania magistrali, a bus.poll () służy do zapisywania i odbierania wartości z nadrzędnego Modbus.
bus.poll (tablica_modbus, sizeof (tablica_modbus) / sizeof (tablica_modbus));
Ta metoda służy do sprawdzenia, czy na porcie szeregowym są dostępne jakieś dane.
Jeśli na porcie szeregowym są dostępne jakieś dane, biblioteka Modbus RTU sprawdzi komunikat (sprawdzi adres urządzenia, długość danych i CRC) i wykona wymagane działanie.
Na przykład, aby zapisać lub odczytać jakąkolwiek wartość z mastera, ModbusRTU musi otrzymać bez znaku 16-bitową tablicę liczb całkowitych i jej długość z Master Modbus. Ta tablica zawiera dane, które są zapisywane z wzorca.
W tym samouczku znajdują się trzy tablice dla LED1, LED2 i kąta silnika serwo.
Najpierw włącza się lub wyłącza dioda LED1 modbus_array.
if (modbus_array == 0) // Zależy od wartości w modubus_array napisanej przez Master Modbus { digitalWrite (led1, LOW); // dioda LED wyłączona jeśli 0 lcd.setCursor (0,0); lcd.print ("L1: WYŁ."); } else { digitalWrite (led1, WYSOKI); // dioda świeci, jeśli wartość inna niż 0 lcd.setCursor (0,0); lcd.print ("L1: WŁ"); }
Obok włączania lub wyłączania używana jest dioda LED2 modbus_array.
if (modbus_array == 0) // Zależy od wartości w modbus_array zapisanej przez Master Modbus { digitalWrite (led2, LOW); // dioda LED wyłączona, jeśli 0 lcd.setCursor (8,0); lcd.print ("L2: WYŁ."); } else { digitalWrite (led2, WYSOKI); // LED świeci, jeśli wartość inna niż 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Następnie, aby ustawić kąt silnika serwo, należy użyć tablicy modbus_array, a wartość jest drukowana na wyświetlaczu LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Kąt serwa:"); lcd.print (pwm); opóźnienie (200); lcd.clear ();
To kończy programowanie Arduino UNO do pracy jako MODBUS Slave. Następnym krokiem będzie przetestowanie go jako Modbus Slave.
Testowanie Arduino UNO jako Rs485 Modbus Slave
Po wykonaniu połączeń w obwodzie i wgraniu kodu do Arduino UNO przyszedł czas na połączenie modułu USB na RS-485 z komputerem, na którym jest zainstalowane oprogramowanie Simple Modbus Master.
Otwórz menedżera urządzeń i sprawdź port COM zgodnie z komputerem, do którego podłączony jest moduł USB na RS-485, a następnie otwórz oprogramowanie Simply Modbus Master 8.1.1.
1. Po otwarciu programu Simply Modbus otwórz teraz opcję Write.
2. Po otwarciu Simply Modbus Master Write. Ustaw parametry
Tryb w RTU, port COM zgodnie z twoim komputerem (mój był COM6), Baud na 9600, bity danych 8, bit stopu 1, parzystość brak i identyfikator slave jako 1.
3. Następnie ustaw pierwszy rejestr na 40001 i wartości do zapisania to 3, a kod funkcji na 16 (Write Holding Register).
Następnie wpisz 1 do 40001 (dla diody LED1 włączone) i od 1 do 40002 (dla diody LED2 włączone) i 90 do 40003 (dla kąta silnika serwo), a następnie kliknij przycisk WYŚLIJ.
Możesz zobaczyć zarówno stan diody LED, jak i kąt serwa pod kątem 90 stopni.
4. Następnie wprowadź 40001 jako 1 i 40002 jako 0 i 40003 jako 180 i kliknij przycisk WYŚLIJ.
5. Teraz piszemy 135 do 40003 i 40001 jako 0, a 40002 jako 1.
W ten sposób RS-485 Modbus może być używany w komunikacji szeregowej z Arduino UNO jako Slave. W następnym tutorialu użyjemy Arduino Uno jako mastera w komendzie MODBUS.
Znajdź pełny kod i film demonstracyjny poniżej.