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 17 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 w trzech trybach gry oraz proces instalacji szkicu w urządzeniu.

Sprzęt

Jakiś czas temu zainteresowały mnie klasyczne gry retro dla ATtiny85, ale w repo Attiny-Arduino-Games wszystkie były zaledwie dwuprzyciskowe. 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, dzięki czemu podłączono trzy przyciski pod jeden pin mikrokontrolera.

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




Zaprojektowałem więc lekko chaotyczną wersję dla malutkiej, 170-cio stykowej płytki prototypowej:

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; w połączeniu z przyciskiem 2 i 3 przejście w tryb trudny (wypełnia błędnie klockami część planszy); w połączeniu z przyciskiem 3 przejście w tryb ducha (wyświetlanie podpowiadających klocków na spodzie ekranu),
  2. obrót,
  3. przyspieszenie opadania lub wyjście z trybu uśpienia i uruchomienie gry,
  4. przesunięcie klocka w lewo,
  5. przesunięcie klocka w prawo.

Po aktywacji trybów grę należy uruchomić ponownie 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 i w filmie. Zestaw zasilam okrągłą 3V baterią CR2032 lub 3.7V lipo, ponieważ sketch jest pisany dla obniżonego do 8MHz taktowania zegara ATtiny85. Zalecam baterię lipo, ponieważ jedno pełne naładowanie wystarcza na wiele godzin rozgrywki.

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 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 (lub skorzystać ze skompilowanej wersji umieszczonej na GitHubie) 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 wersja układu dla dużej płytki prototypowej i Digisparka oraz układ dla dużej 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.

Z ciekawostek – pewień chiński użytkownik mojej wersji Tetrisa zaprojektował miniaturową płytkę na podstawie powyższego projektu – polecam jego film na ten temat:

6 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).

  2. ATtiny Tetris Gold is very nice.
    I want to make this using a 1.3 inch display.
    The display is i2c, sh1106 OLED.
    Can you tell me where to fix the program?

Dodaj komentarz

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