Konsola do gier na Arduino

Konsola do gier na Arduino

Tenis to najstarsza z gier video. Swoją premierę miała już w 1972 roku. Ja pamiętam ją jeszcze z mojego dzieciństwa  – w wersji na konsolę TVG-10. Spędziłem nad nią wiele godzin:) Wspomnienia wróciły po wizycie w Muzeum Konsol Gier Video Karpaczu. Szybkie poszukiwanie w Sieci pokazało się, że w oparciu o Arduino można zbudować mini-konsolę podłączaną do telewizora.

pong_00Projekt

Moja konsolka będzie oparta na Arduino UNO. Używając biblioteki TVOUT będę generował obraz analogowy w systemie PAL, który z kolei wyświetlę na telewizorze.

ovr_00

Konsolka będzie wyposażona w mały wyświetlacz LED oparty o TM1637. Do sterowania systemem wykorzystam kilka przycisków typu tact. Przyda się również wyprowadzony na zewnątrz reset. Gry będę obsługiwał za pomocą dwóch kontrolerów. Zamierzam zrobić właśnie takie, jakie były w TVG-10: walcowate z obracaną końcówką. Są znacznie wygodniejsze niż potencjometryczne (stosowane w niektórych starszych systemach).

Całą konsolę zamknę w plastikowej obudowie. Konsola będzie zasilana przez zewnętrzny zasilacz 12v. Podobne projekty były już opisywane w Sieci wielokrotnie – lista inspiracji na końcu tekstu.

Tekst jest mojego autorstwa  i oryginalnie ukazał się na moim blogu Elektronika Bez Spięcia (uczymy.edu.pl): Konsola do gier na Arduino. Niektóre z zagadnień zostały tam opisane w szczegółach – tutaj przytaczam ich skrót.

Kontrolery

Moje kontrolery będą oparte na potencjometrach. Pamiętacie dzielnik napięciowy?

divider_1

Potencjometr kontrolera wstawię w miejsce rezystora R2 i zmierzę na nim napięcie za pomocą pinu przetwornika analog/cyfra A0 (i A1 dla drugiego gracza):

scheme_arduuVid_03

Oczywiście możecie zastosować ten potencjometr łącząc 5v i masę do pinów skrajnych a środkowy – do wejścia analogowego. Ale wtedy potrzebowalibyście 3 kabelków (i nie można by już było wykorzystać prostego gniazda DC – o czym poniżej).

Dla rezystora R1=4k7 i potencjometru P1=10kΩ, napięcie mierzone przez A0 będzie wynosiło:

latex_00

Dla P1 = 0Ω (skrajna pozycja potencjometru), napięcie powinno być bliskie zeru. Dla P1 = 10kΩ (druga skrajna pozycja potencjometru):

latex_01

Biorąc pod uwagę, że funkcja “analogRead()” zwraca 0 dla 0v i 1023 dla 5v, przy tym dzielniku wartości powinny zwierać się w przedziale 0..695. W praktyce na pinie 5v nigdy nie ma 5v – pewnie coś około 4.8 do 4.9v. Rezystory mają swoje odchylenia od wartości nominalnych. W rezultacie pin A0 zwracał wyniki w zakresie 0..720 – ale jedynie, gdy potencjometr był podłączony. W przeciwnym wypadku – 1023.

Zakresy te będą potrzebne do mapowania nastawy potencjometru (zwracanej przez pin analogowy) do pozycji rakietki na ekranie, np.:

Zmienne ymin i ymax to współrzędne najwyższej i najniższej linii ekranu.

Do podłączenia kontrolerów użyłem gniazda zasilające DC do wtyków 2.1mm:

arduPong_04

Z lenistwa kupiłem gotowy kabel z wtykiem pasującym do tych gniazd:

arduPong_05

Pozostało przylutować kabeki:

arduPong_06

Z drugiej strony do kabla przylutowałem potencjometr:

arduPong_09

No i pomysł na kontrolery: butelki po kosmetykach:)

ctrl_00a

Wystarczyło zeszlifować gwint:
ctrl_01
W zakrętkę włożyłem gałkę od potencjometru. Użyłem distalu, żeby je połączyć:
ctrl_06

ctrl_07
Z drugiej strony butelki wywierciłem otwór na potencjometr i odciąłem denko:
ctrl_02

ctrl_03

ctrl_05

Pozostało wkleić to denko wewnątrz tuby:
ctrl_04
W efekcie:

arduPong_17

arduPong_18

Operację należy powtórzyć dwa razy:)

Wyświetlanie obrazu na telewizorze

