- Sériová komunikácia RS-485
- Prepojenie RS-485 s Arduino
- Modul prevodníka USB na RS-485
- Jednoducho softvér Modbus Master
- Potrebné nástroje
- Schéma zapojenia
- Programovanie Arduino UNO pre RS-485 MODBUS Slave
- Testovanie Arduino UNO ako Rs485 Modbus Slave
Modbus je protokol sériovej komunikácie, ktorý objavil Modicon v roku 1979 a používa sa na prenos dát po sériových linkách medzi priemyselnými elektronickými zariadeniami. RS-485 Modbus používa pre prenosové vedenie RS-485. Je potrebné poznamenať, že Modbus je softvérový protokol a nie hardvérový protokol. Je rozdelený na dve časti ako Modbus Master a Modbus Slave. V sieti RS-485 Modbus je jeden Master a 127 Slaves s jedinečnou adresou od 1 do 127. V tomto projekte MAX485 Arduino použijeme Arduino Uno ako Slave pre sériovú komunikáciu.
Modbus sa väčšinou používajú v PLC (Programmable Logic Controllers). A okrem toho sa Modbus používa aj v zdravotníctve, doprave, domácej automatizácii atď. Modbus má 255 funkčných kódov a existujú hlavne tri populárne verzie protokolu Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Aký je rozdiel medzi Modbus ASCII a Modbus RTU?
Modbus RTU a Modbus ASCII hovoria rovnakým protokolom. Jediný rozdiel je v tom, že bajty prenášané cez vodič sú prezentované ako binárne s RTU a ako čitateľné ASCII s Modbus RTU. V tomto výučbe sa použije Modbus RTU.
Tento tutoriál sa týka použitia komunikácie RS-485 Modbus s Arduino UNO ako Slave. Tu inštalujeme jednoducho Modbus Master softvér do PC a ovládame dve LED diódy a servomotor pomocou prenosového vedenia RS-485. Tieto LED a servomotor sú spojené s Slave Arduino a sú riadené odosielaním hodnôt pomocou softvéru Master Modbus. Pretože tento výukový program používa RS-485, odporúča sa najskôr prejsť sériovou komunikáciou RS485 medzi Arduino Uno a Arduino Nano. RS485 môže byť tiež použitý s inými radičmi pre sériovú komunikáciu:
- Sériová komunikácia RS-485 medzi Raspberry Pi a Arduino UNO
- Sériová komunikácia medzi STM32F103C8 a Arduino UNO pomocou RS-485
Začnime skúmaním základných poznatkov o RS-485 a Modbus. Tu sa tiež dozviete viac o rôznych protokoloch sériovej komunikácie.
Sériová komunikácia RS-485
RS-485 je asynchrónny sériový komunikačný protokol, ktorý nevyžaduje hodiny. Na prenos binárnych údajov z jedného zariadenia do druhého používa techniku nazývanú diferenciálny signál.
Aká je teda táto metóda diferenciálneho prenosu signálu ??
Metóda diferenciálneho signálu funguje tak, že sa vytvára diferenčné napätie pomocou kladného a záporného napätia 5 V. Poskytuje komunikáciu s polovičným duplexom, keď sa používajú dva vodiče, a režim Full-Duplex vyžaduje 4 vodiče so štyrmi vodičmi.
Použitím tejto metódy:
- RS-485 podporuje vyššiu rýchlosť prenosu dát maximálne 30 Mbps.
- Poskytuje tiež maximálnu vzdialenosť prenosu dát v porovnaní s protokolom RS-232. Prenáša dáta maximálne do 1 200 metrov.
- Hlavnou výhodou RS-485 oproti RS-232 je viacnásobný slave s jedným Masterom, zatiaľ čo RS-232 podporuje iba jedného slave.
- Môže mať maximálne 32 zariadení pripojených k protokolu RS-485.
- Ďalšou výhodou RS-485 je odolnosť voči šumu, pretože na prenos používajú metódu diferenciálneho signálu.
- RS-485 je rýchlejší v porovnaní s protokolom I2C.
Prepojenie RS-485 s Arduino
Modul RS-485 je možné pripojiť k ľubovoľnému mikrokontroléru so sériovým portom. Pre použitie modulu RS-485 s mikrokontrolérmi je potrebný modul s názvom 5V MAX485 TTL až RS485, ktorý je založený na Maxim MAX485 IC, pretože umožňuje sériovú komunikáciu na veľkú vzdialenosť 1 200 metrov. Je obojsmerný a poloduplexný a má rýchlosť prenosu dát 2,5 Mbps. Tento modul vyžaduje napätie 5V.
Pin-Out na RS-485:
Názov špendlíka |
Popis špendlíka |
VCC |
5V |
A |
Neinvertujúci vstup prijímača Neinvertujúci výstup ovládača |
B |
Obrátenie vstupu prijímača Obrátenie výstupu ovládača |
GND |
GND (0 V) |
R0 |
Prijímač (pin RX) |
RE |
Výstup prijímača (LOW-Enable) |
DE |
Výstup ovládača (HIGH-Enable) |
DI |
Driver Driver (TX pin) |
Modul prevodníka USB na RS-485
Jedná sa o modul adaptéra USB na RS485, ktorý podporuje WIN7, XP, Vista, Linux, Mac OS a poskytuje ľahko použiteľné rozhranie RS485 pomocou portu COM v počítači . Tento modul je zariadenie typu plug-and-play . Neexistujú žiadne príkazové štruktúry, všetko, čo sa pošle na port Virtual COM, sa automaticky prevedie na RS485 a naopak. Modul je úplne napájaný z USB zbernice. Pre prevádzku teda nie je potrebný externý zdroj napájania.
Ukazuje sa ako sériový port / COM a je prístupný z aplikácií alebo hyper-terminálu. Tento prevodník poskytuje poloduplexnú komunikáciu RS-485. Rozsah prenosovej rýchlosti je 75 bps až 115200 bps, maximálna až 6 Mbps.
Na použitie tohto zariadenia je na internete k dispozícii rôzny softvér Modbus. V tomto návode sa používa softvér s názvom Simply Modbus Software.
Jednoducho softvér Modbus Master
Softvérová aplikácia Modbus Master je potrebná na zasielanie údajov do podradeného zariadenia Modbus RS-485 Arduino cez COM.
Simply Modbus Master je softvér na testovanie dátovej komunikácie. Môžete si stiahnuť Simply Modbus Master z daného odkazu a dozvedieť sa o ňom viac v príručke k softvéru.
Pred použitím softvéru je dôležité oboznámiť sa s nasledujúcimi terminológiami.
ID otroka:
Každému slave v sieti je priradená jedinečná adresa jednotky od 1 do 127. Keď master požaduje dáta, prvý byte, ktorý pošle, je adresa Slave. Týmto spôsobom každý podriadený počítač vie po prvom bajte, či má alebo nemá ignorovať správu.
Kód funkcie:
Druhý bajt odoslaný nadriadeným je funkčný kód. Toto číslo informuje otroka, ku ktorej tabuľke má pristupovať a či má z tabuľky čítať alebo zapisovať.
Podporované kódy funkcií registra:
Funkčný kód |
Akcia |
Názov tabuľky |
04 (04 hex) |
Čítať |
Analógové vstupné registre |
03 (03 hex) |
Čítať |
Registre zadržania analógového výstupu |
06 (06 hex) |
Píš single |
Register zadržania analógového výstupu |
16 (10 hex) |
Napíšte viac |
Registre zadržania analógového výstupu |
Podporované funkčné kódy cievok:
Funkčný kód |
Akcia |
Názov tabuľky |
02 (02 hex) |
Čítať |
Diskrétne vstupné kontakty |
01 (01 hex) |
Čítať |
Diskrétne výstupné cievky |
05 (05 hex) |
Píš single |
Diskrétna výstupná cievka |
15 (0F hex) |
Napíšte viac |
Diskrétne výstupné cievky |
CRC:
CRC je skratka pre Cyclic Redundancy check. Sú to dva bajty pridané na koniec každej správy protokolu Modbus na účely detekcie chyby.
Potrebné nástroje
Hardware
- Arduino UNO
- Modul prevodníka MAX-485 TTL na RS-485
- Modul prevodníka USB na RS-485
- LED (2)
- 1k rezistor (2)
- 16x2 LCD displej
- 10k potenciometer
- Servomotor SG-90
Softvér
- Jednoducho Modbus Master
Schéma zapojenia
Pripojenie obvodu medzi modulom prevodníka MAX-485 TTL na RS-485 a Arduino UNO:
Arduino UNO |
Modul prevodníka MAX-485 TTL na RS-485 |
0 (PR) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Pripojenie obvodu medzi modulom MAX-485 TTL na RS-485 a prevodníkom USB na RS-485:
MAX-485 TTL až RS-485 Prevádzací modul |
Modul USB na RS-485 Pripojené k PC |
A |
A |
B |
B |
Pripojenie obvodu medzi Arduino UNO a 16x2 LCD displejom:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Ovládací kolík potenciometra na reguláciu kontrastu a jasu 16x2 LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Okruhové spojenie medzi 2 LED diódami, servomotorom a Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servo motor |
2 |
Anóda cez rezistor 1k |
- |
- |
5 |
- |
Anóda cez rezistor 1k |
- |
6 |
- |
- |
Pin PWM (oranžový) |
+ 5V |
- |
- |
+ 5 V (ČERVENÉ) |
GND |
Katóda GND |
Katóda GND |
GND (hnedá) |
Programovanie Arduino UNO pre RS-485 MODBUS Slave
Arduino UNO je nakonfigurované ako Modbus Slave. Tiež Arduino UNO je pripojený dvoma LED diódami a jedným servomotorom. Otrok Arduino je teda riadený z softvéru Master Modbus. Komunikácia medzi Arduino UNO a softvérom Modbus Master sa uskutočňuje pomocou modulu RS-485. Na jeho prepojenie s PC sa používa prevodníkový modul USB na RS-485. A Arduino UNO s modulom prevodníka MAX-485 TTL na RS-485 bude celé nastavenie vyzerať nasledovne:
Na používanie protokolu Modbus v knižnici Arduino UNO
Spočiatku zahrňte požadovanú knižnicu. Knižnica ModbusRTU slúži na použitie komunikácie RS-485 Modbus a knižnica tekutých kryštálov slúži na používanie LCD s Arduino UNO a knižnica servo slúži na použitie servomotora s Arduino UNO.
#include
Teraz sú anódové kolíky LED, ktoré sú spojené s kolíkmi Arduino 2 a 5, definované ako LED1 a LED2.
#define led1 2 #define led2 5
Ďalej je objekt pre prístup k triede tekutých kryštálov deklarovaný pomocou pinov LCD (RS, E, D4, D5, D6, D7), ktoré sú spojené s Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Po dokončení LCD inicializujte servo objekt pre triedu Servo. Tiež inicializovať objekt zbernice pre triedu Modbus.
Servo servo; Zbernica Modbus;
Ďalej na ukladanie hodnôt pre komunikáciu Modbus je deklarované pole s tromi hodnotami inicializovanými nulou.
uint16_t modbus_array = {0,0,0};
Vo funkcii nastavenia je najskôr nastavený LCD v režime 16x2 a je zobrazená a vymazaná uvítacia správa.
lcd.začiatok (16,2); // LCD nastavený v režime 16x2 lcd.print ("RS-485 Modbus"); // uvítacia správa lcd.setCursor (0,1); lcd.print ("Arduino Slave"); oneskorenie (5 000); lcd.clear ();
Potom sa piny LED1 a LED2 nastavia ako výstupné piny.
pinMode (led1, VÝSTUP); pinMode (led2, VÝSTUP);
Servo pulzný kolík pripojený k PWM kolíku 6 Arduina je pripojený.
servo.attach (6);
Teraz sú pre komunikáciu Modbus nastavené nasledujúce parametre. Prvý znak „1“ predstavuje ID slave, druhý znak „1“ predstavuje použitie protokolu RS-485 na prenos údajov a znak „4“ predstavuje konektor RS-485 DE&RE pripojený k Arduino UNO.
autobus = Modbus (1,1,4);
Modbus slave je nastavený na 9600 baudrate.
Smyčka začína definíciou zbernice poll a bus.poll () sa používa na zápis a príjem hodnoty z nadradeného modulu Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Táto metóda sa používa na kontrolu, či sú na sériovom porte k dispozícii nejaké údaje.
Ak sú na sériovom porte k dispozícii nejaké dáta, knižnica Modbus RTU správu skontroluje (skontroluje adresu zariadenia, dĺžku údajov a CRC) a vykoná požadovanú akciu.
Napríklad na zápis alebo čítanie akejkoľvek hodnoty z mastra musí ModbusRTU dostávať 16-bitové celé číslo bez znamienka a jeho dĺžku z mastera Modbus. Toto pole prenáša údaje, ktoré sú zapísané z hlavného počítača.
V tomto výučbe sú k dispozícii tri polia pre LED1, LED2 a uhol servomotora.
Najskôr sa zapne alebo vypne LED1 modbus_array.
if (modbus_array == 0) // Závisí od hodnoty v modubus_array napísanej Master Modbus { digitalWrite (led1, LOW); // LED nesvieti, ak je 0 lcd.setCursor (0,0); lcd.print ("L1: VYPNUTÉ"); } else { digitalWrite (led1, HIGH); // LED svieti, ak je hodnota iná ako 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Ďalej sa zapína alebo vypína LED2 modbus_array.
if (modbus_array == 0) // Závisí od hodnoty v modbus_array napísanej Master Modbus { digitalWrite (led2, LOW); // LED nesvieti, ak je 0 lcd.setCursor (8,0); lcd.print ("L2: VYPNUTÉ"); } else { digitalWrite (led2, HIGH); // LED svieti, ak je hodnota iná ako 0 lcd.setCursor (9,0); lcd.print ("L2: ZAPNUTÉ"); }
Ďalej pre nastavenie uhla servomotora sa použitý modbus_array a hodnota vytlačí na 16x2 LCD displeji.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Uhol serva:"); lcd.print (pwm); oneskorenie (200); lcd.clear ();
Týmto je programovanie Arduina UNO ukončené pre prácu ako MODBUS Slave. Ďalším krokom bude jeho testovanie ako Modbus Slave.
Testovanie Arduino UNO ako Rs485 Modbus Slave
Po dokončení prepojenia obvodov a načítaní kódu do Arduino UNO je čas pripojiť USB k modulu RS-485 k počítaču, na ktorom je nainštalovaný softvér Simple Modbus Master.
Otvorte správcu zariadení a skontrolujte port COM podľa počítača, na ktorom je pripojený modul USB k RS-485, a potom otvorte softvér Simply Modbus Master 8.1.1.
1. Po otvorení softvéru Simply Modbus otvorte teraz voľbu Write.
2. Po otvorení Simply Modbus Master Write. Nastavte parametre
Režim v RTU, port COM podľa vášho PC (môj bol COM6), prenosová rýchlosť 9600, dátové bity 8, stop bit 1, žiadna parita a ID slave ako 1.
3. Potom nastavte prvý register ako 40001 a hodnoty na zápis sú 3 a kód funkcie ako 16 (Write Holding Register).
Potom napíšte 1 až 40001 (pre LED1 zapnuté) a 1 až 40002 (pre LED2 zapnuté) a 90 až 40003 (pre uhol servomotora) a potom kliknite na tlačidlo ODOSLAŤ.
Môžete vidieť, že stav LED diódy je zapnutý, aj uhol serva v 90 stupňoch.
4. Potom zadajte 40001 ako 1 a 40002 ako 0 a 40003 ako 180 a kliknite na tlačidlo ODOSLAŤ.
5. Teraz napíšeme 135 až 40003 a 40001 ako 0 a 40002 ako 1.
Takto je možné použiť RS-485 Modbus v sériovej komunikácii s Arduino UNO ako Slave. V nasledujúcom tutoriále použijeme Arduino Uno ako master v začatí MODBUS.
Kompletný kód a demonštračné video nájdete nižšie.