Ce face: Proiectul reprezintă o adaptare electronică a clasicului joc arcade „Whack-a-Mole”. În loc de cârtițe mecanice, jocul folosește butoane Arcade iluminate. Microcontrolerul va aprinde aleatoriu LED-ul unuia dintre butoane, iar jucătorul trebuie să apese butonul respectiv cât mai repede posibil.
Scopul lui: Scopul principal este testarea și îmbunătățirea timpului de reacție al jucătorului. Din punct de vedere academic, scopul este implementarea unui sistem interactiv complet (bare-metal) care implică citirea de intrări digitale și analogice, generarea de semnale de ieșire multiplexate și utilizarea timerelor.
Ideea de la care am pornit: Ideea a pornit de la dorința de a recrea sentimentul și dinamica jocurilor mecanice retro folosind componente electronice moderne. Am vrut un proiect care să fie nu doar o demonstrație tehnică, ci și un produs final distractiv și interactiv.
Utilitate: Pentru mine, este o oportunitate excelentă de a aprofunda lucrul cu registrele ATmega328p, timerele, întreruperile și optimizarea pinilor folosind un Shift Register. Pentru utilizatori, este un joc antrenant, perfect pentru pauze, care stimulează reflexele.
Sistemul este centrat în jurul microcontrolerului ATmega328p (pe platforma Arduino UNO). Acesta preia date din lumea fizică, le procesează și oferă feedback vizual și sonor.
Interacțiunea modulelor:
Credem că implementarea unei arhitecturi software non-blocante (zero-delay) bazată pe un automat cu stări finite (FSM) și pe un timer hardware dedicat pentru millis() va îmbunătăți calitatea multiplexării vizuale și va garanta un timp de scanare a inputurilor (butoane) sub 5ms. Presupunem că, deoarece microcontrolerul nu va mai irosi cicluri de ceas în bucle de așteptare blocante, acesta va permite actualizarea display-ului și citirea jucătorului în mod simultan, fără efect de flicker.
Următorul tabel descrie activitățile principale desfășurate pe parcursul celor 4 săptămâni alocate proiectului.
| Săptămâna | Activitate asumată |
|---|---|
| Săptămâna 1 | Documentare și Arhitectură: Alegerea componentelor, studierea datasheet-urilor (ATmega328P, 74HC595) și definirea ipotezei proiectului, redactarea documentației pe OCW. |
| Săptămâna 2 | Hardware Design: Proiectarea schemei electrice, asamblarea componentelor pe breadboard și testarea conexiunilor la pini (LED-uri, butoane, display). |
| Săptămâna 3 | Software Design: Implementarea driverelor bare-metal (Timer0 pentru millis, Timer1 pentru generare ton, ADC, EEPROM, SPI/ShiftOut) și scrierea logicii FSM. |
| Săptămâna 4 | PM Fair & Profilare: Profilarea codului, ajustarea dificultății, curățarea finală a repository-ului de Git și pregătirea prezentării. |
Cod scris în C bare-metal pentru ATmega328P, fără framework Arduino. Toolchain:
<avr/io.h>, <avr/interrupt.h>, <util/delay.h>avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os -Wall whack_a_led.c -o whack.elf avr-objcopy -O ihex -R .eeprom whack.elf whack.hex avrdude -p atmega328p -c arduino -P /dev/ttyACM0 -b 115200 -U flash:w:whack.hex
Binar rezultat: ~4.8 KB flash + 150 bytes RAM.
Niciuna. Toate perifericele sunt programate direct la nivel de registre. Singurele include-uri sunt header-ele standard avr-libc pentru definiţiile registrelor şi macro-urile de întreruperi.
switch din main loop.OCR1A = F_CPU / (2 × prescaler × freq) - 1.uint32_t; citirea protejată cu cli/sei pentru atomicitate.cli/sei.millis() care continuă să refresheze display-ul, eliminând pâlpâirea în timpul melodiilor şi animaţiilor.Pentru a valida ipoteza și a garanta un gameplay fluid, am urmărit următoarele metrici de performanță:
display_digits), am observat că fiecare din cele 4 cifre necesită un _delay_us(2000) pentru a garanta o luminozitate optimă a segmentelor. Astfel, un ciclu complet de reîmprospătare durează minimum 8ms, plus overhead-ul shiftării pe 8 biți. Așadar, butoanele sunt scanate la aproximativ 8.5 - 9ms. Deși depășește pragul ipotetic de 5ms, valoarea este suficient de mică pentru a preveni pierderea oricărui input generat de reflexele umane.Proiectul a fost o oportunitate excelentă de a aprofunda lucrul bare-metal cu ATmega328P. Renunţarea la framework-ul Arduino a oferit control complet asupra perifericelor. Cele mai utile decizii s-au dovedit a fi structurarea logicii ca automat cu stări finite și multiplexarea non-blocantă. Cele mai dificile obstacole au fost:
TIMER1_COMPA_vect).millis_count pe arhitectura AVR de 8 biți (rezolvată folosind blocul cli()/sei()).
Cod organizat într-un singur fişier (whack_a_led.c, ~810 linii) cu următoarele grupuri funcţionale:
timer0_init, millis, tone_start/stop, adc_read, eeprom_read/write_byte_raw, prng_nextshift_out_msb, write_segments, display_digits, display_score, display_idle, display_game_over, compute_dp_masktone_blocking, play_melodydisplay_countdown, start_new_game, pick_next_led, trigger_game_over, score_roll_animation, level_up_sequenceget_pressed_buttonload_high_score, save_high_scorewhile(1) cu refresh display + FSMElementul principal de noutate și originalitate (5% din evaluare) constă în sistemul hibrid și dinamic de ajustare a dificultății, secondat de inovații vizuale pe afișajul 7-segmente:
Proiectul a fost finalizat cu succes în cele 4 săptămâni alocate. Sistemul funcţionează stabil ca un joc arcade complet, cu input multiplu (4 butoane cu pull-up intern + potenţiometru), output vizual multiplexat şi feedback sonor (melodii redate printr-un ISR manual pe Timer1).
Validarea Ipotezei: Ipoteza inițială a fost validată parțial, însă cu un rezultat practic excelent. Presupunerea că timpul de polling va scădea sub 5ms s-a dovedit incorectă din cauza necesității hardware de a menține cifra aprinsă timp de 2ms pentru persistența retinei (rezultând într-o buclă de minim 8ms). Cu toate acestea, nucleul ipotezei s-a confirmat pe deplin: arhitectura cu FSM și eliminarea totală a funcțiilor blocante (înlocuite cu funcția custom custom_delay bazată pe millis()) a permis ca sistemul să actualizeze display-ul și să scaneze inputurile simultan, fără nicio blocare sau ghosting.
Repository-ul conţine următoarele fișiere:
whack_a_led.ino — codul sursă al joculuipm_schem.png — schema electrică a proiectuluiREADME.md — documentația și instrucțiunile proiectuluiLICENSE — licența MIT a proiectului
<avr/io.h>, <avr/interrupt.h> şi funcţiile din <util/delay.h>. nongnu.org/avr-libc-mmcu, -Os, -DF_CPU).