Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:adarmaz:tiltthemaze [2023/05/30 02:39]
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 | 
Line 96: Line 100:
 | 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>
 +void loop() {
 +if(mySerial.available() >= 2) {
 +    /* extract info from protocol */
 +    byte received = mySerial.read();​
 +    byte button_pressed = (received & 0x01);
 +    byte upper_cursor = (received >> 1) & 0x01;
 +    byte lower_cursor = (received >> 2) & 0x01;
 +    byte second_button_pressed = (received >> 3) & 0x01;
 + 
 +    if(button_pressed && !start_game) {
 +      start_game = true;
 +      set_LCD_start_game();​
 +    }
 +
 +    if(start_game && !set_game_mode && (upper_cursor != 0 || lower_cursor != 0)) {
 +      /* choose game mode */
 +      last_game_picked = upper_cursor != 0 ? 1 : 2; 
 +      byte cursor_LCD = upper_cursor != 0 ? 1 : 0;
 +      if(cursor_LCD != previous_cursor_state) {
 +        previous_cursor_state = cursor_LCD;
 +        parse_cursor(cursor_LCD);​
 +      }
 +    }
 +  }
 +</​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. ​ \\
pm/prj2023/adarmaz/tiltthemaze.1685403570.txt.gz · Last modified: 2023/05/30 02:39 by adumitrescu2708
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