Está en la página 1de 22

16/7/2017 Comunicacin RS485 con Arduino

Contacte con nosotros Iniciar sesin

Buscar

0
S/. 0,00

CATEGORAS
All Blog News Comunicacin RS485 con Arduino

ARTCULOS POPULARES

Tutorial trasmisor de celda de carga HX711, Balanza Digital ago 23, 2015

Con guracin del mdulo bluetooth HC-05 usando comandos AT ago 08, 2015

Tutorial Mdulo GPS con Arduino jun 25, 2015

ARTCULOS RECIENTES

Usando ESP8266 con el IDE de Arduino oct 21, 2016

Tutorial Sensor de Distancia SHARP sep 28, 2016

Arduino y ESP8266 como cliente web ago 24, 2016

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 1/22
16/7/2017 Comunicacin RS485 con Arduino

PROMOCIONES ESPECIALES
Mdulo PIR HC-SR501
Con este mdulo podrs detectar...

S/. 8,00 S/. 10,00

Todas los promociones especiales

ETIQUETAS

sensor robot cnc Servo infrarrojo LED LCD driver Fuente cable

NOVEDADES
Piezo Buzzer activo 12mm
Agrega alertas o efectos de sonido a tus proyectos

S/. 1,00

Piezo Buzzer activo 22mm


Agrega alertas o efectos de sonido a tus proyectos

S/. 7,00

Shield Display LCD TFT 3.5"


Pantalla de 3.5", colores vvidos, incluye lector de tarjetas microSD.

S/. 70,00

Mdulo expansor IO PCF8574


El PCF8574 es un expansor de E/S compatible con la mayora de...

S/. 12,00

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 2/22
16/7/2017 Comunicacin RS485 con Arduino
Sensor de presin BMP280
Sensor de presin baromtrica BMP280 de alta precisin y de bajo consumo...

S/. 15,00

Sensor de Presin, Temperatura y Humedad BME280


Sensor de monitoreo ambiental ideal para aplicaciones de Drones e...

S/. 28,00

Mdulo GY-91 MPU9250 + BMP280 : Acelermetro, Giroscopio, Magnetmetro, Altmetro I2C


Sensor ultra compacto de 10 grados de libertad (DoF)

S/. 50,00

Shield Relay v2
La manera ms sencilla y rpida de controlar cargas de alta corriente...

S/. 45,00

Todas los nuevos productos

Comunicacin RS485 con Arduino


Posted by Tutoriales 28 Comments

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 3/22
16/7/2017 Comunicacin RS485 con Arduino

Explicaremos como usar los mdulos RS485 e implementaremos varios ejemplos para
comunicar 2 Arduino a travs de rs485, desarrollaremos la comunicacin simplex, full
dplex y half duplex.

El protocolo RS485 es un protocolo industrial ampliamente utilizado por su robustez, fcil


implementacin y buenas prestaciones. Utilizando RS485 como capa fsica es posible
implementar un bus de campo industrial tipo MODBUS y DMX para el control de luces.
Usando RS485 podemos alcanzar distancias de 1Km y conectarnos al mimo bus hasta 32
dispositivos.
Para los ejemplos de este tutorial se usaran los siguientes mdulos RS4854

Este mdulo tiene acceso a todos los pines del max485 y tiene todos los componentes
adicionales para su correcto funcionamiento. Los pines A B se pueden conectar tambin
http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 4/22
16/7/2017 Comunicacin RS485 con Arduino

desde la bornera
Las salidas A y B son por donde se envan los datos, B es la negacin de A, se envan los
mismos datos pero en la lnea B estn negados, de esta forma se pueden restar ambas
seales y eliminar el ruido y quedarnos solo con la seal de datos. El encargado de esta
transmisin diferencial es el max485.
Vindolo desde el microcontrolador o Arduino, la comunicacin se trabaja como una
comunicacin serial, trabajamos con los pines RX y TX; y dependiendo del tipo de
conexin se puede usar un pin ms para especificar si estamos enviando o recibiendo
datos.

Usar le mdulo RS485 como transmisor


