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:
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.