This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.cozma0903 [2025/05/25 15:43] andrei.cozma0903 |
pm:prj2025:avaduva:andrei.cozma0903 [2025/05/25 16:10] (current) andrei.cozma0903 |
||
---|---|---|---|
Line 8: | Line 8: | ||
* Se vor auzi zgomote la distrugerea obstacolelor și la pierderea jocului prin intermediul unui buzzer. | * Se vor auzi zgomote la distrugerea obstacolelor și la pierderea jocului prin intermediul unui buzzer. | ||
* Scopul jocului este pur recreativ. | * Scopul jocului este pur recreativ. | ||
+ | |||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
{{:pm:prj2025:avaduva:schema_bloc_cozma_andrei.jpg?600|}} | {{:pm:prj2025:avaduva:schema_bloc_cozma_andrei.jpg?600|}} | ||
+ | |||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 25: | Line 27: | ||
Schema electrica: | Schema electrica: | ||
- | {{:pm:prj2025:avaduva:cozmaandreischema_electrica.png?600|}} | + | {{:pm:prj2025:avaduva:cozmaandreischema_electrica2.png?600|}} |
Detalii despre pini: | Detalii despre pini: | ||
Line 31: | Line 33: | ||
* Ecranul TFT este conectat prin magistrala SPI, utilizând pinii standard pentru Arduino UNO: pinul digital 10 pentru CS (chip select), 9 pentru DC (data/command) și 12 pentru reset (RST). | * Ecranul TFT este conectat prin magistrala SPI, utilizând pinii standard pentru Arduino UNO: pinul digital 10 pentru CS (chip select), 9 pentru DC (data/command) și 12 pentru reset (RST). | ||
* Tastatura matricială (keypad-ul) este conectată la pinii analogici A0–A4, împărțiți în patru pini de rând (A1–A4) și un pin de coloană (A0), ceea ce permite multiplexarea tastelor fără a consuma pini digitali suplimentari. | * Tastatura matricială (keypad-ul) este conectată la pinii analogici A0–A4, împărțiți în patru pini de rând (A1–A4) și un pin de coloană (A0), ceea ce permite multiplexarea tastelor fără a consuma pini digitali suplimentari. | ||
- | * Buzzer-ul este conectat pe pinul digital 3 (PD3), care corespunde ieșirii de tip PWM OC2B a Timerului 2. Alegerea acestui pin permite generarea de semnal audio controlat în mod direct prin setarea registrelor TCCR2A/B și OCR2A/B, în locul folosirii funcției de nivel înalt tone(). | + | * Buzzer-ul este conectat pe pinul digital 3 (PD3), care corespunde ieșirii de tip PWM OC2B a Timerului 2. Alegerea acestui pin permite generarea de semnal audio controlat în mod direct prin setarea registrelor TCCR2A/B și OCR2A/B, în locul folosirii funcției high-level tone(). |
- | * LED-urile roșu și verde sunt conectate pe pinii PD5 și PD6, controlați direct prin portul PORTD. Această mapare a pinilor reflectă atât constrângerile hardware ale plăcii, cât și obiectivul de a lucra cât mai aproape de nivelul de registru. | + | * LED-urile roșu și verde sunt conectate pe pinii PD5 și PD6, controlați direct prin portul PORTD. |
===== Software Design ===== | ===== Software Design ===== | ||
+ | Pentru realizarea componentei software a proiectului, am folosit mediul de dezvoltare Arduino IDE, împreună cu două biblioteci externe: TFT.h și SPI.h. Acestea sunt utilizate pentru afișarea graficii jocului pe un ecran TFT conectat prin interfață SPI, oferind funcționalități de desenare rapidă a textului și formelor. | ||
- | <note tip> | + | Execuția codului este structurată în modul următor: |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, PlatformIO) | + | * Se declară variabilele globale necesare pentru poziția jucătorului, a glonțului, a inamicilor și a stării jocului (viață, scor, viteză inamic, coliziune). |
- | * biblioteci şi surse 3rd-party folosite (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * În funcția setup() se inițializează ecranul TFT, porturile de control pentru LED-uri, precum și sistemul de sunet. Tot aici se generează o valoare aleatorie pentru poziția inamicilor, folosind analogRead() pentru a inițializa randomSeed(). |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | * Jocul începe cu un ecran de tip intro, care explică comenzile de control: butoanele A și B mută jucătorul stânga/dreapta, C trage un glonț, iar D începe jocul. |
+ | |||
+ | * În cadrul funcției loop(), jocul rulează permanent: se citește tastatura, se mișcă inamicul și glonțul, se detectează coliziunile, se redă sunetul și se actualizează scorul și afișajul. Jocul se oprește în cazul în care se pierd toate viețile, afișând mesajul GAME OVER. | ||
+ | |||
+ | * Jocul funcționează pe un principiu simplu: jucătorul este poziționat în partea de jos a ecranului și poate trage proiectile pentru a distruge inamicii care cad de sus. La fiecare atingere de jos a unui inamic, scorul crește, iar la intervale fixe, viteza acestora se accelerează. La coliziune directă, jucătorul pierde o viață. | ||
+ | |||
+ | În scopul optimizării performanței și pentru o mai bună înțelegere a hardware-ului, au fost făcute mai multe modificări: | ||
+ | |||
+ | * S-a renunțat la utilizarea bibliotecii Keypad.h, implementând în schimb o citire manuală a tastaturii matriciale 4x1. Această abordare permite control complet asupra citirii și debouncing-ului. | ||
+ | |||
+ | * În locul funcției tone(), care este blocantă și abstractă, a fost implementat un sistem propriu de generare a sunetului, folosind Timer2 în mod Fast PWM direct pe pinul OC2B (pinul 3 / PD3). Sunetul este redat atât în mod non-blocking (în timpul jocului), cât și în mod blocking (pentru secvențele de la Game Over). Astfel, s-a reușit reducerea latenței în reacțiile vizuale și sonore. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
Line 50: | Line 63: | ||
{{:pm:prj2025:avaduva:cozmaandreirezultat2.jpeg?300|}} | {{:pm:prj2025:avaduva:cozmaandreirezultat2.jpeg?300|}} | ||
- | |||
- | ===== Concluzii ===== | ||
===== Cod sursă - Download ===== | ===== Cod sursă - Download ===== | ||
Line 60: | Line 71: | ||
[[https://www.youtube.com/watch?v=rv_-RGzo10o|Link Demo]] | [[https://www.youtube.com/watch?v=rv_-RGzo10o|Link Demo]] | ||
+ | |||
+ | ===== Export to PDF ===== | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |