Robotique-Projet
Bonjour et bienvenu sur le forum ROBOTIQUE-PROJET

Merci de nous rejoindre, pour avoir accès aux forum en entier,

il suffis juste de s'inscrire sa prends 2 minutes, et bien sur de faire sa

présentation, au plaisir de se croisé sur le forum.
Robotique-Projet

Forum sur la Robotique & Informatique & Programmation


Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

Voir le sujet précédent Voir le sujet suivant Aller en bas  Message [Page 1 sur 1]

1 Arduino + nunchunk de Wii le Sam 29 Sep - 10:13

Seb03000

avatar
Fondateur
Fondateur
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 0×52 (hexa), avant de pouvoir
demander quoi que ce soit il faut initialiser le nunchunk pour ce faire
il faut envoyer deux octets : 0×40 puis 0×00.
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 : 0×52
Initialisation : 0×40, 0×00
Handshack : 0×00

Une communication “classique” se déroule de la façon suivante :
initialisation -> requestFrom(0×52, 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
Code:

#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 :
[youtube][/youtube]
Se tuto n'est pas de moi bien sur , mes il peux aidé pas mal de monde


_________________
Voici ma chaîne YouTube: Drone-250-Time https://www.youtube.com/channel/UC3ArL72UR4AjpaF5r-pXpSg
Voici ma chaîne YouTube: Dark-Best https://www.youtube.com/channel/UCqHLYZ9IJyfguosa8_rz9Jg
Faite passé l'information les amies , merci a vous tous.
https://www.youtube.com/c/DarkBest

Voir le sujet précédent Voir le sujet suivant Revenir en haut  Message [Page 1 sur 1]

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum