Libérer les connaissances

Transformer un joystick analogique serial (DB15) en numérique USB

Categories:

Dans cet article je vais vous présenter la transformation que j’ai faite sur un vieux joystick Dexxa J-YD15 retrouver dans le grenier.

Anamnèses:

Le pauvre joystick était encore en port série DB15 (port série principalement utilisé pour les manettes de jeux vidéo).
Et pour la place qu’il prenait c’était soit une solution, soit le classement vertical.

Différentes solutions:

Interieur du joystick brut Flou artistique pour l’occasion :-°

Carte analogique du joystick

En fait, le joystick ne faisait absolument rien comme boulots excepter ajouter quelques diodes pour la sécurité ainsi qu’un condensateur pour éviter les rebounds des boutons.
Toutes les actions de l’utilisateur était transcrite par l’ordinateur de l’époque.

Ce qui en fait un patient de choix pour le transformer en joystick USB.
Pour cela, le matos utilisé est très simple :

Contraintes:

Je souhaite modifier le moins possible le joystick et cela pose quelque difficulté circonstanciel pour mon cas. Les potentiomètres ne sont branchés que par 2 broches, la 3ᵉ est totalement inaccessible sauf si on commence à casser du plastique.
Ce qui m’oblige à créer un pont diviseur de tension pour récupérer l’information du potentiomètre.

Tutoriels:
  1. Démonter le joystick et retirer tout ce qui existe actuellement, je gardais que les fils.
  2. Avec le multimètre, vérifier la résistance des potentiomètre à leur maximum (les noter)
  3. Avec le multimètre, regarder le fonctionnement des boutons (regarder s’il sont activer ou non par défaut et trouver le fil commun à tous, et puis le noter avant de l’oublier)
  4. Dans mon cas je calcule la plage que j’aurai avec les potentiomètres pour les résistances que j’ai sous la main (100kOhms), sachant que mes potentiomètres sont également de 100kOhms j’aurai une plage théorique de 2.5Volts à 5Volts
  5. On fait un mini schéma pour le prototypage, sachant que l’alimentation sera fournit par l’Arduino qui lui-même sera alimenté par l’USB de l’ordinateur (5V)

    Schema de la carte pour le montage Schéma pour seulement 3 boutons

  6. Et on réalise le schéma et TADAAA … Résultat sur une carte electronique nu (pour prototypage)
  7. Bon maintenant, attelons-nous au code!
    #include <Joystick.h>
    
    Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_JOYSTICK,
    8, 0, // Button Count, Hat Switch Count
    true, true, false, // X and Y, but no Z Axis
    false, false, false, // No Rx, Ry, or Rz
    false, true, // No rudder or throttle
    false, false, false); // No accelerator, brake, or steering
    
    void setup() {
    // Initialize Button Pins
    pinMode(2, INPUT_PULLUP);
    pinMode(3, INPUT_PULLUP);
    pinMode(4, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP);
    pinMode(6, INPUT_PULLUP);
    pinMode(7, INPUT_PULLUP);
    pinMode(8, INPUT_PULLUP);
    pinMode(9, INPUT_PULLUP);
    
    // Initialize Joystick Library
    Joystick.begin();
    /*Joystick.setXAxisRange(520, 1000);//A2
    Joystick.setYAxisRange(520, 1023);//A1
    Joystick.setThrottleRange(499, 1023);//A0*/
    Joystick.setXAxisRange(-127, 127);//A2
    Joystick.setYAxisRange(-127, 127);//A1
    Joystick.setThrottleRange(0, 255);//A0
    }
    
    // Last state of the buttons
    int lastButtonState[8] = {0,0,0,0,0,0,0,0};
    
    void loop() {
    
    // Read pin values
    for (int index = 0; index < 8; index++)
    {
    int currentButtonState = !(digitalRead(index + 2));
    if (currentButtonState != lastButtonState[index])
    {
    Joystick.setButton(index, currentButtonState);
    lastButtonState[index] = currentButtonState;
    }
    }
    Joystick.setXAxis(map(analogRead(A2), 520, 1000, 127, -127));
    Joystick.setYAxis(map(analogRead(A1), 520, 1023, 127, -127));
    Joystick.setThrottle(map(analogRead(A0), 499, 1023, 0, 255));
    
    delay(10);
    }
    

    Rien de bien compliqué dans ce code:

    • Initialisation des boutons + joystick par la bibliothèque
    • et toutes les 10ms, on update les boutons et on map la lecture analogique des potentiomètres
      L’avantage de ce code est que tous est fait par la bibliothèque ArduinoJoystickLibrary donc rien besoin de faire presque.
  8. Possibilité d’amélioration:
    Dans mon cas j’ai utilisé des résistances de 100kOmhs pour le pont diviseur de tensions. Sachant que le potentiomètre est de 100kOhms, cela fait une tension de 2.5V minimum et donc une fourchette de 2.5V également. On pourrait tous simplement diminuer la résistance pour avoir une fourchette de tension plus élevé et ainsi avoir un peu plus de précision, mais OSEF.
  9. Au final, on referme tout et … (p****n de m****e, où j’ai foutue les 4 p****n de vis pour refermer le cul du joystick) Voilà!!! ^^
    Joystick fini et remonté Joystick fini avec interieur apparent
Bonus: Changer le nom du joystick.

Par ce que, oui! si vous compiler tel quel sur l’Arduino vous aurez le nom de la carte Arduino (Sparkfun ProMicro dans mon cas). donc pour modifier le nom de la carte il suffit de modifier un simple fichier de configuration d’Arduino (soit dans %appdata%, soit dans Document/ArduinoData si vous l’avez installé par le Windows Store)
Vous modifier le fichier boards.txt de votre carte (exemple dans mon cas: \Documents\ArduinoData\packages\SparkFun\hardware\avr\1.1.6\boards.txt)
Vous cherchez votre carte parmi la liste de carte est vous modifier la valeur de build.usb_product (exemple: promicro.build.usb_product=”Dexxa J-YD15”) et vous recompiler pour avoir un truc un peu plus propre que Sparkfun ProMicro ^^

Pensez également à isoler vos connexions, sous peine de devoir tout rouvrir.


Licence Creative Commons
Transformer un joystick analogique serial (DB15) en numérique USB de Clément Cachinho est mis à disposition selon les termes de la licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.
Fondé(e) sur une œuvre à https://blog.noknow.ovh/article/transformer-un-joystick-des-annees-90-analogique-en-digital.