- Comunicare serial RS-485
- Conectarea RS-485 cu Arduino
- Modul convertor USB la RS-485
- Pur și simplu Modbus Master Software
- Instrumente necesare
- Diagrama circuitului
- Programare Arduino UNO pentru RS-485 Slave MODBUS
- Testarea Arduino UNO ca Rs485 Modbus Slave
Modbus este un protocol de comunicare serială care a fost descoperit de Modicon în 1979 și este utilizat pentru transmiterea datelor pe linii seriale între dispozitivele electronice industriale. RS-485 Modbus utilizează RS-485 pentru liniile de transmisie. Trebuie remarcat faptul că Modbus este un protocol software și nu un protocol hardware. Este împărțit în două părți, cum ar fi Modbus Master și Modbus Slave. În rețeaua Modbus RS-485 există un master și 127 de slave fiecare cu adresă unică de la 1 la 127. În acest proiect MAX485 Arduino, vom folosi Arduino Uno ca Slave pentru comunicații seriale.
Modbus sunt utilizate în principal în PLC-uri (controlere logice programabile). Și, în afară de aceasta, Modbus este, de asemenea, utilizat în sănătate, transport, automatizare la domiciliu etc. Modbus are 255 de coduri de funcții și există în principal trei versiuni populare ale Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Care este diferența dintre Modbus ASCII și Modbus RTU?
Modbus RTU și Modbus ASCII vorbesc același protocol. Singura diferență este că octeții care se transmit prin cablu sunt prezentați ca binari cu RTU și ca ASCII lizibili cu Modbus RTU. Modbus RTU va fi utilizat în acest tutorial.
Acest tutorial este despre utilizarea comunicării Modbus RS-485 cu Arduino UNO ca Slave. Aici instalăm Simply Modbus Master Software pe PC și controlăm două LED-uri și servomotor utilizând RS-485 ca linie de transmisie. Aceste LED-uri și servomotor sunt conectate cu Slave Arduino și controlate prin trimiterea de valori utilizând software-ul Master Modbus. Deoarece acest tutorial utilizează RS-485, este recomandat să treceți mai întâi prin comunicarea serială RS485 între Arduino Uno și Arduino Nano. RS485 poate fi utilizat și cu alte controlere pentru comunicații seriale:
- Comunicare în serie RS-485 între Raspberry Pi și Arduino UNO
- Comunicare în serie între STM32F103C8 și Arduino UNO folosind RS-485
Să începem explorând câteva informații despre RS-485 și Modbus. Aflați mai multe despre diverse protocoale de comunicare în serie aici.
Comunicare serial RS-485
RS-485 este un protocol de comunicare serial asincron care nu necesită ceas. Folosește o tehnică numită semnal diferențial pentru a transfera date binare de la un dispozitiv la altul.
Deci, ce este această metodă diferențială de transfer al semnalului ??
Metoda semnalului diferențial funcționează prin crearea unei tensiuni diferențiale utilizând un 5V pozitiv și negativ. Oferă o comunicare Half-Duplex atunci când se utilizează două fire, iar Full-Duplex necesită 4 fire.
Prin utilizarea acestei metode:
- RS-485 acceptă o rată mai mare de transfer de date de maximum 30 Mbps.
- De asemenea, oferă distanța maximă de transfer de date în comparație cu protocolul RS-232. Transferă date până la 1200 de metri maximum.
- Principalul avantaj al RS-485 față de RS-232 este sclavul multiplu cu un singur Master, în timp ce RS-232 acceptă numai un singur sclav.
- Poate avea maximum 32 de dispozitive conectate la protocolul RS-485.
- Un alt avantaj al RS-485 este imun la zgomot, deoarece utilizează metoda semnalului diferențial pentru transfer.
- RS-485 este mai rapid în comparație cu protocolul I2C.
Conectarea RS-485 cu Arduino
Modulul RS-485 poate fi conectat la orice microcontroler care are port serial. Pentru utilizarea modulului RS-485 cu microcontrolere, este necesar un modul numit 5V MAX485 TTL la RS485 care se bazează pe Maxim MAX485 IC, deoarece permite comunicarea serială pe distanțe lungi de 1200 de metri. Este bidirecțional și semi-duplex și are o rată de transfer de date de 2,5 Mbps. Acest modul necesită o tensiune de 5V.
Pin-Out al RS-485:
Nume PIN |
Descrierea pinului |
VCC |
5V |
A |
Intrare receptor fără inversare Ieșirea driverului fără inversare |
B |
Inversarea intrării receptorului Inversarea ieșirii driverului |
GND |
GND (0V) |
R0 |
Receptor Out (pin RX) |
RE |
Ieșire receptor (LOW-Enable) |
DE |
Ieșire driver (activare HIGH) |
DI |
Intrare driver (pin TX) |
Modul convertor USB la RS-485
Acesta este un modul adaptor de convertor USB la RS485 care acceptă WIN7, XP, Vista, Linux, Mac OS și oferă o interfață RS485 ușor de utilizat prin utilizarea portului COM în computer . Acest modul este un dispozitiv plug-and-play . Nu există structuri de comandă, orice este trimis la portul COM virtual este convertit automat în RS485 și invers. Modulul este complet autoalimentat de la magistrala USB. Deci, nu este nevoie de alimentare externă pentru funcționare.
Se afișează ca un port Serial / COM și este accesibil din aplicații sau hiper-terminal. Acest convertor oferă comunicare RS-485 semi-duplex. Gama de viteze Baud este de 75 bps până la 115200 bps, maxim până la 6 Mbps.
Pentru a utiliza acest dispozitiv, există diverse software Modbus disponibile pe internet. În acest tutorial este utilizat un software numit Simply Modbus Software.
Pur și simplu Modbus Master Software
Aplicația software Modbus Master este necesară pentru a trimite date către dispozitivul Arduino Modbus RS-485 slave prin COM.
Pur și simplu Modbus Master este un software de testare a comunicării datelor. Puteți descărca Simply Modbus Master de pe linkul dat și puteți afla mai multe despre acesta, consultând Manualul software.
Înainte de a utiliza software-ul, este important să vă familiarizați cu următoarele terminologii.
ID sclav:
Fiecărui sclav dintr-o rețea i se atribuie o adresă de unitate unică de la 1 la 127. Când comandantul solicită date, primul octet pe care îl trimite este adresa Slave. În acest fel, fiecare sclav știe după primul octet dacă ignoră sau nu mesajul.
Codul funcției:
Al doilea octet trimis de Master este codul Function. Acest număr îi spune sclavului la ce masă să acceseze și dacă să citească sau să scrie în tabel.
Coduri de funcții de înregistrare acceptate:
Codul funcției |
Acțiune |
Nume tabel |
04 (04 hex) |
Citit |
Registre de intrări analogice |
03 (03 hex) |
Citit |
Registrele de păstrare a ieșirii analogice |
06 (06 hex) |
Scrie singur |
Registrul deținere a ieșirii analogice |
16 (10 hex) |
Scrieți mai multe |
Registrele de păstrare a ieșirii analogice |
Coduri de funcții ale bobinei acceptate:
Codul funcției |
Acțiune |
Nume tabel |
02 (02 hex) |
Citit |
Contacte de intrare discretă |
01 (01 hex) |
Citit |
Bobine de ieșire discrete |
05 (05 hex) |
Scrie singur |
Bobină de ieșire discretă |
15 (0F hex) |
Scrieți mai multe |
Bobine de ieșire discrete |
CRC:
CRC înseamnă verificarea redundanței ciclice. Sunt doi octeți adăugați la sfârșitul fiecărui mesaj Modbus pentru detectarea erorilor.
Instrumente necesare
Hardware
- Arduino UNO
- Modul convertor MAX-485 TTL la RS-485
- Modul convertor USB la RS-485
- LED (2)
- 1k-rezistor (2)
- Afișaj LCD 16x2
- Potențiometru 10k
- Servomotor SG-90
Software
- Pur și simplu Modbus Master
Diagrama circuitului
Conexiune de circuit între modulul convertor MAX-485 TTL la RS-485 și Arduino UNO:
Arduino UNO |
Modul convertor MAX-485 TTL la RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Conexiune de circuit între modulul MAX-485 TTL la modulul RS-485 și convertorul USB la RS-485:
MAX-485 TTL la RS-485 Modul convertor |
Modul USB la RS-485 Conectat cu PC |
A |
A |
B |
B |
Conexiuni de circuit între Arduino UNO și afișaj LCD 16x2:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Pentru a controla pinul potențiometrului pentru controlul contrastului / luminozității LCD 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Conexiune de circuit între 2 LED-uri, servomotor și Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servo motor |
2 |
Anod prin rezistor 1k |
- |
- |
5 |
- |
Anod prin rezistor 1k |
- |
6 |
- |
- |
Pin PWM (portocaliu) |
+ 5V |
- |
- |
+ 5V (RED) |
GND |
Catod GND |
Catod GND |
GND (maro) |
Programare Arduino UNO pentru RS-485 Slave MODBUS
Arduino UNO este configurat ca Modbus Slave. De asemenea, Arduino UNO este atașat cu două LED-uri și un servomotor. Deci, sclavul Arduino este controlat din software-ul Master Modbus. Comunicarea dintre Arduino UNO și software-ul Modbus Master se realizează prin utilizarea modulului RS-485. Pentru conectarea acestuia la PC, se utilizează modulul convertor USB la RS-485. Și Arduino UNO cu modulul convertor MAX-485 TTL la RS-485, întreaga configurare va arăta fișierul urmează:
Pentru utilizarea Modbus în Arduino UNO, o bibliotecă
Inițial, includeți biblioteca necesară. Biblioteca ModbusRTU este pentru utilizarea comunicării Modbus RS-485, iar biblioteca cu cristale lichide este pentru utilizarea LCD cu Arduino UNO, iar biblioteca servo este pentru utilizarea servomotorului cu Arduino UNO.
#include
Acum pinii anodului LED care sunt conectați cu pinii Arduino 2 și 5 sunt definiți ca LED1 și LED2.
#define led1 2 #define led2 5
Apoi obiectul pentru accesarea clasei de cristal lichid este declarat cu pinii LCD (RS, E, D4, D5, D6, D7) care sunt conectați cu Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Când LCD-ul este terminat, inițializați obiectul servo pentru clasa Servo. De asemenea, inițializați obiectul autobuz pentru clasa Modbus.
Servo servo; Autobuz Modbus;
Apoi pentru stocarea valorilor pentru comunicația Modbus se declară o matrice cu cele trei valori inițializate cu zero.
uint16_t modbus_array = {0,0,0};
În funcția de configurare , în primul rând ecranul LCD este setat în modul 16x2 și un mesaj de întâmpinare este afișat și șters.
lcd.inceput (16,2); // Lcd setat în modul 16x2 lcd.print ("RS-485 Modbus"); // Mesaj de bun venit lcd.setCursor (0,1); lcd.print ("Arduino Slave"); întârziere (5000); lcd.clear ();
După aceasta, pinii LED1 și LED2 sunt setați ca pini de ieșire.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Pinul servo impuls conectat la pinul 6 PWM al Arduino este atașat.
servo.attach (6);
Acum pentru comunicarea Modbus sunt stabiliți următorii parametri. Primul „1” reprezintă ID-ul sclavului, al doilea „1” reprezintă faptul că folosește RS-485 pentru a transfera date și „4” reprezintă pinul RS-485 DE&RE conectat la Arduino UNO.
autobuz = Modbus (1,1,4);
Sclavul Modbus este setat la 9600 baudrate.
Bucla începe cu definiția bus poll și bus.poll () este folosit pentru a scrie și a primi valoare de la masterul Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Această metodă este utilizată pentru a verifica dacă există date disponibile la portul serial.
Dacă există date disponibile la portul serial, biblioteca Modbus RTU va verifica mesajul (va verifica adresa dispozitivului, lungimea datelor și CRC) și va efectua acțiunea necesară.
De exemplu, pentru a scrie sau citi orice valoare de la master, ModbusRTU trebuie să primească un tablou întreg nesemnat pe 16 biți și lungimea acestuia de la Master Modbus. Această matrice transportă datele scrise de la master.
În acest tutorial există trei tablouri pentru LED1, LED2 și unghiul motor Servo.
Mai întâi pentru pornire sau oprire se utilizează LED1 modbus_array.
if (modbus_array == 0) // Depinde de valoarea din modubus_array scrisă de Master Modbus { digitalWrite (led1, LOW); // LED OFF dacă 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED aprins dacă valoarea este alta decât 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Apoi pentru a porni sau opri LED2 modbus_array este utilizat.
if (modbus_array == 0) // Depinde de valoarea din modbus_array scrisă de Master Modbus { digitalWrite (led2, LOW); // LED OFF dacă 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED aprins dacă o altă valoare decât 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Apoi pentru a seta unghiul motorului Servo, modulul_bus folosit și valoarea sunt imprimate pe afișajul LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Unghiul servo:"); lcd.print (pwm); întârziere (200); lcd.clear ();
Aceasta termină de programat Arduino UNO pentru a lucra ca MODBUS Slave. Următorul pas îl va testa ca Modbus Slave.
Testarea Arduino UNO ca Rs485 Modbus Slave
După ce conexiunile de circuit sunt finalizate și codul este încărcat pe Arduino UNO, este timpul să conectați USB-ul la modulul RS-485 cu computerul unde este instalat software-ul Simple Modbus Master.
Deschideți managerul de dispozitive și verificați portul COM în funcție de computerul dvs. unde este conectat modulul USB la RS-485 și apoi deschideți software-ul Simply Modbus Master 8.1.1.
1. După deschiderea programului Simply Modbus, deschideți opțiunea Write.
2. După ce se deschide Simply Modbus Master Write. Setați parametrii
Mod în RTU, port COM în funcție de PC-ul dvs. (al meu a fost COM6), Baud la 9600, biți de date 8, bit de oprire 1, Parity None și Slave ID ca 1.
3. După aceea, setați primul registru ca 40001 și valorile de scris sunt 3 și codul funcției 16 (Write Holding Register).
După aceea scrieți 1 la 40001 (Pentru LED1 aprins) și 1 la 40002 (Pentru LED2 aprins) și 90 la 40003 (Pentru unghiul motorului servo) și apoi faceți clic pe butonul TRIMITE.
Puteți vedea atât starea LED-ului este aprinsă, cât și unghiul servo la 90 de grade.
4. După aceea, introduceți 40001 ca 1 și 40002 ca 0 și 40003 ca 180 și faceți clic pe butonul TRIMITE.
5. Acum scriem 135 la 40003 și 40001 ca 0 și 40002 ca 1.
Acesta este modul în care RS-485 Modbus poate fi utilizat în comunicarea serială cu Arduino UNO ca Slave. În următorul tutorial vom folosi Arduino Uno ca master în combinarea MODBUS.
Găsiți codul complet și un videoclip demonstrativ mai jos.