Differences

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

Link to this comparison view

pm:prj2026:bianca.popa1106:rares.gheorghe0612 [2026/05/14 11:02]
rares.gheorghe0612 [Software Design]
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 71: Line 71:
   * **<​string.h>​** - folosit pentru functii pe stringuri, in special strcmp()   * **<​string.h>​** - folosit pentru functii pe stringuri, in special strcmp()
  
-**Algoritmi si Structuri**+===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
  
pm/prj2026/bianca.popa1106/rares.gheorghe0612.1778745733.txt.gz · Last modified: 2026/05/14 11:02 by rares.gheorghe0612
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