Comunicación RS RS485 co con Ar Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Comunicación RS485 con Arduino
Posted by
7 Comments
ago 23, 2015
feb 19, 2015
jun 04,
Explic Explicare aremos mos como como usar usar los mód módulo ulos s RS4 RS485 85 e implem implement entare aremos mos vari varios os ejem ejempl plos os pa para ra comu comuni nica carr 2 Ardu Arduin ino o a trav través és de rs48 rs485, 5, desarrollaremos la comunicación simplex, full dúplex y half duplex.
2015
El protocolo RS485 es un protocolo industrial ampliamente utilizado porr su robu po robust stez ez,, fáci fácill impl implem emen enta taci ción ón y bu buen enas as pres presta taci cion ones es.. Utilizando RS485 como capa física 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 ago 06, 2016
jun 15, 2016
1 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
may 25, 2016
Utiliza esta pequeña rueda para tu... S/. 4,00 S/. 6,00
Este módulo 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 también desde la bornera Las salidas A y B son por donde se envían los datos, B es la negación de A, se envían los mismos datos pero en la línea B están negados, de esta forma se pueden restar ambas señales y eliminar el ruido y quedarnos solo con la señal de datos. El encargado de esta transmisión diferencial es el max485. Viéndolo desde el microcontrolador o Arduino, la comunicación se trabaja como una comunicación serial, trabajamos con los pines RX y TX; y dependiendo del tipo de conexión se puede usar un pin más para especificar si estamos enviando o recibiendo datos.
En esta configuración 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 envían los datos hacia el pin DI (Data Input) del módulo y este transmitirá los datos por los pines AB
Pantalla Oficial LCD Touch de 7 pulgadas d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
S/. 470,00
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Al conectar los pines RE y DE el modulo se comporta como Receptor, y los datos recibidos por AB estarán presentes en el pin RO(Receiver Output), conectando el pin RO del módulo al RX de nuestro Arduino podemos leer los datos recibidos.
Soporte para montaje en superficies paralelas a las guías de 8mm diámetro S/. 10,00
S/. 30,00
Una comunicación simplex es una comunicación unidireccional, en este caso un Arduino se comporta solo como transmisor y el otro solo como receptor, a nivel de programación es como si estuviéramos trabajando con una comunicación serial, pero en un solo sentido. Uno envía y el otro solo recibe datos. Veamos un ejemplo: Desde un Arduino a través de un potenciómetro moveremos un servomotor que estará conectado en otro Arduino, solo dos cables (salidas A y B del RS485) unirán a los Arduinos, si la distancia es larga se recomienda usar cable trenzado.
Rodamiento poliméric para guía de 8mm de diámetro S/. 15,00
El código del transmisor es el siguiente: void setup() 3 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
{ Serial.begin(9600);
} void loop() {
Cristal oscilador de 16 MHz de frecuencia. Utilizado en Arduino Uno,...
int lectura = analogRead(0);//leemos el valor del potenc iómetro (de 0 a 0!") b#te angulo= map(lectura$ 0$ 0!"$ 0$ %0);
// escal
amos la lectura a un valor de &ngulo (entre 0 # %0) Serial.'rite(angulo); //enviamos el &ngulo correspondien
S/. 2,00
te dela#(0); }
El código del Arduino receptor es el siguiente: include *+ervo.,-
Ideal para unir los extremos de nuestra correa GT2. S/. 10,00
+ervo m#servo;
// creamos el obeto servo
void setup() { Serial.begin(9600);
m#servo.attac,(9);
// asignamos el pin 9 para el servo.
} void loop() { i (Serial.available()) { int angulo = Serial.read(); //eemos el dato recibido
El módulo Relay te permite controlar el encendido/apagado de equipos de...
ango del servo
S/. 6,00
gulo correspondiente.
i(angulo*=%0) //veriicamos 1ue sea un valor en el r {
m#servo.'rite(angulo); //movemos el servomotor al &n } }
}
Sensor capacitivo te permite detectar objetos metálicos y no metálicos...
d 19
Como se observa es una simple comunicación serial, en el Arduino transmisor se hace la lectura del potenciómetro se lo escala y se lo envía serialmente, en el receptor recibimos el dato y movemos el servomotor. De esta forma podemos realizar una comunicación entre dos Arduino pero en una sola dirección, para hacerlo en dos direcciones tenemos dos formas, half-duplex y full-duplex 03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
S/. 40,00
En este caso necesitamos agregar otro par de líneas más, en total unirían a los Arduino 4 líneas, un par son para transmitir (TX) y otro par para recibir (RX). En el siguiente ejemplo desde un Arduino no solo enviaremos datos para mover un servomotor sino también recibiremos datos de un sensor, usaremos un potenciómetro para simular el sensor. Las conexiones serían 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 específicamente la definición de Maestro/Esclavo en una comunicación RS485 pero usaremos estas denominaciones para saber a qué Arduino nos estamos refiriendo. El código del Arduino Maestro.
const int led2in =
";
// 3umero del pin para el ed
void setup() { Serial.begin(9600);
pin4ode(led2in$ 5727);//iniciali8amos el pin del ed c omo salida } void loop() { i(Serial.available()) { d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
i(Serial.read()==i) //si recibimos el inicio de tra ma { int dato=Serial.parse:nt(); //recibimos valor numr ico i(Serial.read()==) //+i el in de trama es el c orrecto { uncion(dato);
//Reali8amos la acción correspond
iente } } } int lectura = analogRead(0);//leemos el valor del potenc iómetro (de 0 a 0!") int angulo= map(lectura$ 0$ 0!"$ 0$ %0); // escalamos la lectura a un valor de &ngulo (entre 0 # %0) //<<
el servo Serial.print(angulo); //&ngulo
o dato
Serial.print(>); //in de trama
//<<<<<<<<<<<<<<<<<<<<<<<<<<<< dela#(0); //<<
l sensor Serial.print(>); //in de trama
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< dela#(0); } //esta unción
puede variar de acuerdo a su necesidad
void uncion(int dato) { i(dato-00) digital?rite(led2in$ @:A@); else digital?rite(led2in$ 5?); }
Código del Arduino Esclavo:
6 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
include *+ervo.,+ervo m#servo;
// creamos el obeto servo
void setup() { Serial.begin(9600);
m#servo.attac,(9);
// asignamos el pin 9 para el servo.
} void loop() { i(Serial.available()-0) { i(Serial.read()==:) //+i recibimos el inicio de tra ma { c,ar uncion=Serial.read(); //leemos el car&cter de unción //<<<+i el car&cter de unción es una + entonces la trama es para mover el motor<<<<<<<<<<< i(uncion==+) { int angulo=Serial.parse:nt(); //recibimos el &n gulo i(Serial.read()==>) //+i el in de trama es el correcto { i(angulo*=%0) //veriicamos 1ue sea un valo r en el rango del servo {
m#servo.'rite(angulo); //movemos el servom
otor al &ngulo correspondiente. } } } //<<<+i el car&cter de unción
es entonces el ma
estro est& solicitando una lectura del sensor else i(uncion==) { i(Serial.read()==>) //+i el in de trama es e l correcto { int lectura = analogRead(0); //reali8amos
la
lectura del sensor //<<<
//<<<<<<<<<<<<<<<<<
d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
} } } } dela#(0); }
Como se observa se ha establecido una trama para la comunicación:
[Inicio de trama][Función][Valor][Fin de trama] En nuestro caso el inicio de trama es el carácter ‘A’ , la función es el carácter S o L para indicar que vamos a mover el servo o solicitar una lectura del sensor, el [valor] solo estará presente cuando la función necesite enviar una dato, y el fin de trama que usamos es el carácter F. Unos ejemplos de esta trama serian: “IS90F”,”IS120F”,”ILF”, etc. El esclavo interpreta esta trama y realiza la función correspondiente, si es una función que necesite responder, la trama de respuesta es:
[Inicio de trama][Valor][Fin de trama] , como por ejemplo “i865f”, “i64f”
En una comunicación half dúplex 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 comunicación los pines DE y RE del módulo RS485 deben ir conectados al Arduino, con esto desde el programa podemos establecer al módulo como transmisor o receptor
El siguiente ejemplo hace lo mismo que el ejemplo anterior solo que esta vez se usa un módulo rs485 por Arduino y un par de cables para comunicarse.
8 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Las conexiones serían 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.
Código del Maestro:
const int led2in =
";
const int Bn7C2in = void setup()
!;
// 3umero del pin para el ed // @:A@D7E # 5?DRE
{ Serial.begin(9600); Serial.set7imeout(00);//establecemos un tiempo de esper
a de 00ms //iniciali8amos los pines pin4ode(led2in$ 5727); pin4ode(Bn7C2in$ 5727); digital?rite(led2in$ 5?); digital?rite(Bn7C2in$ @:A@); } void loop() { int lectura = analogRead(0);//leemos el valor del potenc iómetro (de 0 a 0!") int angulo= map(lectura$ 0$ 0!"$ 0$ %0);// escalamos l a lectura a un valor de &ngulo (entre 0 # %0) //<<
d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Serial.print(+); //+ para indicarle 1ue vamos a mover
el servo Serial.print(angulo); //&ngulo
o dato
Serial.print(>); //in de trama
//<<<<<<<<<<<<<<<<<<<<<<<<<<<< dela#(0); //<<
l sensor Serial.print(>); //in de trama Serial.lus,();
//Bsperamos ,asta 1ue se envFen los d
atos //<<<<eemos la respuesta del Bsclavo<<<<< digital?rite(Bn7C2in$ 5?); //R+G% como receptor i(Serial.ind(i))//esperamos el inicio de trama { int dato=Serial.parse:nt(); //recibimos valor numri co i(Serial.read()==) //+i el in de trama es el co rrecto { uncion(dato);
//Reali8amos la acción correspond
iente } } digital?rite(Bn7C2in$ @:A@); //R+G% como 7ransmisor //<<<<<<<<<<in de la respuesta<<<<<<<<<<< } void uncion(int dato) { i(dato-00) digital?rite(led2in$ @:A@); else digital?rite(led2in$ 5?); }
Código de Esclavo:
include *+ervo.,+ervo m#servo;
// creamos el obeto servo
const int Bn7C2in =
!;
void setup() {
10 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Serial.begin(9600);
m#servo.attac,(9);
// asignamos el pin 9 para el servo.
pin4ode(Bn7C2in$ 5727); digital?rite(Bn7C2in$ 5?); //R+G% como receptor } void loop() { i(Serial.available()) { i(Serial.read()==:) //+i recibimos el inicio de tra ma { c,ar uncion=Serial.read();//leemos el car&cter de unción //<<<+i el car&cter de unción es una + entonces la trama es para mover el motor<<<<<<<<<<< i(uncion==+) { int angulo=Serial.parse:nt(); //recibimos el &n gulo i(Serial.read()==>) //+i el in de trama es el correcto { i(angulo*=%0) //veriicamos 1ue sea un valo r en el rango del servo {
m#servo.'rite(angulo); //movemos el servom
otor al &ngulo correspondiente. } } } //<<<+i el car&cter de unción
es entonces el ma
estro est& solicitando una lectura del sensor<<< else i(uncion==) { i(Serial.read()==>) //+i el in de trama es e l correcto { int lectura = analogRead(0);
//reali8amos
l
a lectura del sensor digital?rite(Bn7C2in$ @:A@);
//rsG% como tr
ansmisor Serial.print(i); //inicio de trama Serial.print(lectura); //valor del sensor Serial.print(); //in de trama Serial.lus,(); //Bsperamos ,asta 1ue se envF
en los datos
11 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
digital?rite(Bn7C2in$ 5?); //R+G% como rece ptor } } } } dela#(0); }
Como se observa el código cada vez que vamos a escribir o leer datos activamos o desactivamos respectivamente el pin que va conectado a DE y RE del módulo RS485. EL maestro siempre tiene activo la línea como transmisión pudiendo escribir en cualquier momento, mientras que el esclavo siempre está en modo recepción, escuchando los datos que le lleguen. Cuando el maestro necesite una respuesta por parte del esclavo, después 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.
Esta es la configuración más común que se usa, todos los Arduinos están conectados al mismo bus RS485, Un Arduino es maestro y todos los demás son Esclavos. Cada esclavo tiene una dirección el cual le identifica, el maestro para que pueda comunicarse con un esclavo usa esta dirección. El maestro envía la información por el bus y solo el esclavo con la dirección correcta es quien interpreta o procesa los datos. A continuación mostramos el mismo ejemplo que se está trabajando anteriormente, pero enfocado une una conexión multipunto. Las conexiones serían las siguientes
12 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
El ejemplo solo se muestra para un esclavo pero para los otros esclavos las conexiones son las mismas y en el código solo hay que tener en cuenta las direcciones de los esclavos. La diferencia con los casos anteriores es en la trama para la comunicación, ahora es necesario enviar la dirección del esclavo, quedando la trama de la siguiente forma:
[Inicio de trama][Dirección][Función][Valor][Fin de trama] La dirección es un número 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 dirección entonces realiza la función correspondiente, si es una función que necesite responder, en la trama de respuesta también agrega su dirección, esto para que el maestro sepa que ha respondido el esclavo correspondiente. La trama de respuesta es de la forma:
[Inicio de trama][Dirección] [, ] [Valor][Fin de trama] En este caso entre la dirección y el valor enviamos una coma como separador puesto que ambos son valores numéricos, unos ejemplo de trama serian: “i101,865f”, “i26,64f”
Código del Maestro:
const int led2in =
"; // 3umero del pin para el ed
const int Bn7C2in =
!; // @:A@D7E # 5?DRE
void setup() { Serial.begin(9600); Serial.set7imeout(00); //establecemos un tiempo de espe
ra de 00ms // iniciali8amos los pines pin4ode(led2in$ 5727); pin4ode(Bn7C2in$ 5727); digital?rite(led2in$ 5?); digital?rite(Bn7C2in$ @:A@); //R+G% como 7ransmisor } void loop() { int lectura = analogRead(0);//leemos el valor del potenc iómetro (de 0 a 0!") int angulo= map(lectura$ 0$ 0!"$ 0$ %0);// escalamos l
13 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
a lectura a un valor de &ngulo (entre 0 # %0) //<<
+ para indicarle 1ue vamos
a mover el servo Serial.print(angulo); //&ngulo
o dato
Serial.print(>); //in de trama
//<<<<<<<<<<<<<<<<<<<<<<<<<<<< dela#(0); //<<
l sensor Serial.print(>); //in de trama Serial.lus,();
//Bsperamos ,asta 1ue se envFen los d
atos //<<<<eemos la respuesta del Bsclavo<<<<< digital?rite(Bn7C2in$ 5?); //R+G% como receptor i(Serial.ind(i)) //esperamos el inicio de trama { int esclavo=Serial.parse:nt();
//recibimos la direc
cion del esclavo int dato=Serial.parse:nt();
//recibimos el dato
i(Serial.read()==HHesclavo==0) //si in de tra ma # direccion son los correctos { uncion(dato);
//reali8amos la acción con el da
to recibido } } digital?rite(Bn7C2in$ @:A@); //R+G% como 7ransmisor //<<<<<<<<<<in de la respuesta<<<<<<<<<< } void uncion(int dato) { i(dato-00) digital?rite(led2in$ @:A@); else digital?rite(led2in$ 5?); }
Código del Esclavo:
include *+ervo.,-
14 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
+ervo m#servo;
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
// creamos el obeto servo
const int Bn7C2in =
!;
// @:A@D7E # 5?DRE
const int m#direccion =0; //Iireccion del esclavo void setup() { Serial.begin(9600); Serial.set7imeout(00);
//establecemos un tiempo de esp
era de 00ms m#servo.attac,(9);
// asignamos el pin 9 para el servo.
pin4ode(Bn7C2in$ 5727); digital?rite(Bn7C2in$ 5?); //R+G% como receptor } void loop() { i(Serial.available()) { i(Serial.read()==:) //+i recibimos el inicio de tra ma { int direccion=Serial.parse:nt(); //recibimos la di reccion i(direccion==m#direccion) //+i direccion es la nu estra { c,ar uncion=Serial.read(); //leemos el car&ct er de unción //<<<+i el car&cter de unción es una + entonc es la trama es para mover el motor<<<<<<<<<<< i(uncion==+) { int angulo=Serial.parse:nt(); //recibimos el &ngulo i(Serial.read()==>) //+i el in de tra ma es el correcto { i(angulo*=%0) //veriicamos 1ue sea u n valor en el rango del servo {
m#servo.'rite(angulo); //movemos el
servomotor al &ngulo correspondiente. } } } //<<<+i el car&cter de unción
es entonces
el maestro est& solicitando una lectura del sensor<<< else i(uncion==) {
15 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
i(Serial.read()==>) //+i el in de tram a es el correcto { int lectura = analogRead(0); //reali8am os
la lectura del sensor digital?rite(Bn7C2in$ @:A@); //rsG% co
mo transmisor Serial.print(i); //inicio de trama Serial.print(m#direccion); //direccion Serial.print($); Serial.print(lectura); //valor del sens
or Serial.print(); //in de trama Serial.lus,(); //Bsperamos ,asta 1ue s
e envFen los datos digital?rite(Bn7C2in$ 5?); //R+G% com o receptor } } } } } dela#(0); }
El código para un segundo esclavo si se desea que tenga la misma función, en el código solo debe cambiar su dirección. En un próximo tutorial implementaremos el protocolo Modbus en Arduino.
Tags: 130
16 d 19
?
0
0
0
Com artir
3
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Diego jul 14, 2016 Hola enhorabuena por el aporte de información. Quería hacerle una pregunta sobre un proyecto en cuestión:1Quería controlar 3 motores brushless con un maestro y un esclavo con comunicación rs485. 2-En el maestro llevaría tres potenciómetros para cada uno de los motores. 3Según el valor se los potenciómetros tendría mayo o menor velocidad de los motores, cada uno de ellos gobernados independientemente con cada potenciómetro. 4- Llevaría algún sensor en el esclavo además de las conexiones de los motores. 5-También 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
Naylamp jul 15, 2016 Hola diego, según lo que explicas necesitas una comunicación maestro esclavo bidireccional, puedes usar una comunicación full dúplex si solo van a ser dos arduinos de esta forma trabajas como si fuese una comunicación serial simple entre arduinos (como en el ejemplo 2). También puedes usar una comunicación half dúplex como en los ejemplos 3 y 4. Saludos.
roberto sep 5, 2016 A mi me dejaron algo parecido, pero tengo que diseñar mi propio protocolo de comunicacion no se si me darias algun consejo? te lo agradeceria mucho
Alejandro jul 19, 2016 Interesante artículo! 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 magnético. Me gustaría 17 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
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!
Naylamp jul 20, 2016 Alejandro, si en tu proyecto necesitas trabajar con dispositivos industriales o piensas a futuro agregar más dispositivos al mismo bus es mejor trabajar con un protocolo estándar como el Modbus, de lo contrario puedes trabajar con tu propio protocolo.
Rodrick Diaz ago 5, 2016 Que buen tutorial, Gracias por compartir. Tengo una inquietud, implemente el ejemplo número 3 que se detalla en artículo, 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
Naylamp sep 2, 2016 Hola Rodrick, Te debería funcionar así la transmisión sea cada X tiempo, verifica que EnTxPin esté habilitándose y deshabilitándose 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 Ningún retraso.
* Name: * E-mail: (Not Published)
18 d 19
03/10/2016 18 42
Comunicación RS485 con Arduino
http://www.naylampmechatronics.com/blog/37_Comunicación-RS485...
Website: (Site url withhttp://) * Comment:
Submit
Introduzca su dirección de co
Naylamp Mechatronics, Trujillo Perú Llámanos ahora: 997646858 Email:
19 d 19
03/10/2016 18 42