May 27

From Hardy to Wii…

Tag: Turbo Connard @ 22:47

Après quelques déboires avec ma précédente version d’ubuntu, un ordi en terre etc, j’ai décidé d’installer la nouvelle version (Hardy Heron) sur mon autre PC. C’est super, ça tourne bien, etc…

Je voulais dans ce billet expliquer comment depuis une version toute fraîche d’ubuntu, réussir à compiler un programme en processing qui utilise la wiimote… mais de A à Z et sans raccourcis du genre « choppez ce code, compilez -mais en ayant déjà tout le bouzin qui fonctionne- et c’est super »

En écumant les sites internet consacrés à la wiimote je me suis confronté à pas mal de trucs… qu’est ce qu’un bluetooth stack ? Pourquoi ya 12 versions d’avetanaBT ? Mais j’en fous quoi de ces putain de jar etc… Donc, les pré requis de ce tutoriel sont :

Avoir une version Hardy Heron installée, un ordi avec du bluetooth et une wiimote… rien de plus.

1*/ Installation des softs:

1.1*/ Installation d’eclipse

Donc, la première chose à faire est d’installer eclipse. C’est pas dur. Je vous conseille vivement de télécharger une version depuis le site eclipse.org et non pas depuis Synaptic ou autre gestionnaire de paquets… Je vous dis ça parce que je n’avais jamais réussi à faire tourner le soft sous Dapper… fallait installer tout en root et machin du coup fallait lancer eclipse en root etc, bref, la grosse merde.

Téléchargez la version « java developpers »: http://www.eclipse.org/downloads/

Décompresser le fichier dans un répertoire de travail :

J’ai pris /home/fs/proc/ comme répertoire racine de tout le tutoriel et pratiquement tout se passera à cet endroit.

1.2*/Installation de processing

même procédure…

On se rend ici : http://www.processing.org/download/index.html
On télécharge et on décompresse dans /home/fs/proc
Attention, aucun des deux softs ne marche pour l’instant par ce qu’on a pas java

1.3*/Installation de java

Pour installer java il suffit dans lancer Synaptic (Système > Administration > Gestionnaire de paquets Synaptic) faire une recherche sur « sun-java » et cliquer sur le sdk, je crois qu’il demande quelques dépendances… ça m’a mis ça moi :

synaptic java

Pour vérifier que java est installé on peut faire lancer un terminal et taper « java » dedans… (Application > Accessoires > Terminal)

fs@Colin : ~$ java

S’il vous dit que java n’est pas présent ou qu’il faut l’installer ben je sais pas pourquoi…

Eclipse devrait désormais se lancer… Processing nous dit que jikes ne peut pas fonctionner sur notre système. Tant pis, on s’en passera…

2*/ HelloWorld Processing.

On va quand même s’assurer qu’on arrive à compiler du processing avant de se lancer dans la wiimote.

2.1*/ Configuration du projet.

Lancez donc eclipse et choisissez un « workspace » (encore une fois j’ai choisi un répertoire de workspace à la racine de /home/fs/proc/

Dans l’explorateur de package un clic droit permet de créer un nouveau projet java, nommez le HelloWorld.
Il nous faut ensuite importer les packages de classes processing.

Clic droit sur le projet > build path > add external archives et il suffit d’aller chercher le core.jar de processing dans (~proc/processing-0135/lib/)

Eclipse ajoute ces nouvelles classes dans un sous répertoire du projet : Referenced Libraries

HelloWorld

On peut alors créer une classe « HelloWorld » dans « src », on la fait hériter de Papplet et hop, voilà un HelloWorld processing :

import processing.core.PApplet;

public class HelloWord extends PApplet {

public void setup() {

size(300, 300);

println("Helloworld");

}

}


3*/Compilation avetana.

AvetanaBT (bluetooth) est un logiciel qui permet d’utiliser facilement les fonctionnalités bluetooth depuis java :

« AvetanaBluetooth is a Java/JNI-Implementation of JSR-82 for Linux and J2SE. AvetanaBluetooth allows Programmers to easily use and offer Bluetooth services. »

Je sais pas comment tout ça marche mais bon, comme dirait l’autre « on va pas réinventer la roue »

Il faut donc télécharger les sources de ce programme et les compiler !

Télécharger : http://sourceforge.net/projects/avetanabt

Pour compiler notre cher AvetanaBT, le « readme file » nous indique qu’il nous faut plusieurs choses

“In order to compile the avetanaBT libraries you need following software packages to be installed:

- Linux Bluetooth protocol stack (BlueZ)
- GCC compiler
- Java Developer’s Kit Version 1.4.x or higher
- GNU autotools (autoconf 2.57 or higher)”

On peut chopper tout ça avec synaptic en cherchant les bons mots clés :

Bluez, GCC, jdk sont déjà là pour moi… il ne me reste qu’a installer autoconf

autoconf

Ok, une fois autoconf installé on peut imaginer qu’on a tout ce qu’il nous faut pour compiler avetanaBT.
Si vous essayez, la compilation échouera car il nous manques encore libbluetooth.

erreur libbluetooth

Une fois de plus il faut installer le paquet depuis synaptic.

Avec tout ça, nous sommes prêt à compiler le tout mais il nous faut encore paramétrer deux trois trucs…

Comme il l’est dit dans le readme d’avetanaBT, avant de compiler il faut éditer le fichier « envvariables » pour définir les chemins vers le JDK et le répertoire de sortie des fichiers compilés.

Rendez-vous donc dans votre répertoire de sources et éditez le fichier avec gedit par exemple. Le fichier est très simple… si vous ne le comprenez pas, je me demande bien pourquoi vous lisez ce tutorial…

bref, il suffit de changer la ligne :

export JDK_HOME="/usr/lib/jdk1.5.0_12"

par la ligne suivante :

export JDK_HOME="/usr/lib/jvm/java-6-sun"

Pour savoir ou se trouvent « vos java » vous pouvez taper dans un terminal :

fs@Colin:~$ update-alternatives –list java

La commande vous énumérera tous les jre et sdk disponibles pour l’exécution de la commande « java ». Vous pouvez ajouter, supprimer et basculer entre plusieurs environnements grace à la commande « update-alternatives ». Un petit –help permet d’obtenir l’aide de la commande.

Changer ensuite la ligne :

export BIN_DIR="/home/gmelin/avetanabt/binaries"

par un répertoire de votre DD. Chez moi ça donne :

export BIN_DIR="/home/fs/proc/avatena/bin"

Enregistrez le fichier et fermer le. Tout est configuré, il ne reste plus qu’a compiler ! Pour cela, lancez un terminal (Applications > accessoires > Terminal) et rendez-vous dans le répertoire « sources » d’avetana :

fs@Colin:~$ cd /home/fs/proc/avetana/sources

puis un ./install devrait fonctionner :

fs@Colin:~/proc/avatena/sources$ sudo ./install

J’ai rajouté sudo parcequ’il me semble l’avoir fait inconsciemment mais je sais plus… puis ça change pas grand chose…
Le terminal doit balancer plein de trucs et revenir à l’invite de commande…

Si vous avez un soucis, la plupart du temps le compilateur vous indique qu’il vous manque une librairie. Il suffit de la télécharger via synaptic et de retenter l’install.

Si par contre vous voyez des erreurs à cause de JNI -j’avais été confronté à ce problème sur mon autre ordi- il suffit de copier un fichier d’un répertoire à un autre et ça marche nikel… me rappelle plus quoi mais si vous avez le soucis, demandez moi, je retrouverai.

Dans votre répertoire de sortie renseigné dans le envvariable (/home/fs/proc/avatena/bin) vous devriez trouver 2 fichiers :

avatenaBT.jar et libavetanaBT.so

La compilation a bien fonctionné c’est cool MAIS malheureusement, dans l’état votre wiimote ne marcherait pas… Lors du lancement du programme, avetana vous lancerait une erreur genre :

cancel inquiry mes couilles… bref une merdouille qu’un gentil dénomé lmg a feinté sur le forum wiili.org

ça se passait ci : http://www.wiili.org/forum/wrj4p5-wiiremote-p5-library—alpha-t2615-s35.html

Il propose d’effectuer plusieurs modifications dans le fichier c/BlueZ.cpp

ouvrez donc ce fichier avec gedit par exemple et rajouter quelque part dans le code :

JNIEXPORT void JNICALL Java_de_avetana_bluetooth_stack_BlueZ_cancelInquiry (JNIEnv *env, jclass obj) {

/* Close the specified HCI device */

//printf("Function called: %s, %i\n"__FILE__, __LINE__);

//hci_close_dev(dd);

return;

}

et cherchez ensuite la ligne « if(transmitMTU!=-1 || receiveMTU!=-1){ » et ajoutez le code de lmg juste en dessous…

if(transmitMTU!=-1 || receiveMTU!=-1) {/*** modified by lmg to work with the wiimote

maybe this breaks other devices! ***/

transmitMTU = 185;

receiveMTU = 185;

/** end of modifications **/

opts.omtu = (transmitMTU==-1?672:transmitMTU);

Sauvez ce fichier et recompilez… après ces modifications, avetana fonctionnera avec la wiimote ! Gardez ces binaires au chaud dans un coin de votre disque dur, ils vont bientôt nous servir.

4*/Test wiimote java.

Maitenant que nous disposons d’une library qui permet l’utilisation du bluetooth facilement depuis java, nous allons pouvoir tester l’api java wiiremoteJ et vérifier que notre wiimote est reconnue, qu’avetanaBT se lance bien etc… Si tout ceci fonctionne, le passage à processing devrait se faire en douceur.

Pour commencez, téléchargez la bibliothèque WiiremoteJ ici :

http://www.world-of-cha0s.hostrocket.com/WiiRemoteJ/

Extrayez le tout dans /home/fs/proc/ par exemple…

à ce stade du projet mon répertoire proc ressemble à ça :

arbo

Retournez donc dans eclipse et créez un nouveau projet « HelloWiiJava »

Copiez ensuite le fichier « WRLImpl.java » qui se trouve à la racine de /home/fs/proc/WiiRemoteJ v1.3 dans votre nouveau projet : /home/fs/proc/workspace/HelloWiiJava/src . Rafraichissez le répertoire dans eclipse pour voir le fichier apparaître.

Ce programme n’étant pas du processing, nous n’avons pas besoin d’importer la bibliothèque « core » de processing. Par contre, nous avons besoin de la bibliothèque avetanaBT et wiiremoteJ. Ajoutez donc ces deux .jar graçe à un clic droit sur le projet et « build path > add external archives »

Il faut donc ajouter « WiiRemoteJ.jar » qui se trouve dans « /home/fs/proc/WiiRemoteJ v1.3 » et « avetanaBT.jar » dans « /home/fs/proc/avatena/bin »

Lancez alors le programme en cliquant sur la petite flèche verte pour « run WRLimp ». Une fenêtre noire avec un trait blanc horizontal doit se lancer et dans la console d’éclipse, vous devez voir :

« avetanaBluetooth version 1.3.17 »

Appuyez donc sur les boutons 1 et 2 de votre wiimote pour que le programme la détecte et hop ! au bout de quelques secondes; 3 courbes rouge, verte et bleu devraient apparaître et représenter l’accélération de la wiimote.

L’exemple en vidéo :

cool !

5*/ la wiimote en processing

Maintenant qu’on sait que la wiimote fonctionne en java, on peut tester en processing.Au début de ce tutoriel je comptais utiliser la bibliothèque Wrj4P5 de Classiclll. Le mec a bien taffé et sa bibliothèque a l’air sensass… seulement elle marche pas sous linux. Impossible d’avoir la moindre information Infra rouge. J’ai pas mal décortiqué son bouzin pour en arriver à une conclusion « on a pas vraiment besoin de cette bibliothèque ». La bibliothèque WiremoteJ est assez simple et en quelques ligne on a accès à la wiimote et toutes ses infos (accélérations, points infrarouges, boutons…).

On va créer un nouveau projet dans eclipse, « HelloWiiP5 ». Pour notre test processing on va créer:

  • Une classe WiimoteHandler. Elle sera en charge de la connection d’une wiimote. J’ai pas essayé à plusieurs wiimote mais ça doit pas être trop dur à modifier.
  • Une classe CheapWiimote. Je l’ai appelée comme ça parce que c’est vraiment une classe au rabais mais elle devrait déjà nous suffire. Cette classe représentera une wiimote.
  • Une pauvre classe « Point ». Je suis trop nazbrok en java et j’ai pas réussi a déclarer un tableau de façon dynamique…
  • Une classe HelloIR qui sera notre projet processing.

Comme précédement il faut ajouter les core.jar (processing), WiiremoteJ.jar et avetanaBT dans les referenced librairies.
La classe WiimoteHandler ne fait que chercher UNE wiimote. Une fois qu’elle l’a trouvé elle crée une instance de CheapWimote, ajoute un écouteur pour être notifié des événements (bouton, infrarouge, accélération…) et voilà.

La classe CheapWiimote étend WiiRemoteAdapter et par ce biais est notifiée des événements.

Dans une nouvelle classe HelloIR, on peut donc facilement créer une instance de WiimoteHandler et accéder aux propriétés de la wiimote ! Et voilà !

Désormais on peut facilement coder un pointeur :

HelloIR ressemble à ça :

import processing.core.PApplet;
public class HelloIR extends PApplet{
        WiimoteHandler wh;
        double r = 0;
        double x = 0;
        double y = 0;
        public void setup(){
                size(1024,768,P3D);
                wh = new WiimoteHandler();
        }
        public void draw(){
                background(0);         
                translate(0,0);
               
                double minX = width;
                double maxX = 0;
               
                double minY = height;
                double maxY = 0;
               
                translate(width/2, height/2);
               
                for(int i=0;i<wh.cheapWiimote.spots.length;i++){
                        Point p = wh.cheapWiimote.spots[i];
                        if(p.x!=-1){
                                if((p.x*width)<minX) minX = p.x*width – width/2;
                                if((p.y*height)<minY) minY = p.y*height – height /2;
                                if((p.x*width)>maxX) maxX = p.x*width – width/2;;
                                if((p.y*height)>maxY) maxY = p.y*height- height/2;;
                                fill(200, 0, 0);
                                ellipse((float) (p.x*width – width/2),(float) (p.y*height – height/2),30,30);
                        }}if(!Double.isNaN(wh.cheapWiimote.roll)) r += (wh.cheapWiimote.roll – r)/20;
//calcul distance
double difX = maxX – minX;
double difY = maxY – minY;
//calcul du milieu
double px = (minX+difX/2);
double py = (minY+difY/2);
//rotation de l’angle de la wiimote
double px2 =  px*Math.cos(r)Math.sin(r)*py;
double py2 =  px*Math.sin(r) + Math.cos(r)*py;
//décélération
x += ( (px2 * 2 ) – x )/5;
y += ( (py2 * 2 ) – y )/5;
//on décale et on dessine
translate((float)-x , (float) -y);
rotate((float) r);
fill(255, 255, 255);
rect((float) -10 ,(float) -10,(float)20,(float)20);
}
}
 

et ici, les sources : les sources

5 Responses to “From Hardy to Wii…”

  1. matthieu says:

    Cool mec, on va pouvoir porter une reco de mouvements en processing maintenant.

  2. nico says:

    Salut,
    Merci pour ce tutorial.
    Juste pour signaler que BlueCove est nettemenent moins prise de tête sous Ubuntu que Avetana … pas de référence JNI … juste deux .jar.
    +
    +

  3. Ziming says:

    Hi,
    I am having some problem to run wiiremoteJ on Ubuntu Hardy 8.04. findRemote doesn’t return even reporting found my wiimote.
    I cannot read your log, but I tried to follow it as much I can interpret. Do you have an English copy of your wonderful guide?
    Regards
    Ziming

  4. Ziming says:

    Could you please contact me if willing to help me out? Thanks a million!

  5. Turbo Connard says:

    Hello Ziming, I don’t have any english translation for this tutorial however I may help you if you have trouble with wiiremoteJ…
    Can you run the “WRLimp” file above ? http://www.youtube.com/watch?v=YlRk-DpOUjY&eurl=http://www.turboconnard.com/b/?page_id=7

Leave a Reply


- 1 = four