LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

MEMS-owa poziomica z sensorem LIS35 na STM32

 

W artykule przedstawiamy opis wykonania elektronicznej, dwuosiowej poziomicy wykorzystującej w roli sensora popularny akcelerometr MEMS, która służyć będzie do pomiaru kąta względem powierzchni Ziemi, na podstawie uzyskanych danych mikrokontroler obrazować będzie wynik pomiaru na wyświetlaczu TFT w postaci efektownej libelli (pęcherzyka powietrza).

 

 

 

 

W przykładzie posłużymy się 3 osiowym akcelerometrem LIS35 firmy STMicroelectronics, który za pośrednictwem magistrali I2C komunikuje się z mikrokontrolerem STM32F103 z zestawu ZL27ARM. Do zestawu podłączono również wyświetlacz KAmodTFT2 prezentujący dane z czujnika. Schemat połączeń pokazano na rysunku 1.

 

Rys. 1. Schemat połączeń zestawu testowego (nie pokazano podłączenia diody LED D8, sterowanej z linii PB15, połączonych na płytce zestawu)

Rys. 1. Schemat połączeń zestawu testowego (nie pokazano podłączenia diody LED D8, sterowanej z linii PB15, połączonych na płytce zestawu)

 

 

Po konfiguracji sygnałów taktujących samego procesora program przygotowuje do pracy czujnik LIS35 (na module KAmodMEMS2) oraz wyświetlacz TFT. Na wyświetlaczu graficznym na czas inicjalizacji akcelerometru widnieje napis „Inicjalizacja”, w przypadku gdy LIS35 nie zostanie poprawnie wykryty przez urządzenie, obraz na LCD zmienia kolor na czerwony co sygnalizuje błąd akcelerometru.

 

 

Gdy wszystko jest w porządku, na ekranie wyświetlona zostaje bitmapa z rysunkiem tła dla poziomicy, na którym widnieją okręgi określające przechył KAmodMEMS2 względem osi X oraz Y.

	//Bialy obraz
	TFTN_Clear(0xFFF);
	//Tekst "Inicjalizacja" na TFT
  	TFTN_WriteXY("Inicjalizacja\0" ,  5, 10,0xF00,0xFFF, font2);
	//Inicjalizacja LIS35
	if (LIS35_Initialize()) TFTN_Clear(0xF00);	
	//Rysowanie tarczy poziomicy na TFT
	TFTN_WriteBMP(tarcza);

Następnie w nieskończonej pętli odczytywane są rejestry x oraz y zawierające wartość przyspieszenia liniowego za pomocą funkcji:

void LIS35_ReadRegister(char addr, signed char *v);

która jako argument przyjmuje adres rejestru do odczytania.

Jako że współrzędne kulki na ekranie są bezpośrednio odczytane z rejestrów czujnika LIS35, program ogranicza wartość przyspieszenia w każdej z osi jeśli przekroczy ono pewien zakres, aby nasz wirtualny bąbelek powietrza nie znalazł się poza renderowanym obrazem.

	//Wartosc przyspieszenia x	
	LIS35_ReadRegister(0x29,&x);
	//Wartosc przyspieszenia y
	LIS35_ReadRegister(0x2B,&y);
		
	//Ograniczenie maksymalnego przyspieszenia(przechylenia)
	if(x<(-53)) x=-53;
	if(y<(-53)) y=-53;
	if(x>53) x=53;
	if(y>53) y=53;
		
	//Obliczenie wspolrzednych kulki	
	kx=53+x;	//kx=53+x(+-)offset
	ky=53+y;	//ky=53+y(+-)offset