GRA PONG

Transkrypt

GRA PONG
MIKROKONTROLERY ARM
DOKUMENTACJA WSTĘPNA PROJEKTU
GRA PONG
Prowadzący: dr inż. Mariusz Jarosław Suchenek
Opracował: Maciej Michał Piegza
Nr indeksu: 281397
1. Cel projektu
Celem projektu jest stworzenie gry typu Pong z wykorzystaniem mikrokontrolera z rdzeniem
ARM.
2. Opis gry
Gra symuluje rozgrywkę w tenisa stołowego. Gracz porusza w lewo lub prawo paletką
umieszczoną w dolnej części ekranu i za jej pomocą próbuje odbić poruszającą się piłkę w
stronę paletki przeciwnika. Celem gracza jest zdobycie większej liczby punktów od
przeciwnika. Punkty zdobywane są poprzez zetknięcie się piłki z dolną lub górną częścią
ekranu. Koniec gry następuje, gdy jeden z graczy osiągnie założoną wcześniej liczbę punktów.
Rys. 2.1. Rysunek poglądowy gry typu Pong
3. Sposób realizacji
3.1.
Elementy sprzętowe
Do realizacji projektu zostanie wykorzystana płytka uruchomieniowa STM32F429I DISCO.
Rys. 3.1.1. Płytka uruchomieniowa STM32F429I DISCO.
STM32F429I DISCO
Panel
dotykowy
I2C
STM32F429ZIT6
LI9341
LCD Controller
SPI
Rys. 3.1.2. Schemat blokowy płytki uruchomieniowej STM32F429I DISCO.
3.2. Opis działania
Komunikacja z aplikacją: interfejs dotykowy.
Gra jednoosobowa: gracz-człowiek kontra „komputer”.
Po włączeniu aplikacji gracz widzi ekran startowy. Gra rozpoczyna się po dotknięciu ekranu.
Dotknięcie przez gracza prawej lub lewej połowy ekranu dotykowego skutkuje przesunięciem
jego paletki w odpowiednią stronę. Paletka przesuwa się dopóki gracz nie zabierze palca z
ekranu lub gry paletka dotknie krawędzi ekranu.
Paletki składają się z 7 segmentów. Kierunek, w którym będzie przemieszczać się piłka po
odbiciu od paletki zależy od dotkniętego segmentu. Przykładowo, segment 4 (środkowy)
odbije piłkę pod kątem 90o, inne segmenty pod kątem większym lub mniejszym.
Zetknięcie się piłki z górną lub dolną krawędzią ekranu skutkuje zdobyciem punktu przez
gracza (góra) lub „komputer” (dół). Po każdym zdobytym punkcie gra jest przerywana,
następuje wyświetlenie tablicy wyników. Aby wznowić grę należy dotknąć ekranu. Gra
kończy się, gdy gracz lub komputer zdobędzie wcześniej określoną liczbę punktów. Aplikacja
wyświetla informację o wyniku meczu, po czym wraca do ekranu startowego.
3.3. Szczegóły implementacyjne
Logika aplikacji znajduje się w pliku main.c. Zaimplementowano funkcje:
• ball_collision_player() – funkcja odpowiada za detekcję kolizji piłki z paletką gracza
oraz odbicie piłki pod odpowiednim kątem (w zależności od segmentu paletki, z
którym zetknęła się piłka).
• ball_collision_kom() – odpowiednik funkcji ball_collision_player(), odpowiada za
detekcję kolizji piłki z paletką „komputera”.
• move_player() – funkcja odpowiadająca za poruszanie paletką gracza i komunikację
między mikrokontrolerem a panelem dotykowym STMPE811 za pomocą interfejsu
I2C; dotknięcie prawej lub lewej połowy panelu dotykowego decyduje o kierunku
przesuwania paletki gracza.
• move_kom() – funkcja odpowiadająca za poruszanie paletką „komputera”.
Zaimplementowany ruch polega na przesuwaniu paletki „komputera” w takim,
kierunku, żeby środek paletki znajdował się w jednej linii z piłką.
• scored() – funkcja przerywająca grę po zdobyciu punktu przez któregokolwiek z
graczy. Wyświetla wynik i czeka ze wznowieniem gry na dotknięcie ekranu.
• endgame() – funkcja wyświetla ekran końcowy gry z informacją „PRZEGRAŁEŚ” lub
„WYGRAŁEŚ” i wynikiem końcowym gry.
• ball() – funkcja odpowiadająca za ruch piłki, odbicie od bocznych ścian, zdobycie
punktu po kontakcie z dolną lub górną krawędzią ekranu.
• game_start_init() – funkcja odpowiadająca za ustawienie parametrów startowych gry
– wielkości, pozycji i szybkości paletek, wielkości i szybkości piłki, ustalenie liczby
punktów po zdobyciu której gra się kończy.
• game_play() – główna funkcja gry. Przesyła do wyświetlacza ILI9341 dane przez
interfejs SPI, dzięki którym wyświetlane są paletki oraz piłka. Funkcja wykonuje się
dopóki któryś z graczy nie zdobędzie założonej liczby punktów.
• game_reload() – funkcja wyświetla ekran startowy, resetuje parametry gry.
Główna pętla programu wykonuje funkcje game_reload(), game_play(), endgame().
Funkcje odpowiadające za komunikację z wyświetlaczem:
• TM_ILI9341_DrawFilledRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,
uint32_t color) – funcja rysuje na ekranie wypełniony prostokąt o zadanych
współrzędnych rogów x0, y0, x1, y1 i wybranym kolorze.
• TM_ILI9341_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color) – funkcja
rysuje na ekranie okrąg o współrzędnych środka x0, y0, promieniu r i wybranym
kolorze.
• TM_ILI9341_SendData(uint8_t data) – funkcja odpowiadająca za przesłanie do
wyświetlacza danych do rysowania. Komunikacja za pomocą interfejsu SPI.
Funkcje odpowiadające za komunikację z panelem dotykowym:
• TM_STMPE811_ReadTouch(TM_STMPE811_TouchData *structdata) – funkcja
obsługująca dotknięcie panelu. Zapisuje do struktury współrzędne x, y dotkniętego
punktu ekranu oraz stan: pressed (dotknięcie) lub released (puszczenie). Przesyła
strukturę za interfejsem I2C za pomocą kolejki FIFO.
Opisane wyżej funkcje znajdują się w plikach tm_stm32f4_ili9341.c oraz
tm_stm32f4_stmpe811.c.
Do obsługi interfejsów SPI i I2C wykorzystano biblioteki standardowe STM.
4. Wnioski
Zaimplementowany program spełnia wszystkie założenia opisane w punkcie 3.2. Podczas
implementacji wystąpiły problemy ze środowiskiem implementacyjnym. W pewnym
momencie prac wielkość kodu programu zaczęła przekraczać dopuszczalny rozmiar w
darmowej wersji środowiska IDE Keil. Z tego powodu podjąłem próby wykorzystania
alternatywych rozwiązań w postaci Coocox CoIDE. Niestety środowisko zaczęło sprawiać
problemy z przeniesieniem projektu. W ostateczności zdecydowałem się na wykorzystanie
próbnej wersji Keila, bez ograniczeń dotyczących wielkości kodu, ale działającej tylko przez
tydzień.
Ograniczony czas działania środowiska nie pozwolił na większe rozbudowanie programu, np.
o menu, w którym można by wybrać czy chce grać się z drugą osobą czy z komputerem. W
fazie konceptualnej projektu rozważałem możliwość gry przeciwko żywemu graczowi.
Pomysł został porzucony z powodu braku pomysłu na sposób kontroli drugiej paletki. Dwaj
gracze korzystający z panelu dotykowego zasłanialiby prawie cały ekran. Wykorzystanie
żyroskopu wbudowanego w mikrokontroler do sterowania jedną z paletek przeszkadzałoby
graczowi korzystającemu z panelu dotykowemu oraz utrudniałoby dostrzeżenie co dzieje się
na wyświetlaczu (ze względu na jego słabe kąty widzenia).