Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:vstoica:horia.moroianu3101 [2025/05/01 20:06]
horia.moroianu3101 [Download]
pm:prj2025:vstoica:horia.moroianu3101 [2025/05/30 04:34] (current)
horia.moroianu3101 [Software Design]
Line 2: Line 2:
 <​note>​ <​note>​
 **Autor**: Moroianu Horia-Valentin\\ **Autor**: Moroianu Horia-Valentin\\
-**Grupa**: 334CA+**Grupă**: 334CA
 </​note>​ </​note>​
 ===== Introducere ===== ===== Introducere =====
Line 33: Line 33:
  
 ===== Hardware Design ===== ===== Hardware Design =====
 +**Schemă electrică**:​ {{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​infracatch-schematic.pdf|}}
 +
 +<​html><​iframe ​
 +  src="​https://​ocw.cs.pub.ro/​courses/​_media/​pm/​prj2025/​vstoica/​horia.moroianu3101/​infracatch-schematic.pdf#​view=Fit"​
 +  width="​100%"​
 +  height="​600px"​
 +  style="​border:​none;"​
 +  allowfullscreen>​
 +</​iframe></​html>​
 +
 +**Conectivitate**:​
 +^ Pin ATmega328P ^ Pin Arduino Nano ^ Componentă asociată ^ Funcție ^
 +| GND            | GND              | Toate modulele ​      | Alimentare ​            |
 +| VCC            | 5V               | Toate modulele ​      | Alimentare ​            |
 +| PB0            | D8               | LED0                 | GPIO control ​          |
 +| PB1            | D9               | LED1                 | GPIO control ​          |
 +| PB2            | D10              | LED2                 | GPIO control ​          |
 +| PB3            | D11              | LED3                 | GPIO control ​          |
 +| PC4            | A4               | LCD-1602 ​            | I2C - SDA              |
 +| PC5            | A5               | LCD-1602 ​            | I2C - SCL              |
 +| PD2            | D2               | Receptor IR          | Data/​INT0 ​             |
 +| PD6            | D6               | Buzzer ​              | Timer0 PWM Control ​    |
  
 **Listă de componente**:​ **Listă de componente**:​
