6PIN HMC5883L Triple Axis Compass
Magnetometer Sensor Module For arduino
hmc5883l | cj-m49 | vcc/gnd/scl/sda/drdy/3v3 | L883 | 2108 |
HMC5883L jest cyfrowym, 3-osiowym magnetometrem pozwalajÄ…cym na pomiar szerokiego zakresu wielkoÅ›ci pola magnetycznego Ziemi wynoszÄ…cego ±8 gausa. Jego rozdzielczość 12 bitów umożliwia pomiar z dokÅ‚adnoÅ›ciÄ… do 2 miligausów przy poborze prÄ…du zaledwie 100µA. HMC5883L komunikuje siÄ™ z mikrokontrolerem za pomocÄ… szyny I2C z maksymalnÄ… czÄ™stotliwoÅ›ciÄ… pomiarów wynoszÄ…cÄ… 75 Hz w trybie ciÄ…gÅ‚ym.
Zakres pomiarowy | Rozdzielczość | Wzmocnienie |
± 0.88 Ga | 0.73 mG | 1370 |
± 1.3 Ga | 0.92 mG | 1090 |
± 1.9 Ga | 1.22 mG | 820 |
± 2.5 Ga | 1.52 mG | 660 |
± 4 Ga | 2.27 mG | 440 |
± 4.7 Ga | 2.56 mG | 390 |
± 5.6 Ga | 3.03 mG | 330 |
± 8.1 Ga | 4.35 mG | 230 |
HMC5883L pozwala na osiÄ…gniÄ™cie czÄ™stotliwoÅ›ci pomiarów nawet do 160 Hz, jeÅ›li skorzystamy z trybu pojedyÅ„czego pomiaru oraz monitorowania przerwania DRDY. CiekawÄ… możliwoÅ›ciÄ… jakÄ… daje ten ukÅ‚ad, to wybór iloÅ›ci próbek (1, 2, 4 lub 8), które podlegajÄ… uÅ›rednieniu koÅ„cowego wyniku.
NapiÄ™cie zasilania mieÅ›ci siÄ™ w zakresie od 2.0 do 3.6V, dlatego ukÅ‚ad również nie toleruje zasilania wyższego (5V) - należy zwrócić szczególnÄ… uwagÄ™ na to, czy nasz moduÅ‚ posiada możliwość zasilania takim napiÄ™ciem. UkÅ‚ad jest zamkniÄ™ty w obudowie LCC o wymiarach 3mm x 3mm i wysokoÅ›ci 0.91mm .
Pełna dokumentacja techniczna: http://www.jarzebski.pl/datasheets/HMC5883L.pdf
W przypadku moduł IMU GY-80, możemy skorzystać z 5V zasilania. Pin oznaczony SCL (adapter) podłączamy do pinu A5 (Arduino), natomiast pin SDA (adapter) do pinu A4 (Arduino).
Do obsÅ‚ugi moduÅ‚ów z ukÅ‚adami HMC5883L skorzystamy z przygotowanej na tÄ… okazjÄ™ biblioteki dla Arduino, którÄ… można pobrać z repozytorium Git: https://github.com/jarzebski/Arduino-HMC5883L
Pierwszym przykładem będzie odczyt surowych wartości oraz znormalizowanych (mg):
#include <Wire.h>
#include <HMC5883L.h>
HMC5883L compass;
void setup()
{
Serial.begin(9600);
// Inicjalizacja HMC5883L
Serial.println("Initialize HMC5883L");
while (!compass.begin())
{
Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
delay(500);
}
// Ustawienie zakresu pomiarowego
// +/- 0.88 Ga: HMC5883L_RANGE_0_88GA
// +/- 1.30 Ga: HMC5883L_RANGE_1_3GA (domyslny)
// +/- 1.90 Ga: HMC5883L_RANGE_1_9GA
// +/- 2.50 Ga: HMC5883L_RANGE_2_5GA
// +/- 4.00 Ga: HMC5883L_RANGE_4GA
// +/- 4.70 Ga: HMC5883L_RANGE_4_7GA
// +/- 5.60 Ga: HMC5883L_RANGE_5_6GA
// +/- 8.10 Ga: HMC5883L_RANGE_8_1GA
compass.setRange(HMC5883L_RANGE_1_3GA);
// Ustawienie trybu pracy
// Uspienie: HMC5883L_IDLE
// Pojedynczy pomiar: HMC5883L_SINGLE
// Ciagly pomiar: HMC5883L_CONTINOUS (domyslny)
compass.setMeasurementMode(HMC5883L_CONTINOUS);
// Ustawienie czestotliwosci pomiarow
// 0.75Hz: HMC5883L_DATARATE_0_75HZ
// 1.50Hz: HMC5883L_DATARATE_1_5HZ
// 3.00Hz: HMC5883L_DATARATE_3HZ
// 7.50Hz: HMC5883L_DATARATE_7_50HZ
// 15.00Hz: HMC5883L_DATARATE_15HZ (domyslny)
// 30.00Hz: HMC5883L_DATARATE_30HZ
// 75.00Hz: HMC5883L_DATARATE_75HZ
compass.setDataRate(HMC5883L_DATARATE_15HZ);
// Liczba usrednionych probek
// 1 probka: HMC5883L_SAMPLES_1 (domyslny)
// 2 probki: HMC5883L_SAMPLES_2
// 4 probki: HMC5883L_SAMPLES_4
// 8 probki: HMC5883L_SAMPLES_8
compass.setSamples(HMC5883L_SAMPLES_1);
}
void loop()
{
// Pobranie pomiarow surowych
Vector raw = compass.readRaw();
// Pobranie pomiarow znormalizowanych
Vector norm = compass.readNormalize();
// Wyswielnie wynikow
Serial.print(" Xraw = ");
Serial.print(raw.XAxis);
Serial.print(" Yraw = ");
Serial.print(raw.YAxis);
Serial.print(" Zraw = ");
Serial.print(raw.ZAxis);
Serial.print(" Xnorm = ");
Serial.print(norm.XAxis);
Serial.print(" Ynorm = ");
Serial.print(norm.YAxis);
Serial.print(" ZNorm = ");
Serial.print(norm.ZAxis);
Serial.println();
delay(100);
}
Wynik działania
Znajomość wartości pola magnetycznego Ziemi (wektor X i wektor Y) pozwala na określenie bieżącego kierunku południka magnetycznego, a tym samym uzyskanie cyfrowego kompasu. Kierunek południka magnetycznego można obliczyć z prostej zależności:
kierunek_pomiaru (rad) = atan( wektor_y, wektor_x );
Aby poprawnie wyznaczyć kierunek, konieczne jest również uwzglÄ™dnienie czynnika bÅ‚Ä™du - deklinacji magnetycznej. Deklinacja magnetyczna spowodowana jest zarówno poÅ‚ożeniem bieguna magnetycznego Ziemi w innym miejscu niż biegun geograficzny oraz zróżnicowanymi warunkami magnetycznymi w miejscu pomiaru (np. poprzez wystÄ™powaniem dużej iloÅ›ci rud żelaza). Warto zauważyć, że deklinacja magnetyczna jest parametrem zmiennym w czasie, bowiem biegun magnetyczny Ziemi stale siÄ™ przemieszcza. Wartość aktualnej deklinacji magnetycznej znajdziemy na specjalnych mapach magnetycznych, a także na mapach nawigacyjnych.
Na szczęście żyjemy w czasach Internetu i odpowiednią mapę znajdziemy pod adresem: http://magnetic-declination.com/
Deklinacja magnetyczna dla Bytomia
Jak widzimy, deklinacja magnetyczna dla mojej lokalizacji wynosi plus 4 stopnie i 26 minut (wschód). Wartość tÄ… musimy przeliczyć na radiany:
kÄ…t_deklinacji = (stopnie + (minuty / 60.0)) / (180 / Pi);
kÄ…t_deklinacji = (4.0 + (26.0 / 60.0)) / (180 / Pi);
Obliczoną wartość kąta deklinacji dodajemy (wynik POSITIVE) lub odejmujemy (wynik NEGATIVE) od wartości zmierzonej z magnetometru:
kierunek = kierunek_pomiaru ± kÄ…t_deklinacji
JeÅ›li nie znamy kÄ…ta deklinacji, możemy przyjąć wartość zero. W nastÄ™pnej kolejnoÅ›ci musimy zadbać o to, aby otrzymany wynik kierunku bieguna magnetycznego mieÅ›ciÅ‚ siÄ™ w zakresie 0π - 2π (chyba, że chcemy mieć kompas, który pokazuje na przykÅ‚ad 370° zamiast 10°).
jeÅ›li kierunek < 0 to dodajemy do niego 2π
jeÅ›li kierunek > 2π to odejmujemy od niego 2π
Teraz możemy zamienić już radiany na stopnie:
kierunek (deg) = kierunek (rad) * (180 / π)
Istotnym problemem (brzydkÄ… cechÄ…) magnetometru HMC5883L jest nierównomierny pomiar pola magnetycznego w zakresie od 1° ÷ 180° oraz od 180° ÷ 360°. Dla pierwszego przedziaÅ‚u nasz magnetometr bÄ™dzie generowaÅ‚ przekÅ‚amane wyniki od 1° ÷ 240°, natomiast dla drugiego od 240° ÷ 360°. Można w Å‚atwy sposób to skorygować funkcjÄ… map() (patrz poniższy przykÅ‚ad programu). Do peÅ‚ni szczęścia możemy jeszcze wygÅ‚adzić wskazania naszego kompasu, ustawiajać jego reakcjÄ™ na zmianÄ™ o 3°.
Nasz program przedstawia się więc następująco:
#include <Wire.h>
#include <HMC5883L.h>
HMC5883L compass;
int previousDegree;
void setup()
{
Serial.begin(9600);
// Inicjalizacja HMC5883L
Serial.println("Initialize HMC5883L");
while (!compass.begin())
{
Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
delay(500);
}
// Ustawienie zakresu pomiarowego
compass.setRange(HMC5883L_RANGE_1_3GA);
// Ustawienie trybu pracy
compass.setMeasurementMode(HMC5883L_CONTINOUS);
// Ustawienie czestotliwosci pomiarow
compass.setDataRate(HMC5883L_DATARATE_15HZ);
// Liczba usrednionych probek
compass.setSamples(HMC5883L_SAMPLES_4);
}
void loop()
{
// Pobranie wektorów znormalizowanych
Vector norm = compass.readNormalize();
// Obliczenie kierunku (rad)
float heading = atan2(norm.YAxis, norm.XAxis);
// Ustawienie kata deklinacji dla Bytomia 4'26E (positive)
// Formula: (deg + (min / 60.0)) / (180 / M_PI);
float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / M_PI);
heading += declinationAngle;
// Korekta katow
if (heading < 0)
{
heading += 2 * PI;
}
if (heading > 2 * PI)
{
heading -= 2 * PI;
}
// Zamiana radianow na stopnie
float headingDegrees = heading * 180/M_PI;
// Output
Serial.print(" Heading = ");
Serial.print(heading);
Serial.print(" Degress = ");
Serial.print(headingDegrees);
Serial.println();
delay(100);
delay(100);
}
Wynik działania:
Program do processingu znajdziecie w archwium biblioteki.
Niestety kompas jest wrażliwy na wszelkie przechylenia, faÅ‚szujÄ…c kalkulacjÄ™ kierunku poÅ‚udnika magnetycznego. Musi siÄ™ wiÄ™c znajdować na pÅ‚askiej powierzchni, aby wyniki byÅ‚y poprawne. Niepożądany efekt wpÅ‚ywu przechyleÅ„ można na szczęście wyeliminować za pomocÄ… akcelerometru (na przykÅ‚ad ADXL345 lub MPU6050). Jak tego dokonać? Dowiesz siÄ™ z tego artykuÅ‚u - Komepnsacja przechyleÅ„ kompasów cyfrowych.
Biblioteka HMC5883L: https://github.com/jarzebski/Arduino-HMC5883L
Dokumentacja techniczna: http://www.jarzebski.pl/datasheets/HMC5883L.pdf