wusbmote: Adaptateur pour accessoires wiimote à USB

Résumé du projet

Wii-USB

Wii-USB

Cette fois, j'ai décidé de créer un adaptateur permettant d'utiliser des manettes récentes, c'est à dire du genre encore vendues dans les grand magasins, à l'état neuf, et non, pas dans les fameux paniers en fil de fer bourrés d'articles offerts au quart du prix initial. (Que de trésors peut-on y trouver.. mais enfin.)

Caractéristiques

  • Changement de type d'accessoire possible en tout temps.
  • Périphérique USB HID standard. Pilote non requis pour la plupart des systèmes d'exploitation. Fonctionne sous Linux, Windows 7, 8, 8.1, et bien d'autres.

Mode Joystick (Mode par défaut)

  • Support de la Nunchuk, version officielle et clones. Pleine résolution (8 bits pour le joystick XY, 10 bits pour les 3 accéléromètres)
  • Support de la Manette classique, versions officielles (RVL-005, RVL-005(-02)) et clones (comme la HORI Battle pad pour Wii U). Par défaut, le slider analogique L est déactivé. Il est possible d'alterner entre un slider L actif/inactif en gardant le bouton HOME enfoncé pendant 3 secondes.
  • Support partiel de la Wii MotionPlus. Le raccord de périphérique à la MotionPlus n'est pas possible. Les mesures de roulis, tanguage et lacet sont réduites pour pouvoir être transmises sous 10 bits. Cela en limite donc très sévèrement la précision et l'utilité.

Mode souris (Nouveau dans version 1.2)

  • Note: Ce mode doit être activé en utilisant l'outil de configuration.
  • Support de la Nunchuk, version officielle et clones.) Joystick: Pointeur. Défilement effectué en appuyant le bouton C pendant le déplacement du pointeur.
  • Support de la Manette classique, versions officielles (RVL-005, RVL-005(-02)) et clones. Joystick de gauche: Pointeur. Joystick de droite: Défilement.
  • Configurable: Diviseur (contrôle de la vitesse), Zone morte, seuil pour le défilement, inversion du sens de défilement.

Applications

L'utilité de la manette classique ne fait pas de doutes. C'est pratiquement une manette de Playstation. Mais qu'en est-il de la Nunchuk? Ne comportant que deux boutons et un joystick, je n'étais pas certain. Mais en testant, j'ai rapidement réalisé qu'elle est parfaite pour des jeux simples à la master system ou à la NES.

Points forts de la Nunchuk:
  • Fonctionne très bien comme souris.
  • Il est possible de jouer d'une seule main. L'autre se libère donc pour déguster quelque chose ou manipuler son portable tout en surveillant le jeu distraitement (surtout lors du "grinding" dans les RPG).
  • Ne pas être contraint à utiliser ses deux mains permet l'adption de postures traditionellement impossibles ou difficiles telles que jouer le bras détendu le long du corps, pendant sous le siège, ou encore en s'appuyant la tête sur l'autre main.
  • Jouer n'importe quelle main est possible.
Points faibles:
  • Deux boutons sont souvent insuffisants. Heureusement pour les jeux NES, les boutons manquants, start et select, ne sont pas souvent utilisés en plein jeu. Il n'est donc pas trop incommode d'y accéder par le clavier à l'occasion.
  • Les accéléromètres ne sont pas très utiles pour le moment.


Photos

Voici quelques photos du projet et des périphériques supportés:
En développement

En développement

Nunchuk officielle

Nunchuk officielle

Wii MotionPlus

Wii MotionPlus

Manettes classiques officielles

Manettes classiques officielles

Nunchuk clones (Avec et sans fil)

Nunchuk clones (Avec et sans fil)

Adaptateur terminé

Adaptateur terminé



Faites moi parvenir des photos si vous réalisez ce projet! Il me fera plaisir de les ajouter à cette page.


Schéma

Un microcontrôleur Atmega8 (ou Atmega8a) d'atmel est utilisé. L'horloge est assuré par un cristal de 12mhz.
MCU et USB

MCU et USB

Connecteur Wiimote

Connecteur Wiimote


Alimentation 3.3v
Une source de 3.3 volt est nécessaire pour l'alimentation de la manette et pour les résistances R4 et R5 du schéma ci-dessus. Un régulateur de voltage abaissant la tension d'USB 5v à 3.3v peut être facilement réalisé en utilisant le populaire circuit intégré LM317 tel que suggéré pour le projet de manettes N64/Gamecube à USB: http://www.raphnet.net/electronique/gc_n64_usb/index.php#2

