Cómo comunicar dos Arduinos vía RS485 © GPL3+

 

Cómo comunicar dos Arduinos a través de RS485

Cómo comunicar dos Arduinos vía RS485

Aprenderá a comunicar dos Arduinos a través de RS485.

Componentes y suministros

Ph a000066 iso (1) ztbmubhmho
Arduino UNO
× 1
Ph a000066 iso (1) ztbmubhmho
Arduino UNO
× 1
Protoboard grande obl 600 71860.1471018761.500.659
Kit de placa de pruebas sin soldadura Digilent grande
× 1
MAX485 CI
× 2

Aplicaciones y servicios en línea

idea web
IDE de Arduino

Acerca de este proyecto

Este proyecto lo desarrollamos en alianza con JLCPCB y la escuela Robo Lúdico. Los archivos de mapas utilizados están disponibles para su descarga. Descarga las 2 placas para proyectos con Arduino.

 

 

Enlace para descargar la placa compatible con Arduino: https://bit.ly/ArduinoGerberFilesPCB

Link para descargar el escudo: https://bit.ly/3fNSNRI

Hice el proyecto con JLCPCB. Sacaron un cupón para ganar 5 unidades de esta tarjeta. El cupón es: JLC-REBE

El proceso es sencillo:

Descargue los archivos gerbers desde el enlace del proyecto;

  • Descargue los archivos gerbers desde el enlace del proyecto;

Visita el sitio web: https://www.jlcpcb.com/PFC

  • Visita el sitio web: https://www.jlcpcb.com/PFC

Descarga los archivos Gerber;

  • Descarga los archivos Gerber;

Aplica el cupón JLC-REBE en el área de pago.

  • Aplica el cupón JLC-REBE en el área de pago.

¡Comencemos el proyecto!

Introducción

Generalmente en las industrias contamos con varias máquinas y equipos (PLCs, CNCs, convertidores de frecuencia) controlando y monitoreando los más diversos procesos industriales.

Para que todos estos equipos funcionen en conjunto, es fundamental que exista una red de comunicación entre ellos.

Sin embargo, la industria es un entorno que sufre la presencia de muchas interferencias electromagnéticas debido a la activación de motores, solenoides y otros actuadores.

Por lo tanto, la red de comunicación debe ser robusta, teniendo en cuenta esta necesidad, se creó el estándar de comunicación RS485.

El estándar de comunicación RS485 es la capa física de la red de comunicación y se pueden implementar varios protocolos como Modbus, Profibus y otros.

El estándar de comunicación RS485 es adecuado para su implementación en la industria, ya que acepta varias topologías de red, como estrella y anillo, por ejemplo.

Permite la comunicación a largas distancias y utiliza cable de par trenzado. Este modelo de cable reduce las interferencias electromagnéticas ya que tenemos una señal de comunicación diferencial y esto contribuye a ser más insensibles al ruido y a las interferencias electromagnéticas.

Además de la comunicación RS485, también existe la comunicación RS232. Permite la comunicación en red en modo punto a punto y sufre más las interferencias electromagnéticas.

Sin embargo, muchos dispositivos tienen comunicación RS232 y necesitan transmitir datos a largas distancias. Para ello tenemos que utilizar el circuito integrado llamado MAX485.

Este circuito integrado desempeña un papel en la adaptación del nivel lógico TTL al nivel lógico requerido para la comunicación RS485.

Hoy en día, ya existen módulos listos y económicos con este circuito integrado. Permiten el acondicionamiento de la señal y facilitan la comunicación entre diferentes equipos.

Así, la comunicación RS485 se puede utilizar en cualquier tipo de entorno gracias a su robustez.

Entonces, en este artículo, aprenderemos cómo monitorear la temperatura de un ambiente y recibir el valor medido a través de la comunicación serial / RS485 entre dos Arduinos.

El Arduino Slave (Transmisor) realizará la medición de temperatura utilizando un sensor digital DS18B20 y enviará este valor medido vía serial/RS485 al Arduino Master (Receptor) el cual escribirá en el LCD 20 x 4 I2C el valor de temperatura recibido.

Así, a través de este artículo, aprenderás:

  • Realice el montaje del circuito en el protoboard;
  • Comprender cómo funciona el módulo RS 485;
  • Comprenda cómo funciona el sensor DS18B20;
  • Crear un protocolo de comunicación;
  • Realice un control remoto de la temperatura utilizando una red de comunicación por cable;
  • Ganar su propia placa compatible con Arduino del JLCPCB.

Ahora comenzaremos la presentación completa del desarrollo del proyecto. Monitoreo de temperatura con sensor DS18B20 usando comunicación serial RS485.

Desarrollo del proyecto de monitoreo de temperatura con el sensor DS18B20 usando comunicación serial RS485

En la figura 3 tenemos el circuito esquemático necesario para el montaje del proyecto.

El Arduino Uno será el maestro (receptor), recibirá la medición de temperatura y la mostrará en la pantalla LCD I2C de 20 x 4.

El Arduino Nano será el esclavo (transmisor), leerá el sensor DS18B20 y enviará el valor medido a través del módulo RS485.

Ahora pasemos a la lista de materiales necesarios para configurar el proyecto.

El proyecto con DS18B20 y módulo RS485 para Arduino

El sensor de temperatura DS18B20 es un sensor de temperatura digital, ya que para transmitir la información utiliza el protocolo 1 – Wire.

El protocolo 1 – Wire fue fabricado por Dallas Semiconductor y Maxim.

El bus de 1 cable utiliza el concepto de maestro/esclavo para los dispositivos.

El microcontrolador es el maestro y los periféricos son los esclavos.

Durante la fabricación, cada dispositivo recibe una identificación única que es el número de identificación del dispositivo (dirección), para que pueda identificarse en el bus cuando hay muchos dispositivos.

Forma de información:

El 1 – Wire usa una sola línea de datos y usa pulsos cortos y largos para representar 1 y 0. Un pulso de 60 microsegundos significa un 0, un pulso de 15 microsegundos significa un 1.

Es necesario utilizar una resistencia pull-up 4K7 entre el VCC y el pin de señal del sensor DS18B20 para que la comunicación entre el microcontrolador y el sensor sea estable.

Después de ensamblar el circuito transmisor y receptor en el protoboard, podemos ver el ensamblaje físico en el protoboard en la Figura 6.

A la izquierda tenemos el circuito receptor ya la derecha el transmisor.

El código del circuito del transmisor

A continuación, tenemos el código completo del circuito del transmisor.

#include <SoftwareSerial.h>
// bibliotecas para leitura do sensor DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>

#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 // Habilita ou não a transmissão e recepção de dados
SoftwareSerial RS485_serial (RX_485, TX_485);

byte TX [4];
#define RS485transmit HIGH
#define RS485receive LOW

// pino que o sensor esta conectado
const int pino_sensor = 5;
OneWire bus (pino_sensor);
DallasTemperature sensors (&bus);
DeviceAddress sensor;

unsigned int tempo=0;

// variavel para armazenar a temperatura
float temp;
int t=0;

void setup()
{
// inicia a biblioteca
sensors.begin();
// velocidade comunicaçao serial
Serial.begin(9600);
RS485_serial.begin(9600);
pinMode(RS485_control,OUTPUT);
Serial.println(" Monitoramento de temperatura com sensor DS18B20 ");
if(!sensors.getAddress(sensor,0))
{
Serial.println(" Sensor DS18B20 nao encontrado");
}

}
void loop()
{
if((millis()-tempo)>200)
{
tempo=millis();
sensors.requestTemperatures();
temp=sensors.getTempC(sensor);
digitalWrite(RS485_control, RS485transmit);
t = temp * 100;
TX[0] = t/ 255;
TX[1] = t % 255;
for (int i=0; i<4; i++)
{
RS485_serial.write(TX[i]);
}
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.println(" oC");
}
}

Para el código del transmisor, incluiremos 3 bibliotecas: Serial Software, Dallas Temperature y One Wire.

El software serial es responsable de emular la comunicación serial por software.

Bibliotecas Dallas Temperature y One Wire que tienen las funciones necesarias para leer el sensor de temperatura DS18B20.

#include <SoftwareSerial.h>
//bibliotecas para leitura do sensor DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>

