Retro Racing Game

Introducere

  • Proiectul va consta intr-un joc similar cu cel gasit pe consolele retro de tip 9999 games in 1. Mai exact, jocul cu masini, in care jucatorul controleaza o masina si trebuie sa evite ciocnirea cu alte masini, ce vin pe contrasens.

Descriere generala

  • Jocul are 2 “caractere”: masina controlata de jucator, care se afla in partea inferioara a matricei de LED-uri, si masinile ce vin de pe partea opusa. Scopul jocului este simplu: nu te ciocni cu celelalte masini pentru cat mai mult timp.

Implementare Hardware

Componentele necesare:

  • Arduino UNO
  • 8×8=64 LED-uri
  • breadboard
  • shift registers, pentru multiplexarea LED-urilor
  • butoane, rezistente, fire, the usual stuff
  • LCD pentru scor time constraints, procrastination and broken dreams

Descriere implementare hardware

Stiati ca breadboard-urile au conexiuni comune intre gaurile de pe aceeasi coloana numerica? Am aflat prea tarziu. :^)

  • Datorita intrebarii retorice de mai sus, partea hardware a proiectului functioneaza in felul urmator:
    • Exista 4 linii de cate 8×2=16 led-uri fiecare. Led-urile de pe fiecare linie sunt inseriate la anod.
    • Catodurile led-urilor sunt inseriate (short-ate?) pe orizontala, de la o linie la alta, formand astfel 8 coloane.
    • Astfel, daca conectam prima coloana la GND si prima linie la VCC, se aprind primele 2 LED-uri (din moment ce sunt inseriate, cele 2 LED-uri aprinse se numara ca unul singur in software).
    • Aprinderea unui anumit set de led-uri de pe anumite randuri si anumite coloane se face cu ajutorul a doua shift-registere (de tip Serial Input Paralel Output, SIPO).
    • Un shift registru pentru linii, celalalt pentru coloane.
  • Se observa de asemenea prezenta a doua butoane. Ele sunt folosite pentru a misca masina jucatorului in stanga si in dreapta.

Schema hardware

Implementare software

  • “Desenarea” scenei functioneaza asemanator cu un televizor vechi: fiecare coloana este aprinsa, pe rand, insa cu atat de putin delay intre tranzitii incat ochiul uman nu le poate detecta.
  • Scena este defapt statica, desenata la fiecare ciclu al functiei while() din loop(), luand in considerare anumite variabile (numarul liniei pe care se afla jucatorul/un inamic, coloana pe care se afla un inamic).
  • Variabilele aceseta sunt modificate folosind intreruperi:
    • Variabila ce denota linia pe care se afla jucatorul este schimbata in doua functii de intreruperi (pentru directia stanga, respectiv dreapta). Aceste intreruperi sunt atasate celor doua butoane mentionate anterior.
    • Variabila ce denota linia pe care un inamic va aparea este de asemenea schimbata intr-o intrerupere, insa de data aceasta folosesc o intrerupere pe timerul intern.
    • Miscarea inamicului este tratata in aceeasi intrerupere. La un anumit interval de timp, creste indexul coloanelor pe care sunt “desenati” inamicii.
  • Inamicii pot veni de pe maxim 3 linii (mereu ramane una libera), la intervale aleatorii.
  • Coliziunea jucatorului cu un inamic este tratata la fiecare ciclu. Daca o masina inamica ajunge pe aceleasi coloane si aceeasi linie cu jucatorul, jocul se opreste, se aprind toate led-urile pentru a semnala acest lucru, si jocul o ia de la capat.

Rezultat final

Concluze

  • Acest proiect m-a invatat ca trebuie sa ma apuc mai devreme de proiecte cum functioneaza un shift register folosit pentru a controla foarte multe LED-uri. De asemenea, am aprofundat conceptul de intrerupere, atat intreruperi hardware cat si folosirea unui timer intern.

Resurse/Ghiduri folosite

Download cod sursa

  Jocul original, inspiratia acesui proiect: https://www.youtube.com/watch?v=H-L_ra5kT3k

Export to PDF

pm/prj2022/arosca/darian.vrabie.txt · Last modified: 2022/05/24 02:12 by darian.vrabie
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0