Nume: Millio Radu

Grupa: 333CA

Dino Runner

Introducere

Pentru acest proiect voi incerca sa construiesc un player fizic de Dino Runner, jocul de pe Chrome atunci cand nu merge internetul.

Elementele jocului

Un dinozaur alearga de la stanga la dreapta (stand pe loc relativ la ecran) si trebuie sa evite obstacole (cactusi) apasand pe space pentru a sari peste ei.

Descriere generala

Senzorul se lipeste cu scotch pe ecran, servomotorul se lipeste cu scotch langa tasta space. Senzorul trebuie sa fie suficient de sensibil incat sa detecteze lumina neagra a cactusilor de pe ecran. Se apasa butonul start/stop pentru inceperea jocului. La detectarea unui cactus trebuie folosit un debouncer, iar servomotorul se va roti suficient cat sa apese tasta space pentru ca dinozaurul sa sare peste cactus.

Hardware Design

Lista componente:

Componenta Cantitatea
Placa compatibila Arduino Uno R3 ATmega328P 1
Fotorezistor 1
Suport conic pentru senzor 1
Servomotor 1
Buton 1
Condensator 100n 1
Rezistori 10k 2
Jumpers 10
Breadboard 1

Fotorezistorul va fi pus intr-un divizor de tensiune cu o rezistenta de 10K.

Schema electrica:

Implementare

Pentru a izola mediul senzorului am printat 3D un suport conic de culoare neagra. Astfel putem obtine valori care sunt mult mai putin dependente de mediul in care se efectueaza masuratoarea.

Software Design

Diagrama de activitate

Descrierea codului

Pentru editarea codului am folosit Arduino IDE. Logica de functionare este urmatoarea: Variabila GameState este controlata de butonul care face toggle pe aceasta valoare (STOP/PLAY). In modul STOP, senzorul este calibrat, adica ultima valoare produsa de acesta este salvata drept referinta de baza pentru modul de joc. Cand se apasa iar pe buton intram in modul PLAY. Se compara in loop valoarea oferita de senzor cu valoarea de referinta. Daca diferenta dintre acestea este mai mare decat un threshold atunci servomotorul este actionat.

Pentru functionarea butonului am creat o intrerupere INT0 cu activare pe falling edge. Pentru debouncing am folosit un condensator de 100n. Pentru controlarea servomotorului am folosit headerul <Servo.h>.

Cod sursa

Cod sursa

Rezultate obtinute

Video https://youtube.com/shorts/IwO0r8xIpnk?feature=share

Scor mediu obtinut ~ 200 de puncte.

Discutie probleme si solutii incercate / Concluzii

O problema pe care am intalnit-o a fost click-ul dublu al servomotorului cand doar un click este necesar. Datorita variatiei mari intre obstacole (cactusi mici, medii mari; cate 1, 2 sau 3 deodata) senzorul “vede” doua obstacole cand de fapt este unul singur. Am incercat sa folosesc un timer pentru a masura lungimea obstacolelor formate din mai multi cactusi si apoi am impus un delay minim (egal cu aceasta durata) intre masuratori pentru a incerca sa elimin sariturile duble. Desi aceasta solutie rezolva sariturile duble, consecinta este faptul ca atunci cand cactusii vin unul cate unul dar cu viteza mare, dinozaurul nu mai are timp sa sara peste al doilea sau al treilea. Prin incercari, am incercat sa aleg un delay astfel incat aceste efecte sa fie minimizate iar performanta sa fie cat mai buna.

Bibliografie/Resurse

Am folosit Tinkercad pentru generarea schemei electrice.

Resurse resurse_dino.zip

Export to PDF

pm/prj2022/abirlica/din-runner.txt · Last modified: 2022/05/30 20:30 by radu.millio
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