Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Capteurs Wii > Contrôle avec un Wii Nunchuck

Contrôle avec un Wii Nunchuck

mercredi 6 mai 2009, par Julien H.

On s’intéresse ici à un dispositif de contrôle original. On va se faire plaisir en utilisant le Nunchuck, une manette de la console de jeu Nintendo Wii.

Il ne s’agit pas de la manette principale Wiimote (décrite dans cet article) mais d’un périphérique qui s’y connecte via un câble. En tant que tel, il est donc beaucoup plus simple, mais au vu de toutes les innovations dont il est doté, c’est déjà un bond en avant dans les dispositifs de télé-commande classique, qui se limitaient jusqu’ici à des boutons et une croix directionnelle à 8 directions .

Nunchuck pris en main
Pince Easyrobotics + Nunchuck

Jugez plutôt : pour 15 euros, on trouve :
 une croix analogique à 2 axes
 un accéléromètre à 3 axes
 deux boutons judicieusement placés sous l’index et le majeur

Les usages sont multiples, mais on peut imaginer le sketch suivant, basé sur le robot Pobot Easy muni d’une pince Easyrobotics à 2 degrés de liberté :
 un bouton pour prendre la main sur le robot autonome (activer le nunchuck ou revenir au programme autonome)
 un bouton "panique" pour revenir à une situation stable (arrêt du robot, ouverture de la pince, position repliée)
 la croix analogique pour piloter les déplacements (un axe pour la vitesse, un axe pour l’angle, en déplacement polaire)
 l’accéléromètre pour piloter la pince : monter le nunchuck pour monter la pince, pivoter le nunchuck pour ouvrir la pince, en l’utilisant en gravitomètre (une simple rotation lente donnant les mêmes résultats qu’une translation brève) et en utilisant les mouvements rapides pour des enchainements (lancer le nunchuck en avant ferme rapidement la pince) permettant de jouer aussi sur la vitesse.

Exemple d’utilisation pour le Mario Chuck :

Mario Chuck first demonstration from JulienPobot on Vimeo.

Faisabilité technique

Le matériel

L’avantage des périphériques Wii (et les ingénieurs de Nintendo sont bénis pour leur bonne idée) est d’utiliser des protocoles standards qu’on peut donc facilement reprendre et qu’on trouve déjà dans d’autres produits électroniques standards.

Ainsi le Nunchuck utilise le protocole I2C (ou TWI) qu’on retrouve dans beaucoup de capteurs et d’actionneurs en robotique, car issu de l’électronique grand public (magnétoscopes Philips au départ, puis un peu partout pour faire communiquer entre eux plusieurs circuits intégrés). Un inventaire des commandes I2C que le Nunchuck peut comprendre a été dressé par les passionnés, et de nombreuses bibliothèques de code sont disponibles pour les différents programmes électroniques courants.

Reste la connexion... mais là encore, vous n’êtes pas au bout de vos surprises :

  1. la prise a un interstice de l’épaisseur d’une carte électronique standard
  2. un adaptateur permet de récupérer les 4 signaux sur un connecteur standard 2,54 mm

Voici quelques images :

Adaptateur pour prise Wii
Nunchuck connecté à une Arduino

Le logiciel

On ne change pas une équipe qui gagne : depuis quelques mois, le prototypage rapide de nos ateliers est mené sur des cartes Arduino. On va donc très naturellement utiliser une carte Arduino, et cerise sur le gâteau, le génial Tod E. Kurt, concepteur - entre autres - du petit connecteur adaptateur, a choisi un ordre bien précis pour les signaux I2C, permettant d’utiliser directement sur le connecteur femelle de l’Arduino.

Pour se simplifier la vie, on va utiliser une librairie. Il en existe plusieurs :
 celle de WindMeadow
 celle de Tod
 celle de Growdown
 celle de Danjovic (Arduino 1.0)
 celle de Peris et Klimesch

Au passage, on peut constater ici l’intérêt de l’open source !

En fait, à la base c’est le même reverse engineering de WM, donc j’ai classé les solutions par ordre chronologique. On va logiquement utiliser la toute dernière :) qui a l’avantage d’avoir les honneurs du playground Arduino : http://www.arduino.cc/playground/Ma...

