Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Sensory 3-osiowy kompas cyfrowy
Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
2
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Zasilanie: V Pobór prądu: ,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 Zygmunt Kubiak
3
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Za Zygmunt Kubiak
4
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 Zygmunt Kubiak
5
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 Zygmunt Kubiak
6
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Za Zygmunt Kubiak
7
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Za Zygmunt Kubiak
8
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Za Zygmunt Kubiak
9
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Za Zygmunt Kubiak
10
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] Zygmunt Kubiak
11
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.: ) 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 Zygmunt Kubiak
12
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 Zygmunt Kubiak
13
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 Zygmunt Kubiak
14
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Rejestry Zygmunt Kubiak
15
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 x3C (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 Zygmunt Kubiak
16
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. Zygmunt Kubiak
17
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Rejestr konfiguracji A Zygmunt Kubiak
18
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 Zygmunt Kubiak
19
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Rejestr konfiguracji B Zygmunt Kubiak
20
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Rejestr konfiguracji B Zygmunt Kubiak
21
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 Zygmunt Kubiak
22
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 Zygmunt Kubiak
23
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. Zygmunt Kubiak
24
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 Zygmunt Kubiak
25
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 b I2C 7 bitowy adres HMC5883 Zygmunt Kubiak
26
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 } Zygmunt Kubiak
27
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(); Zygmunt Kubiak
28
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 } Zygmunt Kubiak
29
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); } Zygmunt Kubiak
30
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; Zygmunt Kubiak
31
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; Zygmunt Kubiak
32
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 } Zygmunt Kubiak
33
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 } Zygmunt Kubiak
34
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!"); Zygmunt Kubiak
35
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 } Zygmunt Kubiak
36
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); } Zygmunt Kubiak
37
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: 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°. Zygmunt Kubiak
38
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Zygmunt Kubiak
39
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; Zygmunt Kubiak
40
Sensory 3-osiowy kompas cyfrowy – mod. GY-273 z układem HMC5883L
Zygmunt Kubiak
41
Dziękuję Zygmunt Kubiak
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.