Table of Contents

InfraCatch - reflex game

Autor: Moroianu Horia-Valentin
Grupă: 334CA

Introducere

InfraCatch este un joc interactiv de testare a reflexelor. Patru LED-uri se aprind aleatoriu, unul câte unul, iar jucătorul trebuie să apese butonul corespunzător de pe o telecomandă cu infraroșu pentru a stinge LED-ul activ. Dacă reacția este greșită sau prea lentă, jucătorul pierde o viață. Feedback-ul este oferit în timp real printr-un buzzer și un LCD care arată progresul făcut. Jocul se termină atunci când jucătorul rămâne fără vieți.

Scopul jocului este de a obține un scor cât mai mare prin testarea reflexelor într-un mod distractiv și ușor de înțeles. Ideea a pornit din dorința de a crea un joc fizic, controlat de la distanță și de a învăța mai multe despre tehnologia de comunicație cu infraroșu și timer-ele interne ale unui microprocesor.

Consider că acest proiect este util pentru mine deoarece îmi oferă ocazia de a construi un sistem complet, de la început până la sfârșit, concentrat asupra interacțiunii cu utilizatorul, și cred că poate atrage atenția și altor persoane care caută un mod de relaxare, diferit de jocurile digitale clasice.

Descriere generală

Diagramă bloc: infracatch-block-diagram.jpg
Proiectul este construit în jurul microcontroller-ului Arduino Nano, care coordonează următoarele module:

Hardware Design

Schemă electrică: infracatch-schematic.pdf

Conectivitate:

Pin ATmega328P Pin Arduino Nano Componentă asociată Funcție
GND GND Toate modulele Alimentare
VCC 5V Toate modulele Alimentare
PB0 D8 LED0 GPIO control
PB1 D9 LED1 GPIO control
PB2 D10 LED2 GPIO control
PB3 D11 LED3 GPIO control
PC4 A4 LCD-1602 I2C - SDA
PC5 A5 LCD-1602 I2C - SCL
PD2 D2 Receptor IR Data/INT0
PD6 D6 Buzzer Timer0 PWM Control

Listă de componente:

Nume componentă Link achiziție Cantitate Preț unitar (lei)
Arduino Nano (ATmega328p) Link 1 24.99
Receptor Infraroșu Link 1 8.99
Telecomandă Infraroșu Link 1 3.6
LCD 1602 Link 1 16.99
Adaptor I2C pentru LCD 1602 Link 1 5.37
Buzzer Link 1 1.4
LED Link 4 0.39
Rezistor 0.5W 220Ω Link 4 0.1
Breadboard 830 Puncte Link 1 9.98
Breadboard 400 Puncte Link 1 4.56
Fire tată-tată Link 1 7.99
Fire mamă-tată Link 1 4.45
Cablu USB-B Mini Link 1 4.37
Preț total: 93.18

Software Design

Mediu de dezvoltare: Visual Studio Code + PlatformIO

Biblioteci externe:

Implementare:

Codul este împărțit în 5 fișiere ce vor fi prezentate mai jos, ținând cont de funcționalitățile moduleleor. Deși acestea nu conțin particularități ale limbajului C++, am ales sa folosesc acest limbaj pentru compatibilitatea cu bibliotecile externe.

main.cpp / main.h: conține implementarea principală a jocului.

Programul este structurat sub forma unui atutomat cu 3 stări:

Variabile globale folosite:

timers.cpp / timers.h: realizează controlul duratei de aprindere a LED-urilor, generarea de sunete prin buzzer și extragerea unui seed pentru randomizare.

Timer1 - Folosit pentru a controla cât timp rămâne aprins un LED.

Timer0 - Folosit pentru a genera tonuri audio la frecvențe date.

Random seed: extractTimers() – combină valorile din TCNT0, TCNT1 și TCNT2 într-un uint32_t pentru a genera un seed aleator folosit la alegerea LED-urilor.

lcd.cpp / lcd.h: gestionează afișajul LCD al jocului (mesaje de început, de final, scor, și vieți).

sounds.cpp / sounds.h: se ocupă de redarea melodiilor și sunetelor pentru stările jocului.

random.cpp / random.h: modul de generare a numerelor pseudo-aleatoare, optimizat pentru microcontrolere.

Rezultate Obţinute

Demo

Un scurt demo al proiectului poate fi găsit aici.

Download

Toate fișierele acestui proiect pot fi găsite aici.

Bibliografie/Resurse

Resurse Hardware:
ATmega328P Datasheet
Arduino Nano Pinout
Autodesk Fusion

Resurse Software:
PlatformIO
IRremote
LiquidCrystal I2C
Xorshift32 PRNG
Generating Tones with Timers


Export Page to PDF