Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Capteurs Wii > Caméra IR avec une Wiimote

Caméra IR avec une Wiimote

samedi 21 février 2009, par Julien H.

La Wiimote (pour Wii Remote) est une télécommande pour la console de jeu Nintendo ’Wii’ dont vous avez peut être déjà entendu parler.

Ses caractéristiques sont :
 des boutons (normal pour une télécommande)
 un accéléromètre 3 axes (c’est déjà moins commun)
 un port d’extension I2C (là, ça se rapproche de notre domaine)
 une connexion Bluetooth (sympa !)
 une caméra infra-rouge de résolution 1024x768 (c’est ce qui nous intéresse ici)

L’idée est d’utiliser le module caméra pour repérer des balises infra-rouge et ainsi positionner le robot.

Première manipulation, avec un PC

On va commencer par faire simple en utilisant la liaison Bluetooth avec un PC pour récupérer les valeurs. Il y a de nombreux hacks pour utiliser la Wiimote dans des jeux ou des applications de bureau (Powerpoint), mais ils reposent tous sur un outil de scripting, GlovePIE, qui permet d’associer les valeurs reçues de la Wii à des événements de périphériques classiques : clavier, souris ou manette de jeu virtuels.

Pour notre objectif (comprendre le fonctionnement de la caméra pour pouvoir le reproduire dans un robot), nous devons plutôt nous diriger vers des bibliothèques de hook qui donnent accès aux valeurs brutes.

C’est un peu la jungle de ce côté-là, entre MoteJ et WiiRemoteJ, car il faut une implémentation Bluetooth qui n’est pas fournie, et les premiers essais ont échoué. Je ne copie pas les liens vers les sites qui référencent ces API car ils sont spammés en permanence et je ne tiens pas à emmener nos visiteurs vers une page dont le contenu est plus que douteux.

La lumière est venue d’un wrap de WiiRemoteJ dans une bibliothèque pour Processing développée par le japonais Classic111 disponible ici. Pour info, Wrj4P5 signifie "WiiRemoteJ for Proce55ing".

Des explications sont données sur ce blog pour télécharger les fichiers nécessaires (ou utilisez l’archive fournie ci-dessous).

Code source

Le code est vraiment très simple :


import lll.wrj4P5.* ;
import lll.Loc.* ;
Wrj4P5 wii ;

void setup()
// connect first wiimote
wii = new Wrj4P5(this).connect(true) ;

void draw()
// wait until wiimote connected
if (wii.isConnecting()) return ;

wii.rimokon.setLED(1,true) ;
wii.rimokon.setLED(2,false) ;


Log de la connexion

Ce premier code va tout simplement attendre une connexion avec la Wiimote (il faut appuyer simultanément sur les boutons 1 et 2 pour se mettre en mode découverte), puis allumer la seconde led et éteindre le troisième (parmi les 4 leds bleues en bas de la wiimote).

Explication : wii est l’objet global qui représente les périphériques Wii et rimokon est la wiimote proprement dite. De la même manière, on peut accéder à wii.rimokon.nunchuck et à wiiguitar, etc...

Pour accéder aux informations de la caméra, le wrapper fournit un tableau des 4 points détectés et suivis par la caméra. Chacun des points est identifié par sa position x et y par rapport au capteur 1024x768 de la caméra, et une troisième information "z" permet de connaitre une distance approximative, qu’on représente ci-dessous par la dimension de la tâche.

Deux points IR détectés

Juste un extrait du code (complet dans l’archive zip ci-dessous) :


println("Abscisse x du point 0 : "+wii.rimokon.irLights[0].x) ;

Pour aller plus loin

D’autres liens :
 http://www.hackszine.com/blog/archi...
 http://www.windmeadow.com/node/37
 http://ittybits.blogspot.com
 http://www.openprocessing.org/visua...

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.