This shows you the differences between two versions of the page.
pm:prj2023:adarmaz:tiltthemaze [2023/05/30 02:45] adumitrescu2708 [Implementare] |
pm:prj2023:adarmaz:tiltthemaze [2023/05/30 02:58] (current) adumitrescu2708 [Implementare] |
||
---|---|---|---|
Line 49: | Line 49: | ||
Putem să le luăm pe rănd, în ordinea cronologică începerii jocului \\ \\ | Putem să le luăm pe rănd, în ordinea cronologică începerii jocului \\ \\ | ||
- Prima dată, am setat un **JOYSTICK_DEADZONE** pentru a asigura că nu există niciun fel de zgomot în momentul în care labirintul stagnează în **SERVO_DEFAULT_POSITION** (35°), practic atunci când jucătorul nu mișcă joystick-ul sau îl mișcă suficient de puțin, labirintul trebuie să sea pe loc pentru a reduce zgomotele. Dacă datele depășesc **JOYSTICK_DEADZONE**, atunci vom mapa datele primite pe OX și OY în intervalul [25°, 45°). \\ | - Prima dată, am setat un **JOYSTICK_DEADZONE** pentru a asigura că nu există niciun fel de zgomot în momentul în care labirintul stagnează în **SERVO_DEFAULT_POSITION** (35°), practic atunci când jucătorul nu mișcă joystick-ul sau îl mișcă suficient de puțin, labirintul trebuie să sea pe loc pentru a reduce zgomotele. Dacă datele depășesc **JOYSTICK_DEADZONE**, atunci vom mapa datele primite pe OX și OY în intervalul [25°, 45°). \\ | ||
+ | <spoiler Implementarea deadzone-ului și poziționarea servomotoarelor.> | ||
<code C> | <code C> | ||
int joystick_deadzone = 200; | int joystick_deadzone = 200; | ||
Line 69: | Line 70: | ||
} | } | ||
</code> | </code> | ||
+ | </spoiler> | ||
- Variabila **IS_START_GAME** detectează dacă jocul a început sau nu. Pentru a monitoriza acest aspect, contorizăm folosind întreruperea hardware externă generată de apăsarea butonului joystickului, de câte ori a fost apăsat butonul. Prima apăsare anunță începerea jocului, iar a doua selectarea modului de joc. Deoarece pot apărea probleme la apăsare continuă a butonului, în sensul că întreruperea externă se poate activa de mai multe ori pentru o singură apăsare, am implementat o soluție în care se asigură că butonul este apăsat, apoi eliberat și abia apoi o altă apăsare este validată. //Jocul începe o dată ce s-au trimit cele 2 apăsări de buton, iar Arduino 2. trimite înapoi modul de joc selectat// \\ | - Variabila **IS_START_GAME** detectează dacă jocul a început sau nu. Pentru a monitoriza acest aspect, contorizăm folosind întreruperea hardware externă generată de apăsarea butonului joystickului, de câte ori a fost apăsat butonul. Prima apăsare anunță începerea jocului, iar a doua selectarea modului de joc. Deoarece pot apărea probleme la apăsare continuă a butonului, în sensul că întreruperea externă se poate activa de mai multe ori pentru o singură apăsare, am implementat o soluție în care se asigură că butonul este apăsat, apoi eliberat și abia apoi o altă apăsare este validată. //Jocul începe o dată ce s-au trimit cele 2 apăsări de buton, iar Arduino 2. trimite înapoi modul de joc selectat// \\ | ||
+ | <spoiler Întreruperea externă pentru detectarea apăsării butonului și încheierea conexiunii.> | ||
<code C> | <code C> | ||
void loop() { | void loop() { | ||
Line 90: | Line 93: | ||
} | } | ||
</code> | </code> | ||
- | - Pentru a nu aglomera comunicarea pe interfața serială (deoarece ar putea interveni desincronizări în primirea/trimiterea datelor în Receiver / Transmitter sau datele ar putea fi primite cu o întârziere care nu este necesară), am propus o soluție în care pe interfață se comunică doar la începutul jocului căte un **singur byte la un moment dat, în care biții codifică starea actuală a joystickului**. Nu ne interesează decăt up/low/pressed pentru că interfața de pe LCD permite alegerea game modului prin swipe up/low. \\ | + | </spoiler> |
+ | - Pentru a nu aglomera comunicarea pe interfața serială (deoarece ar putea interveni desincronizări în primirea/trimiterea datelor în Receiver / Transmitter sau datele ar putea fi primite cu o întârziere care nu este necesară), am propus o soluție în care pe interfață se comunică doar la începutul jocului căte un **singur byte la un moment dat, în care biții codifică starea actuală a joystickului**. Nu ne interesează decăt up/low/pressed pentru că interfața de pe LCD permite alegerea game modului prin swipe up/low. **Între cele Arduinouri se stabilește un protocol de comunicație. Ambele părți trebuie să cunoască decizia de game mode luat și, implicit încheierea conexiunii. Din punctul alegerii jocului, Arduino-urile au taskuri separate specializate pe modul de joc. **\\ | ||
^ button[0:7] ^ Semnification ^ | ^ button[0:7] ^ Semnification ^ | ||
| button[0] | Button Pressed | | | button[0] | Button Pressed | | ||
| button[1] | Up | | | button[1] | Up | | ||
| button[2] | Low | | | button[2] | Low | | ||
- | | button[3] | 2nd Button Pressed| | + | | button[3] | 2nd Button Pressed| \\ |
- | {{:pm:prj2023:adarmaz:protocol2.png?500|}}\\ | + | {{:pm:prj2023:adarmaz:protocol2.png?500| Protocolul de comunicație între Arduino-uri}}\\ |
- O dată ce game modeul a fost setat se așteaptă un byte înapoi de sincronizare între cele 2 Arduino-uri, care semnifică game modeul selectat, după care începe jocul, pornind servomotoarele și dăndu-le ca direcție datele mapate [25°, 45°) de la joystick. Pentru a asigura o viteză acceptabilă astfel încât să nu se miște brusc/dezordonat labirintul am lasat un delay pentru fiecare unghi în care se deplasează servomotorul.\\ \\ | - O dată ce game modeul a fost setat se așteaptă un byte înapoi de sincronizare între cele 2 Arduino-uri, care semnifică game modeul selectat, după care începe jocul, pornind servomotoarele și dăndu-le ca direcție datele mapate [25°, 45°) de la joystick. Pentru a asigura o viteză acceptabilă astfel încât să nu se miște brusc/dezordonat labirintul am lasat un delay pentru fiecare unghi în care se deplasează servomotorul.\\ \\ | ||
Line 103: | Line 107: | ||
- Primul mod, //Save the Ball// așteaptă ca pentru fiecare gaură să detecteze senzorul magnetic bila magnetică. Dacă bila a fost detectată, se oprește și afișează timpul jocului. \\ | - Primul mod, //Save the Ball// așteaptă ca pentru fiecare gaură să detecteze senzorul magnetic bila magnetică. Dacă bila a fost detectată, se oprește și afișează timpul jocului. \\ | ||
- Al doilea mod, //Send The Ball//, generează random o gaură, implicit pornește LED-ul găurii respective, pentru a anunța jucătorul unde trebuie să trimită mingea, și așteaptă ca senzorii să detecteze fie dacă mingea a picat în gura corectă, fie nu. Va afișa rezultatul **FAIL/PASS** și durata jocului. | - Al doilea mod, //Send The Ball//, generează random o gaură, implicit pornește LED-ul găurii respective, pentru a anunța jucătorul unde trebuie să trimită mingea, și așteaptă ca senzorii să detecteze fie dacă mingea a picat în gura corectă, fie nu. Va afișa rezultatul **FAIL/PASS** și durata jocului. | ||
+ | <spoiler Parsarea datelor primite prin protocolul de comunicare de Arduino2.> | ||
<code C> | <code C> | ||
void loop() { | void loop() { | ||
Line 129: | Line 134: | ||
} | } | ||
</code> | </code> | ||
+ | </spoiler> | ||
==== Rezultate obținute ==== | ==== Rezultate obținute ==== | ||
Consider că partea care mi-a provocat cele mai multe probleme a fost fizica și dinamica jocului. Au apărut dificultăți atât în montarea platformei și a senzorilor și a ledurilor, cât și în fizica deplasării labirintului (viteză prea mare, mișcare bruscă etc.). În final, am reușit să implementez ce mi-am propus. Multe probleme au apărut și din cauza bibliotecilor folosite, primordial SoftwareSerial.h, care mi-a limitat posibilitatea lucrului cu regiștrii. \\ | Consider că partea care mi-a provocat cele mai multe probleme a fost fizica și dinamica jocului. Au apărut dificultăți atât în montarea platformei și a senzorilor și a ledurilor, cât și în fizica deplasării labirintului (viteză prea mare, mișcare bruscă etc.). În final, am reușit să implementez ce mi-am propus. Multe probleme au apărut și din cauza bibliotecilor folosite, primordial SoftwareSerial.h, care mi-a limitat posibilitatea lucrului cu regiștrii. \\ |