[PROJEKT] Elektroniczny kompas z sensorem HMC5883L
W artykule przedstawimy realizację niezwykłego kompasu cyfrowego, zrealizowanego na mikrokontrolerze Kinetis K40 i 3-osiowym czujniku pola magnetycznego Ziemi w – HMC5883L. Platformą sprzętową dla przykładu jest KwikStik K40.
W przykładzie posłużymy się 3-osiowym czujnikiem pola magnetycznego HMC5883L, który za pośrednictwem magistrali I2C komunikuje się z zestawem KwikStik K40. Zestaw zamontowano na – widocznej na zdjęciu – płytce KwikStikBase, która spełnia rolę bazy mechanicznej i elektrycznej dla zestawu KwikStik K40. Dodatkowo w projekcie zastosowano adapter złącz TWRPI, dzięki któremu (między innymi) użytkownik uzyskuje łatwy dostęp do interfejsu I2C1 mikrokontrolera K40.
Schemat elektryczny płytki z czujnikiem kompasowym oraz jej dokumentacja produkcyjna są dostępne do pobrania pod adresem. Płytkę czujnika należy dołączyć do adaptera TWRPI w sposób pokazany na filmie, linie:
SCL_HMC5883<->SCL_KwikStikK40,
SDA_HMC5883<->SDA_KwikStikK40,
GND_HMC5883<->GND_KwikStikK40 i
+3,3V_HMC5883<->+3,3V_KwikStikK40
Po konfiguracji mikrokontrolera, przygotowany przez nas program przygotowuje do pracy LCD oraz magnetometr. Wyświetlacz po inicjalizacji jest czyszczony, następnie jest konfigurowany magnetometr za pomocą funkcji:
int InitHMC5883(MQX_FILE_PTR * f, _mqx_int Freq)
Czułość ustawiona zostaje na 0,88 gaussa oraz włączony zostaje pomiar cykliczny.
WriteHMC5883Reg(*f, 0x01, 0x00); //0.88gaus WriteHMC5883Reg(*f, 0x02, 0x00);//Cykliczny pomiar
W momencie gdy wszystko przebiegnie pomyślnie funkcja InitHMC5883 zwraca wartość „1”, dlatego też program może kontynuować działanie:
if (! InitHMC5883(&HMC5883File, 100000)) _task_block();
W następnej kolejności na wyświetlaczu włączone zostaje logo Freescale, symbol buzzera, pierwsza i ostatnia kolumna pikseli po czym w środku ukazuje się napis „KAL” (widoczny na filmie):
LCD_WF3TO0 = 0x00FF1100; LCD_WF7TO4 = 0x00000000; LCD_WF11TO8 = 0x00000000; LCD_WF15TO12 = 0x00000000; LCD_WF19TO16 = 0x00000000; LCD_WF23TO20 = 0x00000000; LCD_WF27TO24 = 0x00000000; LCD_WF31TO28 = 0x00000000; LCD_WF35TO32 = 0x00000000; LCD_WF39TO36 = 0x0000FF00; _SLCDModule_PrintString("KAL", 11);
Napis ten jest przysłaniany w czasie 15 sekund przez przesuwający się pasek postępu, informujący o czasie pozostałym do końca kalibracji, w którym to musimy obrócić HMC5883 minimalnie raz o 360 stopni. Należy pamiętać, że od samego początku kalibracji oś czujnika „Z” musi być ustawiona prostopadle do Ziemi.
while (petla) { HMC5883GetTemp(HMC5883File, &x,&y,&z); if (x<xmin) xmin=x; if (x>xmax) xmax=x; if (y<ymin) ymin=y; if (y>ymax) ymax=y; petla--; //37 bar=(unsigned short)petla/405; for (line=0;line<8;line++) { _SLCDModule_SetSegment(bar, line); } }