- Comunicació en sèrie RS-485
- Connexió del RS-485 amb Arduino
- Mòdul convertidor USB a RS-485
- Simplement el programari principal Modbus
- Eines necessàries
- Esquema de connexions
- Programació Arduino UNO per esclau RS-485 MODBUS
- Provant Arduino UNO com a esclau Modbus Rs485
Modbus és un protocol de comunicació en sèrie que va ser descobert per Modicon el 1979 i que s’utilitza per transmetre dades a través de línies serials entre els dispositius electrònics industrials. El RS-485 Modbus utilitza el RS-485 per a les línies de transmissió. Cal tenir en compte que Modbus és un protocol de programari i no un protocol de maquinari. Es divideix en dues parts, com ara Modbus Master i Modbus Slave. A la xarxa Modbus RS-485 hi ha un mestre i 127 esclaus cadascun amb una adreça única d’1 a 127. En aquest projecte Arduino MAX485, utilitzarem Arduino Uno com a esclau per a la comunicació en sèrie.
Els Modbus s’utilitzen majoritàriament en PLC (controladors lògics programables). I a part d'això, el Modbus també s'utilitza en salut, transport, domòtica, etc. Modbus té 255 codis de funcions i hi ha principalment tres versions populars de Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Quina diferència hi ha entre Modbus ASCII i Modbus RTU?
Modbus RTU i Modbus ASCII parlen del mateix protocol. L'única diferència és que els bytes que es transmeten a través del cable es presenten com a binaris amb RTU i com ASCII llegibles amb Modbus RTU. En aquest tutorial s’utilitzarà Modbus RTU.
Aquest tutorial tracta d’utilitzar la comunicació Modbus RS-485 amb Arduino UNO com a esclau. Aquí instal·lem el programari Màster Simply Modbus en PC i controlem dos LEDs i Servo Motor mitjançant RS-485 com a línia de transmissió. Aquests LED i servomotors estan connectats amb Slave Arduino i es controlen enviant valors mitjançant el programari Master Modbus. Atès que aquest tutorial fa servir RS-485, es recomana passar primer per la comunicació serial RS485 entre Arduino Uno i Arduino Nano. RS485 també es pot utilitzar amb altres controladors per a la comunicació en sèrie:
- Comunicació en sèrie RS-485 entre Raspberry Pi i Arduino UNO
- Comunicació en sèrie entre STM32F103C8 i Arduino UNO mitjançant RS-485
Comencem explorant alguns antecedents sobre l'RS-485 i el Modbus. També podeu obtenir més informació sobre diversos protocols de comunicació en sèrie aquí.
Comunicació en sèrie RS-485
RS-485 és un protocol de comunicació en sèrie asíncrona que no requereix rellotge. Utilitza una tècnica anomenada senyal diferencial per transferir dades binàries d’un dispositiu a un altre.
Llavors, què és aquest mètode de transferència de senyal diferencial ??
El mètode de senyal diferencial funciona creant una tensió diferencial mitjançant un 5V positiu i negatiu. Proporciona una comunicació Half-Duplex quan s’utilitzen dos cables i Full-Duplex requereix 4 cables.
En utilitzar aquest mètode:
- El RS-485 admet una velocitat de transferència de dades superior a 30 Mbps com a màxim.
- També proporciona una distància màxima de transferència de dades en comparació amb el protocol RS-232. Transfereix dades fins a 1200 metres com a màxim.
- El principal avantatge de l'RS-485 respecte a l'RS-232 és l'esclau múltiple amb mestre únic, mentre que l'RS-232 només admet un esclau únic.
- Pot tenir un màxim de 32 dispositius connectats al protocol RS-485.
- Un altre avantatge del RS-485 és immune al soroll ja que utilitzen el mètode de senyal diferencial per transferir.
- El RS-485 és més ràpid en comparació amb el protocol I2C.
Connexió del RS-485 amb Arduino
El mòdul RS-485 es pot connectar a qualsevol microcontrolador que tingui port sèrie. Per utilitzar mòduls RS-485 amb microcontroladors, es necessita un mòdul anomenat 5V MAX485 TTL a RS485 basat en IC Maxim MAX485 ja que permet la comunicació en sèrie a una llarga distància de 1200 metres. És bidireccional i mig dúplex i té una velocitat de transferència de dades de 2,5 Mbps. Aquest mòdul requereix una tensió de 5V.
Pin-Out de RS-485:

|
Nom del pin |
Descripció del pin |
|
VCC |
5V |
|
A |
Entrada del receptor que no inverteix Sortida de controlador que no inverteix |
|
B |
Invertir l'entrada del receptor Invertint la sortida del controlador |
|
GND |
GND (0V) |
|
R0 |
Sortida del receptor (pin RX) |
|
RE |
Sortida del receptor (habilitació BAIXA) |
|
DE |
Sortida del controlador (activat per ALTA) |
|
DI |
Entrada del controlador (pin TX) |
Mòdul convertidor USB a RS-485

Es tracta d’un mòdul d’adaptador de convertidor USB a RS485 que admet WIN7, XP, Vista, Linux, Mac OS i proporciona una interfície RS485 fàcil d’utilitzar mitjançant l’ús de port COM a l’ordinador . Aquest mòdul és un dispositiu plug-and-play . No hi ha estructures d’ordres, tot el que s’enviï al port COM virtual es converteix automàticament a RS485 i viceversa. El mòdul s’alimenta completament des del bus USB. Per tant, no necessiteu una font d'alimentació externa per al funcionament.
Es mostra com un port sèrie / COM i és accessible des d'aplicacions o hiper-terminal. Aquest convertidor proporciona comunicació RS-485 dúplex. L’interval de velocitat Baud és de 75 bps a 115200 bps, màxim fins a 6 Mbps.
Per utilitzar aquest dispositiu, hi ha diversos programes Modbus disponibles a Internet. En aquest tutorial s’utilitza un programari anomenat Simply Modbus Software.
Simplement el programari principal Modbus
Es necessita l'aplicació de programari Modbus Master per enviar dades al dispositiu Arduino Modbus RS-485 esclau mitjançant COM.
Simply Modbus Master és un programari de proves de comunicació de dades. Podeu descarregar Simply Modbus Master des de l’enllaç donat i obtenir més informació al respecte, consultant Manual de programari.
Abans d’utilitzar el programari, és important familiaritzar-se amb les terminologies següents.
Identificador d'esclau:
A cada esclau d'una xarxa se li assigna una adreça d'unitat única de l'1 al 127. Quan el mestre sol·licita dades, el primer byte que envia és l'adreça esclau. D'aquesta manera, cada esclau sap després del primer byte si ignora o no el missatge.
Codi de funció:
El segon byte enviat pel mestre és el codi de funció. Aquest número indica a l’esclau a quina taula s’ha d’accedir i si ha de llegir o escriure a la taula.
Codis de funcions de registre admesos:
|
Codi de funció |
Acció |
Nom de la taula |
|
04 (04 hexadecimal) |
Llegiu |
Registres d’entrada analògica |
|
03 (03 hexadecimal) |
Llegiu |
Registres de retenció de sortida analògica |
|
06 (06 hexadecimal) |
Escriu sola |
Registre de retenció de sortida analògica |
|
16 (10 hexadecimals) |
Escriu múltiples |
Registres de retenció de sortida analògica |
Codis de funció de bobina compatibles:
|
Codi de funció |
Acció |
Nom de la taula |
|
02 (02 hexadecimal) |
Llegiu |
Contactes d'entrada discreta |
|
01 (01 hexadecimal) |
Llegiu |
Bobines de sortida discreta |
|
05 (05 hexadecimal) |
Escriu sola |
Bobina de sortida discreta |
|
15 (hexadecimal 0F) |
Escriu múltiples |
Bobines de sortida discreta |
CRC:
CRC significa comprovació de redundància cíclica. Són dos bytes afegits al final de cada missatge Modbus per a la detecció d'errors.
Eines necessàries
Maquinari
- Arduino UNO
- Mòdul convertidor MAX-485 TTL a RS-485
- Mòdul convertidor USB a RS-485
- LED (2)
- 1k-resistència (2)
- Pantalla LCD de 16x2
- Potenciòmetre de 10 k
- Servomotor SG-90
Programari
- Simplement Modbus Master
Esquema de connexions

