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); } |
//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(); } |