En esta configuracin el modulo solo trabaja como transmisor, para que el modulo sepa
que las salida A B se van a comportar como salida de datos, se tiene que conectar a 5V
los pines RE y DE. Desde el Arduino se envan los datos hacia el pin DI (Data Input) del
mdulo y este transmitir los datos por los pines AB

Usar el mdulo RS485 como receptor


Al conectar los pines RE y DE el modulo se comporta como Receptor, y los datos recibidos
por AB estarn presentes en el pin RO(Receiver Output), conectando el pin RO del mdulo
al RX de nuestro Arduino podemos leer los datos recibidos.

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 5/22
16/7/2017 Comunicacin RS485 con Arduino

1. Comunicacin Simplex entre dos Arduino con RS485


Una comunicacin simplex es una comunicacin unidireccional, en este caso un Arduino
se comporta solo como transmisor y el otro solo como receptor, a nivel de programacin es
como si estuviramos trabajando con una comunicacin serial, pero en un solo sentido.
Uno enva y el otro solo recibe datos.
Veamos un ejemplo:

Desde un Arduino a travs de un potencimetro moveremos un servomotor que estar


conectado en otro Arduino, solo dos cables (salidas A y B del RS485) unirn a los
Arduinos, si la distancia es larga se recomienda usar cable trenzado.

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 6/22
16/7/2017 Comunicacin RS485 con Arduino

El cdigo del transmisor es el siguiente:

void setup()
{
Serial.begin(9600);
}

void loop()
{
int lectura = analogRead(0);//leemos el valor del potencimetro (de 0 a 1023)
byte angulo= map(lectura, 0, 1023, 0, 180); // escalamos la lectura a un valor de ngulo (entre
0 y 180)
Serial.write(angulo); //enviamos el ngulo correspondiente
delay(50);
}

El cdigo del Arduino receptor es el siguiente:

#include <Servo.h>

Servo myservo; // creamos el objeto servo

void setup()
{
Serial.begin(9600);
myservo.attach(9); // asignamos el pin 9 para el servo.
}

void loop()
{

if (Serial.available()) {
int angulo = Serial.read(); //Leemos el dato recibido
if(angulo<=180) //verificamos que sea un valor en el rango del servo
{
myservo.write(angulo); //movemos el servomotor al ngulo correspondiente.
}
}
}

Como se observa es una simple comunicacin serial, en el Arduino transmisor se hace la


lectura del potencimetro se lo escala y se lo enva serialmente, en el receptor recibimos el
dato y movemos el servomotor.
De esta forma podemos realizar una comunicacin entre dos Arduino pero en una sola
direccin, para hacerlo en dos direcciones tenemos dos formas, half-duplex y full-duplex

2. Comunicacin full dplex entre arduinos.


En este caso necesitamos agregar otro par de lneas ms, en total uniran a los Arduino 4
lneas, un par son para transmitir (TX) y otro par para recibir (RX).
http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 7/22
16/7/2017 Comunicacin RS485 con Arduino

En el siguiente ejemplo desde un Arduino no solo enviaremos datos para mover un


servomotor sino tambin recibiremos datos de un sensor, usaremos un potencimetro para
simular el sensor.
Las conexiones seran las siguientes:

Al Arduino de la izquierda, lo llamaremos Maestro, pues es el Arduino principal y quien


administrara todas las rdenes, mientras que el segundo Arduino lo denominaremos
Esclavo; esta no es especficamente la definicin de Maestro/Esclavo en una
comunicacin RS485 pero usaremos estas denominaciones para saber a qu Arduino nos
estamos refiriendo.
El cdigo del Arduino Maestro.

const int ledPin = 13; // Numero del pin para el Led


void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);//inicializamos el pin del Led como salida
}

