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:
1 |
int InitHMC5883(MQX_FILE_PTR * f, _mqx_int Freq) |
1 2 |
WriteHMC5883Reg(*f, 0x01, 0x00); //0.88gaus WriteHMC5883Reg(*f, 0x02, 0x00);//Cykliczny pomiar |
1 |
if (! InitHMC5883(&HMC5883File, 100000)) _task_block(); |
1 2 3 4 5 6 7 8 9 10 11 12 |
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); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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); } } |