Magnetométer


A HMC5883L háromtengelyes mágneses térérzékelő modul ami remekül érzékeli a föld mágneses mezőit épp ezért iránytűként használható. I2C kommunikációt használ ami megkönnyíti számunkra az adatok kiolvasását. Az érzékelt mágneses térerő adatait egy 12-bites beépített ADC dolgozza fel. Pontossága 1-2 °, a mérési értéktartomány -8 és +8 Gauss közé esik.

Mivel mi az SI szerint nem használjuk a Gausst ezért a mért értéket már T (Teslában) adják meg.
Átváltási érték: 1gauss = 0,0001 T fordítva 1T = 10 000gauss

A föld mágneses mezejének méréséhez μT (mikroTeslát) használunk, ez 20μT és 60μT közé eső
érték lehet ami függhet az adott hely geológiai adottságától, valamint a szélességi helyétől.
A modul közvetíti a három tengelyen mért értékeket, valamint az ezekből kiszámított irányszöget.


Bekötése:
  HMC5883L    Arduino Uno
     VIN                  5V
    GND                GND
     SDA                 A4
     SCL                 A5

Két könyvtárat kell letöltenünk az egység használatához. Az egyik az Adafruit Sensor könyvtára, ez letölthető : https://github.com/adafruit/Adafruit_Sensor

A másik könyvtár a magnetométeré, ezt letölthetjük: 

https://github.com/adafruit/Adafruit_HMC5883_Unified


Mindkét könyvtár kicsomagolás után átnevezendő az első Adafruit_Sensor, a második Adafruit_HMC5883_U névre, másoljuk be őket az Arduino/ librarie könyvtárba. Indítsuk el az Arduino IDE-t, nyissuk meg a minták/ Adafruit_HMC5883_U/ magsensor példa progiját.

//könyvtárak megadása
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>

//egyedi azonosító rendelése a szenzorhoz a szenzor létrehozásával egy időben(12345)
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);


//a szenzor tulajdonságait kiíró függvény
void displaySensorDetails(void)
{
sensor_t sensor;
mag.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}

void setup(void)
{
Serial.begin(9600);
Serial.println("HMC5883 Magnetometer Test"); Serial.println("");

/inicializálja a szenzort
if(!mag.begin())
{

// hibaüzenetet ír ki ha nem a megfelelő típusú érzékelőt használjuk
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while(1);
}

//meghívja a szenzor tulajdonságait kiíró függvényt
displaySensorDetails();
}

void loop(void)
{
//érzékelő esmény létrehozása
sensors_event_t event;
mag.getEvent(&event);


//kiírja az értékeket mikroTeslába
Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" ");
Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" ");
Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT");


// Tartsuk a modult vízszintesen, hogy pontos legyen az x és y tengelyes mérés
// az x és y tengely értékéből kiszámolja az eltérési szöget radiánba.
float heading = atan2(event.magnetic.y, event.magnetic.x);


//Meg kell adni a helyi elhajlási értéket evvel korrigáljuk a kapott szöget (radiánban)
// A deklináció(elhajlás) megnézhető itt: 
http://www.magnetic-declination.com/
float declinationAngle = 0.22;
heading += declinationAngle;


// korrekció, ha kisebb az érték mint nulla akkor a teljes kör értékét adjuk hozzá
if(heading < 0)
heading += 2*PI;

// korrekció, ha nagyobb az érték mint a teljes kör akkor ezt kivonjuk belőle.
if(heading > 2*PI)
heading -= 2*PI;


// fokká konvertálja a radián értéket
float headingDegrees = heading * 180/M_PI;

//a szög kiíratása amivel eltérünk az északi pólustól
Serial.print("Heading (degrees): "); Serial.println(headingDegrees);

delay(500);
}


Tehát a progiban be kell állítani a földrajzi helyhez kapcsolódó elhajlás (deklináció) értékét mert csak így kaphatunk pontos irányszöget. A helyi deklináció megnézhető a következő oldalon:

http://www.magnetic-declination.com/


Ha valaki nem akarja átszámítani a deklináció értékét radiánokban az a következő sort cserélje ki:
float declinationAngle = 0.22;
erre a sorra:
float declinationAngle = 0.22 /180*PI;

A 0.22 helyett az adott földrajzi hely fokokban mért deklinációját kell beírni. Erre egy példa:
Budapest deklinációja: 4°24´ ezt írjuk be: 4.24 /180*PI;

Persze ez nem teljesen korrekt mivel 1 ° az 60´, ezért a 24´ -et még át kellene váltani tizedessé,
de mivel a műszer pontossága így is 1-2° eltérést engedélyez így ez is belefér.
Ha pontos akarsz lenni akkor a perceket elosztod 6-al és szorzod 10-el (vagy csak szorzod 1.666-al). Nézzük: 24´ / 6 = 4 ,       4*10 = 40 ,      a beírandó szám 4.40 lesz.

Ha beírtuk az értéket és feltöltöttük a progit nyissuk meg a soros monitort:


A soros monitoron láthatjuk az x, y, z mágneses térerősséget mikroTeslában, alatta az északi iránytól való elfordulás szögét fokban.

Ez már jó alap egy elektronikus iránytű elkészítéséhez, további jó munkát.