Miniaturowy Tetris

Kilka moich drobnych zmian w oryginalnym projekcie gry ATtiny Tetris, które jednak dość znacząco wpływają na jej odbiór. Mikrokontroler ATtiny85, pięć przycisków sterujących, ekran Oled 128×64, temat muzyczny z oryginalnej gry i pełniejsze udźwiękowienie.

To wszystko przy zaledwie sześciu dostępnych GPIO ATtiny85. Po zlutowaniu koszt budowy całego zestawu wynosi około 15 zł. Jeżeli nie chcemy się bawić w lutowanie i wystarczy nam wersja z płytką protoypową 170 styków (jak poniżej), to cenę należy zwiększyć o koszt płytki oraz drucików połączeniowych. ATtiny Tetris Gold Multi Button obsługuje narastający poziom trudności (przyspieszanie opadania wraz z usuwaniem kolejnych linii), informację o klocku pojawiającym się w kolejnej turze, podpowiedź o pozycji klocka w dolnej partii planszy (domyślnie wyłączona), pełną pseudo-losowość doboru klocków, dźwięki i temat muzyczny z oryginalnej gry.

Poniżej mój filmik prezentujący ten układ:

W filmie można zobaczyć krótkie urywki z rozgrywki, proces instalacji szkicu w urządzeniu oraz pełny, ośmiominutowy gameplay.

Sprzęt

Jakiś czas temu zainteresowały mnie klasyczne gry retro dla ATtiny85, ale w repo Attiny-Arduino-Games wszystkie były zaledwie dwu-przyciskowe. Tetris wymagał nieco więcej logiki, ale i tak obsługiwało się go przez naciskanie lub przytrzymywanie jednego z tylko dwóch przycisków, co generowało błędy i nie było zbyt wygodne. Z czasem jednak pojawiła się w repo wersja Tetris Multi Button, w której rozwiązano ten problem wykorzystując odpowiednią kombinację rezystorów i przycisków, dzięki czemu podłączono trzy przyciski pod jeden pin mikrokontrolera.

Do projektu dołączony był poniższy schemat:




Przeniosłem go na lekko chaotyczną wersję dla malutkiej płytki prototypowej (170 styków).

Zmontowany Krok 1 Krok 2 Z ekranem
  * Powiększenia dostępne po kliknięciu w miniaturkę.
  * Powiększenia dostępne po kliknięciu w miniaturkę.
  * Powiększenia dostępne po kliknięciu w miniaturkę.
  * Powiększenia dostępne po kliknięciu w miniaturkę.

Poszczególne przyciski odpowiadają za:

  1. start nowej gry lub restart aktualnie rozgrywanej,
  2. obrót,
  3. przyspieszenie opadania,
  4. przesunięcie w lewo,
  5. przesunięcie w prawo.

Przytrzymanie przycisku opadania i włączenie restartu gry aktywuje tryb ducha, a przytrzymanie przycisku opadania razem z przyciskiem obrotu podczas restartu ustawia trudny poziom gry, wypełniając dodatkowo błędnie klockami część planszy. Po aktywacji tych opcji grę należy uruchomić przyciskiem przyspieszonego opadania.


Rozmieszenie elementów jest dość nietypowe, ale dzięki takiemu upchnięciu większości połączeń w lewym górnym rogu możliwe było maksymalne zsunięcie ekranu w dół i nie wystaje on ponad płytkę, w wyniku czego jeszcze bardziej miniaturyzuje urządzenie. Dodatkowo żadne izolowane druciki nie przeszkadzają głośniczkowi piezo i może być on maksymalnie dociśnięty do płytki. Na schemacie ekran nieznacznie wystaje, ale w rzeczywistości jest mniejszy, co można zobaczyć na zdjęciach. Zestaw zasilam okrągłą 3V baterią CR2032 lub 3.7V lipo ponieważ sketch jest pisany dla obniżonego do 8MHz taktowania zegara ATtiny85.

Po zlutowaniu powyższego układu i po ubraniu go w miniaturowy brelok do kluczy, koszt (bez baterii) zamknąłby się poniżej 15 złotych. Na Aliexpress ATtiny85 kosztuje 0,80$, ekran Oled 128×64 1.80$, mały piezo buzzer 0,17$, a reszta części to już koszty groszowe. Tym sposobem otrzymujemy pełną grę sterowaną w identyczny sposób, jak w wielkich automatach Arcade lata temu, a do tego zasilaną malutką baterią 3V. Do zestawu zamiast białego ekranu można wybrać ekran niebieski lub żółto-niebieski, ale ponieważ ten ostatni jest dzielony na dwie różne części z odstępem, to nie prezentuje się zbyt atrakcyjnie (co widać na filmie z Digisparkiem) i polecam jednokolorowy odpowiednik. Potencjalny brelok mógłby wyglądać tak, jak na obrazku obok.

Kod

