En este montaje realizamos una brújula con el módulo GY282 que emplea el chip HMC5983.
Registros del chip HMC5983.
La dirección I2C del chip HMC5983 es 0x1E .
Para establecer el modo de funcionamiento del chip.
Wire.beginTransmission(0x1E);
Wire.write(0x02); // Select mode register
Wire.write(0x00); // Continuous measurement mode
Wire.endTransmission();
El programa lee continuamente cada 50 ms el valor de la brújula.
Para calcular los grados se necesita los datos de X e Y que es de dos bytes cada uno, MSL y LSB.
Se transforma a Gauss (unidad de campo magnético) para luego hacer el cálculo en radianes.
Se hace una comprobación para corregir si el angulo esta invertido.
Se transforma a grados.
Este cálculo es simple, no se corrige la declinación desde nuestra posición.
Para un cálculo mas preciso se tiene que hacer un ajuste de mas preciso de los cálculos introduciendo la declinación desde nuestra posición.
De las pruebas realizadas no varÃa mas de 2 grados, por lo que el programa principal se utilizó el cálculo simple.
int gradosComplejo(void) { int grados; leerDatos(); Xm = mX_out*0.00092; // Gauss unit Ym = mY_out*0.00092; // ============================== //Calculating Heading heading = atan2(Ym, Xm); // Coreccion de la declinacin dependiendo de tu lugar // http://www.ngdc.noaa.gov/geomag-web/ // Mi lugar //España --- Palencia //En mi caso varia 1º declination = 0.020; heading += declination; // Corregir si angulo es invertido if(heading <0){ heading += 2*PI; } //ocurre entre 180º y 360º if(heading > 2*PI) {heading -= 2*PI; Serial.print("***"); } headingDegrees = heading * 180/PI; // Para convertir radianes a grados //Si se quiere introducir un pequeño filtro para que no vibre el angulo // descomentar al linea siguiente headingFiltered = headingFiltered*0.85 + headingDegrees*0.15; // headingFiltered = headingDegrees; grados=headingFiltered; return(grados); } |
Montaje eléctrico.
Conexionado:
Vcc 5V -> VIN
GND -> GND
A4 -> SDA
A5 -> SDL
Aunque el chip HMC5983 funciona a 3.3V , el módulo GY282 incorpora un regulador de voltaje, por lo cual se puede alimentar a 5V
//31/08/2017 //modificado por xsetaseta@gmail.com //Juan Galaz // Basado en http://www.instructables.com/id/Arduino-Processing-HMC5983-GY-282-Arduino-Proccesi/ #include <Wire.h> #define BRUJULA 0x1E //I2C 7bit address of HMC5983 int mX_out,mY_out,mZ_out; int tiempo; void setup() { Serial.begin(9600); Serial.println("__Reseteando__"); Wire.begin(); delay(500); Wire.beginTransmission(BRUJULA); Wire.write(0x02); // Select mode register Wire.write(0x00); // Continuous measurement mode //With the data rate at the factory default of 15Hz updates, a 67 milli-second. Wire.endTransmission(); } void loop() { tiempo--; if(tiempo<0) { tiempo=10; Serial.print("Grados="); Serial.println(gradosSimple()); } delay(5); } //__________________________________________ int gradosSimple(void) { float heading; float Xm,Ym; int grados; leerDatos(); Xm = mX_out*0.00092; // Gauss unit Ym = mY_out*0.00092; heading = atan2(Ym, Xm); // Corregir si angulo es invertido if(heading <0){ heading += 6.28; } //ocurre entre 180º y 360º if(heading > 6.28) {heading -= 6.28;} grados = heading * 57.29; // Para convertir radianes a grados return(grados); } //Lectura registros X,Z,Y void leerDatos() { Wire.beginTransmission(BRUJULA); Wire.write(0x03); // Wire.endTransmission(); Wire.requestFrom(BRUJULA,6); mX_out= Wire.read()<<8 | Wire.read(); mZ_out= Wire.read()<<8 | Wire.read(); mY_out= Wire.read()<<8 | Wire.read(); } |
Programa realizado en gambas (VB para linux)
El el archivo del programa de arduino existen dos versiones.
Al primera es una prueba de comparación de los dos tipos de cálculos.
La segunda brujula_setav2.ino , es la que se emplea para comunicarse con el programa del PC.
Programa Arduino
Programa Gambas
Video del funcionamiento.
NOTAS:
Las interferencias que producen cualquier altavoz debido a los imanes modifican la medidas.
También las masas influyen en la medidas.
Como curiosidad me ocurrió que al acercar imanes me cambiaron el ajuste del chip. Tuve que recalibrarlo acercando imanes al chip
Saludos
Juan Galaz
BibliografÃa:
http://www.instructables.com/id/Arduino-Processing-HMC5983-GY-282-Arduino-Proccesi/
Ola, me parece muy interesante el proyecto, pero me gustaria saber como implementarlo en una pantalla visualizando lo mismo que en el programa pero con una imagen directamente en una pantalla conectada en arduino si es posible. Gracias por su atencion
ResponderEliminarGracias por visitar mi página.
ResponderEliminarPoderse se puede, pero deberÃamos saber que pantalla.
Si tengo tiempo haré algo parecido.
Saludos