[ARDUINO] Utiliser Arduino Leonardo comme joystick USB
Publié : dim. août 09, 2015 9:56 am
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!".
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)
Voilà à quoi ressemble par défaut le nouveau périphérique. Il a 4 axes, un hat et 13 boutons.
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.
A présent, nous voilà avec une carte arduino leonardo reconnue comme joystick.
Pour utiliser les fonctions du joystick nouvellement créé :
Si vous voulez aller un peu plus loin :
Dans le fichier HID.cpp, remplacez la ligne
par
puis dans le fichier USBAPI.h, remplacez la ligne
par
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.
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!".
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)
Voilà à quoi ressemble par défaut le nouveau périphérique. Il a 4 axes, un hat et 13 boutons.
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.
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;
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.