Cyfrowy kompas na STM32 z czujnikiem HMC5883
W projekcie pokażemy w jaki sposób wykonać na mikrokontrolerze STM32 kompletny kompas cyfrowy, bazujący na 3-osiowym czujniku pola magnetycznego HMC5883L firmy Honeywell. Projekt wykonano na zestawie ZL27ARM, wynik pomiarów jest prezentowany na kolorowym wyświetlaczu LCD z interfejsem SPI (moduł KAmodTFT2).
Artykuł na temat czujnika HMC5883 oraz zestawu ewaluacyjnego z dokumentacją PCB opublikowaliśmy tutaj. |
Do realizacji przykładu zastosowano 3-osiowy czujnik pola magnetycznego HMC5883L, który za pośrednictwem magistrali I2C komunikuje się z mikrokontrolerem STM32 w zestawie ZL27ARM. Do zestawu podłączono również kolorowy wyświetlacz prezentujący dane z czujnika (schemat niezbędnych połączeń pokazano na rysunku 1). Dużą część programu zajmują obliczenia trygonometryczne oraz wyświetlanie odpowiednich danych na wyświetlaczu.
Rys. 1. Schemat połączeń niezbędnych do zaimplementowania przykładowego projektu
Dokumentacja płytki drukowanej dla czujnika HMC5883L jest dostępna do bezpłatnego pobrania pod adresem. |
Po konfiguracji mikrokontrolera program przygotowuje do pracy moduł KAmodTFT2 oraz magnetometr HMC5883. Następnie w nieskończonej pętli zrealizowana jest obsługa menu głównego, program sprawdza stan przycisków celem zmiany wybranej opcji w menu:
if (!GPIO_ReadInputDataBit(JOY_SW_PORT,JOY_UP) && (pozycja>1)){ aktualizacja=pozycja; pozycja--; } if (!GPIO_ReadInputDataBit(JOY_SW_PORT, JOY_DOWN) && (pozycja<4)){ aktualizacja=pozycja; pozycja++; }
po czym, jeśli nie zatwierdzono wyboru przyciskiem JOY_ENTER oraz wybrana pozycja z menu się zmieniła, następuje jego przerysowanie:
//Rysowanie menu if (aktualizacja>=0) { if (aktualizacja==0) { TFTN_Clear(0x000); TFTN_FillRect( 0, 0, 131, 18, 0x555); TFTN_WriteXY("MENU\0",45,2,0xFFF,0x555, font2); } for (i=1;i<=4;i++){ if ((i==aktualizacja)||(aktualizacja==0)) { TFTN_FillRect( 0, i*18+8, 131, i*18+8+18, 0x000); TFTN_WriteXY(menu[i-1],5,i*18+10,0xFFF,0x000, font2); } if (i==pozycja) { TFTN_FillRect( 0, i*18+8, 131, i*18+8+18, 0x000); TFTN_WriteXY(menu[i-1],5,i*18+10,0xF00,0x000, font2); } } aktualizacja=-1; }