Skyduino:~#
Articles
arduino, programmation, tutoriel

[Mini Tutoriel] Arduino + nunchunk de Wii

Bonjour tout le monde !

En attendant de pouvoir faire le prochain tutoriel arduino je me suis dis que j’allais en profiter pour vous faire un petit retour sur un bricolage récent que j’ai réalisé.

Tout le monde connaît la console de jeu « Wii », et tout le monde a du au moins une fois entendre parler du nunchunk pour la manette de Wii.
En gros le nunchunk est un accessoire pour la manette principal de Wii, contenant un accéléromètre 3 axes, un joystick et deux boutons.
Normalement il est utile pour jouer à des jeu comme Wii Sport, etc … mais il peut avoir une autre utilité !

Comme beaucoup de produits grand publique la Wii permet d’avoir des accessoire de jeu relativement bon marché et de qualité, normalement un « vrai » nunchunk pour Wii coûte dans les 20€, c’est relativement bon marché mais quand même un peu chère.
Récemment je suis allez à gifi acheter une boite pour ranger quelques petites choses, au passage je suis aller voir le rayons jeu-vidéo en promos histoire de me foutre un peu de la gueule des jeux (roo! qui n’as jamais rigoler de voir des jeux débile en promos à gifi ;)) et je suis tomber sur un nunchunk pour Wii à 4€ !

Sur le coup dilemme, acheter ou ne pas acheter ce nunchunk « made in china » 5x moins chère qu’un vrai nunchunk ?
Dans la mesure ou je n’ai pas de Wii il m’aurai inutile de prendre un vrai nunchunk pour Wii (logique j’ai pas la console) mais en y réfléchissant bien je me suis souvenu que de nombreux projets arduino utilisé des nunchunk de Wii, j’ai déja une manette de PS1 modifié pour mon arduino alors pourquoi pas un nunchunk ?

J’ai cracké, sorti 4€ et je me suis pris ce nunchunk « pour tester ».
Et je suis vraiment pas mécontent de mon achat, certes c’est du « made in china », avec un circuit électronique à faire avoir une attaque à n’importe quel électronicien de part sa qualité, mais pour 4€ j’ai un accéléromètre 3 axes, un joystick (sans bouton milieu … dommage) et deux boutons !

Seul l’accéléromètre coute déja 6€ … grâce au miracle du « made in china » produit en masse je l’ai pour 4€ et avec des bonus ! Que demander de plus ?

Un des gros avantage du « made in china » c’est que bien que les composants soit souder n’importe comment sur le pcb (en carton compressé), et bien il ont pensé au mec qui voudrait faire mumuse avec son nunchunk !
(Ps: j’ai ressouder le quartz, faut pas abuser quand même ;))

héhé! SDA, CLK ! Ça ne vous rappelle rien ?
Et oui c’est bien un bus I2C ! Les nunchunk de Wii, et plus généralement les accessoires pour manettes de Wii sont contrôlé par I2C !

Alors à partir de là deux solutions, faire un adaptateur dans ce genre et garder la connectique d’origine, sauf que bon un morceau de pcb à 3€ pour brancher un nunchunk à 4€ sa fait mal … ou passer à la solution deux, la solution « j’ai pas de Wii donc osef du câble ! », j’ai don souder (proprement) un jolie petit câble se terminant avec une barrette tulipe 4 broches.

Bien, j’ai le nunchunk, je peut le connecter à mon arduino, je sais que c’est de l’I2C, maintenant reste le plus dure simple, la programmation !

La plage mémoire accessible par I2C du nunchunk est la suivante :
Octet Description
1 X-axis value of the analog stick
2 Y-axis value of the analog stick
3 X-axis acceleration value
4 Y-axis acceleration value
5 Z-axis acceleration value
6 Bit 0: "Z"-Button, Bit 1: "C" button, Bits 2-3: X acceleration LSB, Bits 4-5: Y acceleration LSB, Bits 6-7: Z acceleration LSB