Il faut copier le code de la dernière version (compatible Arduino 1.0) et l’enregistrer dans un fichier WiiChuck.h à côté de votre sketch .ino dans le même répertoire, ou bien pour pouvoir l’utiliser dans tous vos sketchs dans un répertoire "libraries/WiiChuck" situé à la racine du sketchbook (le répertoire par défaut contenant vos programmes).

Voici un exemple d’utilisation :

#include "Wire.h"
#include "WiiChuck.h"

WiiChuck chuck = WiiChuck();

int valX = 0;
int valY = 0;

void setup() {

  delay(100);  // une petite attente
  //
  Serial.begin(19200);
  chuck.begin();
  chuck.update();
}

void loop() {
  delay(200);
  chuck.update(); 

  // lecture des valeurs du joystick 2D
  valX = chuck.readJoyX();
  valY = chuck.readJoyY();

  // affichage
  Serial.print(valX);
  Serial.print(" ");
  Serial.print(valY);
  Serial.println();
}

Réalisation

Code Arduino"ChuckServoTest"
version testée sur la version 1.6.3 le 18-12-2015

Voici ce qu’on voit à l’oscilloscope (programme sous Processing) :

Nunchuck joystick axe X
les valeurs sont comprises entre 20 et 200

L’affichage des valeurs c’est déjà bien, mais piloter des servomoteurs ce serait plus... visuel ! alors c’est parti.

On va utiliser la bibliothèque officielle pour piloter les servomoteurs. Pour plus de fun, on va faire bouger une pince Easyrobotics à 2 degrés de liberté. Il y en a justement une qui est arrivée chez moi ce matin.

Le code spécifique au servo est très simple :

#include "Servo.h"

Servo servBras;
Servo servPince;

// code nunchuck ...

void setup() 
{
  // code nunchuck ...
  //
  servBras.attach(10);
  servPince.attach(9);
  servBras.write(90); // valeur milieu 
  servPince.write(90); // valeur milieu
}

void loop()
{
  // code nunchuck ...

  // lecture des valeurs du joystick 2D pour rappel
  valX = chuck.readJoyX();
  valY = chuck.readJoyY();

  servBras.write(90+valX/2); // on divise par 2 la valeur reçue pour moins d'amplitude et plus de précision 
  servPince.write(90+valY/2); 

}

Et une petite vidéo :

Nunchuck Wii makes move robotics arm with grip from JulienPobot on Vimeo.

Lisser les valeurs de l’accéléromètre

On va maintenant mettre en place un algorithme permettant de lisser la valeur de l’accéléromètre. Tout d’abord, on ne va pas utiliser les valeurs brutes des 3 axes mais les convertir en angles "roll" et "pitch".

Cette conversion est fournie par une librairie Arduino.

/**
 * Nunchuck -- Use a Wii Nunchuck
 * Tim Hirzel http://www.growdown.com
 */

    // returns roll degrees
    int readRoll() {
        return (int)(atan2(readAccelX(),readAccelZ())/ M_PI * 180.0);
    }

    // returns pitch in degrees
    int readPitch() {        
        return (int) (acos(readAccelY()/RADIUS)/ M_PI * 180.0);  // Radius = 210
    }

Voici tout d’abord ce qu’on obtient sans filtre.

Nunchuck accelero "roll"
entre -180 et +180
Nunchuck accelero "X" + "roll"
en rouge l’accéléromètre X et en blanc l’angle calculé avec la formule trigonométrique.

Filtre PID

On va asservir une valeur "filtre" sur la valeur réelle, et on va utiliser un asservissement PID pour que notre valeur "filtre" suive la consigne donnée par la valeur réelle.

Voici le résultat de quelques tests :

Intéressant mais pas très utile finalement.

Filtre moyenne

En fait, le plus simple est de faire un effet retard en considérant comme valeur "filtre" la moyenne des n dernières valeurs réelles. Le choix de n influera sur la rapidité du filtre.

Voici ce que ça donne : c’est très satisfaisant et ça évitera que le nunchuck ne soit trop réactif.

Autres vidéos d’un Nunchuck

Des vidéos d’autres réalisations (non-Pobot) :

Et une réalisation complète avec un robot humanoïde Robonova :

Vos commentaires

  • Le 7 octobre 2017 à 09:28, par guilhem En réponse à : Contrôle avec un Wii Nunchuck

    Bonjour, débutant avec l’arduino j’ai testé un montage avec un nunchuk pilotant 2 servomoteurs en utilisant ce code : http://www.wikidebrouillard.org/index.php?title=Bras_Robotis%C3%A9_pilot%C3%A9_par_nunchuk_arduino
    mon problème est que les servomoteurs se mettent à bouger de temps en temps en mode joystick sans que celui-ci soit touché
    et autre problème j’aimerais le rendre plus précis comme vous en divisant par 2 la valeur mais je ne sais pas où rentrer cette ligne.
    pouvez-vous m’aider SVP...
    Cordialement

    • Le 8 octobre 2017 à 01:16, par Eric P. En réponse à : Contrôle avec un Wii Nunchuck

      Bonjour,
      Le fait que les servos bougent sans qu’on le leur demande est la plupart du temps le signe de faux contacts quelque part qui génèrent des parasites sur les signaux. Ca peut être sur le signal de commande du servo, ou bien sur les signaux d’entrée qu’utilise le programme pour décider quoi faire avec les servos. De mauvaises connexions d’alimentation peuvent également générer ce genre de dysfonctionnement.
      Il faut reconnaître que les platines à essai sans soudure sont des usines à faux contacts, surtout si on les achète pour par cher en Chine 😉 Vérifiez soigneusement les liaisons concernées.
      Quant à la division par 2 dont vous parler, je ne comprends pas bien à quoi elle faire référence.
      Cordialement

    Répondre à ce message

  • Le 20 mai 2016 à 19:00, par Barnab En réponse à : Contrôle avec un Wii Nunchuck

    Bonjour,
    J’ai essayé le premier programme, simplement pour pouvoir lire les valeurs du joystick, mais dans le Serial port, il ne m’affiche que des symboles, qui semblent cependant correspondre à des valeurs pour la position X et Y du joystick.
    Merci d’avance

    • Le 18 mars 2017 à 14:14, par Eric P. En réponse à : Contrôle avec un Wii Nunchuck

      Si l’affichage semble "crypté", c’est très probablement que la vitesse de communication est incorrecte.
      Si ce n’est pas le cas, une autre explication est que les valeurs sont envoyés en binaire et non pas sous forme affichable.
      N’étant pas l’auteur du programme, je ne peux malheureusement pas en dire plus.
      Cordialement

    Répondre à ce message

  • Le 8 novembre 2014 à 14:15, par François En réponse à : Contrôle avec un Wii Nunchuck

    Bonjour, je suis en trin de paramétrer mon nunchuck sans fil, j’ai rentré le code mais en regardans dans port série les lignes de chiffres s’enchènent verticalement comme prévu mais si j’appuie sur le joystique ou sur les bouton sa continu pareil, en restant appuyé sur un bouton normalement une des lignes devrait resté sur 0 mais la tout s’enchaine n’importe comment. Pouvez vous m’aider ?
    Merci

    • Le 8 novembre 2014 à 16:00, par Julien H. En réponse à : Contrôle avec un Wii Nunchuck

      Bonjour,
      Si les tests sont faits trop souvent, la console affiche tous les messages du début.
      Essayez avec une ligne "delay(100) ;" en fin de fonction loop.
      Cordialement
      Julien.

    Répondre à ce message

  • Le 21 octobre 2013 à 00:05, par Félix Dhumes En réponse à : Contrôle avec un Wii Nunchuck

    Bonjour, j’ai voulu essayer ce code, qui a l’air excellent, malheureusement le programme ne reconnait pas "PC3". J’ai essayé avec le code "PORTC3" avec la nouvelle interface arduino, mais pas moyen. J’ai pourtant les librairies dans le code, une idée ?

    • Le 21 octobre 2013 à 09:43, par Julien H. En réponse à : Contrôle avec un Wii Nunchuck

      Bonjour,

      J’ai mis à jour l’article avec un code adapté à la nouvelle version de la bibliothèque fournie sur le Playground officiel. Il n’est plus nécessaire d’initialiser les pattes PORTC3 et PORTC2 depuis votre sketch car le fichier WiiChuck.h les intègre désormais.

      Cependant cela aurait dû fonctionner tel quel (j’ai testé le sketch ChuckServoTest.pde de 2009 sans problème). Quelle est votre carte et quelle est votre version du logiciel Arduino ?

      Cordialement,
      Julien.

    • Le 25 octobre 2013 à 00:37, par Félix Dhumes En réponse à : Contrôle avec un Wii Nunchuck

      Bonjour.
      J’utilise une arduino Leonardo. Après une recherche dans la datasheet, on voit en effet que les pins d’entrée analogiques se contrôlent avec le port E ( nommé alors PORTE ). Les instructions pour le contrôle de ports sont aussi, il me semble, légèrement différentes avec la version 1.xx du logiciel arduino ? J’ai dû utiliser la commande " DDRE = B00001100 ; PORTE = B00001000 ; ". La première commande configure les pins analogiques 2 et 3 en sortie, la deuxième met la pin 3 à l’État haut et force la 2 à l’état bas. Les 2 premiers 0 sont là pour former un octet, les 6 autres bits s’occupent de contrôler les pins, en sortie ( 1 ) ou en entrée ( 0 ) puis leur état ( haut ou bas ). le 3 ème bit s’occupe de la pin 5 et le 8 ème de la pin 0.

      Cette explication reste cependant spécifique au cas cas d’une arduino Leonardo ( le port E est spécifique à la Leonardo, utilisez le C dans le cas d’une UNO, par exemple) . Attention, car les pins scl et sdl se trouvent être les sorties numériques 2 et 3. Le contrôle des pins analogiques devient donc inutile.

      J’espère que mes explications ne sont pas trop fouili, je précise donc que si vous avez une Leonardo, il suffit de mettre les pins numériques 1 à l’état haut et la pin 0 à l’état bas. Pensez à adapter l’emplacement de l’adaptateur.

      On préfèrera utiliser des fils plutôt que de brancher directement l’adaptateur, car la prise nunchuck devient tournée vers le reste des broches numériques.

    Répondre à ce message

  • Le 23 juin 2009 à 10:19, par batoub En réponse à : Contrôle avec un Wii Nunchuck

    Bjr bjr !

    un petit message juste pour rappeler que ca fait plus d’un mois :)

    Bonne continuation !

    • Le 25 juin 2009 à 07:38, par Julien H. En réponse à : Contrôle avec un Wii Nunchuck

      Bien vu, je m’en occupe bientôt. Je suis à fond sur le nunchuck sans fil.

    • Le 1er juillet 2009 à 15:35, par batoub En réponse à : Contrôle avec un Wii Nunchuck

      Sans fils ?

      Ca devient encore plus intérréssant !

    • Le 30 juin 2011 à 23:34, par Julien H. En réponse à : Contrôle avec un Wii Nunchuck

      Il aura fallu quand même deux ans jours pour jours avant que j’arrive à faire fonctionner ce fo... Nunchuck sans-fil

    • Le 6 novembre 2011 à 16:02, par gilles En réponse à : Contrôle avec un Wii Nunchuck

      bonjour, vous m’avez gentillement repondu sur un autre site comment conecter un capteur I.R. je viens de voir que l’on peut utiliser un commande de WII nunchchuk pour commander un robotnova
      (Super video) pourriez vous m’expliquer comment faire (point par point), si cela ne vous prend pas trop de temps.
      cordialement

    • Le 6 novembre 2011 à 18:51, par Julien H. En réponse à : Contrôle avec un Wii Nunchuck

      Bonjour,

      Nous préférons aider à réaliser un projet en donnant des conseils face à des problèmes précis plutôt que d’expliquer comment faire point par point.

      Car non seulement ce serait long mais on n’est pas certain que nos explications soient suffisamment détaillées et que vous rencontriez les mêmes problèmes que nous.

      Ce qui va prendre deux minutes chez nous peut vous prendre deux heures, et ce qui nous bloque trois heures peut être résolu chez vous en cinq secondes.

      Donc aucun problème pour vous aider à mener à bien ce projet : avez-vous déjà interfacé un simple capteur de contact avec le robonova ? Commençons par là et on verra ensuite pour le Nunchuck.

      Cordialement,
      Julien.

    Répondre à ce message

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.