jueves, 12 de septiembre de 2013

Brujula Electronica con Arduino Nano

Alguna vez te has preguntado como funciona la brujula en un iPhone? Pues hemos construido una con un Arduino para enseñarte el principio basico!
Si vemos la hoja de datos, vemos que el LSM303DLHC cuenta ci 2 sensores, un magnetómetro con 3 ejes y un acelerómetro con 3 ejes. Mientras es obvio para que necesitamos el magnetómetro, preguntémonos para que necesitamos 3 ejes y un acelerómetro para una brújula?
Tu también tenias uno de estas brújulas cuando chiquito?
Este es un aparatico maravilloso, pero tiene sus problemas:
• Tiene que ser usada horizontalmente
• No muestra el norte geográfico 
• Una brújula que compras en Europa no funciona bien en sur América
• La brújula es muy sensible a metales e imanes que se encuentran cerca
Todos imperfecciones no son inconvenientes para la brújula electrónica!
• Si inclinemos una brújula magnética, la aguja va a tener contacto con la base a partir de un ángulo bastante pequeño y así no se puede mover mas. Obvio que esto no pasa en una brújula electrónica. Pero sin embargo las líneas magnéticas del campo terrestre van a cruzar el magnetómetro en un ángulo diferente, que tiene como consecuencia una medición errónea. Pero si medimos el ángulo de este inclinación con el acelerómetro , podemos compensar nuestro medición.
• Si uno dice “Norte” casi siempre se refiere al polo norte geográfico, pero lo que la brújula nos indica es el polo norte magnético. La diferencia entre estés dos puntos es dependiente de la latitud en donde uno se encuentra y se llama declinación magnética. En el internet se encuentran listas con estés ángulos. Para calcular la orientación al polo geográfico se debe adicionar la declinación magnética a la orientación medida. Como una brújula magnética siempre cuenta con un computador o controlador es fácil calcular la orientación geográfica.
• La forma del campo magnético de la tierra esta diferente en diferentes latitudes. El ángulo en que cruzan los líneas magnéticas la horizontal se denomina inclinación magnética. En los polos este ángulo tiene 90°, en el ecuador 0° y en Europa alrededor de unos 60°. Por eso las agujas de las brújulas magnéticas siempre son balanceadas, y este balanceo solo sirve para una distinta región de la tierra. Como una brújula electrónica cuenta con 3 ejes es simple proyectar el vector de la medición en un plano horizontal.
• También la brújula electrónica esta sensible a metales e imanes que se encuentran cerca de ella. Pero esto también se puede solucionar fácilmente. Podemos compensar los efectos, si evaluemos todos los magnitudes del magnetómetro cuando lo giramos por todos sus ejes. La representación en 3 dimensiones de estas mediciones deben resultar en una esfera centrada. Si la esfera no esta centrada un campo magnético cercana de un imán esta alterando nuestra medición (hard-iron). Si figura no es una esfera pero mas bien un elipsoide, las alteraciones tienen sus causas en metales o conductores (soft-iron). La librería puede compensar los alteraciones hard-iron, las alteraciones soft-iron en general son muy pequeños y con un diseño bueno de la placa se pueden minimizar. Si en todas formas quieres aplicar una compensación para estos efectos vas a encontrar buenas informaciones aquí: Tilt compensated compass
La librería para arduino
Con este documento llega un driver para arduino que facilita el uso del LSM303DLHC.
El driver es una clase de C++ que principalmente hace lo siguiente:
• Abstraer la comunicación de I2C con el sensor
• Compensar los alteraciones causados por imanes
• Calcular la orientación con una compensación de inclinación del dispositivo (un poco de matemática)
Este driver consiste en una carpeta denominada “LSM303DLHC” que contiene dos archivos:
• LSM303.h
• LSM303.cpp
estos son los archivos driver. También hay una carpeta “examples” que contiene un sketch de un ejemplo como usar el driver.
Instalación
Para instalar este libreria, llega a tu carpeta de instalación de arduino y copia toda la carpeta “LSM303DLHC” en la carpeta “libraries”. Después debes reiniciar Arduino para tener acceso al driver.

Propiedades públicas
Las propiedades públicas de este driver son:
vector a
La ultima medición del acelerómetro.
vector m
La ultima medición del magnetómetro.
vector m_min
Los valores mínimos del magnetómetro de cada eje. Se usa para la calibración de heading().
vector m_max
Los valores máximos del magnetómetro de cada eje. Se usa para la calibración de heading().
byte last_status
El estado de la ultima transacción del bus I2C. Mira aquí para los códigos de errores: Wire.endTransmission() documentation
magGain magGain_?
Una enumeración con posibles valores de amplificación del magnetómetro.
magGain_13 = ±1,3Gauss
magGain_19 = ±1,9 Gauss
magGain_25 = ±2,5 Gauss
magGain_40 = ±4,0 Gauss
magGain_47 = ±4,7 Gauss
magGain_56 = ±5,6 Gauss
magGain_81 = ±8,1 Gauss
Funciones públicas
Las funciones públicas de este driver son:
LSM303(void)
El constructor de la clase
void enableDefault(void)
Inicializa el acelerómetro y el magnetómetro en la configuración básica.
void writeAccReg(byte reg, byte value)
Escribe un byte a un registro del acelerómetro. Mira LSM303.h para nombres de los registros.
byte readAccReg(byte reg)
Lee un byte de un registro del acelerómetro. Mira LSM303.h para nombres de los registros.
void writeMagReg(byte reg, byte value)
Escribe un byte a un registro del magnetómetro. Mira LSM303.h para nombres de los registros.
byte readMagReg(int reg)
Lee un byte de un registro del magnetómetro. Mira LSM303.h para nombres de los registros.
void setMagGain(magGain value)
Ajusta la amplificación del magnetómetro. Usa los elementos de la enumeración magGain
void readAcc(void)
Lee los valores de aceleración momentánea y los graba en el vector a.
void readMag(void)
Lee los valores momentáneas del magnetómetro y los graba en el vector m.
void read(void)
Ejecuta readAcc y readMag
int heading(void)
Vuelve con la orientación compensada y calibrada como ángulo con respeto al norte
Ejemplo:
Esquema

Para usar el sketch del ejemplo se debe conectar el sensor LSM303DLHC como se ve en el esquema siguiente:
Nota No es necesario conectar el display LCD, porque el funcionamiento del sensor también se puede ver a través del puerto USB.
Sketches
Hay tres programas de ejemplo en la “examples:
Serial
Este ejemplo imprime los datos crudos de todos los 6 ejes en el puerto serial. Debes empezar con este
Calibrate
Este programa es una ayuda para calibrar las valores de orientación que se pueden ver en el ejemplo “Heading”. Antes de usar “heading” debes ejecutar este sketch y seguir los siguientes pasos:
1. Carga el Arduino con este sketch
2. Arranque el monitor serial
3. Coge el circuito y gíralo en todos los direcciones hasta los valores que se pueden ver en el monitor serial no cambian mas
4. Anota estas valores.
Heading
Esto es el ejemplo principal. Imprima el valor y el punto cardinal al puerto serial y a un display LCD
Antes de cargar este sketch debes pasar los valores que has obtenido a través del sketch “calibrate” a este sketch. Descarga toda la documentacion incluido ejemplo y libreria de Arduino aca:  Documentación Brujula
Referencias / links

No hay comentarios:

Publicar un comentario