Differences

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

Link to this comparison view

pm:prj2022:rstanescu:gamepad [2022/05/12 16:27]
rares.fodor created
pm:prj2022:rstanescu:gamepad [2022/06/02 16:41] (current)
rares.fodor
Line 8: Line 8:
 ===== Descriere generală ===== ===== Descriere generală =====
  
-Pentru a putea respecta standardul impus de XInput, este nevoie de o platforma cu suport nativ pentru USB si de perifericele corespunzatoare unui controller de Xbox: butoanele A/B/X/Y, D-pad, doua joystick-uri,​ butoanele RB/LB/RT/LT si butoanele de meniu (viewmenuxbox).+Pentru a putea respecta standardul impus de XInput, este nevoie de o platforma cu suport nativ pentru USB si de perifericele corespunzatoare unui controller de Xbox: butoanele A/B/X/Y, D-pad, doua joystick-uri,​ butoanele RB/LB/RT/LT si butoanele de meniu (BackStartXbox).
  
-{{ :​pm:​prj2022:​rstanescu:​xinput_gamepad_schema_bloc.png?​300 |}}+{{ :​pm:​prj2022:​rstanescu:​xinput_gamepad_schema_bloc.png?​direct&300 |}}
  
 ===== Hardware Design ===== ===== Hardware Design =====
- 
-<note tip> 
-Aici puneţi tot ce ţine de hardware design: 
-  * listă de piese 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) 
-  * diagrame de semnal ​ 
-  * rezultatele simulării 
-</​note>​ 
  
 **Lista de piese** **Lista de piese**
   * Arduino Leonardo   * Arduino Leonardo
-  * 15 Butoane +  * 15 butoane 
-  * 2 Joystick-uri+  * 2 joystick-uri 
 +  * 10 rezistori de 220ohm
   * Jumpere   * Jumpere
