domingo, 26 de febrero de 2012

AHRS 9DOF Razor IMU Parte 2

Como ya comenté en AHRS 9DOF Razor IMU Parte 1, la adaptación del código de Mongoose no termina de funcionar todo lo bien que cabría esperar. Como ha pasado tiempo desde que empecé con este tema en la página de Sparkfun vi que ya tienen -por fin- actualizado el código así que me he puesto a hacer pruebas. Bueno, realmente no es que lo haya actualizado Sparkfun, creo que lo ha hecho uno o varios usuarios, ya sabéis, esa es la maravilla de Arduino, su comunidad que trabaja gratuitamente compartiendo. Toda su información original la podéis encontrar en

https://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs

Como no podía ser de otra manera ha sido coger el código tal cual, subirlo a la tarjeta y funcionar a la primera. He hecho un primer cálculo del tiempo de ejecución del bucle (sin el envío de datos) y está en torno a los 10 ms, alguna vez da lectura de 11 ms. Tenemos prácticamente 5 ms más que con el código de Mongoose lo que sin duda es mucho tiempo. Esto me va a permitir poder enviar los datos de los ángulos y los datos de los sensores que necesite (probablemente sólo el acelerómetro) sin problemas. Voy a seguir con mi método de envío de datos ya explicado en la Parte 1 de manera que el tiempo de envío de todos los datos será tan bajo que me permitirá bajar la velocidad de transmisión que con el código Mongoose tenía en 115.200 bps. Bajar la velocidad siempre es bueno ya que se tienen menos problemas de transmisión. Una vez montado el cuadricóptero seguro que habrá mucho ruido producido por los ESC y los motores así que calcularé cuál es la velocidad más baja que me permita enviar todos los datos que requiero. Un primer cálculo teórico aproximado estimo que si envío los ángulos y los datos del acelerómetro la trama puede tener en torno a 17 bytes. Ajustando a un máximo de 9 ms (20 ms del tiempo de ciclo menos 11 ms máximo del tiempo de ejecución) y estimando unos 10 bits por byte tenemos 17 * 10 / 0,009 = 18.889 bps. Cualquier velocidad superior a esa -con suficiente margen, no tomaremos 19.200 bps- nos será válida.

El código viene con varias opciones de envío de datos por el puerto serie, pudiendo activar uno u otro. Con el mismo criterio he añadido un output_EnviarArduino() para activar el envío de los datos que quiero en mi formato, esto es, los tres ángulos y los tres datos del acelerómetro multiplicados por 100 para tener precisión de 1 centésima y poder enviar cada dato con tan solo 2 bytes. Subo todos los archivos, también los de Processing con el que al activar la salida de datos

int output_mode = OUTPUT__MODE_ANGLES_TEXT 1

en lugar de la mía

int output_mode = OUTPUT__MODE_EnviarArduino;

podremos ver en Processing gráficamente la posición de nuestro AHRS.

También veréis una sección en la que se pueden calibrar los sensores. El enlace explica muy bien cómo hacerlo.

Archivo para 9DOF Razor: Razor AHRS
Archivo para leer los datos enviados: Leer 9DOF Razor v1.0.1

    Hay una nueva entrada en AHRS 9DOF Razor IMU Parte 3.

domingo, 12 de febrero de 2012

AHRS 9DOF Razor IMU Parte 1

Mis esfuerzos no quise centrarlos en el desarrollo del AHRS. Tiré la casa por la ventana y me compré el de Sparkfun con 9 grados de libertad. Debo indicar que tube algún que otro problema. Al cargar el código no daba lecturas correctas. Leyendo mucho pude saber que este IMU de Sparkfun tiene varios modelos puesto que lo van actualizando a nivel hardware. Pues bien, en aquellos momentos habían sacado una nueva tarjeta en la que incluían otro gyro, esa tarjeta era la mía, pero el código no estaba actualizado.

Al final encontré un código, el que han desarrollado para la tarjeta Mongoose, que ya lo habían adaptado para el nuevo gyro. La tarjeta Mongoose es prácticamente igual que la de Sparkfun solo que además le han añadido un sensor de presión para tener un control de la altura. Y además sale a menor precio. De haberlo sabido antes me habría comprado esta tarjeta. La web de la tarjeta Mongoose es ckdevices y el código original puede descargarse en mongoose-9dof-imu. Sin embargo este código no nos funcionará tal cual con la tarjeta de Sparkfun, tuve que hacerle unas modificaciones como las de anular las lecturas del sensor de presión y alguna más para adaptarlo a Arduino 1.0. El código final que funciona es el siguiente:

 Archivo para Arduino 1.0: Mongoose9DOF

Sin embargo a este código le encuentro sus pegas. Tal vez sea porque no he hecho una adaptación perfecta del código. Cada ciclo toma las lecturas del gyro y acelerómetro pero las del magnetómetro las toma cada 5 ciclos. El tiempo de ejecución del código he calculado que está en torno a 8 ó 9 ms pero el ciclo que toma la lectura del magnetómetro aumenta hasta los 14 ó 15 ms. No sé si esto es normal, intuyo que no, como he dicho antes tal vez sea por una mala adaptación por mi parte del código. La cuestión es que quedan tan sólo unos 5 ms para el envío por puerto serie de los datos. Con el método que viene programado el envío de los tres ángulos aún haciéndolo a 115.200 bps ya desborda el tiempo de ciclo de 20 ms. Así que desarrollé un pequeño protocolo que me permitiera enviar los ángulos con menos caracteres. Este protocolo se activa mediante #define EnviarArduino 1 y elaboro un byte para la transmisión de los signos de los tres ángulos y dos bytes más para cada uno de los ángulos. En total, teniendo la misma precisión de 1 centésima de grado, envío los tres ángulos con un protocolo de 8 bytes. La forma original envía más o menos bytes en función del valor numérico de los ángulos y si tienen signo negativo y en el peor de los casos puede llegar a tener hasta 24 bytes. La reducción es importante y permite enviar más datos o bien bajar la velocidad del puerto serie. Por el momento no está implementado con esta forma reducida el envío de los datos de los sensores, en concreto puede ser de utilidad el envío del acelerómetro que tal vez permitiría saber si el cuadricóptero se está desplazando para poder dejarlo quieto en el aire. Cuando el proyecto esté más avanzado y llegue el momento haré este tipo de pruebas.

NOTA: recientemente he visto en la página de Sparkfun que ya tienen actualizado su código, además viene con una aplicación para Processing para ver visualmente los datos enviados. Preveo que puede estar más optimizado y no tener los problemas del tiempo de ejecución del Mongoose así que aunque por el momento puede servir este código con el tiempo estudiaré el nuevo y le implementaré mi protocolo de envío de datos.
Podéis ver el nuevo código con un mejor funcionamiento en AHRS 9DOF Razor IMU Parte 2