Retro Racing Game - Darian VRABIE-DINU

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

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

pm/prj2023/fstancu/darian.vrabie.txt · Last modified: 2023/05/29 16:13 by florin.stancu
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