Do wyświetlania obrazu na telewizorze wykorzystałem bibliotekę TVOUT: https://github.com/Avamander/arduino-tvout/. Wystarczy  pobrać ją z GitHuba plik zip i rozpakować do katalogu z bibliotekami Waszego Arduino IDE. Teraz z katalogu “./arduino-tvout-master/TVoutfonts” skopiujcie wszystkie pliki do katalogu głównego biblioteki (zob. ten wątek). W ten sposób będziecie mogli użyć w swojej aplikacji wszystkie dostępne czcionki:

  • 4×6
  • 6×8
  • 8×8
  • 8x8ext

Otwórzcie nowy projekt i z menu “Szkic/Dodaj bibliotekę” dodajcie “TVOut”:

Dodajcie czcionki i zainicjalizujcie bibliotekę:

Biblioteka ta udostępnia kilka funkcji, które możecie użyć w swoich programach, np:

  • tv.fill(WHITE): wypełnij ekran kolorem białym (BLACK – czarnym),
  • tv.clear_screem(): wyczyść ekran,
  • tv.delay(1000): opóźnienie 1s,
  • tv.draw_column(10,10,50,WHITE): narysuj linię pionową na x=10 dla y=10..50 – białym kolorem (szybsze niż draw_line),
  • tv.draw_rect(50,50,10,10,WHITE): narysuj na ekranie kwadrat o boku 10 pikseli na pozycji (x, y): (50,50),
  • tv.print(): cały zestaw funkcji do wypisywania na ekranie tekstu.

A teraz uwaga (której odkrycie kosztowało mnie trochę czasu):

Biblioteka TVOUT mocno używa przerwań. Może zakłócać działanie innych bibliotek lub ich funkcji. Na przykład… Serial.println().

Użycie w kodzie instrukcji Serial.println() spowoduje przedziwne “efekty”. Obraz będzie nagle znikał a aplikacja będzie się wieszać. W związku z tym: nie używajcie modułu Serial.

Podłączenie do telewizora

Dla Arduino UNO:

  • Pin 9: synchronizacja,
  • Pin 7: sygnał video,
  • Pin 11: sygnał audio

Wybór pinów nie jest przypadkowy: dla UNO R3 nie możecie użyć innych. Biblioteka TVOUT wykorzystuje pewne dodatkowe funkcje portów kontrolera. Jeżeli zamiast AtMega328 (napędzającego UNO R3) użyjecie np. Arduino Mega lub Leonardo – będziecie musieli użyć trochę innych pinów – odsyłam do dokumentacji biblioteki.

Piny te wyprowadzę na 2 wtyczki typu cinch – jedną dla video, drugą dla audio. Wewnętrzny styk to sygnał – zewnętrzny to masa. Do podłączenia video będziecie potrzebowali 2 rezystorów 1kΩ i 470Ω (na podstawie: TVOut library):

scheme_arduuVid_01Audio można podłączyć bezpośrednio:

scheme_arduuVid_02

Teraz pozostało nawiercić w obudowie otwory pod gniazda cinch:

arduPong_01

Do gniazd przylutowałem kable:

arduPong_02

Złącza można dodatkowo zarobić koszulkami termokurczliwymi:

arduPong_03

Wyświetlacz

Pomyślałem, że przyda się wyświetlacz, który będzie pokazywał np. wybraną grę albo stopień trudności. W tym celu użyłem modułu z TM1637.

arduPong_07

Jego dokładny opis znajdziecie tutaj: Wyświetlacz LED z TM1637. Wyświetlacz przykręciłem do górnej części obudowy za pomocą czterech śrubek fi2mm/16mm:

arduPong_08

Klawiatura

Na potrzeby wybierania gry, jej startowania i ustawiania poziomu trudności, przyda się kilka przycisków. Mój wybór padł na standardowe przełączniki typu tact. Ponieważ ma być ich 4, postanowiłem podłączyć je poprzez port analogowy.

keys_08

Dokładny opis takiego podłączenia znajdziecie w tym tekście: Arduino: przyciski podłączane do wejść analogowych. Przyciski przylutowałem na płytce uniwersalnej. Modulik zasilany jest z 5v. Przyciski podłączyłem do wejścia A2. Pamiętajcie również o połączeniu A2 z D2. W ten sposób będzie można podpiąć przerwanie pod port D2 i sprawdzać stan  klawiatury dopiero po wciśnięciu klawisza.

Dodatkowy reset

Już pierwsze doświadczenia z konsolą pokazały, że dodatkowy reset jest niezbędny. O tyle łatwiej było go wyprowadzić, że płytka rozszerzenia posiadała już pady do wlutowania odpowiedniego przycisku. Wystarczyło je przedłużyć  i wyprowadzić na piny:

arduPong_15_reset

