ZL31ARM: sterowanie kulką i obrotami bryły 3D za pomocą czujnika MEMS LIS35

 

Celem danego projektu jest opracowanie prostego graficznego wskaźnika przyśpieszenia wraz z możliwością kalibracji wskazań, a także zaprezentowanie dwóch przykładowych zastosowań akcelerometru: do sterowania pochyleniem stołu w celu przemieszczenia kulki, a także do sterowania przyśpieszeniem kątowym obracającej się bryły. Wykorzystano tutaj moduł z ekranem LCD (KAmodTFT2), moduł z akcelerometrem MEMS (KAmodMEMS2) oraz komputerek zintegrowany z programatorem JTAG – ZL31ARM z wbudowanym mikrokontrolerem STM32F103RB.

 

Materiały pomocnicze…
…do prezentowanego projektu to opis programowej obsługi wyświetlacza z telefonu Nokia 6100 ze sterownikiem Epson S1D15G00.

 

 

Schemat elektryczny połączeń linii we/wy mikrokontrolera STM32 z joystickiem, diodami, wyświetlaczem KAmodTFT2 i akcelerometrem KAmodMEMS2 przedstawiono na poniższych rysunkach.

 

Rys. 1. Schemat podłączenia przycisków oraz diod

Rys. 1. Schemat podłączenia przycisków oraz diod

 

Rys. 2. Schemat podłączenia wyświetlacza LCD

Rys. 2. Schemat podłączenia wyświetlacza LCD

 

Rys. 3. Schemat podłączenia akcelerometru MEMS

Rys. 3. Schemat podłączenia akcelerometru MEMS

 

Konfiguracja projektu

Programy opisane w artykule powstały na bazie bibliotek opisanych w książce „Mikrokontrolery STM32 w praktyce”, dlatego przed rozpoczęciem ich testowania należy pobrać pliki źródłowe przykładów z tej książki (dostępne m.in. na stronie Wydawnictwa BTC). W pliku archiwum znajduje się katalog Libraries, który należy skopiować do katalogu z zainstalowanym środowiskiem µVision (np. C:\Keil\ARM\). Z biblioteki należy wybrać potrzebne pliki i dodać je do własnego projektu. Pliki stm32f10x_conf.h oraz stm32f10x_it.c(h) można skopiować z dowolnego katalogu i w razie potrzeby wprowadzić wymagane zmiany lub też można je znaleźć w załączniku do książki „STM32 Aplikacje i ćwiczenia w języku C” dostępne w katalogu wzorzec. Dalej klikamy na Options for Target… i w zakładce C/C++ w polu Define dodajemy następujące parametry: STM32F10X_MD, USE_STDPERIPH_DRIVER. Oprócz tego należy dodać ścieżki dostępu do plików źródłowych w Include Paths (rysunek 4). W zakładce Debug wybieramy Use ST-Link (Deprecated Version) i to samo robimy w zakładce Utilities, gdzie występuje pole Use Target Driver for Flash Programming.

 

Rys. 4. Okno z wykazem domyślnych ścieżek dostępu dla środowiska uVision

Rys. 4. Okno z wykazem domyślnych ścieżek dostępu dla środowiska µVision

 

Do wyświetlania elementów grafiki zostanie wykorzystany kod opisany w artykule „ZL31ARM: implementacja funkcji graficznych 2D” oraz „ZL31ARM: funkcje graficzne 3D”. Opisano tam również skąd można pobrać potrzebne pliki: w załączniku „Przykładowy program dla STM32” dla modułu KAmodTFT2 można znaleźć lcdlib.c, lcdlib.h, lis35.c, lis35.h (opis modułu KAmodMEMS2 wraz z opisem funkcji dla interfejsu SPI można znaleźć na stronie www.STM32.eu) oraz SystemInit.c i board.h oprócz graphics.c, który został zmodyfikowany w powyższych projektach i który jest dostępny w załączniku do tych artykułów (podczas kompilacji może wystąpić błąd nie znalezienia pliku stm32f10x_lib.h – wtedy należy zmienić nazwę na stm32f10x.h); dodatkowo w celu wyświetlenia symboli tekstowych należy pobrać załącznik do artykułu na stronie [1] oraz skopiować plik fonts.c do katalogu projektu, a z pliku main.c skopiować fragment dotyczący funkcji LCDPutChar() i zapisać do lcdlib.c. Struktura całego projektu jest przedstawiona na rysunku 5. W pliku stm32f10x_conf.h należy odkomentować instrukcje załączające potrzebne pliki, jak poniżej:

 

Rys. 5. Struktura projektu

Rys. 5. Struktura projektu

 

Docelowa zawartość pliku board.h powinna wyglądać w następujący sposób:

Konfiguracja linii portów we/wy wykorzystywanych przez joystick, 2 diody, wyświetlacz LCD oraz akcelerometr LIS35 jest zawarta w pliku SystemInit.c:

