Sensory 3-osiowy kompas cyfrowy Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Zasilanie: 3-5V Pobór prądu: 0,1mA Przetwornik AC 12 bitowy Osiem zakresów pomiarowych Maksymalny zakres pomiarowy: -8 G do +8 G Minimalny zakres pomiarowy: -0,88 G do +0,88 G 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Za 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L HMC5883L, obudowa LLC 3,0x3,0x0,9mm Producent: Honeywell Przetwornik AC 12-bitowy zapewnia dokładność kątową 1-2º Czujniki pola magnetycznego wykonane są z anizotropowych elementów magnetorezystancyjnych (ang. AMR – Anisotropic Magnetoresistive) z permaloju (stop niklu (79%) i żelaza (21%)), które tworzą układ mostkowy 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Zalecany sposób montażu Należy unikać elementów ferromagnetycznych (żelazo, nikiel) w pobliżu obudowy Należy usunąć miedź pod obudową Do minimum usunąć zasilania i masy spod obudowy 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Za 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Za 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Za 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Za 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Test automatyczny Funkcja auto-test umożliwia sprawdzenie poprawności działania HMC5883L Przy wykorzystaniu wew. uzwojenia o generowane jest nominalne pole magnetyczne dla dodatniej jak i ujemnej polaryzacji; pole jest mierzone i zapisywane Różnica tych pomiarów jest wykorzystywana do korekcji wyników pomiarów w każdej z trzech osi Wyniki autotestu mogą być także wykorzystane do określenia/ kompensowania zmiany czułości pod wpływem temperatury Autotest Wysłanie impulsu „Set” Odczyt pierwszego pomiaru (M1) Wygenerowanie prądu (~10mA) w uzwojeniu „offset” do wytworzenia pola (~1,1 Gauss) „offset” i odczyt kolejnego pomiaru (M2) Wpisanie różnicy pomiarów do rejestru wyjsciowego każdego z sensorów Wyjście = [M2-M1] 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Magistrala I2C Układ HMC5883L jest urządzeniem typu Slave Jest zgodny ze specyfikacją I2C (dok.:9398 393 40011) Korzysta z adresu 7-bitowego Obsługuje prędkości zegara 100kHz i 400kHz Zewnętrzne rezystory podciągające są niezbędne Dostęp do rejestrów ma priorytet nad wewnętrzną aktywnością układu, np. pomiarami – celem tego jest by oczekiwanie na dostęp do magistrali oraz jej zajętość trwały możliwie najkrócej Wewnętrzny zegar układu jest wykorzystywany wyłącznie dla jego wewnętrznych funkcji 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Mostek H do sterowania uzwojeniem Set/Reset Użyte tranzystory FET duży ale krótki impuls podawany na „uzwojenie” (pasek) Set/Reset Funkcja Set/Reset wykonywana jest automatycznie dla każdego pomiaru Połowa z różnicy pomiarów Set/Reset zostaje umieszczona w rejestrze danych wyjściowych dla każdej z trzech osi – w ten sposób są korygowane błędy wynikające z offsetu i wpływu temperatury Set/Reset również usuwa skutecznie pozostałość magnetyczną, jeśli była Dla każdego pomiaru: Wysłanie impulsu Set Odczyt pomiaru (Mset) Wysłanie impulsu Reset Odczyt pomiaru (Mreset) Wpisanie wyniku do rej. wyj.: Wyjście = [Mset – Mreset] / 2 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Tryby działania Tryb pomiaru ciągłego (ang. Continuous-Measurement Mode) Układ wykonuje cykliczne pomiary z prędkością określoną przez użytkownika i dane umieszcza w rejestrach wyjściowych Dane mogą być odczytane z rejestrów w razie potrzeby Jeśli Master nie zagwarantuje odczytu przed końcem pomiaru, wyjściowe rejestry danych zostaną nadpisane nowymi pomiarami Pomiędzy pomiarami układ przechodzi do stanu podobnego do trybu czuwania Tryb pojedynczego pomiaru (ang. Single-Measurement Mode) Układ wykonuje pojedynczy pomiar, aktualizuje rejestry wyjściowe i przechodzi do trybu czuwania Tryb bezczynności (ang. Idle Mode) Układ jest dostępny przez magistralę I2C, ale główne układy wewnętrzne są wyłączone 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestry 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Dostęp do rejestrów Master wysyła najpierw 7-bitowy adres (0x1E) oraz 1-bitowy identyfikator odczyt/zapis Odczyt 0x3D (przesunięcie adresu w lewo o 1 bit + bit odczytu) Zapis 0x3C (przesunięcie adresu w lewo o 1 bit) Wskaźnik adresu jest automatycznie inkrementowany, bez udziału Master Każda próba odczytu nieprawidłowej lokalizacji zwraca 0; analogicznie nie jest realizowany zapis do nieprawidłowej lokalizacji 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr konfiguracji A Lokalizacja Nazwa Opis CRA7 Bit CRA7 jest rezerwowany na przyszłość CRA6 do CRA5 MA1 do MA0 Liczba uśrednianych próbek (1-8) 00 = 1 (domyślnie); 01 = 2; 10 = 4; 11 = 8 CRA4 do CRA2 DO2 do DO0 Częstotliwość zapisu próbek do rejestrów CRA1 do CRA0 MS1 do MS0 Bity konfiguracyjne dla pomiarów. 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr konfiguracji A 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr konfiguracji A MS1 MS0 Tryb pomiarowy Normalny układ pomiarowy (domyślnie) 1 Dodatnie podmagnesowanie dla wszystkich osi Ujemne podmagnesowanie dla wszystkich osi Rezerwa 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr konfiguracji B 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr konfiguracji B 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr trybów MD1 MD0 Tryb pracy Tryb pracy ciągłej. Wyj. RDY=1 dane dostępne 1 Tryb pojedynczego pomiaru. Gdy dane gotowe RDY=1 Tryb bezczynności 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Dane wyjściowe Dwa rejestry 8-bitowe Dane traktowane są jako liczby 16-bitowe w uzupełnieniu dwójkowym Zakres od 0xF800 do 0x7FF Rejestr A zawiera starszy bajt (MSB) a rejestr B – młodszy bajt (LSB) W przypadku przekroczenia zakresu w górę lub dół do rejestru wpisana zostanie wartość -4096 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Rejestr stanu Lokalizacja Nazwa Opis SR7 – SR2 Rezerwa SR1 LOCK Blokada rejestru danych. Ten bit jest ustawiony gdy: 1- Nie wszystkie 6 rejestrów zostało odczytane 2- Rejestr trybu został odczytany. Dane są zablokowane a nowe nie zostaną umieszczone do momentu spełnienia jednego z warunków: 1. Wszystkie 6 bajtów odczytano 2. Rejestr trybu został zmieniony 3. Konfiguracja pomiarów (CRA) została zmieniona 4. reset układu SR0 RDY Bit gotowości. Ustawiony, gdy zapisane zostało 6 rejestrów. Kasowany przy rozpoczęciu kolejnego zapisu. 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Przykład inicjalizacji pracy ciągłej Zapis CRA (00) – wysłanie 0x3C 0x00 0x70 (uśrednianie 8 pomiarów, częstotliwość 15Hz, normalny tryb pomiarowy) Zapis CRB (01) – wysłanie 0x3C 0x01 0xA0 (wzmocnienie x5) Zapis Mode (02) - wysłanie 0x3C 0x02 0x00 (praca ciągła) Czekaj 6ms lub monitorowanie rejestru stanu lub wyjścia DRDY Pętla wysłanie 0x3D 0x06 (odczyt 6 bajtów) konwersja wyniku na wartości dziesiętne dla wszystkich osi wysłanie 0x3C 0x03 (wskaźnik do rejestru pierwszej danej 0x03 czekaj około 67ms (dla 15Hz) lub monitorowanie rej. stanu lub DRDY End_loop 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino z HMC5883L /* * HMC5883L Demo. * Arduino UNO lub odpowiednik * Arduino GND -> GY273/HMC5883L GND * Arduino 3.3V -> GY273/HMC5883L VCC * Arduino A4 (SDA) -> GY273/HMC5883L SDA * Arduino A5 (SCL) -> GY273/HMC5883L SCL */ #include <Wire.h> //I2C Arduino Library //0x1E 0011110b I2C 7 bitowy adres HMC5883 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino void setup() { //Initializacja transmisji szeregowej Serial.begin(9600); Serial.println("TEST modulu GY273 "); //Initializacja komunikacji I2C Wire.begin(); // zegar I2C – domyślnie 100kHz // Wybór trybu pracy HMC5883 Wire.beginTransmission(0x1E); //otw. komunikacji Wire.write(0x02); // wybór rejestru trybu Wire.write(0x00); // wybór trybu ciągłych pomiarów Wire.endTransmission(); // koniec nadawania } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino void loop() { int x, y, z; // dane z trzech osi //Odczyt danych z układu HMC5883 Wire.beginTransmission(0x1E); Wire.write(0x03); //wybór rejestru #3, rej. X MSB Wire.endTransmission(); 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino // odczyt danych z każdej osi, 2 rejestry na każdą oś Wire.requestFrom(0x1E, 6); if(6<=Wire.available()) { x = Wire.read() <<8; //X msb x |= Wire.read(); //X lsb z = Wire.read() <<8; //Z msb z |= Wire.read(); //Z lsb y = Wire.read() <<8; //Y msb y |= Wire.read(); //Y lsb } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino //Wydruk wyników dla wszystkich osi Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); Serial.print(" z: "); Serial.println(z); delay(1000); } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Aplikacja Arduino z HMC5883L – wersja rozszerzona /* * HMC5883L Demo. * Arduino UNO lub odpowiednik * Arduino GND -> GY273/HMC5883L GND * Arduino 3.3V -> GY273/HMC5883L VCC * Arduino A4 (SDA) -> GY273/HMC5883L SDA * Arduino A5 (SCL) -> GY273/HMC5883L SCL */ #include <Wire.h> //I2C Arduino Library #define HMC5883L_ADDR 0x1E //I2C 7bit adres HMC5883 bool haveHMC5883L = false; 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino bool detectHMC5883L () // odczyt rejestrów identyfikatora { Wire.beginTransmission(HMC5883L_ADDR); //otw. komunikacji Wire.write(10); // wybór rej. A identyfikatora Wire.endTransmission(); // koniec nadawania Wire.requestFrom(HMC5883L_ADDR, 3); // odczyt danych, liczba if(3 == Wire.available()) char a = Wire.read(); char b = Wire.read(); char c = Wire.read(); if(a == 'H' && b == '4' && c == '3') return true; } return false; 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino void setup() { //Initializacja transmisji szeregowej oraz komunikacji I2C Serial.begin(9600); Serial.println("TEST modulu GY273 "); Wire.begin(); // zegar I2C – domyślnie 100kHz // TWBR=400000L dla 400kHz TWBR = 78; // 25 kHz TWSR |= _BV (TWPS0); // zmiana dzielnika wstępnego } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino void loop() { bool detect = detectHMC5883L(); // sprawdzenie obecności układu if(!haveHMC5883L) if(detect) haveHMC5883L = true; Serial.println("HMC5883L zostal dolaczony do Arduino"); // Wybór trybu pracy HMC5883 Wire.beginTransmission(HMC5883L_ADDR); //otw. komunikacji Wire.write(0x02); // wybór rejestru trybu Wire.write(0x00); // wybór trybu ciągłych pomiarów Wire.endTransmission(); // koniec nadawania } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino else { Serial.println(„Nie wykryto HMC5883L!"); delay(2000); return; } if(!detect) haveHMC5883L = false; Serial.println(„Utrata komunikacji z HMC5883L!"); 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino int x,y,z; // dane z trzech osi //Odczyt danych z układu HMC5883 Wire.beginTransmission(HMC5883L_ADDR); Wire.write(0x03); //wybór rejestru #3, rejestr X MSB Wire.endTransmission(); // odczyt danych z każdej osi, 2 rejestry na każdą oś Wire.requestFrom(HMC5883L_ADDR, 6); if(6<=Wire.available()) { x = Wire.read()<<8; //X msb x |= Wire.read(); //X lsb z = Wire.read()<<8; //Z msb z |= Wire.read(); //Z lsb y = Wire.read()<<8; //Y msb y |= Wire.read(); //Y lsb } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino //Wydruk wyników dla wszystkich osi Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); Serial.print(" z: "); Serial.println(z); delay(250); } 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino 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, ustawiając jego reakcję na zmianę o 3°. 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L Prosta aplikacja Arduino 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; 11-2014 Zygmunt Kubiak
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L 11-2014 Zygmunt Kubiak
Dziękuję Zygmunt Kubiak 09-2006