Gra Snake Multiplayer na Neopixel

Typ_projektu
Arduino
Zdjecie główne
Krótki opis projektu

Projekt polega na wykonaniu interaktywnej gry Snake na matrycy LED NeoPixel 16x16 z wbudowanym mikrokontrolerem ESP8266. Gra obsługuje tryb jedno i wieloosobowy, a sterowanie odbywa się bezprzewodowo za pomocą kontrolerów z przyciskami kierunkowymi. Kod projektu został przygotowany w Visual Studio, a całość obejmuje logikę gry, obsługę matrycy, komunikację ESP-NOW oraz testy działania.

Niezbędne elementy

 

1. Matryca LED NeoPixel 16x16 z mikrokontrolerem ESP8266

2. 4 Kontrolery wyposażone w 4 przyciski kierunkowe, z mikrokontrolerami ESP8266

 

Sprzęt

Poza wymienionymi wyżej elementami potrzebny jest jedynie komputer, z oprogramowaniem do pisania kodów w języku C++ (w naszym przypadku było to VisualStudio) oraz przewód do łączenia płytek z komputerem. 

Opis projektu


Interaktywna platforma do gry Snake na ESP8266 i matrycy NeoPixel

1. Cel projektu

Celem projektu było wykonanie prostej, ale w pełni działającej platformy do gry typu Snake. Projekt został przygotowany w taki sposób, aby można było go odtworzyć w warunkach szkoły ponadpodstawowej, przy użyciu popularnych i łatwo dostępnych elementów elektronicznych. Główna wersja urządzenia wykorzystuje mikrokontroler ESP8266, matrycę LED WS2812B NeoPixel oraz bezprzewodowe kontrolery graczy.

Gra polega na sterowaniu wężem poruszającym się po planszy zbudowanej z diod LED. Gracz zmienia kierunek ruchu węża, zbiera pojawiające się jedzenie i unika kolizji ze ścianami, własnym ogonem lub innym graczem. Projekt może działać w trybie jednoosobowym albo wieloosobowym. W wersji demonstracyjnej najważniejsze było przygotowanie obsługi dwóch graczy, ale struktura programu została zaplanowana tak, aby można było rozbudować projekt do większej liczby kontrolerów.

Projekt łączy elementy elektroniki, programowania mikrokontrolerów oraz projektowania prostego interfejsu użytkownika. Dzięki temu pokazuje, jak można stworzyć własną miniaturową konsolę do gry, zamiast korzystać z gotowego ekranu lub komputera.

2. Główne elementy układu

Do wykonania projektu potrzebne są następujące elementy:

- mikrokontroler ESP8266 jako jednostka główna,
- matryca LED WS2812B NeoPixel, np. 16x16 diod,
- moduły ESP32 lub ESP8266 jako bezprzewodowe kontrolery graczy,
- przyciski kierunkowe do kontrolerów,
- przewody połączeniowe,
- źródło zasilania 5 V, np. komputer przez USB, powerbank albo osobny zasilacz 5 V 2–3 A,
- obudowa lub ramka na matrycę LED,
- warstwa rozpraszająca światło, np. mleczna plexi, papier techniczny lub inny dyfuzor.

Centralnym elementem układu jest ESP8266. Odpowiada on za wykonywanie programu, przechowywanie aktualnego stanu gry, obliczanie pozycji węży, wykrywanie kolizji oraz wysyłanie obrazu do matrycy LED. Matryca NeoPixel pełni rolę ekranu. Każda dioda działa jak pojedynczy piksel, dlatego plansza gry może być pokazana bez użycia tradycyjnego wyświetlacza LCD.

Matryca LED jest połączona z jednostką główną przewodowo. Do działania potrzebuje zasilania 5 V, masy GND oraz przewodu sygnałowego DATA. Przewód DATA jest podłączony do wybranego pinu mikrokontrolera, na przykład D4 / GPIO2. Bardzo ważne jest, aby masa zasilacza, matrycy i ESP8266 była wspólna. Bez wspólnej masy sygnał sterujący może być niestabilny, a matryca może świecić nieprawidłowo.

Sterowanie grą odbywa się bezprzewodowo. Kontrolery graczy są zbudowane na osobnych modułach ESP32 lub ESP8266 i wysyłają informacje o wciśniętych przyciskach do jednostki głównej. Do komunikacji wykorzystywany jest ESP-NOW, czyli prosty sposób bezprzewodowego przesyłania danych pomiędzy modułami ESP. Dzięki temu kontrolery nie muszą być połączone przewodami z główną obudową gry, co poprawia wygodę użytkowania.

3. Zasada działania gry

Po uruchomieniu urządzenia gracz widzi ekran startowy. W tej części można przygotować proste menu, np. wybór liczby graczy albo ekran oczekiwania na rozpoczęcie gry. Po zatwierdzeniu rozpoczyna się rozgrywka.

