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:
- Solution 1: J’ai tout d’abord pensé acheter un simple adaptateur DB15 vers USB. Cependant, malgré quelque trouvaille sur Amazon, les forums déconseiller ces adaptateurs en raison de leur inefficacité partielle ou totale. Les joysticks demandaient à être compatible USB … ce qui était certainement pas le cas du mien.
- Solution 2: Opération à cœur ouvert.
Après une courte analyse des entrailles, le verdict fut sans appel… Aucun dispositifs digital dedans.
3 potentiomètres + 8 interrupteurs (par défaut activer) pour contrôler 10 boutons physiques, un axe X, Y et un throttle
Flou artistique pour l'occasion :-°
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 :
- Un fer à souder
- Un multimètre (chinois)
- Une Arduino (j’ai choisit une Arduino pro micro 5v/16 MHz sur aliexpress, une contre façon de Sparkfun pro micro)
Mais attention pour ce tuto il faut une Arduino compatible avec la librairie ArduinoJoystickLibrary . - Des résistances.
- Une plaque de prototypage pour faire des choses propres ^^
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:
Démonter le joystick et retirer tout ce qui existe actuellement, je gardais que les fils.
Avec le multimètre, vérifier la résistance des potentiomètre à leur maximum (les noter)
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)
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
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)
Schéma pour seulement 3 boutons
Et on réalise le schéma et TADAAA ...
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.
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.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à!!! ^^
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.