void loop()
{
if(Serial.available())
{
if(Serial.read()=='i') //si recibimos el inicio de trama
{

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 8/22
16/7/2017 Comunicacin RS485 con Arduino

int dato=Serial.parseInt(); //recibimos valor numrico


if(Serial.read()=='f') //Si el fin de trama es el correcto
{
funcion(dato); //Realizamos la accin correspondiente
}
}
}

int lectura = analogRead(0);//leemos el valor del potencimetro (de 0 a 1023)


int angulo= map(lectura, 0, 1023, 0, 180); // escalamos la lectura a un valor de ngulo (entre 0 y
180)
//---enviamos el ngulo para mover el servo------
Serial.print("I"); //inicio de trama
Serial.print("S"); //S para indicarle que vamos a mover el servo
Serial.print(angulo); //ngulo o dato
Serial.print("F"); //fin de trama
//----------------------------
delay(50);
//---solicitamos una lectura del sensor----------
Serial.print("I"); //inicio de trama
Serial.print("L"); //L para indicarle que vamos a Leer el sensor
Serial.print("F"); //fin de trama
//------------------------------------------------
delay(50);

//esta funcin puede variar de acuerdo a su necesidad


void funcion(int dato)
{
if(dato>500)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
}

Cdigo del Arduino Esclavo:

#include <Servo.h>

Servo myservo; // creamos el objeto servo

void setup()
{
Serial.begin(9600);
myservo.attach(9); // asignamos el pin 9 para el servo.
}

void loop()
{
if(Serial.available()>0)
{
if(Serial.read()=='I') //Si recibimos el inicio de trama
{
char funcion=Serial.read(); //leemos el carcter de funcin
//---Si el carcter de funcin es una S entonces la trama es para mover el motor-----------
http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 9/22
16/7/2017 Comunicacin RS485 con Arduino

if(funcion=='S')
{
int angulo=Serial.parseInt(); //recibimos el ngulo
if(Serial.read()=='F') //Si el fin de trama es el correcto
{
if(angulo<=180) //verificamos que sea un valor en el rango del servo
{
myservo.write(angulo); //movemos el servomotor al ngulo correspondiente.
}
}
}
//---Si el carcter de funcin es L entonces el maestro est solicitando una lectura del sens
or
else if(funcion=='L')
{
if(Serial.read()=='F') //Si el fin de trama es el correcto
{
int lectura = analogRead(0); //realizamos la lectura del sensor
//----enviamos la respuesta-----
Serial.print("i"); //inicio de trama
Serial.print(lectura); //valor del sensor
Serial.print("f"); //fin de trama
//-----------------
}
}
}
}
delay(10);
}

Como se observa se ha establecido una trama para la comunicacin:


[Inicio de trama][Funcin][Valor][Fin de trama]
En nuestro caso el inicio de trama es el carcter A , la funcin es el carcter S o L para
indicar que vamos a mover el servo o solicitar una lectura del sensor, el [valor] solo estar
presente cuando la funcin necesite enviar una dato, y el fin de trama que usamos es el
carcter F. Unos ejemplos de esta trama serian: IS90F,IS120F,ILF, etc.
El esclavo interpreta esta trama y realiza la funcin correspondiente, si es una funcin que
necesite responder, la trama de respuesta es:
[Inicio de trama][Valor][Fin de trama] , como por ejemplo i865f, i64f

3. Comunicacin half dplex entre arduinos.


En una comunicacin half dplex utiliza un solo canal para comunicarse, en un momento
por el canal se transmiten datos y en otro momento se reciben datos, pero nunca
podremos transmitir y recibir a la vez.
Para realizar esta comunicacin los pines DE y RE del mdulo RS485 deben ir conectados
al Arduino, con esto desde el programa podemos establecer al mdulo como transmisor o
receptor

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 10/22
16/7/2017 Comunicacin RS485 con Arduino

El siguiente ejemplo hace lo mismo que el ejemplo anterior solo que esta vez se usa un
mdulo rs485 por Arduino y un par de cables para comunicarse.

Las conexiones seran las siguientes:

Al igual que en el caso anterior el Arduino de la izquierda ser el maestro y el de la


derecha ser el esclavo.
http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 11/22
16/7/2017 Comunicacin RS485 con Arduino

Cdigo del Maestro:

const int ledPin = 13; // Numero del pin para el Led


const int EnTxPin = 2; // HIGH:TX y LOW:RX
void setup()
{
Serial.begin(9600);
Serial.setTimeout(100);//establecemos un tiempo de espera de 100ms
//inicializamos los pines
pinMode(ledPin, OUTPUT);
pinMode(EnTxPin, OUTPUT);
digitalWrite(ledPin, LOW);
digitalWrite(EnTxPin, HIGH);
}