Connecteur Wii
Il y a plusieurs options:

  • Utiliser une rallonge. (Beaucoup d'options sur eBay, et très économique)
  • Utiliser un connecteur équivalent neuf (En vente dans mon magasin en ligne)
  • Utiliser le connecteur d'une manette Wiimote endomagée. (Parfois sur eBay en cherchant "broken wiimote" par exemple)
  • Ne pas utiliser de connecteur. Couper le câble de la manette Nunchuk / Classique. (Recommandé si le circuit est assemblé/installé à l'intérieur de la manette)
Important: Je ne précise pas la couleur des conducteurs dans les rallonges Wiimote car cela varie d'un manufacturier à l'autre. Vous devez absolument déterminer le code de couleur de vos câbles en utilisant un testeur de continuité pour réaliser un tableau tel que ci-dessous qui clarifiera ensuite les raccords.

Très important: Ne vous fiez pas aux couleurs de fils indiquées dans l'exemple ci-dessus. Désolé d'insister, mais c'est que s'y fier aveuglément peut résulter au mieux en un montage non-fonctionnel et au pire à des dommages permanents à votre matériel (Manette, PC, Maison?). Quoi qu'il advienne, je ne serai pas tenu responsable.

Et le bouclier du câble?
Le bouclier devrait être raccordé au GND.


Circuit imprimé

Comme c'est souvent le cas, j'ai utilisé mon circuit multiuse pcb2 qui est fait pour acceuillir un Atmega8 et les composantes liées à cette implémentation USB.
Multiuse pcb2

Multiuse pcb2

Circuit câblé

Circuit câblé

Schéma de câblage

Schéma de câblage

Connecteur Wiimote

Connecteur Wiimote



La couleur des fils dans la deuxième image ci-dessus a été volontairement désaturée car tel que déjà énoncé dans la section schématique, il est n'est pas prudent de s'y fier aveuglément.


Logiciel

Version v1.3
29 mai 2014 (Jeudi)
Meilleure configurabilité:
  • Création d'une interface de configuration séparée (HID-Generic). Ceci permet d'envoyer des commandes de configuration à l'adaptateurs sous Windows, même en mode souris.
  • Mise à jour de l'outil de configuration suivant les changements énoncés ci-dessus.
  • Implémentation d'un mode « Interface I2C » (utilse pour accéder directement aux manettes et pour de l'expérimentation générale. Referez-vous au répertoire i2c_tool/ pour un exemple.
Fichier(s):
wusbmote-1.3.tar.gz (129 KB)
wusbmote-1.3-m8.hex (19.1 KB)
wusbmote-1.3-m168.hex (19.9 KB)
Afficher les versions précédentes
Version v1.2.1
11 mai 2014 (Dimanche)
Petites corrections:
  • Fonctionne de nouveau sous Windows (Correction des «report descritors»)
  • Ajout d'un Makefile pour la compilation de l'outil de configuration sous Windows.
Fichier(s):
wusbmote-1.2.1.tar.gz (122.2 KB)
wusbmote-1.2.1-m8.hex (17.2 KB)
wusbmote-1.2.1-m168.hex (17.9 KB)
Version v1.2
4 mai 2014 (Dimanche)
Nouvelles fonctionnalités:
  • Ajout d'un mode souris (Avec la Nunchuk ou manette classique)
    • Défilement (roulette) avec le stick de droite de la manette classique.
    • Défilement par movement et maintient du bouton C appuyé (Nunchuck)
  • La configuration est maintenant enregistrée dans l'EEPROM. Contenu:
    • Numéro de série
    • Mode d'opération (Souris ou Joystick)
    • Paramètres pour le mode souris: Diviseur, Zone morte, Défilement inverse.
  • Configuration modifiable via 'HID Feature report'
  • Ajout d'un outil Linux pour modifier la configuration (Utilise hidapi)
  • Changement de VID/PID USB
  • Mainteant compatible aussi avec l'Atmega168 (Utilisez Makefile.atmega168)
  • Nettoyage du code
Fichier(s):
wusbmote-1.2.tar.gz (111.7 KB)
wusbmote-1.2-m8.hex (17.3 KB)
wusbmote-1.2-m168.hex (18 KB)
Version v1.1
26 avril 2014 (Samedi)
Maintenance:
  • Mise à jour de V-USB et ajustements pour les version récentes de GCC
  • Optimisation du code de communication I2C
Fichier(s):
wusbmote-1.1.tar.gz (102.7 KB)
wusbmote-1.1.hex (10.8 KB)
Version v1.0
4 Novembre 2012
Version initiale.
  • Support de la Nunchuk
  • Support de la manette classique
  • Support partiel de la Wii MotionPlus
  • Compatible USB HID
  • Changement de type d'accessoire possible en tout temps.
Fichier(s):
wusbmote-1.0.tar.gz (81.7 KB)
wusbmote-1.0.hex (11.5 KB)
Ce projet est aussi disponible sur GitHub!
Pour suggérer de nouvelles fonctionnalités, signaler un problème ou contribuer au projet, vous pouvez m'écrire ou utiliser le dépôt GitHub:
https://github.com/raphnet/wusbmote
Code source:
Le code source est rendu publique sous la license GPL version 2. Voir License.txt pour plus d'information. Le projet se compile avec avr-gcc.

Utilisation des fichiers .hex
  • Atmega8: Les fichiers *-m8-*.hex ou les .hex avant la version 1.4 sont pour programmer un Atmega8. Les "fuses bytes" pour l'atmega8 sont: high_byte=0xc9 low_byte=0x9f.
  • Atemga168: Les fichiers *-m168-*.hex sont pour programmer un Atmega168. Les "fuses bytes" pour l'atemga168 sont: high=0xdd, low=0xd7, extended=0x01

Pour de l'information sur la programmation d'un AVR, visitez ma page sur la programmation d'AVR


Fonctionalité USB:
J'ai construit mon adaptateur en utilisant le microcontrôleur ATmega8 d'Atmel. Ce microcontrôleur ne supporte pas USB nativement alors j'ai utilisé le pilote USB logiciel-seulement V-USB.

Combinaison Vendor ID/Product ID USB:
Veuillez ne pas réutiliser ma combinaison VID/PID pour des projets dérivés ou autres. Obtenez-en un vous-même.


Configuration

Un outil de configuration est fourni avec les sources sous le répertoire tool/. Pour l'instant je ne l'ai compilé que sur Linux, mais comme hidapi est aussi compatible avec Windows et Mac OS X, il devrait être possible de l'utiliser sous ces systèmes d'exploitation également.

Notez:
  • Les ajustements effectués avec cet outil seront stockés dans l'adaptateur. Aux branchements suivants, les mêmes paramètres seront effectifs.
  • Cet outil ne fonctionne pas avec les anciennes version (avant 1.2).

Aide

$ wusbmote_ctl --help
./wusbmote_ctl [OPTION]... [COMMAND]....
Control tool for WUSBmote adapter. Version 1.1.1

Options:
  -h, --help   Print help
  -l, --list   List devices
  -s serial    Operate on specified device (required unless -f is specified)
  -f, --force  If no serial is specified, use first device detected.

Configuratin commands:
  --set_serial serial                Assign a new device serial number
  --mouse_mode                       Put the device in mouse mode
  --joystick_mode                    Put the device in joystick mode
  --mouse_divisor val                Set the mouse rate divisor (Higher = slower). Typ: 4
  --mouse_deadzone val               Set the deadzone for mouse mode. Typ: 5
  --scroll_joystick_invert val       Invert joystick scrolling direction. (0 = normal, 1 = inverted)
  --scroll_nunchuck_invert val       Invert scroll direction (0 = normal, 1 = inverted)
  --scroll_nunchuck_threshold val    Set the nunchuck roll threshold for scrolling. Typ: 127
  --scroll_nunchuck_step val         Set the scroll step size (Higher = more scrolling). Typ: 5
  --scroll_nunchuck_c val            Enable/disable scrolling by move + C. (1 = enable, 0 = disable)
  --scroll_nunchuck_c_threshold val  Stick deflection threshold for scrolling. (Typ: 64)

Exemple: Listing des adaptateurs

Chaque adaptateur possède un numéro d'identification qui est utilisé lors de la configuration. Cela permet de configurer un adaptateur spécifique, même si plusieurs adaptateurs sont présents. La commande de listing permet d'obtenir ces numéros.

Dans le cas où vous n'auriez qu'un adaptateur, vous pouvez simplement utiliser l'option --force qui fera agir l'outil sur le premier adaptateur (et donc le seul) de la liste.
$ ./wusbmote_ctl -l
Simply listing the devices...
Found device 'WUSBmote_v1.2', serial '1001'
1 device(s) found

Activer le mode souris

Par défaut, l'adaptateur fonctionne en mode joystick. Le mode souris doit donc être activé. Notez que vous devrez utiliser le numéro de série correspondant à votre adaptateur. (Voir listing des périphériques ci-dessus) Note: Lorsque qu'on bascule entre le mode souris et joystick, il est nécessaire de débrancher et rebrancher l'adaptateur par la suite.
./wusbmote_ctl -s 1001 --mouse_mode
Setting mouse/joystick mode...command result: 0

Configuration de la souris

  • Si la souris est trop rapide (ou lente), il est possible d'en modifier la vitesse via l'option --mouse_divisor.
  • Si le pointeur bouge tout seul lorsque le joystick est au centre, augmentez la zone morte avec --mouse_deadzone. Idéalement, gardez cette valeur aussi bas que possible pour un meilleur contrôle. Sachez également que comme la zone morte est calculée après l'ajustement d'échelle (--mouse_divisor), plus le diviseur est grand, plus la zone morte requise devient possible.

Permissions sous Linux

Généralement, il ne sera pas possible par défaut de configurer le périphérique en tant qu'usager normal:
./wusbmote_ctl -s 1001 --mouse_mode
Error opening device. (Do you have permissions?)
Une solution rapide consiste à utiliser l'usager root via sudo:
sudo ./wusbmote_ctl -s 1001 --mouse_mode
Setting mouse/joystick mode...command result: 0




Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.