P35 Hack-a-Wii : Emulation de wiimote pour rendre la Wii accessibles aux personnes handicapées

De Wiki de Projets IMA


Emulation de wiimote avec une kinect



Fichier:Rapport de fin de projet PFE.pdf
Fichier:Video de presentation du projet en 180s.zip la vidéo est au format wmw. lien vers la vidéo sur Youtube

Fichier:WiimoteEmulator.ino.zip

Informations générales

Page de wiki du projet Hack-a-Wii : Emulation de wiimote pour rendre la Wii accessibles aux personnes handicapées

Étudiant Fabien Violier

Tuteur Laurent Grisoni

Contexte : Dans un contexte de handicap physique et/ou mental, des éducateurs utilisent la Wii comme exercice ludique. Cependant, certains utilisateurs ont des difficultés motrice a se servir de la manette de la Wii la WiiMote.

But : Afin de palier à ces problèmes de motricité, il a été proposé de passer par l'utilisation d'une kinnect et de l'émulation d'une WiiMote. Au vue de la période relativement courte allouer au projet, seul la partie émulation de la WiiMote sera abordée.

Présentation générale du projet


Le principe du projet est de se servir d'une kinnect pour jouer sur une Wii afin de palier des problèmes de motricité chez des utilisateurs handicapés.
Le schéma d'une manette de jeu se décomposerai comme suit :
PFE prez du projet global.png

Dans la suite de cette page, il ne sera uniquement question du contrôle de la WiiMote. L'organisation de cette page est relativement chronologique et suit 2 parties principales causées par l'impossibilité de poursuivre la première partie

Partie 1 : émulation d'une WiiMote via des modules Bluetooth semaine 1 et 2

Prise en main du Bluetooth, découverte des modules Bluetooth

Lors de la première réunion du projet, nous avons décidé d'explorer les différents modules Bluetooth usuellement piloté par un plateforme Arduino. Nous avons choisi cette piste car l'Arduino nous permet un contrôle plus "bas niveau" et permettrai un panel de configuration du Bluetooth plus large. L'idée étant de reproduire une WiiMote et d'envoyer les mêmes messages que celle-ci.
Afin que l’illusion soit complète et qu'il n'y ai pas de problème de connexion entre cette reproduction de WiiMote et la Wii, il faut avoir accès à un large panel de configuration comme :

  • le nom
  • l'adresse MAC
  • le code PIN
  • la "Class Of Device" (COD)
  • ...

Au vue de l'état de l'art actuel dans le domaine, les éléments de configuration indispensable à la connexion n'ont pas pu être listé.

Les modules Bluetooth

Le Module série simple d'utilisation
module basic

Ce module permet d'établir une liaison série facilement. Il n'y a pas de configuration possible.
Ce module ne répond dons pas à nos besoin. Nous l'avons rapidement abandonnée pour un module offrant d'avantage de configuration.

Le module HC 06
module HC 06

Ce module permet d’établir une communication série simple, la configuration est rapide et simple. Il n’est cependant pas possible de configurer entièrement le module.
Pour configurer le module, on utilise les commandes AT. Attention toutefois à la tension d’entrée sur la broche Rx, le module accepte du 3.3V il est donc recommandé de faire un pont diviseur de tension sur cette broche.
Le protocole de configuration est le suivant : (pour ce module il ne faut pas envoyer de retour charriot « \r\n », entre chaque commande il est recommandé d’attendre 2secondes.

Emission : AT
Attente
Réception : OK

Il est possible de changer le nom du périphérique, le code PIN ainsi que la vitesse de communication, par défaut la vitesse est de 9600BAUD, cette vitesse resterai utilisable peu importe la vitesse choisie.
Changer le nom : AT+NAMEnomduperipherique
répond OKsetname
Changer le code pin : AT+PINxxxx
répond OKsetpin
Changer la vitesse de transmission : AT+BAUDx ‘x’ allant de 1 à 9
1 correspond à 1200BAUD
4 correspond à 9600 BAUD
Ce module n’est donc pas adaptée à l’émulation d’une wiimote celui-ci n’offrant pas suffisamment de personnalisation du module.

Le module HC 05
module HC 05

Ce module permet d’établir une communication Bluetooth. Ce module permet aussi un large panel de configuration possible. On configure ce module en utilisant des commandes AT.
Le protocole est le suivant : On envoie une commande AT\r\n à une vitesse de 38400 BAUD, La pin « KEY » du module doit être mise à VCC. Le module accepte du 0-5V.
Suite à l’envoie de la commande AT\r\n le module répond OK.

Configuration de la WiiMote

Après avoir connecté la WiiMote à un ordinateur sous linux, l'appel de la fonction hidtools info nous renvoie les informations suivantes.

BD Address:  00:24:1E:B8:87:6F
Device Name: Nintendo RVL-CNT-01
LMP Version: 2.0 (0x3) LMP Subversion: 0x31c
Manufacturer: Broadcom Corporation (15)
Features: 0xbc 0x02 0x04 0x38 0x08 0x00 0x00 0x00
  	 <encryption> <slot offset> <timing accuracy> <role switch>
  	 <sniff mode> <RSSI> <power control> <enhanced iscan>
  	 <interlaced iscan> <interlaced pscan> <AFH cap. slave>

Le site internet wiibrew.org/wiki nous apporte des informations complémentaire sur la configuration

Wii Remote/old Wii Remote Plus
Name Nintendo RVL-CNT-01
Vendor ID 0x057e
Product ID 0x0306
Major Device Class 1280
Minor Device Class 4
Service Class 0
(Summary of all Class Values) 0x002504

Configuration des modules

J'ai essayé de configurer les modules de façon a imiter une WiiMote. Voici la configuration que j'ai utilisé pour le module HC 05.

AT+NAME=Nintendo RVL-CNT-01\r\n nom du module
AT+BIND=0024,1E,B8876F\r\n adresse mac du module
AT+CLASS=2504\r\n (source [1] )
apparaît en manette de jeu lors de la connexion au pc
AT+ROLE=0\r\n (par défaut) slave
AT+PSWD=1234\r\n code PIN du module
AT+CMODE=1\r\n (défaut) le périphérique se connecte sur n'importe quelle adresse

Cette configuration n'a pas permis d'établir une connexion entre la Wii et notre système.
Le site wiibrew.org/wiki indique que le mot de passe Wiimote suit l'adresse mac en ASCII. La configuration suivante a également échoué.

AT+BIND=3635,34,333231\r\n (ce qui correspond en code ASCII à 65,4,321
AT+PSWD=123456\r\n

Conclusion

La WiiMote étant un périphérique utilisant un protocole HID, il n'est pas possible, ou pas encore réalisé, d'établir une connexion en utilisant les modules précédents, il est nécessaire d'utiliser des modules intégrant de base le protocole. Cependant, au vue du temps restant allouer au projet, il a été proposé de changer de point de vue et d'essayer de contrôler la WiiMote au lieu de l'émuler.

Partie 2 : Asservissement d'une WiiMote semaine 3 et 4

Afin de contourner le problème rencontré avec les modules Bluetooth je vais maintenant essayer d'asservir une WiiMote. L'idée est donc de brancher un Arduino à la WiiMote et exécuter la commande reçu. Dans un premier temps on ouvrira la WiiMote afin de mettre en évidence les éléments qui nous intéresse. La première étape sera d'activer des boutons. La 2ème d'envoyer des instructions de l’accéléromètre de la WiiMote. La 3ème étape d'émuler un Nunchuck, la manette d'extension de la WiiMote. La 4ème d'externaliser la caméra infra-rouge.

La manette

Wiimote inside.png

Pour démonter la WiiMote, un tournevis spéciale est recommandé, les vis étant de la forme d'une étoile à 3 branches. Il est cependant possible de sen sortir à l'aide d'un tournevis cruciforme relativement pointu ou plat.
2 encoches empêchent l'ouverture de la WiiMote du côté de la caméra IR, celle-ci se trouve au niveau des touches gauches et droites de la croix directionnelles.
Des vidéos sont disponibles montrant comment démonter une WiiMote, dont voici un lien [2]
Après avoir démonter la WiiMote et analysé l'intérieur de celle-ci, On peut voir les éléments suivant :

1 Prise du nunchuck
2 Bouton de synchronisation
3 Puce Bluetooth
4 Vibreur
5 Bouton 'B'
6 Caméra IR
7 Bouton power
8 Croix directionnelle
9 Accéléromètre
10 Boutons '-' 'Home' '+'
11 Le haut parleur
12 Boutons '1' et '2'


Étape 1 le contrôle des boutons


Des tests réalisés à l'aide d'un multimètre ont permis d'établir les informations suivantes au niveaux des boutons:
Pont diviseur tension.svg.png

Les boutons ont une masse communes ainsi qu'un connecteur dont la tension est de 3.16V. La masse est quand à elle relié à la borne négative de la batterie.
J'ai donc choisi d'utiliser les sorties digitales de l'Arduino afin de piloter ces boutons. Je brancherai un diviseur de tension afin d'abaisser la tension à 3.16V. A la sortie de mon diviseur, je brancherai sur la borne '+' des boutons

L'Arduino impose une tension de 0-5V en sortie.
On prendra donc R2=2.2kohms et R1= 1.2kohms

Suite à l'utilisation d'un Arduino DUE, un pont diviseur n'est pas nécessaire puisque les sorties ont une tension 0-3.3V. L'Arduino DUE présente également l'avantage d'offrir des Digital to Analog Converter (DAC). Il sera donc plus facile de piloter les tensions x,y,z de l’accéléromètre.
Afin de pouvoir piloter les boutons correctement il est nécessaire de mettre en commun les masses de la WiiMote et de l'Arduino DUE. J'ai également mis des résistances entre la sortie de l'Arduino et les boutons afin de ne pas causer de court circuit. J'ai soudé un fil sur la masse du bouton 'A', les boutons ayant une masse commune cela permet de relier toutes les masses.

Étape 2 l'accéléromètre

L'accéléromètre de la WiiMote fournit des tensions variant de 1.10V à 1.8V. Cela correspond à des valeurs pour le DAC de l'Arduino comprise entre 1350 et 1450. Nous avons enlevé l'accéléromètre de la WiiMote afin que celui-ci ne perturbe pas la commande. Nous avons ensuite soudé des fils sur la capacités de filtrage de l'accéléromètre.

Étape 3 émulation du nunchuck

Par manque de temps cette étapes n'a pas été traiter il est cependant possible de consulter des travaux sur l'émulation de nunchuck d'un autre groupe de projet de Polytech à cette adresse

Le programme Arduino

Le programme Arduino fonctionne avec une communication série. On envoie les commandes via cette liaison. Les commandes sont listés ci-dessous.

A inversion de l'état du bouton A
B ----------------------------- B
1 ----------------------------- 1
2 ----------------------------- 2
8 ----------------------------- flèche haut 
4 ----------------------------- flèche gauche
5 ----------------------------- flèche bas
6 ----------------------------- flèche droite
y Attend la valeur d'accéléromètre puis applique la tension
x ----------------------------- 
z ----------------------------- 
p programme auto applique un geste (bowling)
Algorythme de l'Arduino


L'Arduino DUE ne possède que 2 DAC, ainsi seul 2 dimensions de l'accéléromètre peuvent être piloté. Afin de régler ce problème, il est conseillé d'utiliser une PWM sur une sortie digital de l'Arduino, suivit d'un filtre passe bas de type RC, avec R=10kohms et C=100nF. Ce type de connexion n'a cependant pas été testé.

Quelques tests