Brújula digital HMC5883L y acelerómetro ADXL345

Brújula digital HMC5883LAcelerómetro ADXL345Seguimos con más componentes del módulo 10DOF, probando el funcionamiento de cada uno de ellos y escribiendo a la vez una pequeña librería para manejarlos. En esta ocasión vamos a ver el HC5883L, que es un magnetómetro o brújula digital, capaz de medir el campo magnético en los tres ejes con una precisión de entre 1 y 2º, y el ADXL345 que es un acelerómetro también de tres ejes con una precisión de 4mg (0.039 m/s²) y un rango de medida hasta 16g.

El acelerómetro sometido al campo gravitatorio nos debe devolver continuamente un vector de valor 1 g en perpendicular a la horizontal, lo que nos permitirá compensar la inclinación del magnetómetro para obtener la orientación exacta hacia el norte magnético. Por supuesto también se puede usar para obtener las aceleraciones a las que está sometido nuestro invento.

En cuanto al magnetómetro, es una instrumento muy sensible que puede servir para medir cualquier tipo de campo magnético diferente del terrestre, o las variaciones que induce en el mismo un material ferromagnético. En las pruebas que he realizado llega al extremo de detectar la variación en el campo magnético que produce un destornillador a 30 cm del módulo, o un iman a más de un metro de distancia.

Por el momento sólo vamos a leer los datos en «crudo» a modo de prueba y en otro capítulo veremos como tratar estos datos para obtener medidas más utilizables.

Al igual que el resto de componentes de la placa 10DOF que estamos usando, la comunicación se hace por I2C, sólo hay que conectar las resistencias de pull-up en las líneas SDA y SCL, o bien, como en este ejemplo poner a 1 las resistencias de internas del PIC.

El procedimiento para comunicar con los dos integrados de este artículo es similar al empleado con el barómetro, enviamos una trama de configuración a uno de los registros del chip y luego leemos los datos en otros registros, por ello he juntado las funciones comunes dentro del fichero 10DOF.h.

En el caso del HMC5883 enviamos un 0 al registro 0x02 de configuración para configurarlo en modo de medición continua a 15Hz, luego leemos los tres ejes en los registros 0x03 – 0x07.

En el ADXL345 utilizamos el registro 0x2D para pasar el chip a modo sleep y luego a medición como indica el datasheet, luego podemos leer los valores de los tres ejes en los registros 0x32 – 0x37. En este caso hay que tener en cuenta que el byte alto de cada registro de 16 bits está en la dirección más alta (al revés que en el HMC5883).

Os dejo un programa de ejemplo con estos dos sensores y el barómetro enviando datos por el puerto serie:

Fichero sólo visible para usuarios registrados

Entrada anterior

Continuará …

4 comentarios

Ir al formulario de comentarios

  1. Muchas gracias por la info!!! estoy tratando de hacer funcionar este módulo con C18 y estoy teniendo muchos problemas para darle formato a los datos que me entrega el ADXL345, tuviste algún avance?
    Mil gracias por todo! saludos!

    1. Estoy terminando una librería completa combinando todos los módulos que tengo en la placa 10DOF, a ver si tengo un rato y la publico un día de estos. En principio no debería haber grandes diferencias con C18, una vez que comuniques correctamente por I2C, pero ten en cuenta unas cuantas cosas que me han dado problemas a mi:

      – El acelerómetro es muy «ruidoso», así que cuando muevas la placa se van a mezclar los datos de la gravedad con los de las vibraciones, una buena forma de eliminar el ruido es tomar los datos sólo cuando el módulo de las aceleraciones sea cercano a 1g (sqrt(ax²+ay²+az²)). Yo estoy empezando a mezclar los datos con los del giróscopo (que tengo en la misma placa) porque es menos ruidoso para sacar valores más estables.
      – Lo mejor para ver si lees bien los datos es dejar la placa quieta y en horizontal y deberías leer en los ejes x e y 0 (o muy pequeño) y en z 250 . Cuidado con el tipo de datos que uses, el resultado tiene que ser un entero «con signo» de 16 bits, y se lee primero el byte bajo y luego el alto en los registros.
      – Por lo menos el mío venía un poco descentrado, vamos que en horizontal media más de 9,8m/s² en el eje Z y al darle la vuelta media un poco menos (y lo mismo con los otros ejes). Se soluciona fácilmente poniendo un valor diferente de cero en los ofsets de ajuste (que son los registros 0x1E,0x1F y 0x20)
      – Pon una buena fuente de alimentación estabilizada y asegúrate de que tu módulo lleva puestas las resistencias de pull-up en las líneas del bus I2C.

      Un saludo!

  2. Muchisimas gracias por los consejos David; en estos días empiezo a dar exámenes por lo que no podré darle mucho tiempo al módulo. Por suerte ya puedo comunicarme bien por I2C, arranqué haciendo pruebas con una eeprom (24LC256) y pude hacer una comunicación estable.
    Definitivamente estoy leyendo mal los datos del acelerómetro dado que si dejo la placa quieta leo en los ejes x:113, y:102 y z:109. Traté de solucionarlo con el ofset pero no cambiaba casi nada, en algo le estoy errando. Esperaré a ver tu librería y ni bien tenga el módulo funcionando te paso el código así tienes en C18 las librerías.
    Muchas gracias nuevamente,

    Saludos!

  3. ¡De nada! Es raro porque los valores no están muy errados, fíjate que el módulo (sqrt(113²+102²+109²)) es 187 «sólo un 25% menos», prueba a poner el módulo perfectamente horizontal o vertical a ver si dos de los valores se te hacen 0 (o casi 0) y otro se acerca a 250.
    La última versión de programa que uso ahora para leer el acelerómetro está en la entrada http://blog.deinventos.com/control-de-un-balancin-i/ y si te fijas uso unos ofsets muy bajos, a lo mejor el problema está simplemente en la configuración del módulo, prueba a cargar los mismos parámetros que tengo yo en esa última versión.
    Suerte con tus exámenes y un saludo.

Deja una respuesta

Tu email nunca se publicará.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies