Snake 3D

Snake 3D

Witam, chciałabym podzielić się moim pierwszym projektem wykorzystującym mikrokontroler. Temat projektu nawiązuje do popularnej gry (Snake). Zaczerpnięty został pomysł poruszającego się węża, który wydłuża się, gdy trafi na jedzenie. Wąż jest wyświetlany na kostce zbudowanej z diod LED  o wielkości 4x4x4, a sterowanie jest zapewnione przez sześć przycisków znajdujących się przed kostką.

WYGLĄD

Widok ogólny:

widok_ogolny

Wnętrzności:

wnetrznosci1

WYKORZYSTANE ELEMENTY

  • 1 x ATmega 328P
  • 2 x rejestr przesuwny 74HC595
  • 1 x stabilizator napięcia 7805
  • 1 x oscylator kwarcowy 16 MHz
  • 64 x zielone diody LED
  • 6 x przyciski monostabilne
  • 4 x tranzystor 2N2222
  • rezystory: 7 x 10 kΩ, 16 x 130 Ω, 4 x 4,7 kΩ
  • kondensatory: 1 x 330 nF, 1 x 100 nF, 2 x 20 pF
  • kawałki plexi i dibondu oraz kawałek czarnej folii do obudowy
  • 4 x śruby M3
  • 12 x nakrętki do śrub
  • 12 x podkładki do śrub
  • 4 x nóżki dla obudowy (tu wykorzystane nóżki od starej kasy fiskalnej)

SCHEMAT POŁĄCZEŃ ELEKTRYCZNYCH

Schemat przedstawiony jest poniżej:

ledsch

Wykorzystałam 2 rejestry przesuwne, dzięki czemu można sterować zapalaniem diod na jednej warstwie kostki (16 diod). To, która warstwa ma się zapalić,  sterowane jest tranzystorami i sygnałami z ATmegi (na schemacie oznaczone jako W1, W2, W3, W4).

Na schemacie widać jeszcze gniazdo 10-pinowe – odpowiedni wtyk został założony na taśmę z przewodami od przycisków.

Na podstawie schematu wykonano projekt płytki drukowanej:

ledbrd

Płytkę przygotowano metodą termotransteru, następnie ją wytrawiłam i przylutowałam elementy. Jest to moja pierwsza przygoda z płytkami drukowanymi i lutowaniem, więc projektowi daleko do perfekcji.

KOSTKA LED

Wyzwaniem dla mnie było odpowiednie połączenie diod. Diody na jednej warstwie zostały połączone katodami. Dokładniej połączenia dla jednej warstwy widać poniżej:

warstwa

Natomiast sąsiadujące warstwy są połączone dzięki anodom:

kostka_led

Przez przylutowaniem na płytkę umieściłam folię między diodami a płytką, żeby potem otwór w obudowie nie rzucał się w oczy.

INTERAKCJA Z GRACZEM I PRZEBIEG GRY

Po włączeniu zasilania gracza wita krótka animacja początkowa. Potem rozpoczyna się gra: widać jedną poruszającą się diodę (symbolizuje ona węża) oraz jedną migającą (symbolizującą jedzenie). Gracz może sterować wężem przez przyciski znajdujące się przed kostką. Poniżej widać, jakie kierunki im odpowiadają:

przyciski_gora

Jeżeli głowa węża trafi na jedzenie, to jego długość zwiększa się o 1, losowane jest kolejne jedzenie oraz zwiększa się szybkość poruszania węża. Śmierć węża następuje w dwóch przypadkach: pozycja głowy węża wyjdzie poza kostkę lub pozycja głowy znajdzie się na pozycji zajmowanej przez jego ciało. Jeżeli wąż umrze, to kilkakrotnie zapalane i gaszone są wszystkie diody, a potem gra rozpoczyna się od początku. Jeżeli w momencie śmierci wąż miał długość 64 (czyli zajął wszystkie diody), to gracz wygrywa i wyświetlana jest specjalna animacja.

ELEMENTY OPROGRAMOWANIA

Program został napisany w języku C. Całość oprogramowania jest dostępna: Snake3D_oprogramowanie

Pliki i biblioteki zostały krótko opisane:

main.c

Po inicjalizacji portów i zmiennych, w nieskończonej pętli, wykonuje się kawałek kodu odpowiedzialny za koordynację ruchów węża: przesunięcie go o 1 pole, sprawdzenie, czy trafił na jedzenie, a w przypadku śmierci lub wybranej wywołanie odpowiedniej animacji.

timery.c

Biblioteka, w której zachodzi inicjalizacja timerów i definicje ich przerwań. Wszystkie ustawione są na tryb CTC.

  • TIMER0 – przerwanie odpowiadające za sprawdzenie, czy użytkownik wcisnął przycisk; program wykrywa zbocze narastające,
  • TIMER1 – zwiększanie zmiennej krok oraz gaszenie i zapalenie diody symbolizującej jedzenie,
  • TIMER2 – przerwanie odpowiadające za zapalanie odpowiednich diod, w każdym wywołaniu przerwania dane o aktualnej warstwie wysyłane są do rejestrów, zapalane są diody na tej warstwie i licznik warstw jest zwiększany o 1.

rejestry.c

Biblioteka odpowiada za obsługę rejestrów przesuwnych. Posiada m.in. funkcję umożliwiającą wysłanie danych 16–bitowych do rejestrów.
waz.c

Biblioteka definiuje zachowanie węża: przesunięcie go o jedno pole oraz przesuwanie głowy w odpowiednim kierunku.

jedzenie.c

Biblioteka losuje pozycję jedzenia i sprawdza, czy wąż na nie trafia. Pozycje jedzenia nie musiały
być losowane w sposób dokładny, zatem zastosowano uproszczony liniowy generator kongruencyjny. Dodatkową losowość uzyskano przez modyfikowanie stanu w zależności od wybranego kierunku (następuje to w przerwaniu licznika TIMER0). Biblioteka jest też odpowiedzialna za sprawdzenie, czy głowa węża trafiła na jedzenie.

kostka.c

Biblioteka odpowiada za przypisanie do struktury kostka takich wartości, aby zapalały się odpowiednie diody.

animacja.c

Biblioteka definiuje sekwencje animacji i długość ich trwania.

WĄŻ W AKCJI

 

Ocena: 4.86/5 (głosów: 233)

Podobne posty

23 komentarzy do “Snake 3D

Odpowiedz

anuluj

Masz uwagi?