Comme vous pouvez le voir il suffit de demander 6 octets de la part du nunchunk pour obtenir toute les informations qui nous sont « utile ».

Le nunchunk se trouve à l’adresse 0x52 (hexa), avant de pouvoir demander quoi que ce soit il faut initialiser le nunchunk pour ce faire il faut envoyer deux octets : 0x40 puis 0x00.
Une fois initialisé il suffit de demander les 6 précieux octets, et faire un handshack (poignée de main, une (ré)initialisation en somme).

Voici les différentes procédure :

Adresse I2C : 0x52
Initialisation : 0x40, 0x00
Handshack : 0x00

Une communication « classique » se déroule de la façon suivante :
initialisation -> requestFrom(0x52, 6) -> handshack -> requestFrom …

Bon comme ça, brut de forme ça peut paraitre un peu (beaucoup) indigeste alors voici le sketch arduino, si vous avez suivis mon tutoriel arduino sur l’I2C ça devrez être à peut prêt compréhensible 😉

#include <Wire.h>

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  Wire.beginTransmission (0x52); // Séquence d'initialisation
  Wire.send (0x40);
  Wire.send (0x00);
  Wire.endTransmission ();
}

void handshake() // Handshack, merci captain obvious !
{
  Wire.beginTransmission (0x52);	
  Wire.send (0x00);	
  Wire.endTransmission ();
}

byte buffer[6]; // Buffer contenant les 6 précieux octets qui nous intéresse
byte cnt = 0; // index courant de buffer

void parse()
{
  byte joy_x_axis = buffer[0]; // joystick axe x (0-255)
  byte joy_y_axis = buffer[1]; // joystick axe y (0-255)
  int accel_x_axis = buffer[2] * 4; // accéléromètre axe x
  int accel_y_axis = buffer[3] * 4; // accéléromètre axe y
  int accel_z_axis = buffer[4] * 4; // accéléromètre axe z

  byte z_button = 0; // bouton Z
  byte c_button = 0; // bouton c

  if ((buffer[5] >> 0) & 1)
    z_button = 1;

  if ((buffer[5] >> 1) & 1)
    c_button = 1;

  if ((buffer[5] >> 2) & 1)
    accel_x_axis += 2;

  if ((buffer[5] >> 3) & 1)
    accel_x_axis += 1;

  if ((buffer[5] >> 4) & 1)
    accel_y_axis += 2;

  if ((buffer[5] >> 5) & 1)
    accel_y_axis += 1;

  if ((buffer[5] >> 6) & 1)
    accel_z_axis += 2;

  if ((buffer[5] >> 7) & 1)
    accel_z_axis += 1;

  Serial.print (joy_x_axis, DEC);
  Serial.print ("\t");

  Serial.print (joy_y_axis, DEC);
  Serial.print ("\t");

  Serial.print (accel_x_axis, DEC);
  Serial.print ("\t");

  Serial.print (accel_y_axis, DEC);
  Serial.print ("\t");

  Serial.print (accel_z_axis, DEC);
  Serial.print ("\t");

  Serial.print (z_button, DEC);
  Serial.print ("\t");

  Serial.print (c_button, DEC);
  Serial.print ("\t");

  Serial.println();
}

void loop()
{
  Wire.requestFrom (0x52, 6);
  while (Wire.available ())
  {
    buffer[cnt] = Wire.receive();
    cnt++;
  }

  if (cnt >= 5)
    parse();

  cnt = 0;
  handshake();
  delay (100);
}

(PS: pour la partie affichage sur le port série, j’ai récupéré des morceaux ici)

Le câblage est vraiment pas compliqué :

Nunchunk -> Arduino
VCC -> 5v
SDA -> A4
CLK -> A5
GND -> GND

Voici le résultat que donne le serial monitor :

