This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.cozma0903 [2025/05/18 17:25] andrei.cozma0903 [Hardware Design] |
pm:prj2025:avaduva:andrei.cozma0903 [2025/05/25 16:10] (current) andrei.cozma0903 |
||
---|---|---|---|
Line 4: | Line 4: | ||
Prezentare pe scurt: | Prezentare pe scurt: | ||
* Un joc simplu inspirat puțin din jocul Subway Surfers, afișat pe un ecran LCD și controlat cu un keypad. | * Un joc simplu inspirat puțin din jocul Subway Surfers, afișat pe un ecran LCD și controlat cu un keypad. | ||
- | * Jocul constă în a evita obstacole prin mutări la stânga sau la dreapta, cu posibilitatea de a distruge obstacolele prin tragerea de gloanțe, toate prin intermediul keypad-ului. | + | * Jocul constă în a evita obstacole prin mutări la stânga sau la dreapta, cu posibilitatea de a distruge obstacolele prin tragerea de gloanțe pentru a te feri și a câștiga mai multe puncte, toate prin intermediul keypad-ului. |
* În timpul jocului, un LED de culoare verde va rămâne aprins, iar la pierderea jocului prin coliziunea cu un obstacol, se va stinge LED-ul verde și se va aprinde cel roșu. | * În timpul jocului, un LED de culoare verde va rămâne aprins, iar la pierderea jocului prin coliziunea cu un obstacol, se va stinge LED-ul verde și se va aprinde cel roșu. | ||
* 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 16: | Line 18: | ||
* [[https://ardushop.ro/ro/plci-de-dezvoltare/2282-placa-de-dezvoltare-uno-r3-compatibil-arduino-6427854027122.html?gad_source=1&gad_campaignid=22058879462&gbraid=0AAAAADlKU-6Mwhj2CaAa-5jV0Ic3VkQvP&gclid=Cj0KCQjwiqbBBhCAARIsAJSfZkbVyDCTc1bebeNp5e5J9NHFTp-tVdRrLhdOlLaeVHEdnzWZikg3MkIaAkReEALw_wcB|Arduino Uno]] | * [[https://ardushop.ro/ro/plci-de-dezvoltare/2282-placa-de-dezvoltare-uno-r3-compatibil-arduino-6427854027122.html?gad_source=1&gad_campaignid=22058879462&gbraid=0AAAAADlKU-6Mwhj2CaAa-5jV0Ic3VkQvP&gclid=Cj0KCQjwiqbBBhCAARIsAJSfZkbVyDCTc1bebeNp5e5J9NHFTp-tVdRrLhdOlLaeVHEdnzWZikg3MkIaAkReEALw_wcB|Arduino Uno]] | ||
* [[https://www.optimusdigital.ro/en/buzzers/12247-3-v-or-33v-passive-buzzer.html?gad_source=1&gad_campaignid=19615979487&gbraid=0AAAAADv-p3DpzQivl1HoGD6feRIlY_6Bz&gclid=Cj0KCQjwiqbBBhCAARIsAJSfZkZjYR4r7Dph21T69KdAhGB7SEqX1z984DDLD_E8l6orkxI8kJMbNwMaAqotEALw_wcB|Buzzer]] | * [[https://www.optimusdigital.ro/en/buzzers/12247-3-v-or-33v-passive-buzzer.html?gad_source=1&gad_campaignid=19615979487&gbraid=0AAAAADv-p3DpzQivl1HoGD6feRIlY_6Bz&gclid=Cj0KCQjwiqbBBhCAARIsAJSfZkZjYR4r7Dph21T69KdAhGB7SEqX1z984DDLD_E8l6orkxI8kJMbNwMaAqotEALw_wcB|Buzzer]] | ||
- | * [[https://www.optimusdigital.ro/en/breadboards/13249-breadboard-300-puncte.html?search_query=breadboard&results=360|Breadboard]] | + | * Breadboard |
+ | * Fire | ||
* [[https://cleste.ro/ecran-lcd-1-8-spi.html|Ecran LCD 1.8" SPI]] | * [[https://cleste.ro/ecran-lcd-1-8-spi.html|Ecran LCD 1.8" SPI]] | ||
* [[https://www.emag.ro/tastatura-matriciala-4x4-ai183-s248/pd/D9SFNYMBM/?ref=cart_item|Keypad]] | * [[https://www.emag.ro/tastatura-matriciala-4x4-ai183-s248/pd/D9SFNYMBM/?ref=cart_item|Keypad]] | ||
- | * Fire | ||
* Rezistențe | * Rezistențe | ||
* 2 LED-uri RGB | * 2 LED-uri RGB | ||
+ | |||
+ | Schema electrica: | ||
+ | |||
+ | {{:pm:prj2025:avaduva:cozmaandreischema_electrica2.png?600|}} | ||
+ | |||
+ | Detalii despre pini: | ||
+ | * Alocarea pinilor s-a făcut cu scopul de a asigura compatibilitate cu perifericele folosite și de a permite un control eficient la nivel de registru atunci când este necesar. | ||
+ | * 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. | ||
+ | * 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. | ||
===== 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) | + | |
- | * biblioteci şi surse 3rd-party folosite (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | + | * 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). |
- | <note tip> | + | * Î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(). |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | + | * 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. |
- | ===== Cod sursă și alte resurse ce trebuie să existe pe GitHub ===== | + | * Î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. |
- | Codul sursă trebuie urcat într-un repo public, recomandăm GitHub. | + | * 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 ===== | ||
- | <note warning> | + | {{:pm:prj2025:avaduva:cozmaandreirezultat1.jpeg?300|}} |
- | Structurați-vă pagina de GitHub a proiectului pe mai multe directoare. De exemplu, creați un director numit **src** în care țineți tot codul sursă. Alt director **hardware** în care să țineți schemele și diagramele și alt director numit **images** în care să puneți toate fotografiile cu proiectul vostru, pe care le link-ați în README.md | + | |
- | Pagina de GitHub a proiectului vostru trebuie să conțină **toate** fișierele relevante pentru realizarea proiectului vostru. Dacă există resurse externe pe care le-ați folosit, vă rugăm să le link-ați în README.md | + | {{:pm:prj2025:avaduva:cozmaandreirezultat2.jpeg?300|}} |
- | </note> | + | |
- | <note warning> | + | ===== Cod sursă - Download ===== |
- | Sunteți încurajați să filmați un demo cu proiectul vostru și să îl încărcați pe YouTube. Faceți embed la video în README.md și în pagina de wiki OCW a proiectului vostru. | + | |
- | </note> | + | |
- | ===== Jurnal ===== | + | {{:pm:prj2025:avaduva:cozmaandrei-codproiect.zip|Link download cod sursă}} |
- | <note tip> | + | ===== Demo ===== |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
- | </note> | + | |
- | ===== Bibliografie/Resurse ===== | + | [[https://www.youtube.com/watch?v=rv_-RGzo10o|Link Demo]] |
- | <note> | + | ===== Export to PDF ===== |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
- | </note> | + | |
<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> |