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. Koszt budowy całego zestawu wynosi około 15 zł. 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). Rozmieszenie 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 układ. 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.

Digispark ATtiny85
  * 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. włączenie/wyłączenie układu,
  3. obrót,
  4. przyspieszenie opadania,
  5. przesunięcie w lewo,
  6. 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.



Wersja dla ATtiny85 potrzebuje tylko 3V, bo sketch jest pisany dla obniżonego do 8MHz taktowania zegara.

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:

Digispark ATtiny85
  * 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 chodzi 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.

O wersji dla Digisparka i czystego ATtiny85 na płytce prototypowej 400 styków (half-sized) można przeczytać na następnej stronie.

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 had 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.