Anda di halaman 1dari 10

Comunicacin RS485 con Arduino

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.
Usando RS485 podemos alcanzar distancias de 1Km y conectarnos al mimo
bus hasta 32 dispositivos.
Para la prctica se usaran los 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 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.

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

e
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 180)
//---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
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')
{
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 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.

Estoy trabajando en un proyecto de comunicacin serie con arduino uno. He


estado revisando los posts que hay sobre este tema pero ninguna refleja
exactamente mi problema.
Se trata de un sistema que consta de una mquina a la que se encuentra
conectados varios dispositivos de tal forma que la mquina enva rdenes a
los dispositivos y stos le comunican una respuesta a dicha orden.
Dicha comunicacin se trata de una comunicacin half duplex y asncrona a
9600 baudios, 1bit de start, 8 bits de datos, sin paridad y 1 bit de stop. El
protocolo de comunicacin que se utiliza se llama ccTalk.
Ejemplo:
Orden -> 002 001 001 228 001 023
253

Respuesta -> 001 000 002 000

La orden que transmite la mquina y la posterior respuesta del dispositivo


se transmiten por un solo cable, primero la mquina manda la orden
completa y a continuacin el dispositivo hace lo mismo con la respuesta.
La idea del proyecto es utilizar el Arduino UNO para que simule a los
dispositivos, es decir que reciba las rdenes de la mquina y sea capaz de
enviar una respuesta a dicha orden.
Hasta ahora he conseguido crear un .vi que lee las rdenes provenientes de
la mquina y un "sub .vi" que transmite las respuestas, pero no consigo
transmitirle la respuesta y la verdad es que no se como hacerlo.
Addjunto imagenes y el sub.vi de lectura y respuesta (dispositivos) para
aclarar ms el problema.
RS232, TRASMISION BALANCEADA, SINGLE ENDED
Esta norma fue diseada para comunicacin punto a punto, en donde se
tiene una computadora (en la norma RS232 se le denomina DTE, Data
Terminal Equipment) que se encuentra trasmitiendo hacia un equipo esclavo
(en la norma conocido como DCE, Data Communications Equipment)
ubicado a distancias no mayores a 15 metros (aunque en la prctica alcanza
distancias de hasta 50 metros) y a una velocidad mxima de 19,200 bps.

Este tipo de trasmisin se le conoce como "single ended" porque usa en el


cable un solo retorno (GND). Es un modo de trasmisin muy simple, pero
tambin vulnerable al ruido aditivo en la lnea y por esa razn es empleada
para comunicacin a distancias cortas.
En general, en la trasmisin RS232, las cadenas de datos son caracteres
ASCII, los cuales incluyen los cdigos de letras, nmeros y signos de
puntuacin, adems de caracteres especiales. Se trata de un estndar
orientado a la trasmisin de texto.
El formato de trasmisin de datos en las seales TX y RX del estndar
RS232, se muestra en la figura de abajo. Se trata de una seal serial bipolar,
normalmente entre +10 y -10 volts, con formato asncrono (explicado ms
abajo). En el ejemplo se trasmite el cdigo ASCII de la "A" (01000001).
Observe que sigue una lgica negativa, con un nivel alto para el valor 0
lgico y un nivel bajo para el 1. El circuito integrado estndar para generar
esta seal es el MAX232N.
El bit de inicio (Start bit) tiene como funcin proporcionar, mediante el
flanco ascendente, la seal de sincrona para que el circuito receptor pueda
muestrear el resto de los 8 bits de datos. La velocidad de trasmisin define
el perodo de cada uno de los bits. Por ejemplo, una velocidad de 1200 bps
opera con una duracin de 833 us por cada bit. A 9600 bps, se tendran 104
us por bit.
Al final de la trama de 8 bits, se generan los llamados bits de paro (Stop
bits) cuya funcin es regresar la seal al estado bajo para preparar el
siguiente flanco ascendente del bit de inicio. La trasmisin se conoce como
"Asncrona", dado que no se requiere una seal separada para sincrona,
sino que cada caracter incluye tanto los 8 bits de datos como los bits de
inicio y de paro para establecerla.
En la lnea de tiempo, que va de izquierda a derecha, el bit menos
significativo LSB se trasmite primero y el bit ms significativo MSB, al
ltimo.

Originalmente la norma RS232 fue diseada para comunicar a una


computadora (DTE) con su mdem para lnea telefnica (DCE), pero
actualmente se usa tambin para comunicacin entre dos computadoras, o
bien una computadora con un dispositivo perifrico.
El puerto serial DB25-RS232, en su forma original estndar, contaba con 25
seales, se us desde los aos 60, y fue diseado para enlazar la
computadora y mdems externos de baja velocidad para lneas telefnicas
(actualmente casi en obsolescencia). Posteriormente, el conector DB25 fue
reemplazado por el DB9.
Para la conexin se utiliza un cable con conectores DB9, con nueve seales,
como el mostrado en la figura. Adicionalmente a la seales de datos
trasmitidos y recibidos TX, RX, la norma original RS232 incluye definiciones
para seales de control (en ingls "handshake signals") que se usan para
varias funciones auxiliares en el protocolo de envo y recepcin de datos, as
como para el dignstico de fallas.
Actualmente, el estndar se ha simplificado a las seales de trasmisin TX,
recepcin RX y tierra GND, dejando sin utilizarse el resto de las seales. En
seguida se muestra una foto del conector DB9 y la asignacin de seales.
RS422/485, TRASMISION BALANCEADA, DIFERENCIAL.
Cuando se requieren mayores distancias y velocidades de trasmisin,
entonces deben de emplearse las normas RS422 y RS485. Adems, estas
normas permiten tambin la trasmisin multipunto, es decir una
computadora central conectada con varias UTR. Dado que la computadora
central tpicamente tiene como salida la interfaz RS232, se hace necesaria

la conexin de un
implementar una red.

mdulo

convertidor

RS232

RS422/485,

para

La trasmisin diferencial permite velocidades de hasta 10 Mbps, sobre


distancias de hasta 1.3 kms. Se usan dos seales para trasmitir y dos para
recibir, adems de la tierra, la cual es normalmente conectada al blindaje
del cable. En cada par, viajan la seal de trasmisin y su complemento. En
el receptor, la seal original se obtiene restando una de la otra. Esta tcnica
reduce grandemente el ruido generado en la lnea, ya que ste se induce
por igual en ambas lneas del par y es al final cancelado. Este tipo de
trasmisin debe de hacerse siempre sobre cable del tipo "par trensado"
(twisted pairs).

RS422
RS422 usa 4 seales y puede emplearse para comunicacin punto a punto o
multipunto. En su aplicacin ms simple, una computadora central se
comunica con una UTR empleando un protocolo master-slave, full dplex. La
electrnica del convertidor RS232-RS422 es muy simple porque solo se
emplean buffers trasmisores receptores del tipo 75176. Una conexin tpica
se muestra abajo. La computadora central se comunica con un convertidor
(K422) usando 5 de las seales de la norma RS232. El convertidor se
conecta al dispositivo remoto 422 usando 4 seales y la tierra.
En algunas aplicaciones, la norma RS422 puede emplearse en redes
"mulipunto", es decir, una computadora central comunicndose con varias
UTR. En este caso, pueden usarse dos tipos de protocolos de
comunicaciones:
1. El llamado protocolo "interrogacin-respuesta" o "polling" en el cual la
computadora enva mensajes que incluyen la direccin de la UTR a la cual
se enva el mensaje y solamente la UTR que reconoce su direccin
responder.
2. El protocolo del tipo "reporte espontneo" en al cual, la UTR inicia la
comunicacin y enva su bloque de datos, nicamente cuando ocurra un
evento. Por ejemplo, en el caso de un sistema de control de acceso, el
evento ocurre cuando se efecta el ingreso de una persona identificada.
En el modo multipunto, todas las UTR deben de poseer drivers del tipo
"tristate" en sus lneas RXA y RXB que permitan su virtual desconexin de
las lneas cuando no se encuentran trasmitiendo, para permitir el libre flujo
de la informacin sin interferencias.
RS485

La diferencia principal entre RS422 y RS485 es el nmero de seales usadas


en el cable de trasmisin. RS422 usa 4 seales y su tierra, RS485 usa solo 2
seales y su tierra. RS485 requiere de un protocolo "half dplex" para
operar, dado que las mismas lneas son usadas tanto para trasmisin como
recepcin.
Todos los dipositivos RS485 poseen drivers "tristate" que permiten a las UTR
desconectarse de la lnea una vez que trasmitieron su informacin.
Normalmente, para este fin se usa un circuito temporizador automtico
habilitado por el flanco ascendente de la seal de trasmisin. El
temporizador habilita el circuito trasmisor durante el tiempo que dura el
mensaje y lo deshabilita al terminar ste.
Entre las aplicaciones tpicas de la norma RS485, se encuentran los
sistemas de control de acceso, los sistemas distribudos de control industrial
y los sistemas de seguridad casera. En todos estos casos, varias UTR
reportan su informacin hacia una computadora central o bien reciben
comandos de la misma.

Anda mungkin juga menyukai