Differences

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

Link to this comparison view

pm:prj2025:vstoica:horia.moroianu3101 [2025/05/18 22:24]
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 35: Line 35:
 **Schemă electrică**:​ {{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​infracatch-schematic.pdf|}} **Schemă electrică**:​ {{:​pm:​prj2025:​vstoica:​horia.moroianu3101:​infracatch-schematic.pdf|}}
  
-{{:pm:prj2025:vstoica:horia.moroianu3101:infracatch-schematic.jpg?600|}}+<​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 48: 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** ^
  
 ===== Software Design ===== ===== Software Design =====
 +
 +**Mediu de dezvoltare**:​ //Visual Studio Code + PlatformIO//​
 +
 +**Biblioteci externe**:
 +  * [[https://​docs.arduino.cc/​language-reference/​|Arduino]] pentru compatibilitatea cu celelalte biblioteci folosite
 +  * [[https://​github.com/​Arduino-IRremote/​Arduino-IRremote|IRRemote]] pentru decodificarea semnalelor primite de la senzorul IR
 +  * [[https://​github.com/​johnrickman/​LiquidCrystal_I2C|LiquidCrystal_I2C]] pentru afișarea stării jocului pe ecran
 +
 +**Implementare**:​
 +
 +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 și 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 ș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.
  
  
-<note tip> 
-Descrierea codului aplicaţiei (firmware): 
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) 
-  * librării şi surse 3rd-party (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 ===== ===== 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|}}
  
-<note tip> +===== Demo ===== 
-Care au fost rezultatele obţinute în urma realizării ​proiectului ​vostru. +Un scurt demo al proiectului ​poate fi găsit [[https://​www.youtube.com/watch?​v=qQdRE64-_nE|aici]].
-</note>+
  
-===== 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ă 
  
 ===== 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.1747596243.txt.gz · Last modified: 2025/05/18 22:24 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