Gra „Snake” na STM32

Zestaw testowy STM32F4DISCOVERY jest interesującą pod względem możliwości i tanią płytką uruchomieniową z mikrokontrolerem z rodziny STM32, wyposażonym w rdzeń ARM Cortex-M4. W artykule przedstawiamy rozrywkową aplikację tego zestawu: konsolkę do gry „Snake”, w której ruchem węża użytkownik steruje za pośrednictwem ekranu dotykowego.

 

Opis realizacji sprzętowej

Do projektu użyta została płytka STM32F4DISCOVERY z płytką bazową DM-STF4BB tworzące razem zestaw ewaluacyjny DevKit407. Dodatkowo wykorzystany został moduł wyświetlacza DM-LCD35RT z panelem dotykowym (fotografia 1).

 

Fot. 1. Wygląd zestawu testowego z STM323F4DISCOVERY

Fot. 1. Wygląd zestawu testowego z STM323F4DISCOVERY

 

Zastosowany w zestawie STM32F4DISCOVERY mikrokontroler STM32F407VGT6 komunikuje się z wyświetlaczem LCD-TFT przez 16-bitowy interfejs równoległy (korzystając z interfejsu FSMC). Panel dotykowy wyświetlacza obsługuje kontroler STMPE811QTR połączony interfejsem I2C, natomiast złącze kart micro-SD wykorzystuje komunikację jednobitową (one-bit SD bus). Płytka bazowa DM-STF4BB ma specjalnie wyprowadzone złącze do podłączenia modułu wyświetlacza LCD, dzięki czemu przygotowanie sprzętu sprowadziło się do połączenia wszystkich trzech płytek razem oraz podłączenia zasilania (przewód USB służący również do programowania zestawu).

 

Rys. 2. Schemat złącza modułu wyświetlacza LCD

Rys. 2. Schemat złącza modułu wyświetlacza LCD

 

Wyświetlacz podłączony jest do interfejsu FSMC (Flexible Static Memory Controller). Jest to interfejs stworzony głównie z myślą o podłączeniu pamięci do mikrokontrolera. Dzięki odpowiedniej konfiguracji interfejsu (Bank1-SRAM) można wykorzystać go do komunikacji z kontrolerem wyświetlacza LCD.

Do złącza modułu wyświetlacza dołączone zostały również sygnały magistrali I2C (SDA1, SCL1) służące do komunikacji z panelem dotykowym, który w celu przyspieszenia transmisji wykorzystuje DMA.

 

Rys. 3. Schemat podłączenia karty SD

Rys. 3. Schemat podłączenia karty SD

 

Złącze do kart SD zamontowane jest już na płytce bazowej. Komunikację w trybie magistrali jednobitowej zapewnia już gotowa biblioteka. Zarówno płytka jak i biblioteka umożliwiają również komunikację w trybie magistrali czterobitowej, jednak jej wspieranie nie jest wymagane przez standard SD, więc nie wszystkie karty muszą ją obsługiwać. Przy konfiguracji zegara transmisji na 48 MHz komunikacja z kartą nie będzie wąskim gardłem.

Projekt obsługuje karty z systemem plików FAT korzystając z modułu FatFs (w wersji R0.08a).

 

Opis realizacji programowej

Projekt do obsługi sprzętu wykorzystuje gotowe biblioteki dostarczone przez STMicroelectronics. Ma to swoją zaletę, że nie trzeba wyważać otwartych drzwi. Jednak nawet w tym przypadku zdarzają się problemy spowodowane błędami w bibliotece. Jednym z błędów w bibliotece obsługi wyświetlacza (stm32f4_discovery_lcd.c) jest niepoprawne użycie funkcji do ustawiania kolorów tekstu i tła. Funkcje te (LCD_SetTextColor() i LCD_SetBackColor()) modyfikują zmienne globalne odpowiednio: TextColor i BackColor.

Dlatego użycie:

lub

nie ma większego sensu, ponieważ jest to w rzeczywistości wykonanie polecenia odpowiednio:

lub

Użycie funkcji modyfikacji koloru tekstu, w celu wyświetlenia elementu w kolorze tła, w sposób następujący:

spowoduje ustawienie TextColor i BackColor na tą samą wartość i zamierzony efekt zostanie osiągnięty. Jednak ponowne użycie tej funkcji z parametrem TextColor, w celu przywrócenia koloru tekstu:

nie powiedzie się, ponieważ zmienna TextColor nie zawiera już pierwotnej wartości barwy tekstu.

Opis tego błędu przedstawiony został w celu ukazania, w jaki sposób można łatwo paść ofiarą, wydawałoby się, prostej logiki.

Oprócz wspomnianej biblioteki wyświetlacza, wykorzystane zostały jeszcze biblioteka do obsługi panelu dotykowego: stmpe811qtr.c oraz obsługa systemu plików FatFs. Do biblioteki wyświetlacza LCD dodana została funkcja umożliwiająca wyświetlanie obrazków prosto z karty SD (listing poniżej).

