This is an old revision of the document!


TimeStrike

Autor: Catarama Dmitrii

Grupa: 332CD

Introducere

Proiectul este un joc interactiv cu două moduri: unul în care jucătorii trebuie să apese rapid un buton după un semnal și altul în care trebuie să apese cât mai aproape de un timp țintă (ex. 11 secunde), ambele afișând rezultatele pe un ecran LCD.

Scopul este să testeze și să antreneze viteza de reacție și simțul timpului al jucătorilor, oferind în același timp o experiență competitivă și distractivă în multiplayer.

Am pornit de la ideea unui joc simplu de reflexe, apoi am adăugat și o provocare diferită – estimarea timpului – pentru a diversifica jocul și a-l face mai captivant.

Este util pentru dezvoltarea reflexelor și a percepției temporale, fiind ușor de folosit și distractiv. În plus, ne ajută să punem în practică concepte învățate la laborator, precum lucrul cu întreruperi, afișaje LCD, butoane și module de timp.

Descriere generală

Proiectul “TimeStrike” are doua moduri de joc:

1. Modul 1 (Reflex): jucatorii trebuie sa apese butonul intr-un interval cat mai scurt dupa un semnal (ex: sub 0.4s la nivel easy). Poate fi single-player, multi-player.
2. Modul 2 (Tinta de timp): jucatorii trebuie sa apese butonul cat mai aproape de o secunda tinta (ex: 11s).

Module hardware:

  • Arduino Nano (cu ATmega328P);
  • LCD 1602 cu interfata I2C: afiseaza mesaje pentru jucatori, cronometre si rezultatele jocului;
  • 4 butoane tactile (cate unul pentru fiecare jucator);
  • 4 LED-uri (cate unul pentru fiecare jucator);
  • Buzzer pasiv: genereaza semnale sonore diferite pentru start, castig sau greseala;
  • Breadboard si fire jumper: interconectarea componentelor.
  • Rezistente 220 Ohm - 4, pentru led-uri
  • Rezistente 10K Ohm - 4, pentru butoane de pull down
  • Rezistente 150 Ohm - 1, pentru buzzer

Hardware Design

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Aplicatia a fost dezvoltata si compilata folosind Arduino IDE.

Proiectul nu foloseste librarii externe 3rd-party, fiind implementat complet cu functionalitatea nativa a microcontrollerului AVR:

  • avr/io.h - pentru accesul la registrele hardware;
  • avr/interrupt.h - pentru gestionarea intreruperilor;
  • util/delay.h - pentru functiile de delay;
  • stdlib.h - pentru functii standard (itoa, etc.);
  • string.h - pentru manipularea string-urilor;
  • math.h - pentru operatii matematice (pow, fabs);

Aplicatia foloseste o masina de stari pentru a gestiona flow-ul jocului:

typedef enum {
   MENU,
   SELECT_REFLEX_MODE,
   SELECT_DIFFICULTY,
   WAIT_SIGNAL,
   SHOW_SIGNAL,
   RESULT,
   SELECT_TIMING_PLAYERS,
   WAIT_TARGET,
   TARGET_RESULT
} GameState; 

2. Timer Management

  • Timer0 cu interrupt pentru implementarea functiei millis();
  • Timer1 pentru generarea PWM pentru buzzer;
  • Sistem de timing cu precizie de milisecunde;

3. Comunicatie I2C

  • Implementare completa a protocolului I2C pentru comunicarea cu LCD-ul:
  • Functii de start/stop;
  • Transmisia de date;
  • Control al LCD-ului in modul 4-bit prin I2C expander;

4. Random Number Generator - pentru a crea intr-un mod realistic procesul de asteptare a start-ului. Generator de numere pseudo-aleatoare folosind Linear Feedback Shift Register (LFSR):

uint32_t lfsr = 1;
uint16_t random_range(uint16_t min, uint16_t max) {
    lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xB400u);
    return min + (lfsr % (max - min));
}

5. Anti-Cheat System Sistem de detectare a apasarilor premature care marcheaza jucatorii ca “trisori”.

Surse si functii implementate

1. Functii de sistem:

timer_init() - initializare timer pentru millis counter;
millis() - functie echivalenta cu Arduino millis();
delay_ms() - delay in milisecunde;

2. Functii I2C si LCD

i2c_init(), i2c_start(), i2c_stop(), i2c_write() - protocol I2C
lcd_init(), lcd_clear(), lcd_set_cursor(), lcd_print() - control LCD
lcd_print_int(), lcd_print_float() - afisare numere pe LCD

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/iotelea/dmitrii.catarama.1748383080.txt.gz · Last modified: 2025/05/28 00:58 by dmitrii.catarama
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