-  * Stripboard+  * <del>Stripboard</​del> ​  ​Breadboard 
 +  * Cablu micro USB 
 + 
 +** Schema Electrica ** 
 +{{ :​pm:​prj2022:​rstanescu:​gamepadxinput_schematic.png?​direct&​900 |}} 
 + 
 +Pentru implementarea proiectului este nevoie de o placuta cu port USB nativ, cum este Arduino Leonardo. 
 + 
 +Am ales sa folosesc doua divizoare de tensiune pentru a economisi pinii digitali de pe placuta. Butoanele directionale si butoanele A/B/X/Y sunt grupate cate 4 in cate un divizor de tensiune. 
 + 
 +Dezavantajul acestor grupari, este ca nu se pot citi doua sau mai multe butoane, din acelasi grup, simultan. De exemplu, apasarea simultana a butoanelor A si B, v-a trimite pe pinul analogic valoarea corespunzatoare apasarii butonului B, nu a amandurora. 
 + 
 +Un alt compromis il constituie faptul ca, din motive de disponibilitate,​ butoanele "​Trigger"​ nu sunt analogice. Valoarea trimisa la API-ul XInput este fie 0% apasat, fie 100% apasat.
  
  
 ===== Software Design ===== ===== Software Design =====
  
 +Pentru dezvoltare am folosit ArduinoIDE, si biblioteca ArduinoXInput.
 +  * [[https://​github.com/​dmadison/​ArduinoXInput_AVR|XInput USB Core for Arduino AVR]]
 +  * [[https://​github.com/​dmadison/​ArduinoXInput|Arduino XInput Library]]
  
-<​note ​tip+<​note ​warning
-Descrierea codului aplicaţiei ​(firmware): +In momentul in care se incarca un sketch pe o placuta cu XInput ​(Tools->​Board->​XInput Boardseste OBLIGATORIU ca atunci cand apare  
-  * mediu de dezvoltare (if any) (e.gAVR StudioCodeVisionAVR) +"​Uploading..." in ArduinoIDEsa apasati de doua ori pe butonul de reset de pe placuta.
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate+
 </​note>​ </​note>​
 +
 +Folosirea acestor biblioteci reduce semnificativ dificultatea implementarii programului.
 +Mai intai setez constantele pinilor
 +<code C>
 +const uint8_t abxy_pin = A5;
 +const uint8_t yL_pin = A1;
 +const uint8_t xL_pin = A2;
 +const uint8_t yR_pin = A3;
 +const uint8_t xR_pin = A4;
 +const uint8_t dpad_pin = A0;
 +
 +
 +const uint8_t lt_pin = 13;
 +const uint8_t lb_pin = 12;
 +const uint8_t swL_pin = 11;
 +const uint8_t view_pin = 10;
 +const uint8_t xbox_pin = 9;
 +const uint8_t home_pin = 8;
 +const uint8_t swR_pin = 7;
 +const uint8_t rb_pin = 6;
 +const uint8_t rt_pin = 5;
 +</​code>​
 +
 +Valorile joystick-urilor sunt de 16 biti cu semn, dar ADC-ul de pe placuta are o rezolutie de doar 10 biti. Din fericire, biblioteca XInput
 +ofera posibilitatea de a seta un range maxim pentru aceste valori.
 +<code C>
 +const uint16_t analog_range = 1023;
 +
 +void setup() {
 +  // ...
 +  XInput.setRange(JOY_LEFT,​ 0, analog_range);​
 +  XInput.setRange(JOY_RIGHT,​ 0, analog_range);​
 +}
 +</​code>​
 +
 +Initializez biblioteca
 +
 +<code C>
 +void setup() {
 +  // ...
 +  XInput.begin();​
 +}
 +</​code>​
 +
 +Functiile bibliotecii folosesc urmatoarele constante pentru butoanele emulate:
 +<code C>
 +
 +enum XInputControl : uint8_t {
 + BUTTON_LOGO = 0,
 + BUTTON_A = 1,
 + BUTTON_B = 2,
 + BUTTON_X = 3,
 + BUTTON_Y = 4,
 + BUTTON_LB = 5,
 + BUTTON_RB = 6,
 + BUTTON_BACK = 7,
 + BUTTON_START = 8,
 + BUTTON_L3 = 9,
 + BUTTON_R3 = 10,
 + DPAD_UP = 11,
 + DPAD_DOWN = 12,
 + DPAD_LEFT = 13,
 + DPAD_RIGHT = 14,
 + TRIGGER_LEFT = 15,
 + TRIGGER_RIGHT = 16,
 + JOY_LEFT,
 + JOY_RIGHT,
 +};
 +</​code>​
 +
 +Pentru interfatarea cu API-ul XInput folosesc urmatoarele functii puse la dispozitie de biblioteca:
 +<code C>
 +XInput.setButton(XInputControl button, bool state);
 +
 +// Seteaza starea butoanelor dpad-ului la valorile parametrilor
 +XInput.setDpad(bool up, bool down, bool left, bool right);
 +
 +// Seteaza valoarea Joystick-ului la valoarea celui de-al doilea parametru.
 +// Daca invert este true, atunci valorile de pe axa respectiva sunt inversate
 +XInput.setJoystickX(XInputControl joy, int32_t x, bool invert);
 +XInput.setJoystickX(XInputControl joy, int32_t y, bool invert);
 +
 +void setTrigger(XInputControl trigger, int32_t val);
 +</​code>​
 +
 +Pentru toate butoanele legate la pini digitali apelez XInput.setButton().
 +
 +Valorile analogice (Dpad si ABXY) sunt parsate in functie de nivelurile de tensiune date de divizor.
 +<code C>
 +void parseVoltageDivider(const int value, bool& int1, bool& int2, bool& int3, bool& int4)
 +{
 +  if (value > 15 && value < 210)        int1 = true;
 +  else if (value >= 210 && value < 290) int2 = true;
 +  else if (value >= 290 && value < 850) int3 = true;
 +  else if (value >= 850)                int4 = true;
 +}
 +</​code>​
 +
 +Butoanele trigger sunt setate folosind urmatoarea functie:
 +<code C>
 +void setTrig(bool button, uint8_t XIControl)
 +{
 +  if (button) {
 +    /* Set 100% */
 +    XInput.setTrigger(XIControl,​ 255);
 +  } else {
 +    /* Release */
 +    XInput.setTrigger(XIControl,​ 0);
 +  }
 +}
 +</​code>​
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +Am reusit sa implementez tot ce mi-am propus. 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+Mi-ar fi placut sa pot lipi proiectul pe un perfboard, dar nu prea m-am descurcat
-</​note>​+ 
 +{{ :​pm:​prj2022:​rstanescu:​gamepadxinput_poza.jpg?​direct&​1000 |}}
  
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Proiectul functioneaza in totalitate, este detectat de Windows si tratat ca un controller de Xbox. Se pot aduce imbunatatiri la rigiditatea constructiei si la felul in care sunt legate butoanele, astfel incat sa se poata citi simultan butoane din grupurile Dpad si ABXY.
  
-<note warning>​ +===== Jurnal =====
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul)**Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +29.05.2022 -- Finalizare documentatie 
-</​note>​+02.06.2022 -- Export to pdf
  
-===== Jurnal ​=====+===== Download ​=====
  
-<note tip> +{{:​pm:​prj2022:​rstanescu:​gamepadxinput_sketch.zip|}}
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. +
-</​note>​+
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +**Resurse Software** 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** ​şi **Resurse Hardware**. +  * [[https://​github.com/​dmadison/​ArduinoXInput_AVR|XInput USB Core for Arduino AVR]] 
-</note>+  * [[https://​github.com/​dmadison/​ArduinoXInput|Arduino XInput Library]] 
 +**Resurse Hardware** 
 +  * [[https://​www.the-diy-life.com/​multiple-push-buttons-on-one-arduino-input/|Divizor de tensiune]]
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
- 
pm/prj2022/rstanescu/gamepad.1652362066.txt.gz · Last modified: 2022/05/12 16:27 by rares.fodor
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