void loop()
{

int lectura = analogRead(0);//leemos el valor del potencimetro (de 0 a 1023)


int angulo= map(lectura, 0, 1023, 0, 180);// escalamos la lectura a un valor de ngulo (entre 0 y 1
80)
//---enviamos el ngulo para mover el servo------
Serial.print("I"); //inicio de trama
Serial.print("S"); //S para indicarle que vamos a mover el servo
Serial.print(angulo); //ngulo o dato
Serial.print("F"); //fin de trama
//----------------------------
delay(50);
//---solicitamos una lectura del sensor----------
Serial.print("I"); //inicio de trama
Serial.print("L"); //L para indicarle que vamos a Leer el sensor
Serial.print("F"); //fin de trama
Serial.flush(); //Esperamos hasta que se enven los datos
//----Leemos la respuesta del Esclavo-----
digitalWrite(EnTxPin, LOW); //RS485 como receptor
if(Serial.find("i"))//esperamos el inicio de trama
{
int dato=Serial.parseInt(); //recibimos valor numrico
if(Serial.read()=='f') //Si el fin de trama es el correcto
{
funcion(dato); //Realizamos la accin correspondiente
}

}
digitalWrite(EnTxPin, HIGH); //RS485 como Transmisor
//----------fin de la respuesta-----------

}
void funcion(int dato)
{
if(dato>500)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 12/22
16/7/2017 Comunicacin RS485 con Arduino

Cdigo de Esclavo:

#include <Servo.h>

Servo myservo; // creamos el objeto servo


const int EnTxPin = 2;
void setup()
{
Serial.begin(9600);
myservo.attach(9); // asignamos el pin 9 para el servo.
pinMode(EnTxPin, OUTPUT);
digitalWrite(EnTxPin, LOW); //RS485 como receptor
}

void loop()
{
if(Serial.available())
{
if(Serial.read()=='I') //Si recibimos el inicio de trama
{

char funcion=Serial.read();//leemos el carcter de funcin


//---Si el carcter de funcin es una S entonces la trama es para mover el motor-----------
if(funcion=='S')
{
int angulo=Serial.parseInt(); //recibimos el ngulo
if(Serial.read()=='F') //Si el fin de trama es el correcto
{
if(angulo<=180) //verificamos que sea un valor en el rango del servo
{
myservo.write(angulo); //movemos el servomotor al ngulo correspondiente.
}
}
}
//---Si el carcter de funcin es L entonces el maestro est solicitando una lectura del sens
or---
else if(funcion=='L')
{
if(Serial.read()=='F') //Si el fin de trama es el correcto
{
int lectura = analogRead(0); //realizamos la lectura del sensor
digitalWrite(EnTxPin, HIGH); //rs485 como transmisor
Serial.print("i"); //inicio de trama
Serial.print(lectura); //valor del sensor
Serial.print("f"); //fin de trama
Serial.flush(); //Esperamos hasta que se enven los datos
digitalWrite(EnTxPin, LOW); //RS485 como receptor
}
}
}
}
delay(10);
}

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 13/22
16/7/2017 Comunicacin RS485 con Arduino

Como se observa el cdigo cada vez que vamos a escribir o leer datos activamos o
desactivamos respectivamente el pin que va conectado a DE y RE del mdulo RS485.
EL maestro siempre tiene activo la lnea como transmisin pudiendo escribir en cualquier
momento, mientras que el esclavo siempre est en modo recepcin, escuchando los datos
que le lleguen. Cuando el maestro necesite una respuesta por parte del esclavo, despus
de enviar la consulta, debe cambiar a modo de receptor para que el esclavo puede usar el
canal para transmitir los datos, finalizado la respuesta, el maestro nuevamente debe tener
libre el canal para transmitir.

4. Comunicacin half dplex entre varios arduinos.


Esta es la configuracin ms comn que se usa, todos los Arduinos estn conectados al
mismo bus RS485, Un Arduino es maestro y todos los dems son Esclavos. Cada esclavo
tiene una direccin el cual le identifica, el maestro para que pueda comunicarse con un
esclavo usa esta direccin. El maestro enva la informacin por el bus y solo el esclavo
con la direccin correcta es quien interpreta o procesa los datos.
A continuacin mostramos el mismo ejemplo que se est trabajando anteriormente, pero
enfocado une una conexin multipunto.
Las conexiones seran las siguientes

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 14/22
16/7/2017 Comunicacin RS485 con Arduino

El ejemplo solo se muestra para un esclavo pero para los otros esclavos las conexiones
son las mismas y en el cdigo solo hay que tener en cuenta las direcciones de los
esclavos.
La diferencia con los casos anteriores es en la trama para la comunicacin, ahora es
necesario enviar la direccin del esclavo, quedando la trama de la siguiente forma:
[Inicio de trama][Direccin][Funcin][Valor][Fin de trama]
La direccin es un nmero entero e indica con cual esclavo nos queremos comunicar.
Ejemplos de esta trama serian: I101S90F,I25S120F,I223LF, etc.
El esclavo interpreta esta trama y si coincide su direccin entonces realiza la funcin
correspondiente, si es una funcin que necesite responder, en la trama de respuesta
tambin agrega su direccin, esto para que el maestro sepa que ha respondido el esclavo
correspondiente. La trama de respuesta es de la forma:
[Inicio de trama][Direccin] [, ] [Valor][Fin de trama]
En este caso entre la direccin y el valor enviamos una coma como separador puesto que
ambos son valores numricos, unos ejemplo de trama serian: i101,865f, i26,64f

Cdigo del Maestro:

const int ledPin = 13; // Numero del pin para el Led


const int EnTxPin = 2; // HIGH:TX y LOW:RX
void setup()
{
Serial.begin(9600);
Serial.setTimeout(100); //establecemos un tiempo de espera de 100ms
// inicializamos los pines
pinMode(ledPin, OUTPUT);
pinMode(EnTxPin, OUTPUT);
digitalWrite(ledPin, LOW);
digitalWrite(EnTxPin, HIGH); //RS485 como Transmisor
}

void loop()
{

int lectura = analogRead(0);//leemos el valor del potencimetro (de 0 a 1023)


int angulo= map(lectura, 0, 1023, 0, 180);// escalamos la lectura a un valor de ngulo (entre 0 y 1
80)
//---enviamos el ngulo para mover el servo------
Serial.print("I"); //inicio de trama
Serial.print("101");//direccin del esclavo
Serial.print("S"); //funcin S para indicarle que vamos a mover el servo
Serial.print(angulo); //ngulo o dato
Serial.print("F"); //fin de trama
//----------------------------
delay(50);
//---solicitamos una lectura del sensor----------
Serial.print("I"); //inicio de trama
Serial.print("101");//direccion del esclavo
Serial.print("L"); //L para indicarle que vamos a Leer el sensor

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 15/22
16/7/2017 Comunicacin RS485 con Arduino

Serial.print("F"); //fin de trama


Serial.flush(); //Esperamos hasta que se enven los datos
//----Leemos la respuesta del Esclavo-----
digitalWrite(EnTxPin, LOW); //RS485 como receptor
if(Serial.find("i")) //esperamos el inicio de trama
{
int esclavo=Serial.parseInt(); //recibimos la direccion del esclavo
int dato=Serial.parseInt(); //recibimos el dato
if(Serial.read()=='f'&&esclavo==101) //si fin de trama y direccion son los correctos
{
funcion(dato); //realizamos la accin con el dato recibido
}
}
digitalWrite(EnTxPin, HIGH); //RS485 como Transmisor
//----------fin de la respuesta----------

}
void funcion(int dato)
{
if(dato>500)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
}

