This shows you the differences between two versions of the page.
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.g. AVR Studio, CodeVisionAVR) | + | * [[https://docs.arduino.cc/language-reference/|Arduino]] pentru compatibilitatea cu celelalte biblioteci folosite |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * [[https://github.com/Arduino-IRremote/Arduino-IRremote|IRRemote]] pentru decodificarea semnalelor primite de la senzorul IR |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * [[https://github.com/johnrickman/LiquidCrystal_I2C|LiquidCrystal_I2C]] pentru afișarea stării jocului pe ecran |
- | * (etapa 3) surse şi 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 ș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. | ||
+ | |||
===== 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> | ||