Line 45: Line 67:
 | Rezistor 0.5W 220Ω | [[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​10958-rezistor-05w-220.html|Link]] | 4 | 0.1 | | Rezistor 0.5W 220Ω | [[https://​www.optimusdigital.ro/​ro/​componente-electronice-rezistoare/​10958-rezistor-05w-220.html|Link]] | 4 | 0.1 |
 | Breadboard 830 Puncte | [[https://​www.optimusdigital.ro/​ro/​prototipare-breadboard-uri/​8-breadboard-830-points.html|Link]] | 1 | 9.98 | | Breadboard 830 Puncte | [[https://​www.optimusdigital.ro/​ro/​prototipare-breadboard-uri/​8-breadboard-830-points.html|Link]] | 1 | 9.98 |
 +| Breadboard 400 Puncte | [[https://​www.optimusdigital.ro/​ro/​prototipare-breadboard-uri/​44-breadboard-400-points.html|Link]] | 1 | 4.56 |
 | Fire tată-tată | [[https://​www.optimusdigital.ro/​ro/​fire-fire-mufate/​12-set-de-cabluri-pentru-breadboard.html|Link]] | 1 | 7.99 | | Fire tată-tată | [[https://​www.optimusdigital.ro/​ro/​fire-fire-mufate/​12-set-de-cabluri-pentru-breadboard.html|Link]] | 1 | 7.99 |
 +| Fire mamă-tată | [[https://​www.optimusdigital.ro/​ro/​toate-produsele/​876-set-fire-mama-tata-10p-15-cm.html|Link]] | 1 | 4.45 |
 | Cablu USB-B Mini | [[https://​www.optimusdigital.ro/​ro/​cabluri-cabluri-usb/​3147-cablu-albastru-usb-am-b-mini-30-cm-pentru-arduino-nano.html|Link]] | 1 | 4.37 | | Cablu USB-B Mini | [[https://​www.optimusdigital.ro/​ro/​cabluri-cabluri-usb/​3147-cablu-albastru-usb-am-b-mini-30-cm-pentru-arduino-nano.html|Link]] | 1 | 4.37 |
-^ **Preț total:** ||^ **84.17** ^+^ **Preț total:** ||^ **93.18** ^
  
-<​hidden>​ 
-<note tip> 
-Aici puneţi tot ce ţine de hardware design: 
-  * listă de piese 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) 
-  * diagrame de semnal ​ 
-  * rezultatele simulării 
-</​note>​ 
-</​hidden>​ 
 ===== Software Design ===== ===== Software Design =====
  
 +**Mediu de dezvoltare**:​ //Visual Studio Code + PlatformIO//​
  
-<note tip> +**Biblioteci externe**
-Descrierea codului aplicaţiei (firmware)+  * [[https://​docs.arduino.cc/​language-reference/​|Arduino]] pentru compatibilitatea cu celelalte biblioteci folosite 
-  * mediu de dezvoltare (if any) (e.gAVR Studio, CodeVisionAVR) +  * [[https://​github.com/​Arduino-IRremote/​Arduino-IRremote|IRRemote]] pentru decodificarea semnalelor primite de la senzorul IR 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +  * [[https://​github.com/​johnrickman/​LiquidCrystal_I2C|LiquidCrystal_I2C]] pentru afișarea stării jocului pe ecran
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate +
-</note>+
  
-===== Rezultate Obţinute =====+**Implementare**:​
  
-<note tip> +Codul este împărțit ​în 5 fișiere ce vor fi prezentate mai jos, ținând cont de funcționalitățile moduleleor. Deși acestea nu conțin particularități ale limbajului ''​C++'',​ am ales sa folosesc acest limbaj pentru compatibilitatea cu bibliotecile externe.
-Care au fost rezultatele obţinute ​în urma realizării proiectului vostru. +
-</​note>​+
  
-===== Concluzii =====+**//​main.cpp / main.h//**: conține implementarea principală a jocului.
  
-===== Download =====+Programul este structurat sub forma unui atutomat cu 3 stări: 
 +  *''​START'':​ Inițializează jocul și așteaptă comanda START. La primirea ei, resetează scorul și viețile, pornește timerul, setează seed-ul random și trece la GAME_PLAYING. 
 +  *''​GAME_PLAYING'':​ Gestionează jocul activ — aprinde LED-uri, așteaptă răspuns IR și actualizează scorul sau viețile. Dacă timpul expiră sau răspunsul e greșit, scade o viață. Dacă viețile ajung la 0 sau se apasă START, trece la GAME_OVER. 
 +  *''​GAME_OVER'':​ Oprește LED-urile, afișează scorul final și redă un sunet în funcție de performanță. Așteaptă comanda START pentru a reveni la GAME_START.
  
-Toate fișierele acestui proiect pot fi găsite [[https://​github.com/​HoriaMoroianu/​infra-catch|aici]].+Variabile globale folosite: 
 +  * ''​game_state''​ – stare actuală a jocului 
 +  * ''​valid_ir''​ – flag pentru semnal IR valid 
 +  * ''​led_timeout''​ – flag dacă timpul LED-ului a expirat 
 +  * ''​score,​ high_score, lives''​ – folosite pentru a urmari progresul jucatorului
  
-<​hidden>​ +**//​timers.cpp / timers.h//​**:​ realizează controlul duratei de aprindere a LED-urilorgenerarea ​de sunete prin buzzer șextragerea unui seed pentru randomizare.
-<note warning>​ +
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ sursescheme, etc. Un fişier README, un ChangeLog, un script ​de compilare şcopiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. 
-</​note>​ 
-</​hidden>​ 
  
-===== Jurnal =====+Timer1 - Folosit pentru a controla cât timp rămâne aprins un LED. 
 +  *''​initLedTimer()''​ – setează Timer1 în mod CTC, cu prescaler 1024 și OCR corespunzător MAX_LED_DELAY (2s). 
 +  *''​startLedTimer()''​ – pornește cronometrarea si resetează TCNT1. 
 +  *''​stopLedTimer()''​ – oprește timerul. 
 +  *''​decreaseLedDelay()''​ – reduce treptat durata LED-ului (până la MIN_LED_DELAY),​ pentru a crește dificultatea jocului. 
 +  *ISR ''​TIMER1_COMPA_vect''​ – semnalează timeout-ul LED-ului în main.cpp (led_timeout ​true).
  
-<note tip> +Timer0 - Folosit pentru a genera tonuri audio la frecvențe date. 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul ​de proiect progresul ​proiectului. +  ​*''​initBuzz()''​ – configurează Timer0 în mod CTC pentru ieșire pe pinul PD6 (OC0A). 
-</note>+  *''​buzz(freq,​ duration)''​ – redă un sunet la frecvența șdurata cerută. Folosește ''​timer_freq_prescale()''​ pentru a calcula automat prescalerul ​și OCR-ul necesar si controlează durata folosind întreruperea ''​TIMER0_COMPA_vect''​. (//Cod inspirat din [[https://​pcarduino.blogspot.com/​2013/​10/​generating-tones-with-timers.html|acest]] articol.//​) 
 + 
 +Random seed: ''​extractTimers()''​ – combină valorile din TCNT0, TCNT1 și TCNT2 într-un uint32_t pentru a genera un seed aleator folosit la alegerea LED-urilor. 
 + 
 +**//lcd.cpp / lcd.h//**: gestionează afișajul LCD al jocului (mesaje de început, de final, scor, și vieți). 
 +  * vectorul ''​heart''​ reprezintă un caracter personalizat (inimă stilizată),​ folosită pentru a reprezenta viețile jucătorului. 
 +  *''​initLCD()''​ — inițializează LCD-ul și configurează simbolul inimă pentru afișare. 
 +  *''​displayStart()''​ — afișează instrucțiunile inițiale pentru a porni jocul și controlul LED-urilor. 
 +  *''​displayScore(lives,​ score)''​ — arată numărul ​de vieți rămase și scorul curent pe ecran. 
 +  *''​displayGameOver(score,​ high_score)''​ — prezintă scorul final și high score-ul la încheierea jocului. 
 + 
 +**//​sounds.cpp / sounds.h//​**:​ se ocupă de redarea melodiilor și sunetelor pentru stările jocului. 
 +  *''​playStart()''​ — melodie scurtă de început pentru startul jocului. 
 +  *''​playWin()''​ — melodie de victorie la obținerea unui high score. 
 +  *''​playFail()''​ — melodie de eșec/​skip. 
 + 
 +**//​random.cpp / random.h//​**:​ modul de generare a numerelor pseudo-aleatoare,​ optimizat pentru microcontrolere. 
 +  *''​setSeed(seed)''​ — inițializează generatorul cu o valoare externă pentru diversificarea secvenței de numere aleatoare. 
 +  *''​nextRand()''​ — returnează un număr pseudo-aleator pe 8 biți folosind algoritmul ''​xorshift32''​ usor modificat. Acesta lucreaza doar cu operații bitwise și produce rapid valori pe 8 biți, folosite ulterior pentru selectarea celor 4 LED-uri. 
 + 
 + 
 + 
 +===== Rezultate Obţinute ===== 
 +{{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​infracatch.jpg?​700|}} 
 +{{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​start.jpg?​700|}} 
 +{{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​running.jpg?​700|}} 
 +{{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​gameover.jpg?​700|}} 
 + 
 +===== Demo ===== 
 +Un scurt demo al proiectului ​poate fi găsit [[https://​www.youtube.com/​watch?​v=qQdRE64-_nE|aici]]. 
 + 
 +<html> 
 +<iframe width="​700"​ height="​400"​  
 +        src="​https:​//​www.youtube.com/​embed/​qQdRE64-_nE"​  
 +        title="​InfraCatch - a reflex game" frameborder="​0"​  
 +        allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​  
 +        referrerpolicy="​strict-origin-when-cross-origin"​  
 +        allowfullscreen></​iframe>​ 
 +</​html>​ 
 + 
 +===== Download ===== 
 + 
 +Toate fișierele acestui proiect pot fi găsite [[https://​github.com/​HoriaMoroianu/​infra-catch|aici]].
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +**Resurse Hardware**:\\ 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. +[[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]]\\ 
-</note>+[[https://​www.tech-sparks.com/​arduino-nano-pinout-guide/​|Arduino Nano Pinout]]\\ 
 +[[https://​www.autodesk.com/​products/​fusion-360/overview|Autodesk Fusion]]
  
-<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​+**Resurse Software**:​\\ 
 +[[https://​platformio.org/​|PlatformIO]]\\ 
 +[[https://​github.com/​Arduino-IRremote/​Arduino-IRremote|IRremote]]\\ 
 +[[https://​github.com/​johnrickman/​LiquidCrystal_I2C|LiquidCrystal I2C]]\\ 
 +[[https://​en.wikipedia.org/​wiki/​Xorshift|Xorshift32 PRNG]]\\ 
 +[[https://​pcarduino.blogspot.com/​2013/​10/​generating-tones-with-timers.html|Generating Tones with Timers]] 
 + 
 +\\ 
 +<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export ​Page to PDF</​a></​html>​
  
pm/prj2025/vstoica/horia.moroianu3101.1746119164.txt.gz · Last modified: 2025/05/01 20:06 by horia.moroianu3101
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