• Autor de la entrada:
  • Categoría de la entrada:Arduino

Las comunicaciones son clave en la sociedad actual y han tomado tanta importancia que casi todos llevamos en el bolsillo un Smartphone. En los últimos años hemos visto como se incrementa el I+D en IoT. Hemos visto la integración de grandes redes de sensores y actuadores interconectados, en su mayoría de manera inalámbrica, creando las ya denominadas como Smartcities. RS485 es un estándar que todavía tiene mucho que decir, por eso merece la pena que le demos una oportunidad al RS485 con Arduino.

Cuando nos enfrentamos a desarrollar un sistema que integra varios dispositivos que se tienen que comunicar entre sí, surgen infinidad de posibilidades desde el punto de vista del electrónico. De todas esas posibilidades, normalmente tocará elegir solo una.

En contadas ocasiones podrás montar sistemas de comunicación redundantes. Por el exceso de precio, por el exceso de espacio o simplemente porque no nos importa que un sistema cuente con la seguridad de ser redundante.

En electrónica industrial rara es la ocasión en la que no nos encontramos con el enemigo número uno del electrónico: el campo electromagnético. Y es que este nos proporcionará más de un quebradero de cabeza si no sabemos como tratarle. Si no lo tenemos en cuenta, afectará a nuestras comunicaciones.

MAX485 en protoboard para RS485 con Arduino
MAX485 en protoboard

El RS485 capa física

Uno de los estándares de comunicaciones altamente conocido en el mundo industrial es el RS485. Es ideal para las comunicaciones en áreas industriales donde tengamos ruido generado por campos electromagnéticos o donde tengamos que levantar redes multipunto de hasta 1200 metros. Si has leído bien, más de 1 Km de distancia

La característica que convierte al RS485 en el estándar de capa física ideal para la comunicación en entornos industriales y de hasta 1200 metros es que se trata de un estándar diferencial. En él no tenemos en cuenta la tensión en uno de los cables, si no que lo que mediremos será la diferencia de potencial entre los dos cables que integran el BUS.

Se pueden montar dos tipos de BUS el half-duplex y el duplex.

En half-duplex solo podemos un envió simultaneo, es decir o mandamos datos o recibimos datos y está formado por 2 cables.

En el duplex podremos enviar y recibir datos al mismo tiempo puesto que disponemos de 4 cables, dos para recibir y dos para transmitir.

Es una practica común y recomendada que cada par de cables, sea trenzado, es decir, que el half-duplex tendremos un par de cables trenzados y en el duplex tendremos dos pares de cables trenzados.

Sobre RS485 podemos enviar datos en bruto usando por ejemplo un puerto serie o podemos montar protocolos como MODBUS o algún similar.

Aprende a usar el módulo RS485 en Arduino

Para usar RS485 con un microcontrolador o con lo que quieras que disponga de puerto serie, puedes usar un módulo basado en el circuito integrado MAX485. Este te permitirá crear una red RS485.

A pesar de ser RS485, para ti será muy similar a trabajar con el puerto serie de por ejemplo Arduino. Por tanto montar una comunicación RS485 con Arduino es coser y cantar.

RS485 en Fritzing
RS485 en Fritzing

Conectar el módulo a Arduino es bastante sencillo, tenemos 6 pines, los cuales dos corresponden al puerto serie y se conectan así:

MAX485ArduinoDescripción
DITXEntrada de datos desde el mirco hacia MAX485
DORXSalida de datos provenientes del BUS hacia el micro
REPin 2Habilita la recepción de datos si está en estado bajo
DEPin 2Habilita la transmisión de datos hacia el BUS
VccVccAlimentación del MAX485
GNDGNDConexión de masa

Por último quedarán dos pines A y B que son los dos que componen el BUS del RS485, es decir, tendremos que conectar entre sí los las A de todos los MAX485 con un cable y todos las B con otro cable.

En el ejemplo que te presento en el vídeo tenemos un pulsador conectado en el pin digital 7 del Arduino UNO y un LED conectado en el pin 13 del Arduino MEGA.

Nuestro objetivo es que al presionar el pulsador del primer Arduino, este envíe una orden al otro Arduino para que encienda el LED, todo ellos medio de RS485.

Te animo a que veas el vídeo y más abajo te dejo los códigos para ambos Arduinos.


Usando RS485 con Arduino UNO – Ejemplo emisor

El procedimiento consiste en crear un puerto serie por software, inicializarlo a 9600 baudios y transmitir por ese puerto serie. Como se trata de un sistema semiduplex, antes de transmitir debemos activar la señal de transmisión con un digitalWrite. Enviar un dato, por ejemplo el carácter «A», es tan sencillo como usar el método write del puerto serie por software.

/*
RS485 sender
By: Enrique
Rincón Ingenieril
Date: June 16th, 2016
License: This code is public domain.
*/

#include<SoftwareSerial.h>

//SoftwareSerial pins
#define pinTX 4
#define pinRX 3
//MAX485 control pin
#define transmitir 2
//Button pin
#define pulsador 7

SoftwareSerial RS485(pinRX, pinTX);

void setup(){
//Initialize SoftwareSerial
RS485.begin(9600);
//Digital pins PinMode
pinMode(13,OUTPUT);
pinMode(transmitir, OUTPUT);
pinMode(pulsador, INPUT);
}

void loop(){
//If button is pressed
if(digitalRead(pulsador) == HIGH){
digitalWrite(13,HIGH);
digitalWrite(transmitir, HIGH);	//Enable max485 transmission
RS485.write('A');					//Write A cacharacter on Serial
digitalWrite(transmitir,LOW);		//Disable max485 transmission mode
delay(200);
digitalWrite(13,LOW);
}
}

Arduino MEGA – Ejemplo para receptor

Este código está diseñada para ser implementado en un Arduino Mega, sin embargo, se podría hacer en otro Arduino usando software serial igual que en transmisor.

En el loop esperamos a tener disponible un dato con available y una vez lo tenemos, lo leemos y almacenamos en la variable recibido. A continuación, usamos if para comprobar si el carácter que hemos recibido es el correcto, es decir, si es una «A». Si fuera afirmativo encendemos y apagamos el LED.

/*
RS485 receiver
By: Enrique
Rincón Ingenieril
Date: June 16th, 2016
License: This code is public domain.
*/

//Max485 transmission control
#define transmitir 2

#define led 13

void setup(){
Serial3.begin(9600);			//Initialize serial communication
pinMode(led, OUTPUT);			//Set LED and transmitir as output pins
pinMode(transmitir,OUTPUT);
digitalWrite(transmitir,LOW);
}

void loop(){
//If we receive something
if(Serial3.available() > 0){
char recibido = Serial3.read();
//If we receive an A
if(recibido == 'A'){
digitalWrite(led, HIGH); 		//Turn on the LED
delay(1000);
digitalWrite(led, LOW);
}
}
}

Seguro que aparte de aprender a usar RS485 con Arduino quieres aprender algo más, puedes echar un vistazo a todos los tutoriales de Arduino

Enrique Gómez

Ingeniero Electrónico Industrial y Automático, amante de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars, cuenta más de lo que parece. Puedes saber más sobre mi y sobre mis trabajos en www.enriquegomez.me