QMC5883L to funkcjonalny odpowiednik układu HMC5883L firmy Honeywell. Po zaprzestaniu produkcji przez Honeywell-a licencję kupiła firma QST i zaczęła produkcję swojej wersji QMC5883L. Wywołało to pewne zamieszanie wśród użytkowników, ponieważ układy choć podobne różnią się jednak w szczegółach obsługi. W dodatku podzespoły montowane na płytkach modułów oznaczone są jako DB5883 (lub DA5883) co dodatkowo zwiększa zamieszanie.
Korzystając z karty katalogowej układu QMC5883L można ustalić, że jego parametry są następujące:
- całkowity zakres pomiarowy sensora: ±8 Gauss,
- zakres precyzyjnego pomiaru: ±2 Gauss,
- ilość pomiarów na sekundę: do wyboru 10/50/100/200,
- ilość próbek używanych do uśredniania wyniku: do wyboru 64/128/256/512,
- komunikacja: magistrala I2C,
- zasilanie: 2,16...3,6 V,
- pobór prądu: zależnie od ustawionej ilości pomiarów na sekundę od 100 do 850 mA.
- niektóre rodzaje modułów mają także zamontowane dodatkowe układy dopasowujące poziomy sygnałów. W takim przypadku możliwa jest praca z zasilaniem i sygnałami magistrali w zakresie od 3,3 do 5 V.
Sposób działania i sterowanie magnetometrem
Na rysunku 1 pokazana została wewnętrzna budowa układu QMC5883L. Rolę elementów pomiarowych pełnią 3 wewnętrzne czujniki magneto-rezystywne. Napięcie z czujników proporcjonalne do natężenia pola magnetycznego, jest sekwencyjnie podawane na wejście przetwornika analogowo-cyfrowego. Wynik przetwarzania zostaje zapisywany w rejestrach dla każdego czujnika oddzielnie. Zawartość rejestrów można odczytać poprzez magistralę I2C. Wbudowany sensor temperatury zależnie od jej poziomu koryguje wynik pomiarów.
Pracę magnetometru synchronizuje sygnał zegarowy wytwarzany przez wewnętrzny generator. O zakończeniu cyklu pomiarów i uaktualnieniu danych informuje ustawienie flag w dostępnym do odczytu rejestrze stanu sensora. Czujniki magneto-rezystywne rozmieszczone są w obudowie tak, aby umożliwić pomiar pola w 3 płaszczyznach X, Y, Z. Na rysunku 2 zaznaczono osie pomiarów względem obudowy.
Po włączeniu zasilania układ magnetometru znajduje się w stanie wstrzymania pobierając minimalny prąd rzędu 3 mA. W tym trybie oczekuje na transmisję magistralą I2C, która zmieni ustawienia rejestrów i zainicjuje pomiary. Dołączony do magistrali jako slave, czujnik reaguje na adres 0x0D (zapis 7 bitowy). W trybie zapisu każda transmisja rozpoczyna się sekwencją Start, adresem slave z wyzerowanym 8 bitem jako dopełnieniem adresu, wysyłany jest bajt z numerem rejestru i bajt danych zakończony sekwencją Stop. W trybie odczytu po sekwencji Start, wysłaniu adresu slave z wyzerowanym 8 bitem i bajtu z numerem rejestru do odczytu, master ponownie wysyła sekwencję Start i adres slave tym razem z ustawionym 8 bitem. Czujnik rozpoczyna przesyłanie zawartości rejestru.
Rejestry magnetometru
Czujnik reaguje na adresy rejestrów od 00H do 0DH (heksadecymalnie).
- 00H – 05H rejestry danych pomiarowych z czujników magneto-rezystywnych. Dane z każdego czujnika zajmują 2 rejestry, w kolejności: XYZ. Rejestr o młodszym adresie zawiera bity b.7 – b.0, w kolejnym rejestrze są bity b.15 – b.8. Dane są zapisane w kodzie uzupełnienia do 2, b.15 ustawiony oznacza wartość ujemną. Rejestry danych są tylko do odczytu. Możliwy jest odczyt grupowy wszystkich 6 rejestrów.
- 06H rejestr flag statusu, rejestr tylko do odczytu,
- b.0 (DRDY) flaga sygnalizuje umieszczenie nowych danych w rejestrach. Flaga jest automatycznie kasowana po odczycie rejestrów danych 00H – 05H,
- b.1 (OVL) gdy flaga jest ustawiona sygnalizuje, że dane w rejestrach mogą być błędne. Automatycznie kasowana gdy w rejestrach danych czujnik umieści nowe dane bez błędu,
- b.2 (DOR) flaga sygnalizuje utracenie nie odczytanych danych przez nadpisanie nowymi wynikami pomiarów. Flaga jest automatycznie kasowana po odczycie rejestrów danych pomiarowych.
- 07H – 08H rejestry wewnętrznego czujnika temperatury. Młodszy i starszy bajt temperatury w kodzie uzupełnienia do 2, rejestry tylko do odczytu,
- 09H rejestr sterujący 1, rejestr do zapisu i odczytu,
- b.1-0 (MODE) bity sterujące trybem pracy: 00 – tryb wstrzymania z obniżonym poborem mocy, 01 – tryb normalnych pomiarów,
- b.3-2 (ODR) bity wyboru częstotliwości pomiarów: 00 – 10 Hz, 01 – 50 Hz, 10 – 100 Hz, 11 – 200 Hz,
- b.5-4 (RNG) bity wyboru zakresu pomiarowego: 00 – 2G (Gauss), 01 – 8G,
- b.7-6 (OSR) wybór ilości kolejnych pomiarów do uśrednienia wyniku: 00 – 512, 01 – 256, 10 – 128, 11 – 64.
- 0AH rejestr sterujący 2, rejestr do zapisu i odczytu,
- b.0 (INT_ENB) gdy bit wyzerowany, wyjście DRDY czujnika będzie sygnalizowało nowe dane do odczytu (odpowiednik flagi DRDY). Wyjście pozostaje w stanie wysokim dopóki nowe dane nie zostaną odczytane.
- b.6 (ROL_PNT) gdy bit ustawiony włączony tryb automatycznego przewijania adresu rejestru do odczytu w zakresie 00H – 06.
- b.7 (SOFT_RST) programowy reset wpisujący do rejestrów wartości predefiniowane.
- 0BH rejestr Period, rejestr do zapisu i odczytu, typowa wartość to 1.
- 0DH rejestr identyfikacji układu, rejestr tylko do odczytu, odczytywana wartość to FFH.
Przykładowa sekwencja uruchomienia pomiarów po podłączeniu czujnika do zasilania z ustawieniami: OSR=512, RNG=8G, ODR=200 będzie wyglądała tak: zapis do rejestru 0BH wartości 0x01, zapis do rejestru 09H wartości 0x1D. Czujnik rozpocznie pomiary i umieszczanie w rejestrach danych wyników pomiarów.
Użycie magnetometru jako kompasu
Dzięki wysokiej czułości i możliwości dokonywania pomiarów w 3 płaszczyznach można moduł magnetometru zastosować do detekcji północnego bieguna magnetycznego czyli po prostu jako kompas. W dobie powszechnej dostępności GPS-u i darmowych aplikacji symulujących kompas w komórce nie brzmi ekscytująco. Ale niewielkie rozmiary modułu: 15×13 mm, niskie zużycie energii i względna prostota obliczeń pozwalają go wykorzystać w urządzeniach i automatach do lokalizacji i określania kierunku ruchu.
Do obliczeń wykorzystuje się pomiary pola w płaszczyźnie X i Y. Podstawiając zmierzone wartości do wzoru:
float kierunek_rad = atan2((float)Ypomiar, (float)Xpomiar);
Otrzymujemy odchylenie osi X sensora od linii pola magnetycznego wskazujących północ. Otrzymany kąt jest wyrażony w radianach. Jeżeli chcemy na końcu obliczeń otrzymać wynik w stopniach kątowych z przedziału 0...360° należy skorygować wynik w radianach tak, aby mieścił się w zakresie 0p – 2p (Podstawiony do obliczeń symbol M_PI oznacza w języku programowania C nieśmiertelną stałą p czyli 3,14… z odpowiednią dokładnością po przecinku).
if (kierunek_rad < 0){
kierunek_rad += 2 * M_PI;
}
if (kierunek_rad > 2 * M_PI){
kierunek_rad -= 2 * M_PI;
}
Na koniec zamieniamy otrzymany wynik z radianów na bardziej czytelne stopnie kąta pełnego.
float pozycja_stopnie = pozycja_rad * 180/M_PI;
Otrzymujemy wynik będący kątem wyrażonym w stopniach pomiędzy osią X zamontowanego na module sensora a magnetyczną północą. Wynik prawdopodobnie bardzo… niedokładny. W największym stopniu przyczyną błędu będzie asymetria wskazań sensorów osi X i osi Y. Tą przyczynę fałszowania wskazań dosyć łatwo jest wyeliminować przeprowadzając wstępną kalibrację przyrządu. Polega ona na obrocie płytki sensora dookoła osi w tej samej płaszczyźnie i zapamiętania dla osi X i Y skrajnych, minimalnych i maksymalnych odczytów. Następnie należy obliczyć ich średnią arytmetyczną a otrzymane wyniki zapamiętać i stosować do korekcji danych pomiarowych Xpomiar i Ypomiar użytych do obliczeń kąta.
ofsetX =(pomiarX_max + pomiarX_min) / 2 ;
ofsetY =(pomiarY_max + pomiarY_min) / 2 ;
//korekta kalibracyjna danych pomiarowych
Ypomiar =danaY - ofsetY;
Xpomiar =danaX - ofsetX;
Kolejną przyczyną fałszowania wskazań modułu jest konieczność utrzymywania podczas pomiaru pozycji równoległej do powierzchni ziemi. Przechyły modułu będą fałszować wskazania magnetometru. Podobnie jak obecność w pobliżu przedmiotów wykonanych z materiałów ferromagnetycznych. Jest to taki sam efekt jak w przypadku tradycyjnego kompasu, gdy wychylenie igły ulega zaburzeniu w pobliżu przedmiotu wykonanego z żelaza bądź stali. Z drugiej strony ta cecha magnetometru może być wykorzystana do śledzenia pozycji sensora względem obiektów wykonanych z materiałów ferromagnetycznych, zakłócających pole magnetyczne.
Oprogramowanie do testowania modułu
Do testowania magnetometru QMC5883L opracowano oprogramowanie dla płyty rozwojowej STM32F746G-DISCO. Oprogramowanie pozwala obserwować zachowanie sensora przy różnych wartościach parametrów pomiarowych. Moduł sensora połączony jest z płytą 4 przewodami (tabela 1).
Moduł magnetometru | Płyta STM32F746G-DISCO |
SCL linia magistrali I2C | CN7-10 PB8 |
SDA linia magistrali I2C | CN7-9 PB9 |
VCC zasilanie 3,3 – 5 V | CN7-8 AVDD 3,3 V |
GND | CN7-7 GND |
DRDY wyprowadzenie sygnalizacyjne | Nie podłączone |
Na płytce modułu powinny być zamontowane oporniki podciągające linie magistrali I2C do poziomu napięcia zasilającego i w takim przypadku nie ma potrzeby dodawania jakichkolwiek zewnętrznych elementów. Długość przewodów łączących płytę z modułem nie powinna przekraczać 20 cm.
Program testowy składa się z 3 ekranów. Zaraz po włączeniu pojawia się ekran z polami do wyświetlania danych surowych z czujników w osiach X, Y, Z. Pomiary inicjuje ustawienie widocznego na ekranie przełącznika w pozycji ON. Jeżeli brak będzie prawidłowej komunikacji z czujnikiem, wyświetlony zostanie stosowny komunikat. Jeżeli sensor zostanie wykryty i komunikacja będzie prawidłowa, zostaną wyświetlone parametry ustawień sensora, a w polach danych pojawią się mierzone przez czujniki wartości natężenia pola (fotografia tytułowa).
Drugi ekran służy do zmiany ustawień parametrów sensora (fotografia 1). Na listach przewijanych można wybrać ustawienia: częstotliwości pomiarów, ilości pomiarów używanych do uśrednienia wyniku i zakresu pomiarowego. Zmienione ustawienia przesyłane są do sensora natychmiast po wyborze.
Trzeci ekran nazwany testem pozycjonera (fotografia 2), wykorzystuje odczyty z sensora do lokalizacji pozycji modułu względem północnego bieguna magnetycznego Ziemi. Ten prosty kompas działa przy ustawionym zakresie pomiarowym 2Gs. Dla poprawienia dokładności wskazań, przed pomiarami konieczna jest kalibracja.
Po ustawieniu przełącznika kalibracji w pozycję ON, należy moduł obrócić dookoła osi o 360° lub w lewo i prawo o 180°. W czasie kalibracji moduł powinien być cały czas ustawiony równolegle do powierzchni ziemi. Kalibrację kończy ustawienie przełącznika w pozycji OFF. Z prawej strony wyświetlone zostaną uzyskane wyniki kalibracji: wartości minimalne i maksymalne pomiarów czujników X, Y, Z. Wyniki przeprowadzonej kalibracji używane są do korekcji bieżących odczytów i obliczana kąta pomiędzy biegunem północnym a zaznaczoną na płytce modułu osią X.
Ryszard Szymaniak
biuro@ars.info.pl