Lectura en RS-232 de un acelerometro

Hola a todos.

Estoy intentando recibir por puerto serie en el ordenador la trama de datos que me envia un acelerometro. Sin embargo lo que recibo no se corresponde con lo que debería ser, asi que imagino que el problema es que no recibo todo lo que envia.

Una parte del código que he escrito, usando la librería NewSoftSerial, es la siguiente:

if (Acelerometro.available()) {
    Serial.print(Acelerometro.read(), HEX);

Si no me equivoco, y me gustaria que me lo confirmarais, el acelerometro.available comprueba que en el buffer del puerto serie haya bytes, y si los hay, con el .read y .print envio uno de ellos.

Si alguno que haya trabajado leyendo sensores y mostrando los datos por puerto serie puede compartir algo de su experiencia, me seria de ayuda. En particular me gustaría saber posibles razones por las que me falla, si seria conveniente introducir delays entre medidas, si hay funciones o librerias ya hechas que me puedan servir de ayuda... cualquier cosa es bienvenida.

Gracias de antemano, un saludo.

Hola,

Yo primero te recomendaría para estudiar los datos que te envia dicho acelerómetro conectarlo directamente al ordenador sin pasar por el Arduino.

Puedes usar el programa Realterm ( http://realterm.sourceforge.net/) para ver los datos (te deja ver ASCII y HEX).
Si estas con portatil y no dispones de puerto serie, puedes usar la propia placa del arduino.... Basta con desmontarle el micro, ya que tiene un conversor USB <--> Serie de la casa FTDI integrado.

Salu2

Igor R.

Por cierto... Si el acelerómetro sólo envia datos y no necesita recibir nada, con el puerto serie hardware ya te vale. No necesitas implementar un segundo puerto serie... (en el caso que no le tengas que mandar nada desde Arduino al sensor).

Conecta sólo el Tx de tu acelerómetro al RX de Arduino.

Asi todo lo que hagas con Serial.print irá al ordenador...

Igor R.

Gracias por contestar Igor.

En primer lugar, ya consegui ver en el ordenador lo que envia el acelerómetro ya que el fabricante incluye dos conexiones. Por un lado USB y por otro RS232. Por USB directamente del acelerometro al PC ya he conseguido ver la trama de datos que envia y es la correcta. Ahora lo que necesito es pasarla por RS232 al arduino, y te preguntaras, ¿para que tanto lio?

Pues es que mi arduino es la version que incorpora bluetooth, asi que lo que necesito pasar por rs232 al arduino y del arduino por bluetooth a otros dispositivos. Ahora mismo estoy enviando por rs232 del sensor al arduino, y del arduino al PC por bluetooth (visualizado el resultado en hyperterminal), pero el PC no recibe la trama de datos correcta.

He probado con distintas velocidades de transmision, por si era que al transmitir demasiado deprisa algunos datos no se enviaban (se llenaba el buffer del puerto serie o lo que sea). Pero cambiar la velocidad no ha solucionado nada.

La duda ahora es si el problema es el código con el que programo el arduino. Para leer la trama de datos de un sensor y simplemente mostrarla por pantalla, ¿qué código utilizarías tú?

Hola,

Lo que pasa que nunca he usado la libreria de implementación de puerto serie.Siempre he usado la UART del micro.

Lo que hago es conectar el TX del sensor al RX del Arduino.
Para depurar, uso Serial.print normalmente, ya que el Tx del arduino va al ordenador. Asi puedo ver con hyperterminal de windows, ó la propia consola de la IDE del Arduino mis puntos de depuración.

Tampoco sé como va la versión bluetooh de Arduino, ya que seguramente usa la UART del micro...

Lo que tu haces para depurar tu programa y lo que estoy intentando yo ahora mismo no es tan diferente. La diferencia es que tu supongo que el hyperterminal lo usas para ver cadenas de caracteres o valores de variables de tu programa, y yo lo quiero usar para escribir valores hexadecimales prodecentes del sensor continuamente.

Una duda de novato:

  if (acelerometro.available()) {
  numero = acelerometro.read());
  Serial.print(numero, HEX);

Con este codigo, si el fabricante me dice que el acelerometro envia, por ejemplo, "4E" hexadecimal, yo deberia estar viendo en hyperterminal ese 4E verdad? (la variable numero es un "int")

No. El problema, que el Hyperterminal sólo ve ASCII. O por lo menos, no encuentro donde cambiar ésto.
Te va a traducir al código ASCII correspondiente a 4E, que es una "N". Pero tu si que estas enviando un 4E con Serial.print(numero,hex)

Yo uso como terminal para estos casos RealTerm http://realterm.sourceforge.net/, que te permite ver Hex, Ascii, combinacion de ambos,...
Además puedes enviar cadenas en Ascii ó en Hex. Es perfecto cuando trabajas con tramas!!!

Se me paso por la cabeza que pudiese ser problema del hyperterminal y el ascii. Desde luego es posible que sea algo relacionado con conversion de los valores que originalmente da el sensor. He probado tu programa pero obtengo datos similares a los del hyperterminal. Algo asi como:

61 94 94 2B A9 58 35 9F 5C 14 2B F9 59 81 C0 36 2 0 61

El problema es que cada nueva trama (segun el fabricante y comprobado mediante la conexion usb que antes mencione) comienza con "FA FF", y es una combinacion que no se da en las lecturas que estoy recibiendo tanto por hyperterminal como por realterm.

Asi que si a alguien se le ocurre qué puedo estar haciendo mal en la toma o el tratamiento de datos, cualquier ayuda es bien recibida.

¿Estas usando un MAX232 ó similar para hacer interfaz con el sensor?
¿O viene ya con salida de TTL?

Acabo de encontrar un programa bastante chulo gratuito.
Se llama FREE SERIAL TERMINAL MONITOR (FREE Serial Port Monitor Analyze Your Serial Port Communication Data)

No conocía ninguno que hicera de "espia" del puerto serie gratuito. Este te deja hacerlo con la versión que bajas de la web.
Con esto puedes monitorizar lo que en realidad esta pasando en tus puertos de forma transparente.

A lo mejor te viene bien en tu propósito.

:wink:

Puede que tengas razon y haya sido tan torpe como para no ajustar los niveles de rs232. Voy a hacer un montaje con una max entre el sensor y el arduino y ya te contare.

Gracias, un saludo

Muchas gracias, no me acorde de que tenia que ajustar los niveles de la salida del sensor. Tras añadir una max entre sensor y arduino ya veo en el hyperterminal los valores enviados a traves de bluetooth sin ningun problema.

Un saludo

Muy bien!! Parecía lo lógico si se está preparado para conectarse a un PC... :wink:

Por cierto, ¿qué acelerómetro es? Para tener salida USB y Serie....

Tecnicamente no es un acelerometro es un IMU, Xsens MTx-28A.

Por cierto que aun no consigo recibir lo que deberia. Los dos bytes al comienzo de cada trama son los correctos, pero el resto no. Ya me estoy quedando sin ideas, no creo que sea problema de la velocidad, quiza de la programacion en el arduino por eso voy a realizar mas pruebas. Si sigo sin conseguirlo volvere a preguntar con mas detalles.

Un saludo

Umm... ya me contarás que tal va!! Hace mucho tiempo que tengo curiosidad por los sensores de xsens...

Saca directo información de pitch, roll y yaw?

Salu2

Igor R.

No me he leido esa parte de la documentacion (somos varios trabajando en ello) pero si me suena de haber oido que saca directamente el pitch, roll y demas. De todos modos con tiene muchos modos de salida y muchas opciones de configuracion asi que este sensor en concreto seguro que tiene todo lo que busques