Connexió de circuits entre el mòdul convertidor MAX-485 TTL a RS-485 i Arduino UNO:
|
Arduino UNO |
Mòdul convertidor MAX-485 TTL a RS-485 |
|
0 (RX) |
RO |
|
1 (TX) |
DI |
|
4 |
DE & RE |
|
+ 5V |
VCC |
|
GND |
GND |
Connexió de circuits entre el mòdul MAX-485 TTL a RS-485 i el convertidor USB a RS-485:
|
MAX-485 TTL a RS-485 Mòdul convertidor |
Mòdul USB a RS-485 Connectat amb PC |
|
A |
A |
|
B |
B |
Connexions de circuits entre Arduino UNO i pantalla LCD de 16x2:
|
LCD de 16x2 |
Arduino UNO |
|
VSS |
GND |
|
VDD |
+ 5V |
|
V0 |
Per controlar el pin del potenciòmetre per al control de contrast / lluminositat de 16x2 LCD |
|
RS |
8 |
|
RW |
GND |
|
E |
9 |
|
D4 |
10 |
|
D5 |
11 |
|
D6 |
12 |
|
D7 |
13 |
|
A |
+ 5V |
|
K |
GND |
Connexió del circuit entre 2 LEDs, servomotor i Arduino UNO:
|
Arduino UNO |
LED1 |
LED2 |
Servomotor |
|
2 |
Ànode a través de la resistència 1k |
- |
- |
|
5 |
- |
Ànode a través de la resistència 1k |
- |
|
6 |
- |
- |
Pin PWM (taronja) |
|
+ 5V |
- |
- |
+ 5V (VERMELL) |
|
GND |
Càtode GND |
Càtode GND |
GND (marró) |
Programació Arduino UNO per esclau RS-485 MODBUS
L'Arduino UNO es configura com Modbus Slave. A més, Arduino UNO està connectat amb dos LEDs i un servomotor. Per tant, l'esclau Arduino es controla des del programari Master Modbus. La comunicació entre Arduino UNO i el programari principal Modbus s’aconsegueix mitjançant el mòdul RS-485. Per connectar-lo a l'ordinador, s'utilitza el mòdul convertidor d'USB a RS-485. I Arduino UNO amb el mòdul convertidor MAX-485 TTL a RS-485, la configuració completa tindrà un fitxer següent:

Per utilitzar Modbus a Arduino UNO, una biblioteca
Inicialment, incloeu la biblioteca necessària. La biblioteca ModbusRTU serveix per utilitzar la comunicació Modbus RS-485, i la biblioteca de cristalls líquids serveix per utilitzar LCD amb Arduino UNO, i la servoteca per utilitzar servomotor amb Arduino UNO.
#incloure
Ara els pins d'ànode LED que estan connectats amb els pins Arduino 2 i 5 es defineixen com LED1 i LED2.
#define led1 2 #define led2 5
A continuació, es declara l'objecte per accedir a la classe Liquid Crystal amb els pins LCD (RS, E, D4, D5, D6, D7) que estan connectats amb Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Quan s'hagi acabat la pantalla LCD, inicialitzeu el servo objecte per a la classe Servo. També inicialitzeu l’objecte bus per a la classe Modbus.
Servo servo; Autobús Modbus;
A continuació, per emmagatzemar valors per a la comunicació Modbus es declara una matriu amb els tres valors inicialitzats amb zero.
uint16_t modbus_array = {0,0,0};
En la funció de configuració , en primer lloc, la pantalla LCD es configura en mode 16x2 i es mostra i esborra un missatge de benvinguda.
lcd.begin (16,2); // Lcd configurat en mode 16x2 lcd.print ("RS-485 Modbus"); // Missatge de benvinguda lcd.setCursor (0,1); lcd.print ("Arduino Slave"); retard (5000); lcd.clear ();
Després d'això, els pins LED1 i LED2 es configuren com a pins de sortida.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
S'ha connectat el pin d'impulsió servo connectat al pin 6 PWM d'Arduino.
servo.attach (6);
Ara, per a la comunicació Modbus, es configuren els paràmetres següents. El primer "1" representa l'identificador d'esclau, el segon "1" representa que utilitza el RS-485 per transferir dades i el "4" representa el pin RS-485 DE&RE connectat a Arduino UNO.
bus = Modbus (1,1,4);
L'esclau Modbus està configurat a 9600 baudrate.
El bucle comença amb la definició de sondeig de bus i bus.poll () s’utilitza per escriure i rebre valor del Modbus mestre.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Aquest mètode s’utilitza per comprovar si hi ha dades disponibles al port sèrie.
Si hi ha dades disponibles al port sèrie, la biblioteca Modbus RTU comprovarà el missatge (comprovarà l'adreça del dispositiu, la longitud de les dades i CRC) i realitzarà l'acció necessària.
Per exemple, per escriure o llegir qualsevol valor del mestre, el ModbusRTU ha de rebre una matriu sencera de 16 bits sense signar i la seva longitud del Màster Modbus. Aquesta matriu conté les dades que s’escriuen des del mestre.
En aquest tutorial hi ha tres matrius per a l'angle del motor LED1, LED2 i Servo.
Primer per activar o apagar el LED1 modbus_array.
if (modbus_array == 0) // Depèn del valor de modubus_array escrit pel mestre Modbus { digitalWrite (led1, LOW); // LED apagat si 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED encès si el valor és diferent de 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Seguidament per activar o apagar el LED2 modbus_array s'utilitza.
if (modbus_array == 0) // Depèn del valor de modbus_array escrit pel mestre Modbus { digitalWrite (led2, LOW); // LED apagat si 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED encesa si el valor és diferent de 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
A continuació, per definir l'angle del servomotor, s'imprimeix el modbus_array utilitzat i el valor a la pantalla LCD de 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Angle de servo:"); lcd.print (pwm); retard (200); lcd.clear ();
S'acaba de programar Arduino UNO per treballar-lo com MODBUS Slave. El següent pas serà provar-lo com Modbus Slave.
Provant Arduino UNO com a esclau Modbus Rs485
Després de completar les connexions del circuit i carregar el codi a Arduino UNO, és hora de connectar el mòdul USB al mòdul RS-485 amb l'ordinador on està instal·lat el programari Simple Modbus Master.
Obriu el gestor de dispositius i comproveu el port COM segons el vostre PC on està connectat el mòdul USB a RS-485 i, després, obriu el programari Simply Modbus Master 8.1.1.
1. Després d' obrir Simply Modbus Software , obriu l'opció d'escriptura.

2. Després d’ obrir-se l’escriptura senzilla Modbus Master . Estableix els paràmetres
Mode a RTU, port COM segons el vostre PC (el meu era COM6), Baud al 9600, Data Bits 8, Stop bit 1, Parity None i Slave ID com a 1.

3. Després d'aquest conjunt, primer registreu-vos com 40001 i els valors per escriure són 3 i el codi de funció com a 16 (Write Holding Register).
Després, escriviu de l'1 al 40001 (per al LED1 encès) i de l'1 al 40002 (per al LED2 encès) i del 90 al 40003 (per a l'angle del motor servo) i feu clic al botó ENVIAR.

Podeu veure que tant l’estat dels LEDs està activat com l’angle de servo a 90 º.
4. Després, introduïu 40001 com a 1 i 40002 com a 0 i 40003 com a 180 i feu clic al botó ENVIAR.

5. Ara escriviu 135 a 40003 i 40001 com a 0 i 40002 com a 1.

Així es pot utilitzar RS-485 Modbus en la comunicació en sèrie amb Arduino UNO com a esclau. En el proper tutorial utilitzarem l’Arduino Uno com a mestre en la comminació MODBUS.
A continuació, trobareu el codi complet i un vídeo de demostració.