Za przycisk posłużył kolejny “tact switch” do którego dolutowałem kabelki z gniazdami gold pin:

arduPong_16_reset

Teraz pozostało przykleić go w obudowie – z braku pomysłów użyłem gorącego kleju:

pong_12

Widok na obudowie:

reset_00

Montaż

Arduino przykręciłem do podstawki za pomocą śrubek M2 tak, żeby gniazdo zasilające było na samej krawędzi:

arduPong_10

arduPong_11

Jak widzicie użyłem klona Arduino w stylu “leonardo”. Klon był wyposażony w procesor AtMega328 (SMD) – ale w miejsce wielgachnego USB było microUSB. To pozwoliło mi ładniej wpasować płytkę w obudowę.

W górnej części obudowy wypiłowałem otwór na gniazdo DC:

arduPong_12

Całość elektroniki zmontowałem na płytce rozszerzenia:

arduPong_13

Nie było tego wiele:

  • Gniazda audio/video oraz kontrolerów podłączyłem do terminali,
  • Wyświetlacz, klawiaturę i reset podłączyłem przez gniazda typu gold pin.

arduPong_14

Z gold-pinami miałem trochę problemów. Po nałożeniu kabelków po prostu nie mieściły się w obudowie:) Zdjąłem plastykową koronkę i wygiąłem piny…

pong_10

Następnym razem pomyślę o pinach kątowych… Całość zmieściła się w obudowie:

pong_01

pong_03

Oprogramowanie…

Na podstawie takiej mini-konsoli możecie napisać kilka całkiem interesujących gier. Tenis to jedna – ale przecież wcale nie musicie się do tego ograniczać. NES i inne konsole ery 8-bitowej mogą dostarczyć Wam wielu inspiracji. Do dyspozycji macie klawisze, wyświetlacz, kontrolery – jest w czym wybierać…

Jeżeli jednak nie chcecie bawić się w programistów – przykładowy kod tenisa możecie pobrać z blogu: How to recreate the classic Pong game… Możecie go wykorzystać, pod warunkiem wykonania pewnych zmian.

W projekcie How to…, autor użył potencjometrów, które podłączył bezpośrednio do wejść analogowych. Ja użyłem dodatkowych rezystorów, dzięki którym podłączyłem kontrolery na 2 przewodach – a nie 3. W projekcie z bloga potencjometry zwracają wartości z przedziału 0..1023, u mnie – 0..720. Trzeba więc przemapować wartości. W funkcji processInputs() zmieńcie linijki od 63 z:

Na:

Dalej, jedyny klawisz podłączony był do D2. Jego stan odczytywano w procedurze processInputs(). W linijce 67 zamieńcie:

Na:

W tym momencie wciśnięcie klawisza spowoduje uruchomienie gry. Możecie podłączyć konsolę do komputera za pomocą video grabera – znacznie ułatwi to pisanie i testowanie kodu.

Podsumowanie

Łatwe? Cóż, wymaga trochę pracy. Zawsze tak jest, gdy z projektów na płytce stykowej chcecie zrobić coś, co będzie trochę mniej… eksperymentalne:) Prawdziwa zabawa zaczyna się gdy dochodzi do lutowania czy konieczności wykonania elementów mechanicznych, albo choćby zmieszczenia wszystkiego w obudowie. A na końcu – można sobie pograć!

Materiały

Do budowy wykorzystałem:

  • Arduino UNO R3, klon z microUSB – może być dowolny – mi taki po prostu pasował do obudowy,
  • Obudowa Z77 124x72x37mm czerwona,
  • Płytka rozwojowa dla Arduino, z resetem,
  • Płytka przewlekana, dwustronna, ok 3×5 cm,
  • Kabel z wtykiem DC 2.1/5.5mm przewód 2×0.22mm, 2 sztuki,
  • Gniazdo zasilające DC 2.1/5.5 mm na panel, 2 sztuki,
  • Potencjometr osiowy liniowy 10k, 2 sztuki,
  • Tact Switch 6x6x8mm czarny, 5 sztuk,
  • Rezystory około 10kΩ i 20kΩ, 1kΩ i 470Ω,
  • Gniazdo CHINCH (RCA) na panel złote 2szt,
  • Terminal blocki, 3 gniazda – 2 sztuki,
  • Śrubki M2 o długości 8mm (do przykręcenia Arduino) i 16mm po 10 sztuk powinno wystarczyć.

Przyda się mini-wiertarka, pistolet na gorący klej, pilniki i papier ścierny.

Źródła

Ocena: 5/5 (głosów: 14)

Podobne posty

5 komentarzy do “Konsola do gier na Arduino

Odpowiedz

anuluj

Masz uwagi?