Triple Axis Compass
ID: 63
Kategorie: Module
Menge: 0
Position:

6PIN HMC5883L Triple Axis Compass
Magnetometer Sensor Module For arduino

hmc5883l cj-m49 vcc/gnd/scl/sda/drdy/3v3 L883 2108

3-osiowy magnetometr HMC5883L

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µAHMC5883L 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

Podłączenie HMC5883L do Arduino

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 Githttps://github.com/jarzebski/Arduino-HMC5883L

Prosty przykład

Pierwszym przykładem będzie odczyt surowych wartości oraz znormalizowanych (mg):

  1. #include <Wire.h>
  2. #include <HMC5883L.h>
  3.  
  4. HMC5883L compass;
  5.  
  6. void setup()
  7. {
  8.   Serial.begin(9600);
  9.  
  10.   // Inicjalizacja HMC5883L
  11.   Serial.println("Initialize HMC5883L");
  12.   while (!compass.begin())
  13.   {
  14.     Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
  15.     delay(500);
  16.   }
  17.  
  18.   // Ustawienie zakresu pomiarowego
  19.   // +/- 0.88 Ga: HMC5883L_RANGE_0_88GA
  20.   // +/- 1.30 Ga: HMC5883L_RANGE_1_3GA (domyslny)
  21.   // +/- 1.90 Ga: HMC5883L_RANGE_1_9GA
  22.   // +/- 2.50 Ga: HMC5883L_RANGE_2_5GA
  23.   // +/- 4.00 Ga: HMC5883L_RANGE_4GA
  24.   // +/- 4.70 Ga: HMC5883L_RANGE_4_7GA
  25.   // +/- 5.60 Ga: HMC5883L_RANGE_5_6GA
  26.   // +/- 8.10 Ga: HMC5883L_RANGE_8_1GA
  27.   compass.setRange(HMC5883L_RANGE_1_3GA);
  28.  
  29.   // Ustawienie trybu pracy
  30.   // Uspienie:              HMC5883L_IDLE
  31.   // Pojedynczy pomiar:     HMC5883L_SINGLE
  32.   // Ciagly pomiar: HMC5883L_CONTINOUS (domyslny)
  33.   compass.setMeasurementMode(HMC5883L_CONTINOUS);
  34.  
  35.   // Ustawienie czestotliwosci pomiarow
  36.   //  0.75Hz: HMC5883L_DATARATE_0_75HZ
  37.   //  1.50Hz: HMC5883L_DATARATE_1_5HZ
  38.   //  3.00Hz: HMC5883L_DATARATE_3HZ
  39.   //  7.50Hz: HMC5883L_DATARATE_7_50HZ
  40.   // 15.00Hz: HMC5883L_DATARATE_15HZ (domyslny)
  41.   // 30.00Hz: HMC5883L_DATARATE_30HZ
  42.   // 75.00Hz: HMC5883L_DATARATE_75HZ
  43.   compass.setDataRate(HMC5883L_DATARATE_15HZ);
  44.  
  45.   // Liczba usrednionych probek
  46.   // 1 probka:  HMC5883L_SAMPLES_1 (domyslny)
  47.   // 2 probki: HMC5883L_SAMPLES_2
  48.   // 4 probki: HMC5883L_SAMPLES_4
  49.   // 8 probki: HMC5883L_SAMPLES_8
  50.   compass.setSamples(HMC5883L_SAMPLES_1);
  51. }
  52.  
  53. void loop()
  54. {
  55.   // Pobranie pomiarow surowych
  56.   Vector raw = compass.readRaw();
  57.  
  58.   // Pobranie pomiarow znormalizowanych
  59.   Vector norm = compass.readNormalize();
  60.  
  61.   // Wyswielnie wynikow
  62.   Serial.print(" Xraw = ");
  63.   Serial.print(raw.XAxis);
  64.   Serial.print(" Yraw = ");
  65.   Serial.print(raw.YAxis);
  66.   Serial.print(" Zraw = ");
  67.   Serial.print(raw.ZAxis);
  68.   Serial.print(" Xnorm = ");
  69.   Serial.print(norm.XAxis);
  70.   Serial.print(" Ynorm = ");
  71.   Serial.print(norm.YAxis);
  72.   Serial.print(" ZNorm = ");
  73.   Serial.print(norm.ZAxis);
  74.   Serial.println();  
  75.  
  76.   delay(100);
  77. }

Wynik działania

HMC5883L jako kompas cyfrowy

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:

  1. #include <Wire.h>
  2. #include <HMC5883L.h>
  3.  
  4. HMC5883L compass;
  5.  
  6. int previousDegree;
  7.  
  8. void setup()
  9. {
  10.   Serial.begin(9600);
  11.  
  12.   // Inicjalizacja HMC5883L
  13.   Serial.println("Initialize HMC5883L");
  14.   while (!compass.begin())
  15.   {
  16.     Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
  17.     delay(500);
  18.   }
  19.  
  20.   // Ustawienie zakresu pomiarowego
  21.   compass.setRange(HMC5883L_RANGE_1_3GA);
  22.  
  23.   // Ustawienie trybu pracy
  24.   compass.setMeasurementMode(HMC5883L_CONTINOUS);
  25.  
  26.   // Ustawienie czestotliwosci pomiarow
  27.   compass.setDataRate(HMC5883L_DATARATE_15HZ);
  28.  
  29.   // Liczba usrednionych probek
  30.   compass.setSamples(HMC5883L_SAMPLES_4);
  31. }
  32.  
  33. void loop()
  34. {
  35.   // Pobranie wektorów znormalizowanych
  36.   Vector norm = compass.readNormalize();
  37.  
  38.   // Obliczenie kierunku (rad)
  39.   float heading = atan2(norm.YAxis, norm.XAxis);
  40.  
  41.   // Ustawienie kata deklinacji dla Bytomia 4'26E (positive)
  42.   // Formula: (deg + (min / 60.0)) / (180 / M_PI);
  43.   float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / M_PI);
  44.   heading += declinationAngle;
  45.  
  46.   // Korekta katow
  47.   if (heading < 0)
  48.   {
  49.     heading += 2 * PI;
  50.   }
  51.  
  52.   if (heading > 2 * PI)
  53.   {
  54.     heading -= 2 * PI;
  55.   }
  56.  
  57.   // Zamiana radianow na stopnie
  58.   float headingDegrees = heading * 180/M_PI;
  59.  
  60.   // Output
  61.   Serial.print(" Heading = ");
  62.   Serial.print(heading);
  63.   Serial.print(" Degress = ");
  64.   Serial.print(headingDegrees);
  65.   Serial.println();
  66.  
  67.   delay(100);
  68.  
  69.   delay(100);
  70. }

Wynik działania:

Program do processingu znajdziecie w archwium biblioteki.

Uwaga na koniec

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.

Demo

 

Materiały dodatkowe

Biblioteka HMC5883Lhttps://github.com/jarzebski/Arduino-HMC5883L
Dokumentacja techniczna: http://www.jarzebski.pl/datasheets/HMC5883L.pdf