Mapeamento de hardware da ligação dos pinos do módulo RS 485 ao Arduino
#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 // Habilita ou não a transmissão e recepção de dados
Cria o objeto RS485_serial com os pinos de RX e TX

SoftwareSerial RS485_serial (RX_485, TX_485); //Variável que irá armazenar o valor lido de temperatura para ser transmitida via serial.

byte TX [4]; //Constantes definidas para habilitar ou não a transmissão e recepção de dados via serial/RS485.

#define RS485transmit HIGH
#define RS485receive LOW

//Pino onde está conectado o sensor

const int pino_sensor = 5;

//Pino onde o sensor está conectado
OneWire bus (pino_sensor);

//Armazena o endereço do sensor
DallasTemperature sensors (&bus);
DeviceAddress sensor;
unsigned int tempo=0; Armazena o tempo corrente

//variavel para armazenar a temperatura
float temp;
int t=0;

En la función de configuración vacía, iniciamos la comunicación con el sensor, configurando la velocidad de comunicación serial y RS485.

Comprueba si la comunicación con el sensor fue exitosa.

Configure el pin de control de comunicación RS485 como una salida con el comando: pinMode (RS485_control, OUTPUT).

void setup()
{

//inicia a biblioteca
sensors.begin();

//velocidade comunicaçao serial
Serial.begin(9600);

RS485_serial.begin(9600);
pinMode(RS485_control,OUTPUT);

Serial.println(" Monitoramento de temperatura com sensor DS18B20 ");

if(!sensors.getAddress(sensor,0))
{
Serial.println(" Sensor DS18B20 nao encontrado");
}

}

En la función de bucle vacío, el sensor se lee cada 200 ms utilizando la función millis() y ensambla el paquete para transmitir el valor medido.

if((millis()-tempo) > 200)
{

tempo=millis();

sensors.requestTemperatures(); método que requisita a temperatura
temp=sensors.getTempC(sensor); reaaliza a leitura da temperatura do sensor

digitalWrite(RS485_control, RS485transmit); habilita o modo de transmissão
t = temp * 100; Transforma o valor lido de temperatura para um valor inteiro.

TX[0] = t/ 255; Armazena na posição 0 o valor da divisão da temperatura por 255 ( 1 byte).
TX[1] = t % 255; Armazena na posição 1 o valor do resto da divisão de temperatura por 255.

Esta operación se realiza para que podamos dividir el valor de la temperatura en dos bytes, ya que no es posible transmitir un valor flotante directamente mediante comunicación serie.

Transmite el valor leído a través de comunicación serie RS485.

for (int i=0; i<4; i++)
{
RS485_serial.write(TX[i]);
}

Imprime el valor en el puerto serie de la computadora solo para depuración.

Serial.print("Temperatura: ");
Serial.print(temp);
Serial.println(" oC");
}
}

A continuación, introduciremos el código completo del circuito receptor.

El código del circuito del receptor.

Primero, tenemos el código completo del circuito receptor.

#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Addr,En, Rw,Rs,d4,d5,d6,d7, backlight, polarity
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 // Habilita ou não a transmissão e recepção de dados

SoftwareSerial RS485_serial (RX_485, TX_485);
byte RX[4];

#define RS485transmit HIGH
#define RS485receive LOW

// variavel para armazenar a temperatura
float temp;
unsigned long tempo =0;

void setup()
{
// velocidade comunicaçao serial
lcd.begin(20,4);
Serial.begin(9600);
RS485_serial.begin(9600);
pinMode(RS485_control,OUTPUT);
Serial.println(" Comunicacao RS485 ");
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print(" COMUNICACAO RS485 ");
}

void loop()
{
if((millis()-tempo)>500)
{
lcd.clear();
tempo=millis();
digitalWrite(RS485_control,RS485receive);
if(RS485_serial.available () >0)
{
for (int i =0; i<4; i ++)
{
RX[i] = RS485_serial.read();
}
temp = ((RX[0] * 255) + RX[1]) /100;
Serial.print(" Temperatura : ");
Serial.print( temp );
Serial.println(" *C ");
}
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print(" COMUNICACAO RS485 ");
lcd.setCursor(0,1);
lcd.print(" SENSOR DS18B20 ");
lcd.setCursor(0,2);
lcd.print(" TEMP ");
lcd.setCursor(7,2);
lcd.print( temp);
lcd.setCursor(11,2);
lcd.print(" *C ");
}
}

