LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

[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);
		}
	}