Publicado por el 25 junio, 2016 1 comentario
Dificultad bajaComplejidad baja
CC BY-SA 4.0

Las comunicaciones son clave en la sociedad actual y han tomado tanta importancia que casi todos llevamos en el bolsillo un Smartphone que nos permite hacer mil virguerías transmitiendo y recibiendo datos. En los últimos años se viene viendo 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 tratamos el RS485 con Arduino.


Cuando nos enfrentamos a deber desarrollar un sistema que integra varios dispositivos que se tienen que intercomunicar entre sí, surgen infinidad de posibilidades desde el punto de vista del electrónico y de todas esas posibilidades normalmente tocará elegir solo una y digo normalmente porque en contadas ocasiones podrás montar sistemas de comunicación redundantes o bien por el exceso de precio o bien por el exceso de espacio o en ocasiones simplemente 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 y en ocasiones aunque sepamos como tratarle y es que si no lo tenemos en cuenta, afectará a nuestras comunicaciones.

MAX485 en protoboard para RS485 con Arduino

MAX485 en protoboard

Uno de los estándares de comunicaciones altamente conocido en el mundo industrial es el RS485 que lo hace 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 el cual 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, es decir o mandamos datos o recibimos datos (está formado por 2 cables) y el duplex donde 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

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 que te permitirá crear una red RS485 pero que 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 y esto lo tenemos que hacer por 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 caracter “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 disponible, lo leemos y almacenamos en la variable recibido. En la siguiente línea usamos if para comprobar si el caracter que hemos recibido es el correcto, es decir, si es una “A”. En caso 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

Sobre el autor
Enrique Gómez
Amante de la ingeniería electrónica, de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars desde el principio. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario