modbus RS-232 and arduino

Buenas tardes a todos,

Soy nuevo en este tema de arduino y la verdad es que no sé muy bien como va eso, o sea que perdonad si digo algo que no tiene sentido.

Me explico tengo un sensor de voltaje que funciona con protocolo RS232 (DB9), y según lo que he podido ver, utiliza los pins RX, TX, RTS y CTS (si solo pincho el RX y TX con el pc no se comunica). La idea es que el sensor vaya conectado a la placa arduino mega y esta luego al PC(mediante USB).

Mi problema es que he estado buscando como implementar el protocolo modbus RS232 en arduino, utilizando RX, TX, RTS y CTS, y no he sabido encontrar nada.

Hay podría guiarme un poco y sabría decirme, primeramente si es posible, y donde podría encontrar información?

Muchas gracias.

Aqui lo tienes implementado:
http://sites.google.com/site/jpmzometa/arduino-mbrt

aunque para conectarlo al Arduino y que solo haga de interfaz con el PC, haz el modbus en el PC y te ahorras el Arduino.

Un saludo

Muchas gracias Chiva

voy a ver si entiendo como funciona, que esto ya es otro tema...

La idea que tengo, es que dicho sensor lo que hace es enviar datos continuamente por un puerto DB9 (según las especificaciones del sensor tiene implementado el RS 232) tenga o no tenga el pc encendido. quería utilizar el arduino, para que junto al modulo SD recoja todas las medidas del sensor y las guarde en la SD, y cuando yo conecte el PC, cada 15, 20 días o lo que sea pueda descargar todos los datos almacenados en la SD o simplemente extraer la SD y insertar la tarjeta en el PC (lo mas probable es que los datos los tenga en un archivo .csv)

En resumen, que creo que me he liado un poco, el arduino cada x tiempo tiempo debe enviar petición de datos, y que el sensor responda. los datos que envíe el sensor guardarlos en la SD.

Solo una pregunta mas, disculpa, el tema conexionado, puedo usar cualquier pin (siempre y cuando lo defina antes) incluso para RTS Y CTS?

muchas gracias, que complicado que es iniciarse en este mundillo cuando no tienes ni idea.

Saludos!!!!

Parece que el de la página anterior ha hecho una librería para el Arduino:
http://code.google.com/p/modbusmaster/

Una cosa muy importante es si tienes la documentación del cacharillo, ya que necesitarás el número de esclavo, o igual se puede configurar, no se, además de saber qué te va a responder y de que forma.

Un saludo

Toda esta información la tengo, que envía que se le debe enviar, como, etc, etc,. el problema que veo es que en el link que me has pasado utiliza, a parte de arduino un maxim488EPA, o sea que hacer la comunicación directamente no debe poderse hacer.... bufffffffffffffff...

Eso es sólo para hacer la comunicación por RS485, si tu la vas a hacer por RS232 no te hace falta

Hola,

RTS y CTS son dos lineas para decirle al dispositivo que estas listo para recibir (por ejemplo, es una forma de que no llenes el buffer de recepcion porque no te esta dando tiempo a procesar la informacion recibida = CONTROL DE FLUJO HARDWARE).

RTS => Request To Send.
CTS => Clear To Send.

Es decir, tu protocolo Modbus es por RS232 (tx y rx), las otras dos lineas son de control.

Saludos :wink:

Igor R.

hola chivas, hola Igor,

chivas, referente a que con el RS232 no necesito el hardware RS485, significa que por ejemplo, usando el código que comentábamos antes, puedo usar los pins rx tx que correspondan, y como RTS y CTS dos mas cualquiera?

Igor, el problema es que no puedo hacer trabajar el sensor sin control de flujo, y si lo conecto al pc con rx y tx miro el puerto y no pasa nada por ahí, por lo contrario si pongo los RTS y CTS me envia los datos.
La verdad chicos es que lo mío es la mecánica y me han metido en un berenjenal que ni os cuento y tengo que presentar el proyecto en un mes.... eso es lo que pasa por ir de listo.

Seguiré buscando y probando, espero que no os molesto si hago alguna preguntita mas (aun que os parezca algo elemental)

PD: el dispositivo que me envia los datos es un Wi-LEM mesh node.
http://www.lem.com/hq/en/content/view/276/215/

Muchas gracias de verdad

Pues de lo del control de flujo, ni idea, teniendo en cuenta que no sé cómo funciona Modbus y el creador de las librerías tampoco ha perdido mucho tiempo en explicar los pines un poco, pues...

He usado Profibus y MPI en PLCs, pero allí es casi Plug and Play, no tienes que configurar casi nada, lo ideal sería que lo conectes a un PLC, pero eso cuesta su dinero o con uno de los adaptadores que vende la empresa, a un PC, pero lo mismo.

Ya lo siento, pero me pillas en malas fechas para ponerme a investigar.
Un saludo

Pero no veo el problema a lo de control de flujo, es simplemente usar dos pines digitales.
Si crees que te va a dar tiempo siempre de procesar los datos, simplemente pon el pin CTS del sensor a LOW (Clear to Send) y eso hara que este constantemente enviando datos.

Ejemplo de conexion (he buscado en imagenes de google para ver ponerte algo de referencia):
http://www.hw-group.com/products/sollae/image/kabel_rs232.gif
http://www.hw-group.com/products/sollae/image/port_rs232big.gif

:wink:

buenas Igor,

