This shows you the differences between two versions of the page.
pm:prj2023:fstancu:darian.vrabie [2023/05/26 19:42] darian.vrabie created |
pm:prj2023:fstancu:darian.vrabie [2023/05/29 16:13] (current) florin.stancu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | aaaa | + | ====== 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. | ||
+ | {{:pm:prj2023:fstancu:diag_gen.png?700|}} | ||
+ | |||
+ | ===== Implementare Hardware ===== | ||
+ | |||
+ | Componentele necesare: | ||
+ | * Arduino UNO | ||
+ | * 8x8=64 LED-uri | ||
+ | * breadboard | ||
+ | * shift registers, pentru multiplexarea LED-urilor | ||
+ | * butoane, rezistente, fire, the usual stuff | ||
+ | |||
+ | Descriere implementare hardware: | ||
+ | |||
+ | <note tip>Stiati ca breadboard-urile au conexiuni comune intre gaurile de pe aceeasi coloana numerica? Am aflat prea tarziu. :^) </note> | ||
+ | |||
+ | |||
+ | * 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 ===== | ||
+ | {{:pm:prj2023:fstancu:diag_hardware.png?800|}} | ||
+ | |||
+ | ===== 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 ===== | ||
+ | * Video: [[https://www.youtube.com/watch?v=uSwPenMtLd0]] | ||
+ | |||
+ | |||
+ | ===== Concluze ===== | ||
+ | * Acest proiect m-a invatat <del>ca trebuie sa ma apuc mai devreme de proiecte</del> 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 ===== | ||
+ | * Canalul DroneBot Workshop [[https://www.youtube.com/@Dronebotworkshop]] pentru: | ||
+ | * Cum sa folosesc un cip shift register | ||
+ | * Aprofundare intreruperi | ||
+ | * Laboratoare PM | ||
+ | |||
+ | ===== Download cod sursa ===== | ||
+ | * [[https://github.com/darian1901/retro_racing_game_arduino]] | ||
+ | |||
+ | <note>Jocul original, inspiratia acesui proiect: [[https://www.youtube.com/watch?v=H-L_ra5kT3k]]</note> |