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?
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.
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.
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...
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.
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)
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.
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!
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:
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.
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
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
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
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:
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....
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....