[ARDUINO] Utiliser Arduino Leonardo comme joystick USB

Fabrication de cockpit et divers ( palonnier , panels ..) c est ICI
Avatar de l’utilisateur

Topic author
Topper Harley.
Nouvelle Recrue
Nouvelle Recrue
Messages : 28
Inscription : 13 avril 2012

[ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#1

Message par Topper Harley. »

La carte arduino Leonardo se distingue surtout des autres cartes par sa connexion avec le PC qui s'effectue en direct entre son processeur
ATMega32u4 et le port USB. Dans le gestionnaire de périphériques, la carte apparait donc à la fois comme un périphérique USB (souris,clavier) et dans la liste des ports COM (Arduino Leonardo).

Donc contrairement à l'arduino UNO qu'il faut basculer en mode USB ou COM selon l'usage qu'on veut en faire, on peut communiquer avec la leonardo par le port série tout en restant connecté comme périphérique USB.

L'inconvénient c'est que par défaut les périphériques qui sont émulés par la leonardo sont uniquement le clavier et la souris, côté programmation elles sont accessibles via les classes Keyboard et Mouse.

La souris ne nous intéresse pas trop (à moins qu'on puisse utiliser la commande de la molette souris dans BMS), quand au clavier, il peut nous permettre d'envoyer des caractères ou séquences de caractères. Ce pourra être utile, mais pas indispensable car nous avons vu un autre moyen en envoyant le code clavier directement depuis un programme exécuté sur le PC (dans article : Gestion des aérofreins pas un potentiomètre).

Heureusement, il est possible de faire reconnaitre la leonardo comme un joystick, condition indispensable pour utiliser des entrées analogiques dans BMS.
La première façon de faire reconnaitre l'arduino leonardo comme joystick est de copier le dossier leojoy qui se trouve dans le répertoire de unojoy (http://code.google.com/p/unojoy/) sous "C:\Program Files (x86)\Arduino\hardware\arduino" puis de compiler un code quelconque pour que la modification soit prise en compte.
Dès lors, dans la liste des cartes disponible apparait la "leojoy!".

Image

Sélectionnez cette carte, et envoyez-y un code arduino quelconque : le code est versé sur la carte, et celle-ci est passé en unojoy!, la création d'un périphérique joystick est maintenant effective. Vous pouvez le voir dans Periphériques et imprimantes : la leonardo a fait place à leojoy!.
Et vous pouvez voir qu'il y a bien un joystick (contrôleur de jeu)
Image

Voilà à quoi ressemble par défaut le nouveau périphérique. Il a 4 axes, un hat et 13 boutons.
Image

C'est bien, mais peux mieux faire, pour reprendre "la formule".

Parmi les fichiers que nous venons d'ajouter et qui créent cette nouvelle carte, on pourrait ouvrir les fichiers HID.cpp et USBAPI.h (par défaut à C:\Program Files (x86)\Arduino\hardware\leojoy\cores\leojoy) pour modifier le type de joystick en changeant sa description HID, et modifier en conséquence ses actions, mais cela est assez ardu. Et presque inutile car cela a déjà été fait : allez jeter un oeil sur la page http://www.imaginaryindustries.com/blog/?p=80 : le gentil rédacteur de la page a modifié ces deux fichiers et nous les tient à disposition.
Téléchargez et copiez donc les fichiers HID.cpp et USBAPI.h sur votre disque dur. Perso, je ne les ai pas placé sur la carte leoJoy! mais dans leur emplacement d'origine de la carte leonardo, c'est à dire sous C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino. Ainsi, la carte arduino leonardo crée la souris, le clavier et un joystick qui comporte 8 axes et 32 boutons !

Il y a juste une anomalie : dans les axes, je n'arrive pas à faire reconnaitre l'axe de rotation Z... Qu'à cela ne tienne : en modifiant le ligne 0x09, 0x35, du fichier HID.cpp par 0x09, 0x36, l'axe de rotation Z est remplacé par un slider (curseur), que je peux voir apparaitre dans les propriétés du joystick. On se retrouve bien là avec un joystick à 8 axes.

Image


Image

A présent, nous voilà avec une carte arduino leonardo reconnue comme joystick.

Pour utiliser les fonctions du joystick nouvellement créé :


Code : Tout sélectionner

JoyState_t joySt; // Joystick state structure void setup() { pinMode(13, OUTPUT); joySt.xAxis = 0; joySt.yAxis = 0; joySt.zAxis = 0; joySt.xRotAxis = 0; joySt.yRotAxis = 0; joySt.zRotAxis = 0; joySt.throttle = 0; joySt.rudder = 0; joySt.hatSw1 = 0; joySt.hatSw2 = 0; joySt.buttons = 0; } // the loop routine runs over and over again forever: void loop() { joySt.xAxis = random(255); joySt.yAxis = random(255); joySt.zAxis = random(255); joySt.xRotAxis = random(255); joySt.yRotAxis = random(255); joySt.zRotAxis = random(255); //joySt.throttle = random(255); joySt.rudder = random(255); joySt.throttle++; joySt.buttons <<= 1; if (joySt.buttons == 0) joySt.buttons = 1; joySt.hatSw1++; joySt.hatSw2--; if (joySt.hatSw1 > 8) joySt.hatSw1 = 0; if (joySt.hatSw2 > 8) joySt.hatSw2 = 8; delay(100); if (joySt.throttle > 127) digitalWrite(13, HIGH); else digitalWrite(13, LOW); // Call Joystick.move Joystick.setState(&joySt); }

Si vous voulez aller un peu plus loin :

Dans le fichier HID.cpp, remplacez la ligne

Code : Tout sélectionner

data[12] = joySt->zRotAxis;

par

Code : Tout sélectionner

data[12] = joySt->slider;


puis dans le fichier USBAPI.h, remplacez la ligne

Code : Tout sélectionner

uint8_t zRotAxis;
par

Code : Tout sélectionner

uint8_t slider;

A présent dans le script d'arduino, (les fichiers ino), n'utilisez plus la fonction joySt->zRotAxis mais joySt->slider.

Si vous voulez modifier encore le descripteur de HID, sachez toutefois que cela est extrêmement délicat (si vous voulez jouer avec : http://www.usb.org/developers/hidpage/), et il vous faudra ensuite modifier la classe et lier ce périphérique avec les actions que vous voulez qu'il fasse.
Avatar de l’utilisateur

Fullnegi
Rédacteur
Rédacteur
Messages : 2247
Inscription : 17 juin 2009

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#2

Message par Fullnegi »

Hello ! Petit déterrage, mais sujet encore d'actualité et très interressant.

J'ai vu qu'on pouvait faire de même avec une carte Micro.

Si on ne veut pas utiliser de matrice, du coup, combien d'entrée "boutons" et "axes" on peut avoir au maximum physiquement sur chacune des cartes?
Le nombre exacte d'entrée digitale et analogique ?

Donc sur la Leonardo, ça voudrait dire 13 boutons et 5 axes, c'est ça ?

On parle beaucoup de programmation, mais pas beaucoup de connexion physique sur le sujet, et c'est sur ce sujet que je recherche des infos.

J'ai cependant trouvé ceci pour la matrice, mais je ne m'en sens pas trop capable : [lien suspect]

Ou utiliser un 74LS348 (8-LINE TO 3-LINE PRIORITY ENCODERS http://www.ti.com/lit/ds/symlink/sn74ls348.pdf


On a déterré la carte Leo Bodnar avec un ami, et on se pose la question des avantages et inconvénients de l'une et l'autre et de leurs possibilités selon ce qu'on veux faire.
Dernière modification par Fullnegi le lun. juin 03, 2019 11:09 pm, modifié 3 fois.
> Mon pit sur C6 <
Fabriquer un cockpit F16 ? -> THE VAULT
ImageFFW01
Avatar de l’utilisateur

Balto
Jeune Pilote
Jeune Pilote
Messages : 1260
Inscription : 15 mars 2006

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#3

Message par Balto »

Merci mais le lien que tu donnes pour la matrice me dit que j ai ete selectionné par sfr pour gagner un iphone dernier cri si j accepte d installer des virus sur mon pc. C est très suspect.
Le lien du pdf fonctionne mais c est du chinois pour moi.
Avatar de l’utilisateur

Fullnegi
Rédacteur
Rédacteur
Messages : 2247
Inscription : 17 juin 2009

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#4

Message par Fullnegi »

Ha mince... J'ai du me tromper...
[...]
Pas de problème chez moi avec celui la :)

Le commentaire au complet que j'ai trouvé sur le tuto :
> -How to a get 32 buttons working with just 16 digital pins?
One way to get large numbers of buttons wired up to a device that has limited input pins, is to create a key matrix. The following website explains them in details and should provide you with the information you need to know: [...]

Another option is to use a 74LS348 (8-LINE TO 3-LINE PRIORITY ENCODERS - http://www.ti.com/lit/ds/symlink/sn74ls348.pdf) or something equivalent to read in multiple inputs using only a few microcontroller pins.

> How do I set them to go with the controller buttons?
You will have to decode the value read in via your input pins and map it to the appropriate game controller buttons. I do something similar to this in my "Classic Joystick to USB Adaptor" (http://mheironimus.blogspot.com/2014/09 ... aptor.html). I am mapping the value to keyboard keys, but the principal is the same
[edit]
Je viens enfin de pouvoir vérifier le lien avec l'ordinateur, effectivement, redirection vers une page suspecte... Je n'avais pas eu le problème avec le téléphone.
Donc dans le doute, j'ai encore une fois retiré le lien...
:busted_co
Dernière modification par Fullnegi le mar. juin 04, 2019 2:07 pm, modifié 2 fois.
> Mon pit sur C6 <
Fabriquer un cockpit F16 ? -> THE VAULT
ImageFFW01
Avatar de l’utilisateur

Vmf214
Nouvelle Recrue
Nouvelle Recrue
Messages : 87
Inscription : 12 décembre 2017

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#5

Message par Vmf214 »

Bonjour,
Pour faire des joysticks avec un arduino il faut un arduino avec un atmel 32u4 dont sont équipés les arduinos leonardo et pro micro.
Attention aux noms et vérifier qu'il y a bien le bon atmel.

Pour ajouter des entrées sorties autant prendre des cartes d'extension toute faite comme celle avec des mcp23017. 16 entrées /sorties par carte. Donc avec deux on couvre le nombre max de bouton possibles pour un joystick. Et pour les entrées analogiques autant prendre un leonardo qui en a plus que le pro micro.
Serveur DCS : LFDM WWII_Baie_des_Veys
Site web http://wwii.lfdm.free.fr/
Avatar de l’utilisateur

Fullnegi
Rédacteur
Rédacteur
Messages : 2247
Inscription : 17 juin 2009

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#6

Message par Fullnegi »

Ok ! Merci beaucoup de ta réponse VMF ! :)
> Mon pit sur C6 <
Fabriquer un cockpit F16 ? -> THE VAULT
ImageFFW01
Avatar de l’utilisateur

dimebug
Pilote d'essais
Pilote d'essais
Messages : 6963
Inscription : 18 août 2001

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#7

Message par dimebug »

si tu veux pas te prendre la tete la carte Leo Bodnard est la meilleure solution. Si tu veux t'amuser un peu plus tu as aussi les Teensy qui sont aussi des cartes a base arduino mais avec plein de fonctions HID intégrés. Le programme Joystick est même fournis en exemple ainsi que des exemple Joystick + interfaçage avec X Plane par exemple.

https://www.pjrc.com/teensy/td_joystick.html
Image Dresseur de cochon (sauvage)
Avatar de l’utilisateur

Fullnegi
Rédacteur
Rédacteur
Messages : 2247
Inscription : 17 juin 2009

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#8

Message par Fullnegi »

Excelent, je vais regarder ça également, merci Dimebug !
> Mon pit sur C6 <
Fabriquer un cockpit F16 ? -> THE VAULT
ImageFFW01
Avatar de l’utilisateur

Vmf214
Nouvelle Recrue
Nouvelle Recrue
Messages : 87
Inscription : 12 décembre 2017

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#9

Message par Vmf214 »

Aussi regardes d'abord ce qu'attends Dcs, BMS ou IL2, est ce qu'il veut l'appuie d'un bouton momentané ou continu, est ce que c'est une valeur d'axe 0 a 255 par exemple.
Je me suis déjà fait avoir plusieurs fois comme ça.
Exemple le pas d'hélice pour le spitifre dcs, dcs veut l'équivalent de plusieurs pressions (pas des bières hein) d'un bouton et pas les valeurs d'un axe.

C'est sûr la leobodnar est prete à l'emploi, mais on pourra pas programmer : "si en position ON alors envoyer qu'une seule fois une pression d'un bouton" parce que le logiciel pourrait ne pas apprécier un bouton pressé non stop.

Bon courage et pas trop de pressions ;)
Serveur DCS : LFDM WWII_Baie_des_Veys
Site web http://wwii.lfdm.free.fr/
Avatar de l’utilisateur

Fullnegi
Rédacteur
Rédacteur
Messages : 2247
Inscription : 17 juin 2009

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#10

Message par Fullnegi »

Yep, je regarde effectivement attentivement pour les comportements de toggle "momentané"... Pas de la tarte.
Apparemment, sur Arduino, ce serait possible, mais j'ai connu un ami qui s'était cassé les dents la dedans...
> Mon pit sur C6 <
Fabriquer un cockpit F16 ? -> THE VAULT
ImageFFW01

Sokol1
Nouvelle Recrue
Nouvelle Recrue
Messages : 128
Inscription : 21 novembre 2005

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#11

Message par Sokol1 »

Une autre option pour les Arduinos (ATMEGA32u4, 16 MHZ, 5v):

MMJoy2 Firmware configurable du joystick

https://sites.google.com/site/mmjoyproj ... 2v20151118

- 8 axes
- Support for TLE5010/11 contactless sensor in digital mode
- Up to 128 buttons
- Buttons modes
- Support up to 6 encoder
- Calibration modes
- Axis curves

Auter: MegaMOZG (Développeur électronique de VirPil/VPC)
Avatar de l’utilisateur

Adry
Nouvelle Recrue
Nouvelle Recrue
Messages : 21
Inscription : 11 avril 2017

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#12

Message par Adry »

vmf, est-ce que tu serais d'accord de fournir ton code pour qu'on voit comment programmer l'arduino avec la carte MCP23017 et comme controller ?
Image
Avatar de l’utilisateur

dimebug
Pilote d'essais
Pilote d'essais
Messages : 6963
Inscription : 18 août 2001

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#13

Message par dimebug »

oui, la MMJoy2 est aussi un tres bon choix pour faire un joystick...
Image Dresseur de cochon (sauvage)
Avatar de l’utilisateur

Vmf214
Nouvelle Recrue
Nouvelle Recrue
Messages : 87
Inscription : 12 décembre 2017

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#14

Message par Vmf214 »

Adry a écrit :
mar. juin 04, 2019 7:09 pm
vmf, est-ce que tu serais d'accord de fournir ton code pour qu'on voit comment programmer l'arduino avec la carte MCP23017 et comme controller ?
Oui bien sûr, c'est pas vraiment mon code mais voici :

Code : Tout sélectionner

#include <Wire.h> // Wire.h byte input=0; void setup() { Serial.begin(9600); // Configure le PORT B en entrées(inputs) Wire.begin(); // wake up I2C bus Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission(); } void loop() { Wire.requestFrom(0x20, 1); input=Wire.read(); Serial.println(input); delay(100); // for debounce }
Le MCp23017 a un port A et un B, chacun de 8 pins, qui peuvent etre soit des entrées soit des sorties.
Le port A peut etre en sortie pour allumer des led par exemple pendant que le port B est en entrée pour récupérer les pressions de boutons.
La carte est reliée à l'arduino via le i2c a l'adresse 0x20

Régulièrement le mcp23017 est interrogé sur le port i2c et donne l'état des 8 ports B
On obtient qqchose du style 00101010 soit 0 ou 1 pour chaque entrée digitale

Après cette partie purement mcp23017 il faut utiliser la librairie joystick qui lancera l'action bouton pressé.
Serveur DCS : LFDM WWII_Baie_des_Veys
Site web http://wwii.lfdm.free.fr/
Avatar de l’utilisateur

Vitaliq
Mécano au sol
Mécano au sol
Messages : 533
Inscription : 18 janvier 2016

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#15

Message par Vitaliq »

Cela marche aussi avec un arduino uno ou MEGA. Avec le firmware unojoy. C'est très simple je l'ai fait perso.

https://github.com/AlanChatham/UnoJoy
Avatar de l’utilisateur

Adry
Nouvelle Recrue
Nouvelle Recrue
Messages : 21
Inscription : 11 avril 2017

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#16

Message par Adry »

Je possède aussi un arduino Méga, ça me ferai un peu mal de racheter un arduino.

Vitaliq, tu saurais aussi me donner ton code ? UnoJoy est facile à mettre en place ?
Image
Avatar de l’utilisateur

Vitaliq
Mécano au sol
Mécano au sol
Messages : 533
Inscription : 18 janvier 2016

Re: [ARDUINO] Utiliser Arduino Leonardo comme joystick USB

#17

Message par Vitaliq »

J'avais fait un stick arcade avec un arduino uno donc je n'ai pas utilisé le mega (il traine dans un carton depuis des lustres :) ) mais le principe reste le même pourtant je suis nul en code.

Regarde les exemples dans MegaJoy/samples en gros tu vas allouer chaque pin à une touche, tu peux même changer les pins analogiques en pin logique pour rajouter des boutons. Puis tu flash l'arduino pour qu'il soit reconnu comme un simple périphérique direct X

Tu as même un émulateur pour éviter de devoir flasher à chaque fois que tu veux tester.
Répondre

Revenir à « Cockpit & mod perso »