This shows you the differences between two versions of the page.
pm:prj2025:vstoica:horia.moroianu3101 [2025/05/01 19:46] 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ă**: {{: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.g. AVR 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. | ||
- | <note warning> | + | Variabile globale folosite: |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | * ''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 | ||
- | 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**. | + | **//timers.cpp / timers.h//**: realizează controlul duratei de aprindere a LED-urilor, generarea de sunete prin buzzer și extragerea unui seed pentru randomizare. |
- | </note> | + | |
- | ===== Jurnal ===== | ||
- | <note tip> | + | Timer1 - Folosit pentru a controla cât timp rămâne aprins un LED. |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | *''initLedTimer()'' – setează Timer1 în mod CTC, cu prescaler 1024 și OCR corespunzător MAX_LED_DELAY (2s). |
- | </note> | + | *''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 ===== | ||
+ | {{: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> | ||