Differences

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

Link to this comparison view

pm:prj2025:vstoica:horia.moroianu3101 [2025/05/27 23:20]
horia.moroianu3101 [Hardware Design]
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ă**:​+**Schemă electrică**: ​{{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​infracatch-schematic.pdf|}}
  
 <​html><​iframe ​ <​html><​iframe ​
Line 44: Line 44:
  
 **Conectivitate**:​ **Conectivitate**:​
-^ Pin ATmega328P ^ Componentă asociată ^ Funcție ^ +^ Pin ATmega328P ​^ Pin Arduino Nano ^ Componentă asociată ^ Funcție ^ 
-IO3            | Toate modulele ​     GND               +GND            | GND              ​| Toate modulele ​      ​Alimentare ​            
-IO4            | Toate modulele ​     5V VCC            ​+VCC            | 5V               | Toate modulele ​      ​Alimentare ​            
-IO10           Buzzer ​             | Timer0 Control PWM| +PB0            ​D8               | LED0                 ​| GPIO control ​          ​
-| IO12           | LED0                | GPIO control ​     +PB1            | D9               | LED1                 ​| GPIO control ​          ​
-IO14           | LED1                | GPIO control ​     +PB2            | D10              ​| LED2                 ​| GPIO control ​          ​
-IO15           | LED2                | GPIO control ​     +PB3            | D11              ​| LED3                 ​| GPIO control ​          ​
-IO16           | LED3                | GPIO control ​     +PC4            | A4               | LCD-1602 ​            ​| I2C - SDA              
-IO27           | LCD-1602 ​           | I2C - SDA         ​+PC5            | A5               | LCD-1602 ​            ​| I2C - SCL              
-IO28           | LCD-1602 ​           | I2C - SCL         ​+PD2            | D2               | Receptor IR          Data/INT0              
-IO32           | Receptor IR         ​Date/INT0         ​+| PD6            | D6               | Buzzer ​              | Timer0 PWM Control ​    |
-//Restul pinilor nespecificați sunt lăsați în aer.//+
  
 **Listă de componente**:​ **Listă de componente**:​
Line 70: Line 69:
 | Breadboard 400 Puncte | [[https://​www.optimusdigital.ro/​ro/​prototipare-breadboard-uri/​44-breadboard-400-points.html|Link]] | 1 | 4.56 | | 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:** ||^ **88.73** ^+^ **Preț total:** ||^ **93.18** ^
  
 ===== Software Design ===== ===== Software Design =====
  
-<​hidden>​ +**Mediu de dezvoltare**:​ //Visual Studio Code + PlatformIO//​ 
-<note tip> + 
-Descrierea codului aplicaţiei (firmware)+**Biblioteci externe**
-  * mediu de dezvoltare ​(if any) (e.gAVR StudioCodeVisionAVR+  * [[https://​docs.arduino.cc/​language-reference/​|Arduino]] pentru compatibilitatea cu celelalte biblioteci folosite 
-  * librării şsurse 3rd-party (e.gProcyon AVRlib+  * [[https://​github.com/​Arduino-IRremote/​Arduino-IRremote|IRRemote]] pentru decodificarea semnalelor primite ​de la senzorul IR 
-  * algoritmi şstructuri pe care plănuiţsă le implementaţ+  * [[https://​github.com/​johnrickman/​LiquidCrystal_I2C|LiquidCrystal_I2C]] pentru afișarea stării jocului pe ecran 
-  * (etapa 3surse şfuncţii implementate + 
-</note> +**Implementare**:​ 
-</hidden>+ 
 +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. 
 + 
 +**//​main.cpp / main.h//**: conține implementarea principală a jocului. 
 + 
 +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. 
 + 
 +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 
 + 
 +**//​timers.cpp / timers.h//​**:​ realizează controlul duratei de aprindere a LED-urilor, generarea de sunete prin buzzer și extragerea unui seed pentru randomizare. 
 + 
 + 
 +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)
 + 
 +Timer0 - Folosit pentru a genera tonuri audio la frecvențe date. 
 +  *''​initBuzz()''​ – configurează Timer0 în mod CTC pentru ieșire pe pinul PD6 (OC0A). 
 +  *''​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 (o inimă stilizată),​ folosită pentru a reprezenta viețile jucătorului. 
 +  *''​initLCD()''​ — inițializează LCD-ul șconfigurează simbolul inimă pentru afișare. 
 +  *''​displayStart()''​ — afișează instrucțiunile inițiale pentru a porni jocul școntrolul LED-urilor. 
 +  *''​displayScore(lives,​ score)''​ — arată numărul de viețrămase și scorul curent pe ecran. 
 +  *''​displayGameOver(score, high_score)''​ — prezintă scorul final ș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 ===== ===== 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|}}
  
-{{:pm:​prj2025:​vstoica:​horia.moroianu3101:​hardware-demo.jpeg?600|}}+===== Demo ===== 
 +Un scurt demo al proiectului poate fi găsit [[https://www.youtube.com/watch?v=qQdRE64-_nE|aici]].
  
-===== Concluzii =====+<​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 ===== ===== Download =====
  
 Toate fișierele acestui proiect pot fi găsite [[https://​github.com/​HoriaMoroianu/​infra-catch|aici]]. Toate fișierele acestui proiect pot fi găsite [[https://​github.com/​HoriaMoroianu/​infra-catch|aici]].
- 
-===== Jurnal ===== 
- 
-  * 01/05/2025 - alegerea temei + documentație inițială 
-  * 07/05/2025 - schimbare pini receptor IR 
-  * 18/05/2025 - schemă electrică + hardware demo 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​hidden>​ +**Resurse Hardware**:\\ 
-<​note>​ +[[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]]\\ 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. +[[https://​www.tech-sparks.com/​arduino-nano-pinout-guide/​|Arduino Nano Pinout]]\\ 
-</note> +[[https://​www.autodesk.com/​products/​fusion-360/overview|Autodesk Fusion]]
-</hidden>+
  
-<​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.1748377243.txt.gz · Last modified: 2025/05/27 23:20 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