Konfiguracja kontrolera przerwań NVIC:

Konfiguracja sygnałów zegarowych:

Konfiguracja interfejsu SPI:

Kulka na wirtualnym stole

Mając do dyspozycji moduł wyświetlacza oraz akcelerometru jest możliwe zrealizowanie ciekawych programów sterujących. Pomysłów na to może być wiele, ale czasem zdarza się, że nie zawsze jest to takie proste w realizacji i niestety trzeba poznać pewne metody pozwalające osiągnąć zamierzone efekty. Na początku warto zacząć od prostych aplikacji jak np. sterowanie kulką na stole wirtualnym.

Fizyczna kulka posiada pewną masę, na którą działa siła przyciągania ziemskiego i które powoduje przyśpieszanie kulki, a zatem jej ruch. W naszym przypadku kulka co prawda nie posiada masy, ale można odczytać wartość przyśpieszenia z akcelerometru i za pomocą pewnych technik wprawić kulkę w ruch. Jak wiadomo z podstaw mechaniki klasycznej, położenie kulki na którą działa przyśpieszenie a jest określone następującym równaniem:

 

 

gdzie:
t  – czas
s  – pozycja bieżąca
s0  – pozycja początkowa
v  – prędkość początkowa
a  – przyśpieszenie

Dla potrzeb danego projektu powyższe równanie zostanie nieco zmodyfikowane w następujący sposób. Pozycja aktualna kulki będzie przechowywana w zmiennych x_pos i y_pos, które co pewien okres będą aktualizowane o wartości przemieszczenia delta_x i delta_y:

Z kolei aktualne przemieszczenia są wynikiem iloczynu prędkości aktualnej i stałego okresu próbkowania Ts:

Ostatnie dwa równania określają aktualną prędkość kulki według wzoru:

 

 

Wartości przyśpieszeń zostały podzielone przez 5 w celu poprawnej wizualizacji, tzn. aby kulka nie poruszała się za szybko. Jednocześnie można pójść dalej i wprowadzić tarcie wirtualne dla poruszającej się kulki co w pewnym stopniu nadaje cechy realistyczne:

Ostatnia rzecz jakiej jeszcze brakuje to efekt odbijania się kulki od ścianki i dodatkowo utrata przy tym pędu/energii (a zatem i prędkości). Oto przykładowy fragment realizacji powyższego dla jednej osi:

Cała funkcja wygląda następująco:

Zmiana koloru kulki przy kliknięciu

Moduł akcelerometru posiada również funkcję wykrywania kliknięć lub krótkich uderzeń co można wykorzystać np. do zmiany koloru kulki z poprzedniego przykładu. Aby z niej skorzystać należy odpowiednio skonfigurować układ LIS35 przez zapisanie 5 rejestrów zaraz po jego inicjalizacji. Na początku należy określić w jakiej osi ma być wykrywane kliknięcie i czy ma ono być pojedyncze lub podwójne; w danym przypadku do tego wykorzystano oś Z:

Dalej należy wskazać powyżej jakiej wartości (wielokrotność 0.5g) ma nastąpić identyfikacja kliknięcia, tzn. należy określić próg:

Również parametry czasowe, jak ograniczenie w czasie i opóźnienie są podawane (wartości te są przykładowe i mogą zostać swobodnie zmieniane w zależności od potrzeb):

Na koniec zostaje jeszcze włączenie generacji sygnału przerwania po wykryciu kliknięcia:

Po skonfigurowaniu czujnika wg powyższego wzoru (konfigurację przerwań z kontrolerem NVIC przedstawiono przy konfiguracji projektu) można skorzystać z funkcji EXTI0_IRQHandler i odpowiednio reagować za zdarzenia w postaci kliknięć:

Obracanie figury

Wykorzystując wiedzę nabytą w poprzednim punkcie można zrealizować obracanie figurą 3D za pomocą odchylenia akcelerometru od pozycji neutralnej (osie X i Y są równoległe do powierzchni Ziemi). Im dłużej jest on odchylony tym coraz szybciej figura się obraca, a im większy jest kąt pochylenia tym większe przyśpieszenie kątowe otrzymuje obracający się obiekt. Również uwzględnia się tarcie, które powoduje, że prędkość kątowa w dowolnej osi maleje do zera w pozycji neutralnej akcelerometru. Funkcja realizująca powyższe zamierzenie jest podobna do tej opisanej z kulką na stole wirtualnym z niewielką różnicą; wielkości liniowe zostały zamienione na kątowe:

Funkcje pomocne

Poniżej przedstawiono kody niektórych funkcji wykorzystywanych w programie:

W pliku main.h zapisane są następujące dane:

Jan Szemiet

Do pobrania

Autor: varhyid@o2.pl