[ARDUINO] Utiliser Arduino UNO comme périphérique 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 UNO comme périphérique USB

#1

Message par Topper Harley. »

Pour pouvoir interagir pleinement avec notre simulateur, il nous faudra récupérer des données qu'il a calculé, c'est ce que nous avons vu dans les articles précédents avec la mémoire partagée, et il nous faudra aussi lui envoyer des informations afin qu'il puisse les interpréter.

Les informations que nous devons lui envoyer sont de deux types :
-Des appuis clavier.
-Des plages de valeurs correspondant à des curseurs, des axes.

Pour les appuis clavier, ce sera probablement assez simple : soit l'Arduino Leonardo envoie le code correspondant au code clavier désiré, soit on envoie les données sur le PC où un programme simule l'appui sur cette touche.
Pour les plages de valeur ce sera plus dur, plus dur car BMS ne reconnait que des valeurs récupérées par un périphérique (généralement le joystick. Donc, en reprenant le même principe que précédemment, j'aurai aimé créer un périphérique virtuel piloté en C++ d'après les données envoyées par l'Arduino. Malheureusement, mes connaissances en développement sont trop limitées pour ça et le travail que ça demanderai pour le combler me semble énorme. Une autre piste est d'utiliser une carte arduino comme si il s'agissait d'un périphérique USB, c'est à dire qu'elle doit pouvoir être reconnue par le gestionnaire de périphérique comme un joystick (ou autre périphérique qui est reconnu par BMS et qui permet d'envoyer des plages de valeurs variables). Vous savez, j'essaie de faire ces article avec des cartes Arduino, je vais essayer de continuer dans ce sens.

Arduino UNO.
La carte Arduino uno ne communique que par le port série. Une fois installée, elle simule un port série qui nous permet de lui envoyer le programme. Elle n'est donc pas reconnue comme périphérique USB, d'ailleurs, dans BMS, menu Setup/Controller/Advanced, elle ne figure pas dans la liste déroulante des entrées.

Image

La carte Arduino uno (rev3) est dotée du microcontrolleur ATMEGA328, qui est le coeur même de la carte, mais elle a aussi le microcontrolleur ATMEGA16U2 qui a une contenance de 16Ko de mémoire flash. Ce composant traite les informations reçues par le biais de l'USB et l'ATMEGA328. Un projet a vu le jour et permet de modifier le programme de l'ATMEGA16U afin de le faire reconnaitre comme périphérique USB. Dès lors, le port série n'est donc plus actif, et il devient impossible, dans ce mode, de charger un nouveau programme dans l'ATMEGA328. Il convient donc de mettre le programme sur l'AT328 avant de modifier le ATMEGA16U.

La marche à suivre ainsi que les codes sources sont disponibles à cette adresse : http://code.google.com/p/unojoy/ et ici, si vous voulez les images : http://code.google.com/p/unojoy/wiki/GettingStarted

J'ai essayé, et ça fonctionne : la carte est reconnue comme un périphérique USB à part entière, dans le gestionnaire de périphériques, il sera dans les Controleurs de jeu HID (VID_10C4&PID_82C0) ainsi que dans les Periphériques d'entrée USB, vous le retrouverez comme "UNO JOYSTICK" sous "Périphériques et Imprimantes" et vous pourrez le sélectionner sous falcon BMS.

Image

Puisque maintenant elle est reconnue comme un joystick, on va voir comment l'utiliser concrètement dans BMS :

Préparez un circuit de cette façon : (le port analogique 0 recevra une valeur de 0 à 5v selon la course du potentiomètre)
Image
Image

Envoyez ce petit code dans l'arduino (ça récupère la valeur analogique du pin 0 et va l'utiliser comme axe X du joystick) :

Code : Tout sélectionner

#include "UnoJoy.h" void setup(){ setupUnoJoy(); } void loop(){ dataForController_t controllerData = getBlankDataForController(); controllerData.leftStickX = map(analogRead(A0), 0, 1023, 0,255); setControllerData(controllerData); }
Ensuite, passez l'Arduino en mode périphérique USB. (il faut shunter deux pins et lancer le script TurnIntoAJoystick.bat).

Dans les propriétés du controleur de jeu, vous pouvez tester que conformément au programme, le joystick est reconnu, et le potentiomètre agit directement sur l'axe X (horizontal).

Image

A présent, dans falcon BMS, vous pouvez sélectionner l'arduino comme joystick USB, et l'affecter pour le contrôle désiré. Il n'y a aucun code à faire côté PC, juste lier dans BMS le périphérique et l'axe avec l'action désirée :

Image

Et un petite vidéo, pour faire plaisir à Nor : B)



Voilà, on a réussi à utiliser des données anlogiques de l'arduino dans Falcon, mais du coup, on ne peut plus communiquer via le port serie dans le sens PC->arduino, pour allumer ou éteindre nos voyants. Probablement que la solution serait de communiquer entre le PC et l'arduino via le périphérique HID, mais je n'y suis pas parvenu.

Pour ça, essaiera une prochaine fois avec l'Arduino Leonardo, car dans le dossier unojoy il y a le projet leojoy qui fait reconnaitre l'arduino leonardo comme joystick HID. Mais ce sera pour une prochaine fois.

Revenir à « Cockpit & mod perso »