Cdigo del Esclavo:

#include <Servo.h>

Servo myservo; // creamos el objeto servo


const int EnTxPin = 2; // HIGH:TX y LOW:RX
const int mydireccion =101; //Direccion del esclavo
void setup()
{
Serial.begin(9600);
Serial.setTimeout(100); //establecemos un tiempo de espera de 100ms
myservo.attach(9); // asignamos el pin 9 para el servo.
pinMode(EnTxPin, OUTPUT);
digitalWrite(EnTxPin, LOW); //RS485 como receptor
}

void loop()
{
if(Serial.available())
{
if(Serial.read()=='I') //Si recibimos el inicio de trama
{
int direccion=Serial.parseInt(); //recibimos la direccion
if(direccion==mydireccion) //Si direccion es la nuestra
{
char funcion=Serial.read(); //leemos el carcter de funcin

//---Si el carcter de funcin es una S entonces la trama es para mover el motor---------


--
if(funcion=='S')
{
http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 16/22
16/7/2017 Comunicacin RS485 con Arduino

int angulo=Serial.parseInt(); //recibimos el ngulo


if(Serial.read()=='F') //Si el fin de trama es el correcto
{
if(angulo<=180) //verificamos que sea un valor en el rango del servo
{
myservo.write(angulo); //movemos el servomotor al ngulo correspondiente.
}
}
}
//---Si el carcter de funcin es L entonces el maestro est solicitando una lectura de
l sensor---
else if(funcion=='L')
{
if(Serial.read()=='F') //Si el fin de trama es el correcto
{
int lectura = analogRead(0); //realizamos la lectura del sensor
digitalWrite(EnTxPin, HIGH); //rs485 como transmisor
Serial.print("i"); //inicio de trama
Serial.print(mydireccion); //direccion
Serial.print(",");
Serial.print(lectura); //valor del sensor
Serial.print("f"); //fin de trama
Serial.flush(); //Esperamos hasta que se enven los datos
digitalWrite(EnTxPin, LOW); //RS485 como receptor
}
}
}
}
}
delay(10);
}

