This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:rares.gheorghe0612 [2026/05/14 11:00] rares.gheorghe0612 |
pm:prj2026:bianca.popa1106:rares.gheorghe0612 [2026/05/23 12:30] (current) rares.gheorghe0612 |
||
|---|---|---|---|
| Line 56: | Line 56: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | **Mediu de Dezvoltare** | + | ===Mediu de Dezvoltare=== |
| * **Visual Studio Code** | * **Visual Studio Code** | ||
| Line 63: | Line 63: | ||
| * **AVR-GCC Toolchain** - utilizat pentru compilarea fisierelor sursa .c | * **AVR-GCC Toolchain** - utilizat pentru compilarea fisierelor sursa .c | ||
| - | **Librarii folosite** | + | ===Librarii folosite=== |
| * **<avr/io.h>** - accesul la registrii(ex PORT, DDR, OCR) | * **<avr/io.h>** - accesul la registrii(ex PORT, DDR, OCR) | ||
| Line 70: | Line 70: | ||
| * **<stdlib.h>** - folosit pentru rand() si srand() pentru a genera timpul de stingere aleator | * **<stdlib.h>** - folosit pentru rand() si srand() pentru a genera timpul de stingere aleator | ||
| * **<string.h>** - folosit pentru functii pe stringuri, in special strcmp() | * **<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 | ||
| + | |||