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:
Wnętrzności:
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:
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:
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:
Natomiast sąsiadujące warstwy są połączone dzięki anodom:
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ą:
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
Chyle czoło przed płcią przeciwną, bardzo fajny i estetyczny projekt. Może teraz 8x8x8 ?:) Leci piąteczka
5/5 i punkt ekstra za estetykę wykonania. W wersji 2.0 proponuję następujące udoskonalenie: zrobić na diodach RGB i wyróżnić innym kolorem jedzenie i głowę węża.
Projekt zacny. Estetyczny, schludny i naprawdę bardzo ciekawy. Z tego miejsca chciałbym przeprosić za zaniżenie oceny, bo przez przypadek wcisnąłem 4. Bardzo przepraszam. Powinno być zasłużone 5.
Świetny projekt, a obudowa wręcz fantastyczna :D leci piąteczka :)
Bardzo mi się podoba. Aż się zdziwiłem takiemu super projektowi. W kolejnej wersji powinnaś dodać diody rgb. Głowa byłaby wyróżniona kolorem czerwonym a reszta ciała siemniałaby się do tyłu. Jedzonko byłoby białe :)
Świetny projekt – bardzo pomysłowy i naprawdę estetycznie wykonany.
Bardzo mi się podoba (5/5).
W następnej wersji może sterowanie żyroskopem? :)
Ciekawy pomysł, świetne wykonanie. Czekamy na kolejną większą wersje i kolorowe diody :)
Jeszcze tylko 16x16x16 i mamy światową ewolucję gry w wężyka ! Można by było sprzedawać takie kostki , a co do projektu to 6/5 ;)
. Zrobić 16×16 RGB i na PolakPotrafi.pl albo KickStartera!
I w ogóle nie robię sobie żartów… Waćpanna może na tym dobre pieniądze zrobić. Tylko jakiś patencik strzelić coby nikt pomysłu nie ukradł i do roboty!
Łukasz: a może dałoby się zrobić w kodzie strony coś takiego, że gdy ktoś dostanie dużo piątek, to odblokowuje się opcja dania 6? Bo wiele projektów jest bardzo dobrych, ale to jest chyba dopiero drugi, któremu dałbym 6 bez zmrużenia oka! :)
Duuuużo zachodu by z tym było :)
Szkoda, ale rozumiem ;)
W każdym razie projekt przekracza skalę :D
Wat? Bez problemu mogę to zrobić (z tego co wykminiłem strona na WordPressie?), napisz na maila jeśli jesteś zainteresowany (jako plugin, nie potrzebowałbym wtedy dostępu do strony).
Problem w tym, że musi to być dobrze rozwiązane od strony cache, bo bez cachowania serwer tego nie pociągnie przy takim ruchu.
Obecnie jadę na gotowej wtyczce, która jest w miarę dopracowana (do ideału trochę jej brakuje, ale generalnie działa i jest dosyć wydajna).
już jest taki projekt na kickstarterze na diodach ws2812 – można sterować każda osobno i tworzyć animacje itp + łączenie kilku kostek w całość itp
Link?
https://www.kickstarter.com/projects/lookingglass/l3d-cube-the-3d-led-cube-from-the-future
Dzięki.
Można prosić gotowy program z końcówką .hex ? Jak nie to jak ustawić fuse-bit ?
btw. podsunę pomysł, dla stwórcy nowszej versji!
wstawił bym to do pudła ale z dodatkiem iluzji
– z lustrem wielu wymiarowym pod stolik
tak jak robi się lustro z głębią studni +LED
za szybą z przyciemniana folia,
jak ktoś chce albo ma lepszy pomysł tu macie jak to zrobić
jak by kto nie kojarzył – https://www.youtube.com/watch?v=b2bvWArORSc
– Pomysł by Sciemek miłej zabawy.
Jak wgrać ten program do uC ? Czym to skompilować? :/ A fuse-bity?
Poradziłem sobie z kompilacją programu, wgrałem .hex do uC, ale program wykonywany jest zbyt szybko, wszystko dzieje się za szybko.. Co mam zrobić? Po zmianie fusebitów na wewnętrzny kwarc 8Mhz jest lepiej, ale i tak zbyt szybko..
Bardzo fajne ale 2d to klasyk.
Najlepiej gra się na noki :)
Wiesz co fajna była by taka duża tablica na ścianę na której by się w to grało.