Niezmiernie ważne jest również oprogramowanie: przyjazne otwarte licencje i prostota obsługi, a także olbrzymia, łatwo dostępna baza pomysłów i rozwiązań. Można wybierać. Przypominają mi się czasy z epoki komputerów XT/AT. Modernizacja poprzez wymianę podzespołów i żonglowanie jumperami dostarczała podobnych emocji co dzisiaj poznawanie i testowanie rozwiązań zastosowanych w mikrokontrolerach.
Tylko dostęp do wiedzy był w tamtej epoce mocno utrudniony. Idąc z duchem czasu, firma AVT przygotowała szereg zestawów do samodzielnego montażu (lutowania) opartych na mikroprocesorach. Po montażu zawsze występuje dreszczyk emocji, czy zmontowany układ zadziała. Sprawdzenie zestawów opartych na mikroprocesorach zajmuje zazwyczaj znacznie więcej czasu niż w przypadku prostych kitów, których efektem działania ma być np. migotanie diod czy generowanie dźwięku.
Opis układu do montażu AVT5362 (Arduino)
Jednym z najbardziej zaawansowanych zestawów w ofercie AVT jest z pewnością AVT5362 (AVTduinoMEGA), oparty na mikroprocesorze ATmega2560. Projektantowi udało się zmieścić komplet podzespołów na znacznie mniejszej powierzchni, niż ma to miejsce w przypadku oryginalnej płytki Arduino MEGA 2560 R3 (fotografia 1). Dlatego montaż wymaga szczególnej staranności i cierpliwości. Nagrodą, poza satysfakcją, może być funkcjonalna płytka, która możliwościami zdecydowanie przewyższa Arduino UNO z ATMEGA328 na pokładzie.
Aby się o tym przekonać, postanowiłem napisać prostą, a jednak dynamiczną, działającą w czasie rzeczywistym grę VIVI (ekran powitalny na fotografii 2). Pomysł nie jest nowy. Nawiązuje do jednej z wielu odmian gry z epoki DOS-a i monitorów EGA. Przypomina także popularną znaną z telefonów komórkowych grę Snake jednak wszystkie kamienie (diamenty), które należy zebrać na danym poziomie, są od razu widoczne.
Na planszy są również mury, które należy omijać. Zderzenie z nimi, jak również natrafienie na własny ogon, spowoduje zmniejszenie liczby dostępnych żyć o jeden i konieczność powtarzania poziomu. Melodyjka wykorzystana w grze będąca sekwencją kilku nut pochodzi z domeny publicznej. Jest dostępna również na platformie Arduino IDE: plik→przykłady→digital →toneMelody.
Elementy użyte w projekcie gry opartej na układzie AVTduinoMega (Arduino):
- płytka AVT5362;
- dwie matryce LED typu 8X8X4 bazujące na układach MAX7219 opisane w numerze 10/2019 „Elektroniki dla Wszystkich”. Razem stanowią one ekranik 32×16 pikseli – diod LED RED;
- własnoręcznie przygotowana prosta 4-klawiszowa klawiatura wraz z brzęczykiem i diodą zasilania LED, pokazana na fotografii 3.
Schemat połączeń całości pokazany jest na rysunku 1, a na rysunku 2 przedstawiony jest schemat klawiatury.
Projekt został napisany w środowisku Arduino IDE. Plik vivi.ino dostępny jest wśród materiałów dodatkowych do tego artykułu. Projekt można podzielić na kilka części:
1. Obsługa ekranu – z racji, że ekran ma tylko 32 piksele szerokości oraz 16 pikseli wysokości i jest dwukolorowy, każda dioda może być zgaszona lub włączona, odwzorowanie ekranu w pamięci narzuca się samo: 16-elementowa tablica 32-bitowych liczb typu unsigned long.
Przed cyklicznym kopiowaniem zawartości powyższej tablicy na ekran magistralą SPI należy ją uprzednio wypełnić aktualną sytuacją i dlatego dla każdego poziomu trudności zostały przygotowane tablice z układem murów i diamentów. Aby odróżnić jedne od drugich, konieczne było wprowadzenie „trzeciego koloru” – diamenty migoczą na planszy ze stałą częstotliwością. Ostatnim elementem składającym się na bieżącą sytuację jest sam wąż, którego położenie zmienia się dynamicznie w zależności od naciskanych przez gracza klawiszy. W celu detekcji zderzenia z murem lub natrafienia na diament wykorzystywane są operacje bitowe.
2. Fonty – w sieci dostępne są gotowe rozwiązania, jednak są one dosyć nadmiarowe, a funkcje „zoptymalizowane” pod kątem czytelności, dlatego na potrzeby projektu został przygotowany zestaw niezbędnych bitmap wraz z funkcją obsługującą przewijanie wyświetlanego tekstu.
3. Obsługa klawiatury – gra jest dynamiczna, wąż przemieszcza się coraz szybciej wraz ze zdobywanymi kolejnymi poziomami i aby możliwe było niezawodne sterowanie, każdy klawisz generuje niezależne przerwanie, którego obsługa polega na wpisaniu czasu ostatniego naciśnięcia do odpowiedniej zmiennej. Z racji niedoskonałości styków podczas jednego przyciśnięcia klawisza może zostać wygenerowanych kilka przerwań. Nie jest to jednak groźne, gdyż ostatnie z nich nadpisze w pamięci te niepożądane. W celu umożliwienia szybkich manewrów zawracania lub uskoku węża został przygotowany bufor pamiętający dwa ostatnio naciśnięte i powodujące zmianę kierunku ruchu węża klawisze.
4. Obsługa pamięci EEPROM – układ ATMEGA2560 ma wbudowaną pamięć EEPROM. W grze została ona użyta do zapamiętania i wyświetlania najlepszego uzyskanego przez gracza wyniku.
5. Brzęczyk bez generatora – stanowi element klawiatury, chociaż może powinien znajdować się w pobliżu sytuacji, czyli ekranu. Każdy pojedynczy ruch węża jest sygnalizowany niskim tonem. Gdy wąż natrafi na diament, ton zostaje podwyższony. Po każdym ukończeniu planszy odgrywana jest kilkudźwiękowa melodia.
Fotografia 4 przedstawia przykładowy komunikat przewijany na ekranie oraz kilka początkowych sytuacji dla wybranych poziomów. Zielone zabarwienie pochodzi z trzech warstw folii przezroczysto-zielonej wyciętej z okładki do notatnika akademickiego. Chodzi o to aby patrzenie na ekranik pełen migających diod nie męczyło oczu.
Myślę, że płytka AVT5362 została w ten sposób wstępnie przetestowana. Opisany projekt jest rozwojowy. Ekran można zastąpić kolorowym złożonym z diod LED RGB, klawiaturę można zintegrować z ekranem, tworząc coś na kształt podręcznej konsoli do gier. Obudowę można wydrukować na drukarce 3D.