Nume: Millio Radu
Grupa: 333CA
Pentru acest proiect voi incerca sa construiesc un player fizic de Dino Runner, jocul de pe Chrome atunci cand nu merge internetul.
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.
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.
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 |
Schema electrica:
Implementare
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>.
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.