El cdigo para un segundo esclavo si se desea que tenga la misma funcin, en el cdigo
solo debe cambiar su direccin.
En un prximo tutorial implementaremos el protocolo Modbus en Arduino.

Pueden adquirir los materiales usados en este tutorial en


nuestra tienda
-Arduino Uno R3
-Mdulo RS485
Tags: comunicacin rs485

142 ? ? 0 ? Compartir 5

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 17/22
16/7/2017 Comunicacin RS485 con Arduino

28 Comments

Diego
jul 14, 2016

Hola enhorabuena por el aporte de informacin. Quera hacerle una pregunta sobre un proyecto en
cuestin:1- Quera controlar 3 motores brushless con un maestro y un esclavo con comunicacin
rs485. 2-En el maestro llevara tres potencimetros para cada uno de los motores. 3- Segn el
valor se los potencimetros tendra mayo o menor velocidad de los motores, cada uno de ellos
gobernados independientemente con cada potencimetro. 4- Llevara algn sensor en el esclavo
adems de las conexiones de los motores. 5-Tambin la posibilidad de activar desde el maestro
tres salidas en el esclavo.Es decir, los valores que tenga en las entradas del maestro se escriben
en las salidas del esclavo.Gracias de antemano Enhorabuena por vuestra web Un saludo Diego

Reply

Naylamp
jul 15, 2016

Hola diego, segn lo que explicas necesitas una comunicacin maestro esclavo
bidireccional, puedes usar una comunicacin full dplex si solo van a ser dos
arduinos de esta forma trabajas como si fuese una comunicacin serial simple entre
arduinos (como en el ejemplo 2). Tambin puedes usar una comunicacin half
dplex como en los ejemplos 3 y 4. Saludos.

Reply

roberto
sep 5, 2016

A mi me dejaron algo parecido, pero tengo que disear mi propio


protocolo de comunicacion no se si me darias algun consejo? te lo
agradeceria mucho

Reply

Alejandro
jul 19, 2016

Interesante artculo! Estoy en un proyecto similar al que propone Diego, solo que en mi caso se
trata de un maestro y dos esclavos para controlar algunos motores de paso, un servomotor y un
sensor magntico. Me gustara saber si es mejor trabajar con un protocolo propuesto por mi o
trabajar con Modbus RTU (del cual no tengo mucho conocimiento). Un cordial saludo!

Reply

Naylamp
jul 20, 2016

Alejandro, si en tu proyecto necesitas trabajar con dispositivos industriales o


