This is an old revision of the document!


Reflex Analyzer — Sistem de masurare si analiza a timpului de reactie

Autor: Enciu Cezar-Andrei, grupa 332CA
Asistent: Bianca Popa

Introducere

Descriere generala

Reflex Analyzer este un sistem embedded pentru masurarea precisa a timpului de reactie uman. Placa ATmega324P primeste o comanda de start dintr-o aplicatie desktop, genereaza un interval de asteptare pseudo-aleator intre 1 si 4 secunde, dupa care emite simultan un semnal sonor (buzzer) si unul luminos (LED). La apasarea butonului de catre utilizator, cronometrul hardware se opreste, iar rezultatul — exprimat in milisecunde — este trimis aplicatiei prin USART. Display-ul OLED I2C afiseaza starea sistemului in timp real. Aplicatia centralizeaza rezultatele si prezinta statistici: medie, minim, maxim si un grafic al evolutiei pe sesiune.

Scop

Crearea unui instrument simplu, precis si portabil care sa masoare obiectiv reflexele unui utilizator si sa permita urmarirea progresului in timp, cu o precizie superioara aplicatiilor software pure.

Ideea de baza

Microcontrollerul ATmega324P cronometreaza timpul de reactie folosind Timer1 pe 16 biti (rezolutie ~4μs), activat in momentul emiterii semnalului si oprit prin intreruperea externa INT0 la apasarea butonului. Rezultatul este trimis prin USART catre o aplicatie desktop Python + PyQt5. Un display OLED I2C (SSD1306) ofera feedback local.

Utilitate practica

  • Sportivi care vor sa isi masoare si imbunateasca reflexele in antrenament
  • Utilizatori generali curiosi sa isi testeze timpul de reactie cu precizie reala
  • Demonstratii educationale — ilustreaza concret timere hardware, intreruperi si comunicatie seriala

De ce e util

  • Precizie hardware reala (~4μs rezolutie) vs. aplicatii web/mobile cu latenta de zeci de ms
  • Detectie false start — apasare buton inainte de semnal, tratata si raportata separat
  • Delay pseudo-aleator (LFSR) — nu se poate anticipa momentul semnalului
  • Display local (OLED I2C) — feedback instant fara a privi spre ecranul PC-ului
  • Export CSV din aplicatie pentru analiza ulterioara

Descriere generala

Schema bloc a sistemului:

Schema bloc Reflex Analyzer

Fluxul de date pe scurt:

  1. Aplicatia desktop trimite comanda S (start) prin portul serial catre ATmega324P.
  2. Microcontrollerul genereaza un delay aleator (1-4s) cu LFSR, dupa care activeaza LED-ul si buzzer-ul simultan.
  3. Display-ul OLED trece de la “Gata…” la “GO!” la momentul semnalului.
  4. Utilizatorul apasa butonul — intreruperea externa INT0 opreste Timer1 si calculeaza diferenta de timp.
  5. Rezultatul in milisecunde este trimis prin USART aplicatiei si afisat pe OLED.
  6. Daca butonul e apasat inainte de semnal, sistemul semnalizeaza false start si se reseteaza.

Hardware Design

Lista de piese

Componenta Cantitate Rol
ATmega324P-PU (DIP-40) 1 Microcontroller principal
USBasp Programmer 1 Programare firmware prin ISP
Crystal 16MHz 1 Sursa de ceas externa
Condensator 22pF 2 Stabilizare crystal
Condensator 100nF 1 Decuplare alimentare
LED rosu 5mm 1 Stimul vizual de start
Rezistor 220 Ohm 1 Limitare curent LED
Buzzer pasiv 5V 1 Stimul sonor de start, controlat prin PWM
Buton tactil 6x6mm 1 Input reactie utilizator
Display OLED I2C 0.96” SSD1306 1 Afisare stare sistem si timp de reactie
Convertor USB-UART CP2102 1 Comunicare seriala cu PC
Breadboard + fire jumper 1 set Conectica si prototipare
Sursa alimentare 5V USB 1 Alimentare circuit

Schema de conexiuni

Pin ATmega324P Componenta
PB0 Anod LED rosu (prin 220 Ohm la GND)
PD5 / OC0B Buzzer pasiv (semnal PWM)
PD2 / INT0 Buton (pull-up intern, cealalta latura GND)
PC0 / SCL SCL display OLED SSD1306
PC1 / SDA SDA display OLED SSD1306
PD1 / TXD TX convertor USB-UART
PD0 / RXD RX convertor USB-UART
XTAL1 / XTAL2 Crystal 16MHz (cu 2x 22pF la GND)
VCC / AVCC / GND Alimentare 5V + 100nF decuplare

Software Design

