STM32Butterfly2 i akcelerometr LIS35D
W ostatnim czasie bardzo dużą popularność zdobyły układy MEMS. Szczególnie widoczne są one w postaci akcelerometrów montowanych w telefonach komórkowych, umożliwiając automatyczną zmianę orientacji, obrazu i wykrywanie gestów w sterowaniu aplikacjami. Układy te można także zastosować we własnych aplikacjach.
Poniższy projekt przedstawia obsługę akcelerometru LIS35DE, jest on dostępny także w postaci modułu KAmodMEMS2 (fotografia 1). Działanie aplikacji polega na pomiarze pozycji w osiach X, Y i Z oraz prezentacji jej na wyświetlaczu pochodzącego z telefonu Nokia 3310 (w tym przypadku moduł KAmodLCD1). Komunikacja z układem LIS35DE może być realizowana przez magistrale I2C lub SPI, w przedstawionej aplikacji została wykorzystana ta pierwsza.
Fot. 1. Wygląd modułu KAmodMEMS2
Rys. 2. Schemat elektryczny modułu KAmodMEMS2
Projekt został przygotowany dla zestawu STM32Butterfly2 oraz STM32Butterfly. W obu przypadkach używane elementy są w identycznej konfiguracji, w związku z tym aplikacja nie wymaga wprowadzania dodatkowych zmian przy przejściu na drugą platformę. Projekt do poprawnego działania wymaga modułów: KAmodeMEMS2 i KAmodLCD1. Połączenie ich do zestawu ewaluacyjnego zostało przedstawione na rysunku 3. Układ LIS35D wymaga zasilania z zakresu 2,16V do 3,6V, w związku z tym zasilanie modułu nie powinno być pobierane ze złącza magistrali I2C, tylko ze złącza z wyprowadzonymi liniami portów.
Rys. 3. Zalecany sposób podłączenia modułu KAmodMEMS2 (z układem LIS35D) do STM32Butterfly2
Poniżej przedstawiono program główny aplikacji prezentującej pozycję modułu KAmodMEMS2.
int main(void) { //Initialize system timer time_init(); //Initialize nokia display nlcd_init(); //Initialize the i2c module i2cm_init(I2C_SPEED); //Initialize temp controller int res = lis35_init(); if(res<0) { print_error(res); for(;;); //Fail never end loop } else { nlcd_put_string( "www.boff.pl", 0, 0 ); } for(pos_t x=0,y=0,z=0;;) { res = lis35_get(&x,&y,&z); if(res%gt;=0) { print_value(x,y,z); } else { print_error(res); for(;;); //Failed infinite loop } wait_ms(MEASURE_DELAY_TIME); } return 0; }