piensas a futuro agregar ms dispositivos al mismo bus es mejor trabajar con un
protocolo estndar como el Modbus, de lo contrario puedes trabajar con tu propio
protocolo.

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 18/22
16/7/2017 Comunicacin RS485 con Arduino

Reply

Rodrick Diaz
ago 5, 2016

Que buen tutorial, Gracias por compartir. Tengo una inquietud, implemente el ejemplo nmero 3
que se detalla en artculo, y quise modificar solo para pedir la lectura del sensor y me funciona, el
detalle es cuando quise pedir el dato del senor cada X tiempo, no logro hacer que funcione alguna
idea. Gracias, Saludos

Reply

Naylamp
sep 2, 2016

Hola Rodrick, Te debera funcionar as la transmisin sea cada X tiempo, verifica


que EnTxPin est habilitndose y deshabilitndose en el momento correcto. Las
modificaciones de tiempo solo deben ser en el programa del maestro. El esclavo
debe de responder tan pronto le solicite el Maestro, sin Ningn retraso.

Reply

VICTOR
nov 20, 2016

HOLA MUCHAS GRACIAS ESTA MUY BUENO PERO TENGO UN SOLO PROBLEMA
Comunicacin half dplex entre varios arduinos TIENES UN COMANDO QUE ME DA ERROR
BUENO QUE NO EXISTE ......funcion(dato); //realizamos la accin con el dato recibido PODRIAS
AYUDARME CON ESO QUE ES LO UNICO QUE ME FALTA POR QUE COMO TE COMENTO EL
PROGRAMA NO ME RECONOCE ESO

Reply

victor
nov 23, 2016

ya encontre el error

Reply

Alejandro Lpez
nov 23, 2016

Hola amigo, muchas gracias por el post. Pienso implementar una comunicacin half dplex con un
maestro y varios esclavos, en los esclavos van conectados unos sensores y el maestro le pide
datos cada x tiempo, la cuestin es si como lo estoy pensando es posible (Entend bien lo que
propones ? jeje), Segn entiendo el esclavo le puede enviar informacin al maestro siempre y
cuando este se la pida.Ahora bien, hablando de la parte fsica, en la half dplex se hace un simple
empalme entre los cables?

Reply

Naylamp
nov 30, 2016

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 19/22
16/7/2017 Comunicacin RS485 con Arduino

Hola Alejandro. Si, solo basta con conectarse a los dos cables respectivos del bus,
puedes usar cualquier empalme o apoyarte de las borneras de cada mdulo.

Reply

Joaqun Alarte
dic 6, 2016

Mejor, y ms claro de explicar imposible, un gran post. Pero tengo una cuestin, el mdulo RS485
que ustedes proponen, trabaja con placas compatibles (no oficiales de Arduino). Gracias por el
post!!!

Reply

Naylamp
dic 14, 2016

Hola Joaquin, Si, le ejemplo trabaja con cualquier placa que soporte el IDE arduino
como Arduino UNO, Nano, Mini, Micro, MEGA, ESP8266, NodeMCU etc.

Reply

Adrian Pugliesso
ene 2, 2017

Tengo el esquema armado y me anda perfecto. Entre placa y placa tienen un cableado de unos 50
a 70mts y funcionan bien. Estoy teniendo un problema los dias de tormenta siempre se me daa
alguna plaquita RS485, es como si por el cable de datos A, B se metieras las descargas de la
tormenta y le daan algo a la placa (no la queman) pero es como si quedara transmitiendo datos
erroneos. A Alguien le paso esto? como lo puedo solucionar?

Reply

Antonio C.
ene 15, 2017

Saludos. En primer lugar, enhorabuena y muchas gracias por este post y por los dems. Son
claros, bien explicados y fciles de seguir. Estoy haciendo un proyecto en el que necesito activar
unos reles desde un puesto central, distante unos 8 metros de estos. Comenc la construccin
siguiendo tus explicaciones de la "Comunicacin Half-Duplex entre Arduinos" y utilizando un
Arduino UNO como Maestro y Arduino NANO en cada esclavo. Al conectar todo en el primero de
ellos y probar todo fue perfecto. Sin embargo no he conseguido que funcione un segundo. He
revisado y sustituido el cableado, he intercambiado las placas NANO, he intercambiado las placas
RS485 y siempre he obtenido el mismo y frustrante resultado. El "puesto" que funciona SIEMPRE
funciona (con cualquier placa) y el que no funciona NUNCA funciona. He instalado una pantalla
que me confirma el comando enviado, incluyendo la direccin y, aunque se produce el pequeo
"destello en ambas placas NANO de que algo ha llegado, el resultado siempre es el mismo. Hay
algo adicional a comprobar o instalar? Gracias de antemano y disculpa la perorata.