255 128 520 128 0 1 1
24 0 484 180 68 1 1
0 255 496 100 40 1 1
255 169 516 148 0 1 1
255 30 512 164 36 1 1
0 29 500 152 60 1 1
128 128 496 168 60 1 1
128 128 500 164 40 1 1
128 0 492 156 44 1 1
128 128 520 132 64 1 1
128 94 484 144 64 1 1
128 0 488 220 64 1 1
128 244 496 140 36 1 1
128 255 504 124 16 1 1
128 255 512 108 20 1 1
128 128 500 140 40 1 1
128 0 496 144 64 1 1
128 0 512 176 56 1 1
128 176 512 164 24 1 1
128 255 516 128 16 1 1
91 255 524 108 24 1 1
128 0 512 140 48 1 1
128 0 504 136 44 1 1
128 128 520 136 44 1 1
128 255 516 136 4 1 1
128 255 488 124 8 1 1
128 96 504 140 32 1 1
128 0 496 124 44 1 1
128 0 500 132 44 1 1
0 98 496 132 68 1 1
0 128 492 132 60 1 1
255 128 528 96 0 1 1
255 128 496 128 12 1 1
230 128 476 132 0 1 1
0 128 496 124 72 1 1
0 128 496 124 40 1 1
158 128 532 104 40 1 1
255 128 512 120 16 1 1
255 128 480 108 0 1 1
0 128 512 112 60 1 1
0 128 508 124 48 1 1
255 128 504 120 20 1 1
255 128 504 116 0 1 1
255 128 504 104 12 1 1
0 128 480 144 64 1 1
0 128 492 124 64 1 1
24 128 472 116 76 1 1
128 128 536 140 0 1 1
128 128 644 180 0 1 1
128 128 768 208 0 1 1
128 128 640 236 0 1 1
128 128 404 276 0 1 1
128 128 0 156 0 1 1
128 128 184 236 0 1 1
128 128 540 156 0 1 1
128 128 644 20 80 1 1
128 128 76 140 0 1 1
128 128 1020 632 488 1 1
128 128 0 56 0 1 1
128 128 500 0 16 1 1
128 128 444 820 88 1 1
128 128 1020 268 0 1 1
128 128 864 356 388 1 1
128 128 584 412 900 1 1
128 128 856 376 944 1 1
128 128 844 248 712 1 1
128 128 316 328 492 1 1
128 128 0 248 280 1 1
128 128 0 240 1020 1 1
128 128 0 236 1020 1 1
128 128 0 208 1020 1 1
128 128 0 128 1020 1 1
128 128 420 112 48 1 1
128 128 412 104 16 1 1
128 128 416 92 56 1 1
128 128 416 116 44 1 1
128 128 388 112 8 1 1
128 128 276 152 68 1 1
128 128 364 104 184 1 1
128 128 524 332 0 1 1
128 128 716 92 360 1 1
128 128 240 0 720 1 1
128 128 620 732 112 1 1
128 128 1020 776 0 1 1
128 128 0 760 0 1 1
128 128 0 164 1020 1 1
128 128 0 708 1020 1 1
128 128 1020 792 0 1 1
128 128 1020 0 140 1 1
128 128 0 748 400 1 1
128 128 188 916 0 1 1
128 128 0 0 0 1 1
128 128 0 0 632 1 1
128 128 256 304 104 1 1
128 128 1020 1020 36 1 1
128 128 1020 356 0 1 1
128 128 0 624 324 1 1
128 128 0 468 472 1 1
128 128 0 508 628 1 1
128 128 1020 1020 0 1 1
128 128 356 276 284 1 1
128 128 0 748 1020 1 1
128 128 884 1020 232 1 1
128 128 1020 232 0 1 1
128 128 0 792 0 1 1
128 128 0 560 216 1 1
128 128 184 568 768 1 1
128 128 408 756 368 1 1
128 128 1020 20 1020 1 1
128 128 0 104 0 1 1
128 128 0 516 460 1 1
128 128 744 236 0 1 1
128 128 248 188 76 1 1
128 128 464 220 64 1 1
128 128 384 204 84 1 1
128 128 544 184 120 1 1
128 128 380 128 52 1 1
128 128 576 208 76 1 1

(Oui je sais, j’ai secoué à mort le nunchunk :))

