Página principal

Brújula

GY282  HMC5983
Arduino


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);
}
Cálculo complejo mas exacto.



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/