Reply

Adal
mar 22, 2017

Que tal Antonio C. ya que toda la operacin entre arduinos se realiza de forma
correcta, me gustara saber si tienes conectados los relevadores a una fuente
http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 20/22
16/7/2017 Comunicacin RS485 con Arduino

externa y activados por transistor, ya que si los tienes directo a la arduino no tiene la
corriente necesaria para activar la bobina.

Reply

RAUL JORGE
ene 24, 2017

excelente...gracias quisiera saber como puedo implementar el protocolo Modbus en Arduino.

Reply

Naylamp
feb 17, 2017

Hola Ral, el concepto es el mismo, puedes usar la siguiente librera:


https://github.com/4-20ma/ModbusMaster

Reply

Josue
ene 28, 2017

Hola que tal Me interesa realizar algo parecido, pero mi intension, es comunicar un arduino con
un plc delta, y desde el arduino activar bobinas, leer y modificar registros del PLC, no se si sea
posible, Gracias.

Reply

Ginno
mar 6, 2017

Tema: protocolo Modbus en Arduinohola muchas gracias por los aportes que brindas, tienes
disponible ... con libreras ModBus??? un ejemplo que nos sirva... Gracias de antemano.

Reply

Naylamp
mar 21, 2017

Hola Ginno, an no hemos experimentado con Modbus en Arduino, pero puedes


usar la siguiente librera: https://github.com/4-20ma/ModbusMaster, cuya
documentacin est en: ModbusMaster

Reply

Pugliesso Adrian
mar 13, 2017

Como puedo proteger la entrada de seal A-B para que no se me queme placa por descargas
estaticas o electricas en la linea de conexion entre los modulos. Sabes si hay que poner los
arduinos o las plaquitas rs485 a tierra???

Reply

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 21/22
16/7/2017 Comunicacin RS485 con Arduino

Naylamp
mar 21, 2017

Hola Pugliesso, puedes usar cable blindado o apantallado, es suficiente con


conectar un extremo a tierra (case).

Reply

Golfonauta
mar 22, 2017

Hola,Gracias por las explicaciones.quiero conectar varios arduinos con el metodo half duplex, mi
pregunta es como podra acompaar este bus con otros 2 cables para alimentar todos los arduinos
(alguno a 20 metros del principal / fuente de alimentacin)Gracias

Reply

Freddy Portillo
jun 28, 2017

Hola amigos buen post, no quiero que me resuelvan las cosas pero estoy tratando de hacer una
interfaz para manejar luces DMX a travez de wifi con protocolo arnet. He conseguido casi todo lo
que no encuentro es un ejemplo de como conectar arduino uno y el modulo 485 y sus salidas a el
canon. Si tienes algun ejemplo les agradezco.

Reply

Luis
jul 10, 2017

Muy buen aporte estimado, voy a guiarme de tu ejemplo para hacer mis pruebas, solo como
comentario, RS485 no es un protocolo, es un estandar de comunicacin, protocolo es Modbus
RTU, DeviceNet, etc...

Reply

Jorge
jul 11, 2017

Excelente aporte, podrian ayudarme mi cuestion es que la comunicacion funciona muy bien pero
entre 2 arduinos, como hago para comunicar 5 esclavos con el master , el master va llamando uno
por uno y esperando la repuesta de cada uno y ahi si llama al siguiente, pero no me funciona
Agradezco de su ayuda, gracias...

Reply

Leave a Reply
* Name:

* E-mail:
(Not Published)

Website:
(Site url withhttp://)

http://www.naylampmechatronics.com/blog/37_Comunicaci%C3%B3n-RS485-con-Arduino.html 22/22