Jakie są różnice między moją wersją, dostępną na , a oryginałem gry dla ATtiny85:

  • Dodałem losowość doboru klocków – domyślnie ATtiny Tetris generuje tę samą sekwencję klocków w każdej nowej grze, bo użyta funkcja random korzysta w kółko z tej samej tablicy liczb losowych. Programiści nie aktywowali randomSeed, ponieważ wszystkie piny w układzie są już podłączone. Moja wersja przesuwa tablicę liczb pseudo-losowych po każdym rozpoczęciu gry inkrementując seed do EEPROMu i aktywując w ten sposób pełną pseudolosowość doboru klocków (powtarzają się tylko pierwsze dwa). Ograniczenie liczby zapisów do EPPROMu skutkuje ograniczeniem liczby rozgrywek na jednym ATtiny do 99000 :)
  • Na starcie gry dodałem fragment tematu muzycznego z oryginalnej gry Tetris z 1986 roku – domyślnie brak jakiejkolwiek muzyki w grze. Po wybraniu trybu ducha temat muzyczny jest nieco dłuższy.
  • Dodałem dźwięk opadającego klocka (tylko podczas swobodnego spadania) oraz inny dźwięk dla klocka, który kończy opadanie. Domyślnie dźwięki w tej grze pojawiają się sporadycznie – tylko podczas usunięcia pełnej linii klocków oraz na zakończenie gry.
  • Naprawiłem część błędnie wyświetlanych fontów na ekranie startowym
  • Domyślnie wyłączyłem tryb ducha, który wyświetla podpowiedź o docelowej pozycji klocka. Tryb ducha można aktywować sposobem opisanym powyżej pod konfiguracją przycisków.




Instalacja

Kod zabiera blisko 100% pamięci ATtiny85, należy więc skompilować hexa i wgrać go za pomocą programatora ISP. Jako programatora użyłem Arduino wg poniższego schematu:

ATtiny85 Digispark
  * Powiększenia dostępne po kliknięciu w miniaturkę.
  * Powiększenia dostępne po kliknięciu w miniaturkę.

Na Arduino trzeba wgrać dostępny w przykładach Arduino IDE sketch ArduinoISP. W Arduino IDE należy wkleić link do JSONa dla czystego ATtiny85, a następnie wybrać płytkę ATtiny25/45/85, procesor ATtiny85, zegar Internal 8MHz. Następnie z menu szkic eksportować skompilowany program, który zostanie wtedy umieszczony w katalogu źródła sketcha. Na koniec zostaje już tylko wgranie hexa do ATtiny poprzez Arduino programem avrdude. Poniżej przykładowe polecenie kopiujące (z fusami) wykonane na macOS, ale w innych systemach wygląda podobnie:
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -pattiny85 -cstk500v1 -P/dev/cu.usbmodem14101 -b19200 -Uflash:w:/Users/username/Documents/ATtiny-Tetris-Gold/ATtiny-Tetris-Gold.ino.tiny8.hex -U lfuse:w:0xF1:m -U hfuse:w:0xD5:m -U efuse:w:0xFE:m

Jak przebiega taki proces można obejrzeć na końcu powyższego filmiku.

Podsumowanie

Po zakończeniu gry Tetris natychmiast przechodzi w tryb uśpienia z minimalnym poborem prądu. Gra działa bardzo płynnie, co widać na powyższym filmie, gdy przytrzymuję przycisk przyspieszonego opadania dla kilku klocków pod rząd. Miniaturowy ATtiny Tetris Gold jest bardzo regrywalny (nie nudzi się) i to niesamowite, że udało się go upchnąć na tanim ATtiny85 przy zachowaniu tak dużej funkcjonalności. Serdecznie polecam montaż tego prostego układu.

Tutaj mój starszy filmik prezentujący ten układ w połączeniu z Digisparkiem i płytką prototypową 400 styków (half-sized). Dodatkowo układ dla tej samej płytki i ATtiny85.


Wersję dla Digisparka zasilam poprzez pin VIN 9V baterią i przy takim poborze wystarczy jej na baaardzo długo. Wymagane do działania 5V przenoszę dodatkowym, pustym goldpinem na lewą stronę płytki prototypowej. Ponieważ głośniczek jest podłączony do pierwszego pinu Digisparka, to dodatkowo otrzymujemy LEDowe sygnały świetlne w momencie odtwarzania dźwięków. Do Digisparka dodałem przełącznik włączający/wyłączający zasilanie dla układu – wersja opierająca się wyłącznie na ATtiny85 nie wymaga wykonania tego kroku. Serdecznie polecam montaż tego prostego układu również w połączeniu z Digisparkiem, ale wersja z czystym ATtiny85 i płytką na 170 styków jest bardziej wymagająca i daje więcej satysfakcji przez ostatecznie uzyskaną miniaturowość układu.

2 myśli na temat “Miniaturowy Tetris

  1. How do I reprogram the Digispark if the game didn’t work? It is like dead, can’t access it! Arduino IDE and Uno as ISP with Avrdude tested. Invalid device signature 0x000000.
    All I get is blinking dots on the oled display. If I press reset the dots stop blinking.

    1. > Invalid device signature 0x000000

      I’ve seen this message on badly pressed wires, but you may have to use High Voltage Serial Programming (HVSP).

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.