Plik obrazka podany w parametrze funkcji jest otwierany na karcie i dane prosto z karty czytane są do bufora, z którego następnie wysyłane są do pamięci wyświetlacza. Obrazki muszą mieć 16-bitową paletę barw w formacie RGB565 (rysunek 4), który odpowiada zapisowi wartości kolorów czerwonego, zielonego i niebieskiego na 16 bitach dla każdego piksela: 5 bitów – czerwony, 6 bitów – zielony i 5 bitów – niebieski

 

Rys. 4. Sposób bajtowego zapisu kolorów w formacie RGB565

Rys. 4. Sposób bajtowego zapisu kolorów w formacie RGB565

 

Obsługa panelu dotykowego jest bardzo prosta, ponieważ funkcja IOE_TS_GetState() zwraca nam parametry dotkniętego punktu (listing poniżej).

Niestety standardowa biblioteka wymaga kalibracji panelu przed pierwszym użyciem. Jest to cena za uniwersalność biblioteki i możliwość używania jej na różnych panelach dotykowych. W celu uproszczenia działania gry i pominięcia etapu kalibracji przy każdym włączeniu, dane kalibracyjne dla użytego panelu zostały wpisane na stałe do funkcji obliczającej punkt dotknięcia.

 

Fot. 5. Ekran informujący o sposobie sterowania w grze z zaznaczonymi obszarami zmiany kierunków ruchu węża

Fot. 5. Ekran informujący o sposobie sterowania w grze z zaznaczonymi obszarami zmiany kierunków ruchu węża

 

W przypadku tego projektu precyzja dotknięcia nie jest taka krytyczna, więc nawet jeśli są jakieś rozbieżności pomiędzy panelami, nie powinno to mieć wpływu na działanie gry, ponieważ sterowanie wężem polega na dotykaniu odpowiednich fragmentów ekranu, które są dość duże (fotografia 5).

Sposób wyznaczania nowego kierunku ruchu węża nie jest skomplikowany, pokazano go na listingu poniżej.

Ekran wstępnie podzielony został na dwie części (połówkę górną wraz belką nagłówkową i połówkę dolną). Pozycja lewa górna odpowiada współrzędnym x=0 i y=0, gdzie x to krawędź pozioma, a y to krawędź pionowa.

Dla połówki górnej pozycje dla x<y to pole czerwone (ruch w lewo), pozycje xmax–x<y to pole zielone (ruch w prawo), a pozostałe pozycje to pole niebieskie (ruch do góry).

Analogicznie jest dla połówki dolnej: x<ymax–y to pole czerwone (ruch w lewo), xmax–x<ymax–y to pole zielone (ruch w prawo), a pozostałe pozycje to pole czarne (ruch do dołu).

Na podstawie wyznaczonego kierunku ruchu następuje wyznaczenie nowej pozycji głowy węża, przy czym jeśli nowa pozycja dotyka krawędzi ekranu następuje zakończenie gry (listing poniżej).

Współrzędne poszczególnych elementów węża umieszczone są w tablicy, a jego ruch polega na narysowaniu głowy na nowej pozycji i usunięciu ostatniego fragmentu ogona z jednoczesnym przesunięciem wszystkich pozycji w tablicy współrzędnych.

Jeśli nowa pozycja głowy węża pokrywa się z pozycją celu, to następuje narysowanie nowej pozycji celu, zwiększenie liczby punktów, wzrost węża oraz przyspieszenie jego ruchu. Zwiększenie prędkości węża następuje co określoną (SPEED_INCREASE_STEPS_CNT) liczbę punktów.

Nowa pozycja celu powinna być wyznaczana w losowy sposób. Mikrokontrolery rodziny STM32F4 mają sprzętowy generator liczb losowych. Jednak w tym przypadku stopień losowości nie musi być wysoki i dlatego w tym celu wykorzystany został licznik zegarowy. Moment „trafienia” celu raczej nie będzie się powtarzał, dzięki czemu uzyskamy wystarczającą pseudolosowość. Po wyznaczeniu nowego punktu trzeba sprawdzić, czy jego pozycja jest poprawna i jeśli wszystko się zgadza można narysować „jabłko” w nowych współrzędnych.

Fot. 6. Główny ekran gry

Fot. 6. Główny ekran gry

 

Podsumowanie

Przedstawiony projekt to tylko minimalne wykorzystanie możliwości zestawu STM32F4DISCOVERY, jednak już to może przynieść dużo radości, zarówno z tworzenia, jak i z późniejszego korzystania z projektu. Wykorzystując dostępne na płytce zestawu elementy, takie jak akcelerometr, można urozmaicić grę o dodatkowy sposób sterowania przy pomocy ruchu (przechyłu) płytki. Idąc dalej, czujnik dźwięku z wbudowanym mikrofonem można wykorzystać do głosowego sterowania wężem dodając prosty moduł rozpoznawania mowy. Natomiast przetwornik audio można wykorzystać do urozmaicenia gry dźwiękami. Zestaw daje wiele ciekawych możliwości, a głównym ograniczeniem wydaje się być nasza wyobraźnia.

Arkadiusz Prus

Do pobrania

Autor: