- Comunicación serial RS-485
- Conexión de RS-485 con Arduino
- Módulo convertidor de USB a RS-485
- Simplemente software maestro Modbus
- Herramientas necesarias
- Diagrama de circuito
- Programación de Arduino UNO para RS-485 MODBUS Slave
- Prueba del Arduino UNO como esclavo Modbus Rs485
Modbus es un protocolo de comunicación en serie que fue descubierto por Modicon en 1979 y se utiliza para transmitir datos a través de líneas en serie entre los dispositivos electrónicos industriales. RS-485 Modbus utiliza RS-485 para líneas de transmisión. Cabe señalar que Modbus es un protocolo de software y no un protocolo de hardware. Se divide en dos partes, como Modbus Master y Modbus Slave. En la red RS-485 Modbus hay un maestro y 127 esclavos cada uno con una dirección única de 1 a 127. En este proyecto MAX485 Arduino, usaremos Arduino Uno como esclavo para la comunicación en serie.
Los Modbus se utilizan principalmente en PLC (controladores lógicos programables). Y aparte de esto, el Modbus también se usa en la atención médica, el transporte, la automatización del hogar, etc. Modbus tiene 255 códigos de función y hay principalmente tres versiones populares de Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
¿Cuál es la diferencia entre Modbus ASCII y Modbus RTU?
Modbus RTU y Modbus ASCII hablan el mismo protocolo. La única diferencia es que los bytes que se transmiten por cable se presentan como binarios con RTU y como ASCII legible con Modbus RTU. En este tutorial se utilizará Modbus RTU.
Este tutorial trata sobre el uso de la comunicación RS-485 Modbus con Arduino UNO como esclavo. Aquí instalamos el software Simply Modbus Master en la PC y controlamos dos LED y el servomotor utilizando RS-485 como línea de transmisión. Estos LED y el servomotor están conectados con Slave Arduino y controlados mediante el envío de valores mediante el software Master Modbus. Dado que este tutorial utiliza RS-485, se recomienda pasar primero por la comunicación serie RS485 entre Arduino Uno y Arduino Nano. RS485 también se puede utilizar con otros controladores para la comunicación en serie:
- Comunicación serial RS-485 entre Raspberry Pi y Arduino UNO
- Comunicación serial entre STM32F103C8 y Arduino UNO usando RS-485
Comencemos explorando algunos antecedentes sobre RS-485 y Modbus. También obtenga más información sobre varios protocolos de comunicación serie aquí.
Comunicación serial RS-485
RS-485 es un protocolo de comunicación serial asíncrono que no requiere reloj. Utiliza una técnica llamada señal diferencial para transferir datos binarios de un dispositivo a otro.
Entonces, ¿qué es este método de transferencia de señal diferencial?
El método de señal diferencial funciona creando un voltaje diferencial utilizando 5V positivo y negativo. Proporciona una comunicación Half-Duplex cuando se utilizan dos cables y Full-Duplex requiere 4 cables de cuatro.
Usando este método:
- RS-485 admite una mayor velocidad de transferencia de datos de 30 Mbps como máximo.
- También proporciona una distancia máxima de transferencia de datos en comparación con el protocolo RS-232. Transfiere datos hasta un máximo de 1200 metros.
- La principal ventaja de RS-485 sobre RS-232 es el esclavo múltiple con un solo maestro, mientras que RS-232 admite solo un esclavo.
- Puede tener un máximo de 32 dispositivos conectados al protocolo RS-485.
- Otra ventaja del RS-485 es inmune al ruido, ya que utilizan el método de señal diferencial para transferir.
- RS-485 es más rápido en comparación con el protocolo I2C.
Conexión de RS-485 con Arduino
El módulo RS-485 se puede conectar a cualquier microcontrolador que tenga puerto serie. Para usar el módulo RS-485 con microcontroladores, se necesita un módulo llamado 5V MAX485 TTL a RS485 que se basa en Maxim MAX485 IC ya que permite la comunicación en serie a una larga distancia de 1200 metros. Es bidireccional y semidúplex y tiene una tasa de transferencia de datos de 2,5 Mbps. Este módulo requiere un voltaje de 5V.
Pin-Out de RS-485:
Nombre de PIN |
Pin Descripción |
VCC |
5V |
UN |
Entrada de receptor no inversora Salida de controlador no inversora |
segundo |
Inversión de la entrada del receptor Inversión de la salida del controlador |
GND |
TIERRA (0 V) |
R0 |
Salida del receptor (pin RX) |
RE |
Salida del receptor (LOW-Enable) |
Delaware |
Salida del controlador (HIGH-Enable) |
DI |
Entrada del controlador (pin TX) |
Módulo convertidor de USB a RS-485
Este es un módulo adaptador convertidor de USB a RS485 que admite WIN7, XP, Vista, Linux, Mac OS y proporciona una interfaz RS485 fácil de usar mediante el uso del puerto COM en la computadora . Este módulo es un dispositivo plug-and-play . No hay estructuras de comando, todo lo que se envía al puerto COM virtual se convierte automáticamente a RS485 y viceversa. El módulo se autoalimenta completamente desde el bus USB. Por lo tanto, no se necesita una fuente de alimentación externa para su funcionamiento.
Se muestra como un puerto serial / COM y es accesible desde aplicaciones o hiper-terminal. Este convertidor proporciona comunicación RS-485 semidúplex. El rango de velocidad en baudios es de 75 bps a 115200 bps, máximo hasta 6 Mbps.
Para utilizar este dispositivo, hay varios software Modbus disponibles en Internet. En este tutorial se utiliza un software llamado Simply Modbus Software.
Simplemente software maestro Modbus
Se necesita la aplicación Modbus Master Software para enviar datos al dispositivo esclavo Modbus RS-485 Arduino a través de COM.
Simply Modbus Master es un software de prueba de comunicación de datos. Puede descargar Simply Modbus Master desde el enlace proporcionado y obtener más información al respecto consultando el Manual del software.
Antes de utilizar el software, es importante familiarizarse con las siguientes terminologías.
ID de esclavo:
A cada esclavo en una red se le asigna una dirección de unidad única de 1 a 127. Cuando el maestro solicita datos, el primer byte que envía es la dirección del esclavo. De esta manera, cada esclavo sabe después del primer byte si ignorar o no el mensaje.
Código de función:
El segundo byte enviado por el maestro es el código de función. Este número le dice al esclavo a qué tabla acceder y si leer o escribir en la tabla.
Códigos de función de registro admitidos:
Código de función |
Acción |
Nombre de la tabla |
04 (04 hexadecimal) |
Leer |
Registros de entrada analógica |
03 (03 hex) |
Leer |
Registros de retención de salida analógica |
06 (06 hexadecimal) |
Escribir sencillo |
Registro de retención de salida analógica |
16 (10 hex.) |
Escribe varios |
Registros de retención de salida analógica |
Códigos de función de bobina admitidos:
Código de función |
Acción |
Nombre de la tabla |
02 (02 hex) |
Leer |
Contactos de entrada discreta |
01 (01 hexadecimal) |
Leer |
Bobinas de salida discretas |
05 (05 hex) |
Escribir sencillo |
Bobina de salida discreta |
15 (0F hex) |
Escribe varios |
Bobinas de salida discretas |
CRC:
CRC son las siglas de Cyclic Redundancy check. Son dos bytes agregados al final de cada mensaje Modbus para la detección de errores.
Herramientas necesarias
Hardware
- Arduino UNO
- Módulo convertidor MAX-485 TTL a RS-485
- Módulo convertidor de USB a RS-485
- LED (2)
- Resistencia 1k (2)
- Pantalla LCD 16x2
- Potenciómetro 10k
- Servomotor SG-90
Software
- Simplemente maestro Modbus
Diagrama de circuito
Conexión de circuito entre el módulo convertidor MAX-485 TTL a RS-485 y Arduino UNO:
Arduino UNO |
Módulo convertidor MAX-485 TTL a RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Conexión de circuito entre el módulo MAX-485 TTL a RS-485 y el convertidor USB a RS-485:
MAX-485 TTL a RS-485 Módulo convertidor |
Módulo USB a RS-485 Conectado con PC |
UN |
UN |
segundo |
segundo |
Conexiones de circuito entre Arduino UNO y pantalla LCD 16x2:
LCD de 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Para controlar el pin del potenciómetro para el control de contraste / brillo de LCD 16x2 |
RS |
8 |
RW |
GND |
mi |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UN |
+ 5V |
K |
GND |
Conexión de circuito entre 2 LED, servomotor y Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servo motor |
2 |
Ánodo a través de resistencia de 1k |
- |
- |
5 |
- |
Ánodo a través de resistencia de 1k |
- |
6 |
- |
- |
Pin PWM (naranja) |
+ 5V |
- |
- |
+ 5V (ROJO) |
GND |
GND del cátodo |
GND del cátodo |
GND (marrón) |
Programación de Arduino UNO para RS-485 MODBUS Slave
El Arduino UNO está configurado como Modbus Slave. Además, Arduino UNO se adjunta con dos LED y un servomotor. Por lo tanto, el Arduino esclavo se controla desde el software Master Modbus. La comunicación entre Arduino UNO y el software Modbus Master se logra mediante el módulo RS-485. Para conectarlo con PC, se utiliza el módulo convertidor de USB a RS-485. Y el Arduino UNO con módulo convertidor MAX-485 TTL a RS-485, toda la configuración se verá como el siguiente archivo:
Para usar Modbus en Arduino UNO, una biblioteca
Inicialmente, incluya la biblioteca requerida. La biblioteca ModbusRTU es para usar la comunicación RS-485 Modbus, y la biblioteca de cristal líquido es para usar LCD con Arduino UNO, y la biblioteca de servos es para usar Servo motor con Arduino UNO.
#incluir
Ahora los pines del ánodo LED que están conectados con los pines 2 y 5 de Arduino se definen como LED1 y LED2.
#define led1 2 #define led2 5
A continuación, se declara el objeto para acceder a la clase de cristal líquido con los pines LCD (RS, E, D4, D5, D6, D7) que están conectados con Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Cuando termine la pantalla LCD, inicialice el objeto servo para la clase Servo. También inicializar objeto de bus para clase Modbus.
Servo servo; Bus Modbus;
A continuación, para almacenar valores para la comunicación Modbus, se declara una matriz con los tres valores inicializados con cero.
uint16_t modbus_array = {0,0,0};
En la función de configuración , en primer lugar, la pantalla LCD se configura en modo 16x2 y se muestra y borra un mensaje de bienvenida.
lcd.begin (16,2); // Lcd configurado en modo 16x2 lcd.print ("RS-485 Modbus"); // Mensaje de bienvenida lcd.setCursor (0,1); lcd.print ("Arduino esclavo"); retraso (5000); lcd.clear ();
Después de esto, los pines LED1 y LED2 se establecen como pines de salida.
pinMode (led1, SALIDA); pinMode (led2, SALIDA);
Se adjunta el pin de pulso del servo conectado al pin 6 de PWM de Arduino.
servo.attach (6);
Ahora para la comunicación Modbus se establecen los siguientes parámetros. El primer '1' representa la ID del esclavo, el segundo '1' representa que usa RS-485 para transferir datos y el '4' representa el pin RS-485 DE&RE conectado a Arduino UNO.
bus = Modbus (1,1,4);
El esclavo Modbus está configurado a 9600 baudios.
El bucle comienza con la definición de bus poll y bus.poll () se utiliza para escribir y recibir valor del Modbus maestro.
bus.poll (modbus_array, tamaño de (modbus_array) / tamaño de (modbus_array));
Este método se utiliza para comprobar si hay datos disponibles en el puerto serie.
Si hay datos disponibles en el puerto serie, la biblioteca Modbus RTU verificará el mensaje (verificará la dirección del dispositivo, la longitud de los datos y el CRC) y realizará la acción requerida.
Por ejemplo, para escribir o leer cualquier valor del maestro, ModbusRTU debe recibir una matriz de enteros de 16 bits sin signo y su longitud del maestro Modbus. Esta matriz transporta los datos escritos desde el maestro.
En este tutorial hay tres matrices para LED1, LED2 y ángulo del servomotor.
Primero para encender o apagar el LED1 modbus_array se usa.
if (modbus_array == 0) // Depende del valor en modubus_array escrito por Master Modbus { digitalWrite (led1, LOW); // LED APAGADO si 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED ENCENDIDO si un valor diferente a 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
A continuación, para encender o apagar el LED2 modbus_array se utiliza.
if (modbus_array == 0) // Depende del valor en modbus_array escrito por Master Modbus { digitalWrite (led2, LOW); // LED APAGADO si 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED ENCENDIDO si un valor diferente a 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
A continuación, para establecer el ángulo del servomotor, el modbus_array utilizado y el valor se imprimen en la pantalla LCD de 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Ángulo de servo:"); lcd.print (pwm); retraso (200); lcd.clear ();
Esto termina de programar Arduino UNO para que funcione como MODBUS Slave. El siguiente paso será probarlo como Modbus Slave.
Prueba del Arduino UNO como esclavo Modbus Rs485
Una vez que se completan las conexiones del circuito y se carga el código en Arduino UNO, es hora de conectar el módulo USB al RS-485 con la PC donde está instalado el software Simple Modbus Master.
Abra el administrador de dispositivos y verifique el puerto COM de acuerdo con su PC donde está conectado el módulo USB a RS-485 y luego abra el software Simply Modbus Master 8.1.1.
1. Después de abrir el software Simply Modbus, abra la opción Escribir.
2. Después de que se abra Simply Modbus Master Write. Establecer los parámetros
Modo en RTU, puerto COM según su PC (el mío era COM6), baudios a 9600, bits de datos 8, bit de parada 1, paridad ninguna e ID de esclavo como 1.
3. Después de eso, configure el primer registro como 40001 y los valores para escribir son 3 y el código de función como 16 (Write Holding Register).
Después de eso, escriba 1 a 40001 (para LED1 encendido) y 1 a 40002 (para LED2 encendido) y 90 a 40003 (para ángulo de servomotor) y luego haga clic en el botón ENVIAR.
Puede ver que el estado del LED está ENCENDIDO y el ángulo del servo a 90 grados.
4. Después, ingrese 40001 como 1 y 40002 como 0 y 40003 como 180 y haga clic en el botón ENVIAR.
5. Ahora escriba 135 a 40003 y 40001 como 0 y 40002 como 1.
Así es como RS-485 Modbus se puede utilizar en la comunicación en serie con Arduino UNO como esclavo. En el siguiente tutorial usaremos el Arduino Uno como maestro en la comminación MODBUS.
Encuentre el código completo y un video de demostración a continuación.