Et juste pour vous, une petite vidéo de démonstration :

Discussion

17 réflexions sur “[Mini Tutoriel] Arduino + nunchunk de Wii

  1. Merci pour ce super tuto 🙂

    Publié par Trigger | 26 décembre 2011, 12 h 13 min
  2. Bonjour, merci pour ce bon tuto!
    J’ai un souci!! tout est bon sauf que mes valeurs reste a max !
    (255 1023 1 1 …)
    Tu as une idée de ce qui cloche ?

    Publié par cutprodcutprod | 22 janvier 2012, 10 h 46 min
    • J’avais entendu parler d’un bug similaire avec certain nunchunk en provenance d’ebay, mais j’ai aucune idée de comment résoudre un tel bug … normalement avec un nunchunk de pas trop mauvaise qualité ça devrait marcher sans probléme …

      Publié par skywodd | 22 janvier 2012, 12 h 52 min
      • Si jamais le problème pourrait venir d’une déconnexion (même courte) du nunchuk. En effet, s’il se débranche la synchronisation n’est plus correcte donc toutes les valeurs seront au maximum. Bonne soudure et merci à Skywood pour toutes les infos utiles de ton blog =)

        Publié par sablier94 | 12 juin 2012, 21 h 52 min
  3. Merci pour ta réponse je vais chercher…

    Publié par cutprodcutprod | 22 janvier 2012, 13 h 08 min
  4. Le problème était dans l’initialisation!!
    Après des recherches et pas mal de tests … ça fonctionne mais j’ai remplacer ton initialisation par =
    Wire.beginTransmission (0x52); // Séquence d’initialisation

    Wire.send (0xF0);
    Wire.send (0x55);
    Wire.send (0x00);

    Wire.endTransmission ();

    Encore merci et félicitations pour ton site et tes tutos.

    Publié par cutprod | 1 février 2012, 1 h 07 min
  5. merci pour le tuto (as usual) ca va mettre pratique pour mon jeu sous processing+arduino…. et sinon tu faitune erreur, on dit nunchuck et pas nunchunk 😉

    Publié par zilators | 17 janvier 2013, 23 h 46 min
  6. désolé pour le double post mais un nunchuck travaille géneralement en 3.3V donc il est préférable de brancher le VCC du nunchuck sur le pin 3.3V de l’arduino ou de mettre un pont diviseur +5V<|——|==(5kOhm)==|—–NUNCHUCK——|==(10kOhm)==|——–||| GND

    Publié par zilators | 17 janvier 2013, 23 h 51 min
  7. Super tuto 🙂 bravo à toi

    Publié par ituber62 | 4 septembre 2013, 11 h 54 min
  8. merci pour ce tuto, j’ai pris quelques truck pour l’arranger à ma sauce. je pourrais te mentionner dans une vidéo ?

    Publié par julinkiwi | 26 janvier 2014, 18 h 16 min
  9. Bonjour, j’ai essayé votre tuto, j’ai l’impression que la communication entre le nunckuk et l’arduino ne se fait pas car il y’a rien dans le moniteur et les servomoteurs semblent ne pas réagir avec les mouvements du nunchuck.

    Merci d’avance

    Publié par Biret | 27 janvier 2014, 22 h 55 min
    • Bonjour, problème résolu ! C’était la plaque Labdec qui avait un faux contact du coup tout est rentré dans l’ordre, j’ai modifié à ma sauce le code avec 7 servos 😉

      Publié par Biret | 29 janvier 2014, 20 h 01 min
  10. Mais alos MERCIII

    Publié par ho | 21 octobre 2014, 17 h 41 min
  11. Bonjour, merci pour le tuto !
    Est-ce que on pourrait se servir du nunchunk en bluetooth?

    Publié par Steven | 15 juillet 2016, 17 h 17 min

Rétroliens/Pings

  1. Pingback: Labview-arduino | Pearltrees - 11 novembre 2015

  2. Pingback: Tuto Robot, Technologie - Robot piloté à distance par un Nunchuk - 19 avril 2016

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.