Mediu de dezvoltare

  • avr-gcc + avrdude — compilare si incarcare firmware in limbaj C
  • VS Code — editare cod firmware
  • Python 3.11 + PyQt5 — aplicatie desktop
  • Monitor Serial — debugging USART in timp real

Librarii folosite

Firmware (C / avr-gcc)

Librarie Sursa Rol
avr/io.h avr-libc (built-in) Acces la registrele I/O ale ATmega324P
avr/interrupt.h avr-libc (built-in) Gestionarea intreruperilor hardware
util/delay.h avr-libc (built-in) Delay-uri de initializare
Driver SSD1306 I2C open-source adaptat Initializare display si afisare text

Aplicatie Desktop (Python)

Librarie Rol
pyserial Comunicare seriala cu microcontrollerul prin USB-UART
PyQt5 Interfata grafica (ferestre, butoane, tabele)
matplotlib Grafic evolutie timp de reactie pe sesiune
csv Export rezultate in format CSV

Algoritm de functionare

Sistemul functioneaza pe baza unui automat cu 5 stari. La primirea comenzii S pe USART, se genereaza un delay aleator (LFSR 1-4s). Dupa expirarea delay-ului, LED-ul si buzzer-ul sunt activate simultan, Timer1 porneste cronometrarea. Intreruperea externa INT0 (buton) opreste timer-ul si calculeaza timpul de reactie. Daca butonul e apasat inainte de semnal, se detecteaza false start.

Automat de stari

Automat de stari

Sistemul are 5 stari:

  • IDLE — asteapta comanda S de la aplicatie prin USART
  • WAITING — genereaza delay aleator cu LFSR, Timer1 numara; INT0 activ pentru detectie false start
  • SIGNAL — emite LED + buzzer, Timer1 restartat pentru masurare; asteapta apasare buton INT0
  • RESULT — calculeaza si trimite timpul prin USART, afiseaza pe OLED
  • FALSE_START — buton apasat inainte de semnal; avertisment sonor + USART + revenire la IDLE

Surse si functii principale

  • usart_init() — configurare registre UBRR, activare TX/RX
  • usart_send_int() — trimite numarul ca sir de caractere prin USART
  • timer1_start() / timer1_get_ms() — control cronometru hardware
  • pwm_buzzer_beep() — ton PWM pe buzzer la frecventa data
  • i2c_init() / oled_print() — driver display I2C
  • lfsr_rand() — generator pseudo-aleator pe 16 biti
  • ISR(INT0_vect) — intrerupere buton: oprire timer sau detectare false start

Aplicatie Desktop

Interfata grafica ofera butoanele Start proba, Stop sesiune si Export CSV. Comunicarea seriala ruleaza pe un thread separat pentru a nu bloca UI-ul. La fiecare proba finalizata, aplicatia adauga rezultatul in tabel, actualizeaza statisticile (medie, minim, maxim) si graficul matplotlib.

Rezultate Obtinute

  • Sistem functional end-to-end: buton ATmega324P USART aplicatie desktop
  • Precizie masurare timp de reactie: 4 microsecunde (limitata de rezolutia Timer1 la 16MHz/64)
  • Latenta USART sub 5ms intre apasare buton si afisarea rezultatului in aplicatie
  • Detectie false start functionala in toate scenariile testate
  • Display OLED afiseaza stari stabil, fara artefacte vizuale

Concluzii

  • Utilizarea Timer1 pe 16 biti cu prescaler 1/64 ofera o rezolutie de ~4 microsecunde, suficienta pentru masurarea timpului de reactie uman.
  • Arhitectura FSM (automat de stari) s-a dovedit esentiala — o implementare liniara ar fi ratat evenimentele de intrerupere sau ar fi blocat comunicatia USART.
  • Generatorul LFSR produce o distributie uniform imprevizibila a delay-ului de start, simplu de implementat in C pur.
  • Provocarea principala: variabilele partajate intre main loop si ISR necesita declarare volatile.

Jurnal

Data Activitate
2026-05-05 Alegerea temei, documentare datasheet ATmega324P
2026-05-07 Achizitie componente
2026-05-09 Montaj breadboard, testare USART
2026-05-11 Implementare Timer1 + INT0, masurare timp de reactie
2026-05-13 Implementare PWM buzzer + LED, testare false start
2026-05-15 Implementare driver I2C + OLED SSD1306, integrare FSM
2026-05-17 Scriere aplicatie Python + PyQt5, grafic matplotlib
2026-05-19 Testare end-to-end, debugging
2026-05-21 Documentatie OCW, scheme bloc, poze montaj final

Bibliografie / Resurse

pm/prj2026/bianca.popa1106/cezar_andrei.enciu.1778326346.txt.gz · Last modified: 2026/05/09 14:32 by cezar_andrei.enciu
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