Joc Testare Reflexe

Introducere

Proiectul este un joc interactiv de testare a reflexelor, ce masoare timpul de reactie al jucatorului. Jocul incepe dupa ce cele 4 LED-uri se sting si se termina atunci cand jucatorul apasa pe buton. Jocul ofera si un feedback sonor, atat la aprinderea LED-urilor cat si la apasarea butonului. Jocul comunica prin Bluetooth cu o aplicatie externa, catre care trimite date dar de pe care se pot da si comenzi pentru joc.

Scopul jocului este de a testa capacitatea jucatorului de a reactiona la o schimbare, tinand cont de faptul ca LED-urile se sting mereu dupa un numar aleatoriu de secunde, pentru a evita invatarea unui timp prestabilit, urmarind astfel o reactie reala si nu una mecanica.

Ideea de la care am plecat provine din motorsport, in special Formula 1, unde timpul de reactie este foarte important pentru startul cursei. In acelasi timp, nevoia de a avea reflexe rapide este esentiala si in viata de zi cu zi, acest joc putand fi folosit pentru antrenarea reflexelor la modificarea unui stimul vizual.

Utilitatea proiectului provine din cazurile in care poate fi utilizat: poate fi folosit pentru antrenarea reflexelor intr-un context sportiv, dat fiind faptul ca timpul de stingere al LED-urilor este aleator, dar poate fi folosit si ca un simplu joc de atentie.

Descriere Generala

Proiectul este gandit si construit in jurul microcontrolerului ATmega328P-XMINI, ce preia datele de la buton sau modulul Bluetooth, dar care gestioneaza si logica jocului, trimitand instructiuni celorlalte componente.

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).
  • 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.
  • LED-uri: Fiecare din cele 4 LED-uri se aprinde la interval de o secunda de celalalt, oferind un stimul vizual pentru inceputul jocului. Dupa ce toate cele 4 LED-uri sunt aprinse, ele se sting simultan dupa un numar aleator de secunde semnificand inceputul jocului.
  • Placuta ATmega328P-XMINI: Placuta este principalul loc de procesare, coordonand toate perifericele si gestionand logica, fiind alimentat printr-un cablu USB conectat la laptop.

Schema bloc a proiectului

Hardware Design

Componente folosite

Componenta Model Interfata Link Datasheet
Microcontroller ATmega328P-XMINI UART Datasheet ATmega328P XMINI
Modul Bluetooth HC-05 Bluetooth Datasheet HC-05
Buton HW-504 Intreruperi Externe(INT0) Datasheet Joystick
Buzzer KY-006 Timer2 in Fast PWM -
LED-uri 4 LED-uri 5mm GPIO -
Rezistente 4x220Ohmi, 1x1kOhm, 1x2kOhmi - -

Schema electrica

Diagrame de semnal

  • Buton

  • Buzzer

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

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.txt · Last modified: 2026/05/23 12:30 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