Sterowanie prostą grą wideo - Arduino

(opracował: dr hab. inż. Adrian Bekasiewicz, prof. PG)

Cel:

Celem laboratorium jest uruchomienie implementacji gry T-Rex Run! [1] na układzie FPGA (ang. Field Programmable Gate Array) oraz stworzenie programu, który będzie w sposób automatyczny sterował skokami dinozaura na podstawie wartości odczytanych z fotorezystora. Laboratorium jest podzielone na dwa główne moduły dotyczące: (i) pracy z kodem VHDL (z naciskiem na dostosowanie dostępnego programu do potrzeb użytkownika) oraz (ii) opracowania kontrolera dinozaura na module Arduino UNO.

Zasady realizacji zadań:

Laboratorium zostało podzielone na cztery ćwiczenia o stopniowo rosnącym poziomie złożoności. Do zaliczenia laboratorium należy zrealizować przynajmniej dwa ćwiczenia. Kolejność wykonywania zadań jest sekwencyjna – rozwiązanie danego ćwiczenia stanowi punkt początkowy do wykonania kolejnego. Schemat połączeń niezbędny do realizacji zadania przedstawiono na Rys. 1.

Zadania do realizacji:

  1. Zaimportować pliki VHDL z kodem gry do projektu stworzonego w środowisku Vivado. Zmienić kolor tła w grze na biały, oraz ustawić pozycję dinozaura w taki sposób aby kaktusy znalazły się na wysokości fotorezystora przyklejonego do monitora VGA.

  2. Przeskalować dinozaura.

  3. Napisać program w środowisku Arduino IDE, który będzie realizował funkcjonalność skoku dinozaura ponad przeszkodą na podstawie wartości z fotorezystora odczytanych na wejściu analogowym A0. Wyświetlać wartości odebrane na wejściu A0 przez port szeregowy.

  4. Zmodyfikować napisany program w taki sposób, aby dinozaur przeskakiwał „gęsto” rozmieszczone kaktusy. Wyświetlać wartości odczytane na wejściu A0 oraz czas identyfikacji przeszkód przez port szeregowy.

Opis zadań:

  1. Na implementację gry T-Rex Run! w języku VHDL składa się moduł główny trex_game.vhd, do którego podłączono m.in. moduły dzielnika częstotliwości (clock_divider.vhd), licznika sekundowego (counter.vhd), enkodera (encoder.vhd), czy sterownika wyświetlaczy 7-mio segmentowych (driver_7seg.vhd) [1].

Moduł główny implementuje obsługę monitora VGA, logikę gry, a także zawiera definicję obiektów – grafik komputerowych używanych przez grę (ang. sprites). „Mechanikę gry” oraz sposób wyświetlania grafik na ekranie monitora przedstawiono schematycznie na Rys. 2. „Silnik” gry generuje obraz o rozdzielczości 640 × 480 pikseli, który jest następnie dzielony na tablicę o wymiarach 20 × 15 pól. Każde z pól ma rozmiar 32 × 32 piksele (32·20 × 32·15 = 640 × 480). Obiekty w grze są ograniczone do wspomnianych pól. Wysokość położenia dinozaura, czy pozostałych elementów można sterować poprzez ustalenie odpowiedniej wartości stałych zdefiniowanych w bloku architecture modułu trex_game.vhd. Kolor obiektów (wspólny dla wszystkich), oraz tła jest również zdefiniowany przy użyciu odpowiednich stałych (także w bloku architecture). Wyjście sygnału VGA na płytce Nexys A7 podaje 4 bity na kolor (z palety RGB – red, green, blue) [2].

Zadanie 1 sprowadza się zatem do odnalezienia w module trex_game.vhd odpowiednich stałych oraz ustawienia ich wartości w taki sposób, aby uzyskać pożądaną funkcjonalność.

  1. Grafiki w grze są zdefiniowane w postaci macierzy o rozmiarze 16 × 16 pikseli. Z kolei rozmiar pola jest ustalony na 32 × 32 piksele. Realizacja Zadania 2 wymaga zmodyfikowania w kodzie VHDL reguły odpowiadającej za aktualizację położenia obiektów sprite_x, sprite_y w taki sposób aby każdy piksel obiektu był wyświetlany na ekranie monitora dwukrotnie. Nie dopuszcza się ręcznego „przepisania” definicji obiektów w taki sposób aby ich rozmiar wynosił 32 × 32 piksele.

  2. Program powinien „rejestrować” czas zidentyfikowania przeszkody na podstawie zmiany wartości sygnału z fotorezystora odczytywanego na wejściu A0 [3], [4]. Do jego realizacji należy ustalić wartość progową poniżej/powyżej, której nastąpiła zmiana jasności ekranu (czarny kaktus zastąpił białe tło normalnie oświetlające fotorezystor. Zarejestrowaną zmianę należy wykorzystać do wyzwolenia zatrzasku, który wyzwoli „skok” dinozaura z odpowiednim opóźnieniem względem zarejestrowanego czasu (wynikającym z odległości fotorezystora na ekranie od dinozaura).

  3. Fotorezystor znajduje się w takiej odległości od dinozaura, że może zarejestrować dwa (lub więcej) kaktusów zanim T-Rex przeskoczy pierwszą przeszkodę. Program z Zadania 3 należy zmodyfikować w taki sposób, aby wszystkie kaktusy zidentyfikowane przez fotorezystor przed wykonaniem skoku były zapisywane do tablicy. Po przeskoczeniu kaktusa informacja o czasie jego zidentyfikowania powinna być usuwana z tablicy.

 

 

Rys. 1. Stanowisko do zdalnej realizacji laboratoriów – schemat ideowy.

 

Rys. 2. Organizacja grafik na ekranie komputera oraz zakres ich ruchów. Czarne kółko reprezentuje przykładowe położenie fotorezystora względem siatki.

Pliki:

  1. Szkic programu Arduino + kod źródłowy VHDL: LAB3_code_template.zip

Literatura:

  1. T-Rex Run! Kod źródłowy gry pobrano ze strony: https://github.com/samrose3/trex-runner

  2. Digilent Nexys-A7 – manual

  3. ATmega328P – datasheet

  4. GL5516 – datasheet