Tu crees pues, que con un RX y un TX de la placa mas, dos pins digitales cualquiera, uno como RTS(este supongo que siempre debería estar HIGH) y otro pin como CTS en LOW funcionaria?
lo probaré y te comento.

Muchas gracias, agradezco la ayuda de verdad. Os mantendré informados, aunque mis avances son lentos!

Saludos!!

En un dispositivo el RTS es una salida y el CTS es una entrada. Entonces para conectar dos dispositivos entre si, ambas senyales van cruzadas.

Antes de transmitir, la rutina mira si el pin CTS esta LOW (que significa que el receptor esta preparado para recibir datos) y comienza a transmitir.

Imagina que no quieres hacer control de flujo, simplemente poniendo a nivel bajo el pin CTS de tu sensor, hara que siempre transmita. Me refiero,que podrias poner dicha senyal a LOW y simplemente conectar a tu arduino Rx y Tx (previa adaptacion de senyales con un max232 o similar en caso que sea necesario).

Otra cosa.... eres consciente que si tu sensor es RS232 tienes que adaptar senyales con tu arduino que es TTL, verdad???

Puedes probar, conectando al ordenador solo TX,RX y GND y poniendo a bajo CTS, que para ello puedes unirlo directamente al RTS del mismo puerto serie, y asi haces "truco del almendruco".
Mira esto:

:wink:

Buenas Igor,

Si te tengo que ser sincero, no era consciente de que era necesario. He estado mirando y he visto que sirve para ajustar la tensión. de todas formas ya he conseguido un circuito que hace la conversión de voltaje de TTL a RS232 (similar a MAX232).

Ahora voy a mirar la web que me has enviado, me parece muy interesante el apartado en que muestra el bucle que hace entre RTS y CTS. este paso me ahorraría tener que utilizar dos salidas digitales como RTS CTS. Es coger simplemente el db9 y hacer un puente entre los dos pins

Te agradezco mucho toda esta información, de verdad. supongo que el viernes habré podido hacer la primera prueba, ya te contaré que ha pasado!

El puente lo tienes que hacer en el conector parte sensor. (ya que es el sensor el que te requiere el control de flujo hardware). En el diagrama del post anteriror, lo que pone PC1 es tu sensor y PC2 es tu ordenador o Arduino.

:wink:

una pregunta,

si le pongo este codigo al arduino:

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);

void setup() {

pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(9600);
Serial.begin(9600);

}

void loop()
{

Serial.println("F7 03 00 00 00 16 D0 92");
Serial.println(Serial.read());
delay(10000);

}

cada 10 segundos me envía el texto F7 03 00 00 00 16 D0 92 y luego porque cuando le envío per el puerto, "hola" por ejemplo no me devuelve "hola" y escribe 104, 111, 108.......

yo ya no entiendo nada.
me gustaría que yo le envíe a mi dispositivo el segmento F7 03 00 00 00 16 D0 92 que esta en hexadecimal y ver que responde
:cry:

http://arduino.cc/es/Serial/Print

Si escribes:
Serial.println("F7 03 00 00 00 16 D0 92");

Estas enviando código ASCII por el puerto y supongo que no es lo que quieres, lo que querrás será mandar el número hexadecimal, por lo que deberás ponerlo así:

Serial.print(0xF7);
Serial.print(0x03);
.
.
.

Y el serial.read no va dentro del println, además deberás comprobar primero que se haya recibido carácteres.

Y por último el sofwareserial lo has inicializado pero no lo estás usando para nada, asi que quita todo lo de softwareserial, te sirve con el que lleva el arduino en hardware

Un saludo

Buenas chivas,

primero gracias de nuevo.

por ejemplo para hacer una prueba, si quiero enviar este código a mi hardward (trabaja en RS 232 como hexadecimal) eso seria correcto?

F7 10 00 13 00 02 04 4C 2C BA 56 8B 3A 07 03 00
00 00 31 84 78 F7 03 00 00 00 16 D0 92

por hyperterminal enviar:

0xF70x100x000x130x000x020x040x4C0x2C..... todo junto.

he conectado el hardware al ordenador directamente usando el x0n/xoff con hyperterminal y por lo menos el hardware parece estar activo, este sistema es implementable con el arduino. me parece entender que es parecido a un RTS i CTS

saludos

Hyperterminal siempre envía ASCII, por lo que estás enviando en hexadecimal:
0x30 '0'
0x78 'x'
0x46 'F'
0x37 '7'

Para enviar los valores hexadecimales, tienes que enviar el carácter correspondiente a dicho valor y es bastante lío.
Lo más fácil sería enviarlo desde el Arduino como te he dicho, aunque para leer la respuesta tendrías que tener un puerto serie conectado al pc y otro (el software serial) al sensor y lo que te envíe el sensor redireccionarlo al PC para poder verlo sin complicaciones.

xon/xoff es un rts/cts pero por software en vez de hardware, en la wikipedia hay un explicación:

Un saludo

Xals,

Yo creo que deberias empezar por hacerte ejemplos sencillos de comunicacion entre PC y tu Arduino, y luego ir poco a poco elevando el nivel.
Empezar de cero con el modbus, creo que es demasiado correr.... :wink:

Ahora que la web esta traducida al español, puedes ver los ejemplos y ayudas en http://www.arduino.cc/es/ .

Para poder enviar carácteres en hexadecimal, puedes usar Realterm:
http://realterm.sourceforge.net/
Aunque deberías empezar primero por la base e ir poco a poco....

Ánimo!!

:smiley: