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)
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