W czasie gry program cały czas wykonuje powtarzającą się pętlę. Najpierw odczytywane są dane wejściowe z kontrolerów. Następnie logika gry oblicza nową pozycję węża lub węży. Potem sprawdzane są kolizje i ewentualne zebranie jedzenia. Na końcu aktualny stan gry jest wysyłany do matrycy LED, która wyświetla nową klatkę obrazu.

Każdy wąż składa się z głowy oraz segmentów ogona. Program przechowuje współrzędne poszczególnych części węża na planszy. Gdy wąż zjada jedzenie, jego długość zwiększa się. Jeśli głowa węża uderzy w ścianę, własny ogon albo przeciwnika, gra przechodzi do ekranu końcowego. Ekran końcowy może być oznaczony np. czerwoną ramką albo znakiem „X”, aby od razu było jasne, że runda się zakończyła.

Ważnym elementem programu jest także przeliczanie współrzędnych planszy na numer konkretnej diody LED. Matryce WS2812B często są ułożone w tzw. zygzak, czyli pierwszy rząd jest liczony od lewej do prawej, a następny od prawej do lewej. Dlatego program musi mieć funkcję, która zamienia współrzędne X i Y na właściwy numer diody w taśmie.

4. Podział projektu na moduły

Aby projekt można było wykonywać równolegle, został on podzielony na kilka niezależnych części. Dzięki temu różne osoby mogły pracować nad innymi fragmentami bez ciągłego przeszkadzania sobie nawzajem.

Pierwszym modułem jest moduł sterowania. Jego zadaniem jest odczytywanie przycisków na kontrolerach i przesyłanie tych informacji bezprzewodowo do jednostki głównej. Kontroler nie musi znać zasad gry. Ma tylko wykryć, czy gracz nacisnął kierunek: góra, dół, lewo albo prawo, a następnie wysłać tę informację.

Drugim modułem jest logika gry. Ta część programu odpowiada za zasady Snake’a: poruszanie węża, zwiększanie długości po zjedzeniu jedzenia, generowanie nowego jedzenia, zliczanie punktów oraz sprawdzanie kolizji. Logika gry powinna być możliwie niezależna od sprzętu. Dzięki temu można ją testować nawet wtedy, gdy matryca LED albo kontrolery nie są jeszcze gotowe.

Trzecim modułem jest obsługa wyświetlacza. Jego zadaniem jest zamiana stanu gry na obraz widoczny na matrycy LED. Ten moduł decyduje, które diody mają się zapalić i w jakim kolorze. Przykładowo jeden gracz może być oznaczony kolorem zielonym, drugi czerwonym, a jedzenie innym wyróżniającym się kolorem.

Taki podział ułatwił pracę równoległą. Każdy moduł miał jasno określone zadanie i korzystał ze wspólnych struktur danych. W praktyce oznacza to, że moduł sterowania przekazuje kierunki ruchu, logika gry przetwarza te dane, a moduł wyświetlacza pokazuje wynik na matrycy.

5. Testowanie bez kompletnego sprzętu

Ważnym etapem pracy było testowanie programu jeszcze przed podłączeniem całej ramki LED i wszystkich kontrolerów. Takie podejście pozwala szybciej znaleźć błędy, ponieważ nie trzeba za każdym razem składać całego układu.

Na początku można testować samą logikę gry na komputerze. Zamiast prawdziwej matrycy LED program może wypisywać stan planszy w konsoli albo korzystać z uproszczonego podglądu. Podobnie zamiast bezprzewodowych kontrolerów można tymczasowo podstawiać przykładowe kierunki ruchu w kodzie. Dzięki temu można sprawdzić, czy wąż porusza się poprawnie, czy nie może zawrócić bezpośrednio w przeciwną stronę, czy jedzenie pojawia się na wolnym polu oraz czy kolizje są wykrywane prawidłowo.

W plikach projektu znajduje się wersja alfa kodu przygotowana do wczesnych testów bez finalnej obudowy, ramki i pełnego zestawu kontrolerów. Taka wersja pozwalała sprawdzić podstawowe mechanizmy działania programu jeszcze przed złożeniem kompletnego urządzenia. Jest to przydatne szczególnie w projekcie grupowym, ponieważ jedna część zespołu może rozwijać logikę gry, podczas gdy druga przygotowuje sprzęt.

Dopiero po sprawdzeniu podstawowych funkcji można przejść do testów na rzeczywistej matrycy LED. Na tym etapie należy zweryfikować, czy współrzędne X i Y zgadzają się z fizycznym ułożeniem diod. Jeśli obraz jest odbity lustrzanie albo ruch w lewo powoduje skręt w prawo, należy poprawić funkcję mapowania pikseli albo odwrócić odpowiednią oś.

6. Etapy wykonania projektu

Pierwszym etapem jest przygotowanie stanowiska i sprawdzenie wszystkich elementów. Należy upewnić się, że mikrokontroler jest wykrywany przez komputer, a środowisko Arduino IDE ma zainstalowaną obsługę płytek ESP8266 lub ESP32. Potrzebna jest także biblioteka do obsługi diod NeoPixel, np. Adafruit NeoPixel.

Drugim etapem jest uruchomienie samej matrycy LED. Najprostszy test polega na zapaleniu kilku diod w różnych miejscach planszy. Pozwala to sprawdzić, czy zasilanie działa poprawnie, czy przewód DATA jest podłączony do właściwego pinu oraz czy funkcja ustawiania piksela działa zgodnie z oczekiwaniami.

Trzecim etapem jest przygotowanie podstawowej logiki Snake’a. W tym miejscu program powinien obsługiwać planszę, pozycję węża, kierunek ruchu, jedzenie i kolizje. Ten fragment można testować nawet bez matrycy, korzystając z wersji alfa programu albo uproszczonego trybu testowego.

Czwartym etapem jest przygotowanie kontrolerów. Każdy kontroler powinien mieć przyciski kierunkowe i wysyłać dane do jednostki głównej za pomocą ESP-NOW. Po stronie odbiornika należy sprawdzić, czy naciśnięcie przycisku na pilocie powoduje odebranie właściwego kierunku.

Piątym etapem jest połączenie wszystkich modułów. Jednostka główna powinna odbierać dane z kontrolerów, przekazywać je do logiki gry, a następnie wyświetlać wynik na matrycy LED. Na tym etapie trzeba sprawdzić płynność działania, poprawność sterowania oraz czy gra nie zawiesza się podczas dłuższego działania.

Ostatnim etapem jest zamontowanie elementów w obudowie lub ramce. Warto zastosować dyfuzor, czyli warstwę rozpraszającą światło. Dzięki temu pojedyncze diody nie rażą w oczy, a plansza wygląda jak ekran z dużymi pikselami.

7. Testy końcowe

Po złożeniu urządzenia wykonano testy sprawdzające poprawność działania najważniejszych funkcji. Sprawdzono uruchomienie ekranu startowego, reakcję na przyciski, ruch węża po planszy, pojawianie się jedzenia, zwiększanie długości węża oraz wykrywanie kolizji.

Osobno sprawdzono działanie komunikacji bezprzewodowej. Kontrolery powinny reagować bez wyraźnego opóźnienia, ponieważ w grze zręcznościowej nawet niewielkie opóźnienie może utrudniać sterowanie. Testowano także stabilność zasilania, ponieważ matryca NeoPixel może pobierać stosunkowo duży prąd, szczególnie przy wysokiej jasności i wielu świecących diodach.

W czasie testów zwracano uwagę na czytelność kolorów. Kolory węży, jedzenia i elementów menu muszą być łatwe do odróżnienia. W razie potrzeby można zmniejszyć jasność albo zmienić wartości RGB, aby obraz był bardziej czytelny.

8. Pliki i materiały do odtworzenia projektu

Do projektu dołączone są pliki z kodem, schemat układu, dokumentacja oraz materiały pokazujące proces tworzenia i testowania. W plikach znajduje się również wersja alfa kodu, która służyła do sprawdzania działania programu bez kompletnego sprzętu. Dzięki temu osoba odtwarzająca projekt może najpierw zapoznać się z zasadą działania programu, a dopiero później przejść do podłączania matrycy i kontrolerów.

Aby odtworzyć projekt, należy pobrać pliki projektu, otworzyć kod w Arduino IDE, wybrać odpowiednią płytkę ESP8266 lub ESP32, zainstalować wymagane biblioteki i wgrać program na mikrokontroler. Następnie należy podłączyć matrycę LED zgodnie ze schematem: zasilanie 5 V do wejścia +5 V matrycy, masa do GND, a przewód DATA do wybranego pinu ESP8266. Kontrolery należy zaprogramować osobnym kodem i sparować komunikację ESP-NOW z jednostką główną.

9. Podsumowanie

Projekt pokazuje, że przy użyciu prostych i dostępnych elementów można stworzyć własną platformę do gry retro. Najważniejszą częścią projektu było połączenie trzech obszarów: sterowania bezprzewodowego, logiki gry oraz wyświetlania obrazu na matrycy LED. Podział pracy na moduły pozwolił wykonywać projekt równolegle i testować poszczególne części niezależnie.

Dużą zaletą projektu jest możliwość stopniowego uruchamiania. Najpierw można sprawdzić sam kod i logikę gry na komputerze, później przetestować matrycę LED, następnie kontrolery, a dopiero na końcu połączyć wszystko w jedną działającą całość. Dzięki temu projekt nadaje się do wykonania w szkole ponadpodstawowej, ponieważ nie wymaga od razu kompletnego i idealnie działającego sprzętu.

Gotowy układ umożliwia zagranie w prostą grę Snake na własnoręcznie wykonanym ekranie LED. Projekt można też dalej rozwijać, dodając więcej graczy, licznik punktów, menu wyboru trybu gry, efekty dźwiękowe albo bardziej rozbudowaną obudowę.
 

Zdjęcia
kod programu
ZIP poniżej 
Schemat
Youtube
Tagi
Snake ESP8266 NeoPixel LED multiplayer mikrokontroler ESP-NOW gra