En el receptor utilizaremos tres bibliotecas Software Serial, Wire y LiquidCrystal_I2C.

El software Serial emula la comunicación serial en cualquier pin Arduino Nano.

Bibliotecas Wire y LiquidCrystal_I2C responsables de la comunicación I2C y la comunicación con el LCD I2C.

#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Objeto LCD, en estos objetos tenemos que poner la dirección de visualización.

En mi caso la dirección es 0x27,

// Addr,En, Rw,Rs,d4,d5,d6,d7, backlight, polarity
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

Mapa de hardware con pines en el módulo RS485 conectado al Arduino Nano.

#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 //Habilita ou não a transmissão e recepção de dados
SoftwareSerial RS485_serial (RX_485, TX_485); //Pinos de comunicação serial RS485.
byte RX[4]; //Variavel que irá receber o valor de temperatura através da comunicação serial RS485.

//Constantes que habilitam ou não a transmissão e recepção de dados.
#define RS485transmit HIGH
#define RS485receive LOW

// variavel para armazenar a temperatura
float temp; 
//Variável para armazenar o tempo
unsigned long tempo =0 ;

En la configuración vacía iniciamos la comunicación con la pantalla LCD, configuramos como pin la salida que activa o no la recepción de datos a través de la comunicación RS485. Escriba un mensaje en la pantalla LCD.

void setup()
{
//velocidade comunicaçao serial
lcd.begin(20,4);

Serial.begin(9600);
RS485_serial.begin(9600);

pinMode(RS485_control,OUTPUT);

Serial.println(" Comunicacao RS485 ");

lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print(" COMUNICACAO RS485 ");
}

En la función de bucle vacío, el valor de la temperatura se recibe cada 500 ms.

void loop()
{

if((millis()-tempo)>500) Verifica se já passou 500 ms
{
lcd.clear();
tempo=millis(); Armazena o tempo atual
digitalWrite(RS485_control,RS485receive); habilita o modo de recepção de dados

if(RS485_serial.available () >0) Verifica se tem algum dado disponível na comunicação RS485
{
for (int i =0; i<4; i ++)
{
RX[i] = RS485_serial.read(); Leitura da serial RS485 e armazena os valores no vetor RX até a posição 4
}

Tome el byte 0 del vector RX multiplicado por 255 y agregue el byte 1 del vector RX y divida por 100 para obtener el valor de temperatura.

temp = ((RX[0] * 255) + RX[1]) /100; Conversão de temperatura
Serial.print(" Temperatura : ");
Serial.print( temp );
Serial.println(" *C ");
}
lcd.setBacklight(HIGH); //Liga o blacklight
lcd.setCursor(0,0); //Posiciona o cursor na linha 0 e coluna 0
lcd.print(" COMUNICACAO RS485 "); //Escreve a mensagem
lcd.setCursor(0,1); //Coluna 0 linha 1
lcd.print(" SENSOR DS18B20 "); //Escreve mensagem
lcd.setCursor(0,2); //Coluna 0 linha 2
lcd.print(" TEMP "); //Escreve a string Temp
lcd.setCursor(7,2); //Coluna 7 linha 2
lcd.print( temp);  //Escreve o valor de temperatura
lcd.setCursor(11,2);
lcd.print(" *C ");
}
}

Luego veremos el resultado del proyecto.

resultados del proyecto

Luego de haber programado el transmisor y el receptor, tendremos los siguientes resultados.

Conclusión

En este artículo, aprendimos cómo usar un nuevo sensor de temperatura, el DS18B20, y transmitir su valor de temperatura a otro Arduino usando comunicación RS485.

En nuestro artículo, no estamos utilizando ningún protocolo propietario, hemos desarrollado un protocolo de comunicación en serie simple para enviar y recibir datos.

Una gran bonificación de JLCPCB.COM

El JLCPCB quiere ofrecer 10 unidades de este PCB compatible con Arduino para sus proyectos por 2$ en su primer pedido con el enlace:Gana mis PCB compatibles con Arduino.

Fuente Arduino.cc