This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:rares.gheorghe0612 [2026/05/08 11:44] rares.gheorghe0612 [Hardware Design] |
pm:prj2026:bianca.popa1106:rares.gheorghe0612 [2026/05/23 12:30] (current) rares.gheorghe0612 |
||
|---|---|---|---|
| Line 17: | Line 17: | ||
| **Modul de interactiune a modulelor** | **Modul de interactiune a modulelor** | ||
| - | * **Modulul Bluetooth (HC-05):** Folosit pentru a primi datele privind timpul scos de jucator, dar si pentru a porni jocul de pe telefon. Foloseste **interfata USART** pentru tramsisia/primirea datelor, mai exact pinii RX(primire) si TX(transmisie). | + | * **Modulul Bluetooth (HC-05):** Folosit pentru a primi datele privind timpul scos de jucator, dar si pentru a porni jocul de pe telefon. Foloseste **interfata USART** pentru tramsisia/primirea datelor, mai exact pinii RX(primire) si TX(transmisie). |
| * **Joystick HW-504:** Desi este un joystick, lasand neconectati pinii VRx si VRy, el actioneaza ca un buton. Apasarea lui reprezinta momentul in care numaratoarea este orpita, rezultatele sunt transmise prin Bluetooth, iar buzzerul este activat. Este folosit ca si componenta input, apasarea fiind detectata folosind o **intrerupere externa(INT0)**. | * **Joystick HW-504:** Desi este un joystick, lasand neconectati pinii VRx si VRy, el actioneaza ca un buton. Apasarea lui reprezinta momentul in care numaratoarea este orpita, rezultatele sunt transmise prin Bluetooth, iar buzzerul este activat. Este folosit ca si componenta input, apasarea fiind detectata folosind o **intrerupere externa(INT0)**. | ||
| * **Buzzer KY-006:** Este folosit pentru feedbackul sonor. Este activat la aprinderea unui LED pentru a il acompania auditiv, iar la apasarea butonului, in functie de timpul scos, buzzerul emite anumite sunete, ce reprezinta un timp bun, slab sau mediu, folosind **Timer2** in **modul Fast PWM**. | * **Buzzer KY-006:** Este folosit pentru feedbackul sonor. Este activat la aprinderea unui LED pentru a il acompania auditiv, iar la apasarea butonului, in functie de timpul scos, buzzerul emite anumite sunete, ce reprezinta un timp bun, slab sau mediu, folosind **Timer2** in **modul Fast PWM**. | ||
| Line 32: | Line 32: | ||
| - | ^ Componenta ^ Model ^ Interfata ^ | + | ^ Componenta ^ Model ^ Interfata ^ Link Datasheet ^ |
| - | | Microcontroller | ATmega328P-XMINI | UART | | + | | Microcontroller | ATmega328P-XMINI | UART | [[https://ww1.microchip.com/downloads/en/devicedoc/50002659a.pdf | Datasheet ATmega328P XMINI]] | |
| - | | Modul Bluetooth | HC-05 | Bluetooth | | + | | Modul Bluetooth | HC-05 | Bluetooth | [[https://components101.com/sites/default/files/component_datasheet/HC-05%20Datasheet.pdf | Datasheet HC-05]] | |
| - | | Buton | HW-504 | Intreruperi Externe(INT0) | | + | | Buton | HW-504 | Intreruperi Externe(INT0) | [[https://www.laskakit.cz/user/related_files/joystick_module.pdf | Datasheet Joystick]] | |
| - | | Buzzer | KY-006 | Timer2 in Fast PWM | | + | | Buzzer | KY-006 | Timer2 in Fast PWM |-| |
| - | | LED-uri | 4 LED-uri 5mm | GPIO | | + | | LED-uri | 4 LED-uri 5mm | GPIO |-| |
| - | | Rezistente | 4x220Ohmi, 1x1kOhm, 1x2kOhmi| - | | + | | Rezistente | 4x220Ohmi, 1x1kOhm, 1x2kOhmi| - |-| |
| **Schema electrica** | **Schema electrica** | ||
| Line 53: | Line 53: | ||
| {{:pm:prj2026:bianca.popa1106:diagrama_semnal_buzzer.png?600|}} | {{:pm:prj2026:bianca.popa1106:diagrama_semnal_buzzer.png?600|}} | ||
| + | |||
| + | ===== Software Design ===== | ||
| + | |||
| + | ===Mediu de Dezvoltare=== | ||
| + | |||
| + | * **Visual Studio Code** | ||
| + | * **PlatformIO IDE** - folosit pentru a scrie si rula codul pe microcontroller | ||
| + | * **C/C++ Language** | ||
| + | * **AVR-GCC Toolchain** - utilizat pentru compilarea fisierelor sursa .c | ||
| + | |||
| + | ===Librarii folosite=== | ||
| + | |||
| + | * **<avr/io.h>** - accesul la registrii(ex PORT, DDR, OCR) | ||
| + | * **<avr/interrupt.h>** - folosit pentru ISR | ||
| + | * **<util/delay.h>** - folosit pentru delyauri blocante | ||
| + | * **<stdlib.h>** - folosit pentru rand() si srand() pentru a genera timpul de stingere aleator | ||
| + | * **<string.h>** - folosit pentru functii pe stringuri, in special strcmp() | ||
| + | |||
| + | ===Algoritmi si Structuri=== | ||
| + | |||
| + | 1) **Automatul de stari**: Logica principala a proiectului este data de un automat de stari, starea 0, cand jocul asteapta sa fie pornit(practic el sta intr-o stare de idle), stare 1, care se declanseaza cand se primeste comanda de start, cele 4 LED-uri incepand sa se aprinda treptat, si in final starea 2, atunci cand playerul apasa pe buton dupa stingerea LED-urilor iar timerul se opreste fiind afisat timpul scos(timerul incepe din momentul in care LED-urile se sting). | ||
| + | |||
| + | 2) **Timerul pentru cronometru**: Utilizez intreruperi hardware pentru a numara la fiecare 1 milisecunda, folosind Timer0. La fiecare intrerupere se actualizeaza o variabila globala de tip volatile. Citirea ei se face folosind cli() si sei() pentru a asigura ca este citita corect. | ||
| + | |||
| + | 3) **Generarea semnalului PWM**: Pentru a genera semnalul PWM, folosesc Timer2 in modul FastPWM. Functia care prelucreaza cum se aude sunetul are doi parametrii: frecventa si volum_procent. Astfel, orice apel de functie cu unul din parametrii egali cu 0 opreste timerul. Rezultatul emis de buzzer este stocat in OCR2A, iar valoarea de TOP este calculata dupa formula FrecvCPU/(Prescaler*frecventa) - 1. Ulterior, in registrul OCR2B retine intensitatea sunetului, aplicand volum_procent valorii din OCR2A. Astfel, functia imi permite sa generez diferite sunete. In functie de timpul de reactie al jucatorului, emit diferite serii de sunete. | ||
| + | |||
| + | 4) **Transmiterea datelor**: Folosesc interfata USART atat pentru a afisa rezultatul, cat si pentru a trimite comenzi. Folosesc un buffer ce retine carcaterele primite pana la \n sau \r. Folosind interfata USART si protocolul de Bluetooth trimit si afisez comnezi si rezultate de pe o aplicatie pe telefon. | ||
| + | |||
| + | |||
| + | ==== Functii si fisiere folosite ==== | ||
| + | |||
| + | === Fisiere === | ||
| + | * **main.c** - aici tin toata logica centrala a proiectululi | ||
| + | * **usart.c** - logica pentru comunicarea prin interfata UART | ||
| + | |||
| + | === Functii === | ||
| + | Fisierul main.c este impartit in mai multe functii, astfel: | ||
| + | * **millis()** - functia folosita pentru a prelua numarul de milisecunde scurs din variabila milisecunde_trecute | ||
| + | * **setup()** - functia prin care initializez toti registrii necesari butonului, buzzerul si cele doua timere(timer0 si timer2) | ||
| + | * **play_note()** - functia care se ocupa cu popularea registrilor OCR2A si OCR2B cu valorile necesare generarii sunetului de catre buzzer, in functie de freventa si volum | ||
| + | * **sunetTimpBun()/sunetTimpRau()** - folosind functia anterioara, generez niste secvente de sunete pentru fiecare caz al timpului obtinut | ||
| + | * **main()** - contine toata logica de debounce, de citire a datelor primite de pe aplicatia de pe teleofon, prin UART si de controlul masinii de stari | ||
| + | |||
| + | ===== Rezultate obtinute ===== | ||
| + | |||
| + | Am reusit sa construiesc un sistem care cronometreaza timpul pe care un jucator il inregistreaza atunci cand trebuie sa reactioneze la un stimul vizual, astfel: | ||
| + | |||
| + | * **Integrare hardware si precizie**: Microcontrollerul gestioneaza inputul fizic(apasarea de buton) si comunicarea prin Bluetooth. Timpul de reactie este numarat folosind intreruperi o data la fiecare milisecunde, ceea ce ofera o precizie buna, totul fiind non-blocant, utilizand Timer0. | ||
| + | * **Feedback sonor si vizual**: Jocul ofera atat un feedback sonor, prin buzzer, cat si unul vizual, prin cele 4 LED-uri ce simulaza startul jocului, care este complet aleator special pentru a asigura ca jucatorul nu invata cand sa apese. Buzzerul este controloat prin Timer2 setat in FastPWM pentru a emite diferite sunete in functie de timpul scos. | ||
| + | * ** Comunicatie prin Bluetooth**: Controllerul comunica in timp real prin Bluetooth cu o aplicatie de pe telefon astfel: atunci cand este calculat timpul de reactie el este afisat pe telefon, iar cand de pe telefon se lanseaza comanda "START" jocul incepe. | ||
| + | * ** Arhitectura Software**: Codul este gandit sub forma unui aparat de stari, unde fiecare stare reprezinta in ce etapa a jocului suntem(start, in timpul jocul, pregatire). Mai mult, folosesc un sistem de debouncing non blocant pentru a detecta o apasare corecta de buton. | ||
| + | |||
| + | === Media pentru proiect === | ||
| + | |||
| + | ** Link video proiect YouTube ** | ||
| + | https://www.youtube.com/watch?v=rPKtpC0Egbc | ||
| + | |||
| + | ** Aplicatie Bluetooth ** | ||
| + | |||
| + | {{:pm:prj2026:bianca.popa1106:ss_de_pe_aplicatia_bluetooth.jpg?200|}} | ||
| + | |||
| + | ===== Concluzii ===== | ||
| + | |||
| + | Codul implementat pentru proiect, alaturi de poze sunt pe acest repo de GitHub: | ||
| + | https://github.com/Rares123121/ProiectPM | ||