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