[Rétroingénierie]Manette pro Wii

Bonjour tout le monde ! (oui ça fait longtemps)
Les périphériques de wii, beaucoup de monde les utilisent avec leur arduino, surtout le nunchuck.
Mais vu qu’il dispose de peu de capteurs (un accéléromètre, un joystick et deux boutons), je me suis penché sur une manette pro de wii (Avertissement de redirection). Simple, sobre, 11 boutons, une croix directionnelle, 2 joysticks, bref un truc pas mal (en plus j’en avait une ;)).
Les périphériques de wii utilisent le bus I²C, et ont tous la même adresse et le même principe de fonctionnement (initialisation, handshake etc.) il était donc très facile de récupérer des données .
Pour dumper ces données, j’utilise un petit sketch fait maison:

#include <Wire.h>

#define device 0x52
#define ask 6

void handshake() {
  Wire.beginTransmission(device);
  Wire.write(0x00);
  Wire.endTransmission();
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(device);
  Wire.write(0x40);
  Wire.write(0x00);
  Wire.endTransmission();
}

byte buffer[ask];
byte cnt = 0;
byte toSend = 0;

void loop() {
  Wire.requestFrom(device, ask);
  while (Wire.available()) {
    buffer[cnt] = Wire.read();
    cnt++;
  }
  Serial.print("\nData: ");
  Serial.println(cnt);
  
  while (toSend <= cnt) {
    Serial.print(buffer[toSend], BIN);
    Serial.print("\n");
    toSend++;
  }
  cnt = 0;
  toSend = 0;
  handshake();
  delay(1000);
}

Un truc tout simple, capable de faire cracher le morceau à n’importe quel périphérique de wii ;).
Note: pas besoin d’adaptateur wii/breadboard, 4 fils assez fins peuvent rentrer dans la prise.

Et c’est là que les ennuis le fun commence !
Il faut maintenant décoder le binaire pour obtenir des infos … Mouais, Nintendo aurait pu faire mieux dans la répartition des octets !
On se rend vite compte que les données des joysticks sont vers le début, et celles des boutons vers la fin .
Mais aussi que lors de la première “mesure”, la manette renvoie une fausse mesure: que des 11111111, sauf 110 au dernier octet.
En gros:
1er-2e-3e octets: joysticks
4e octet: L-R
5e octet: L-R (encore), un morceaux de croix (directionnelle) et les boutons + - HOME
6e octet: un autre morceux de croix directionnelle, ABYX, Zr, Zl

Voilà fini :wink: Plus qu’a faire un parseur, mais là j’ai un peu la flème … Et au passage, y’a un piti bug sur les octet:

10011101
11100
11101101
11111110
11111111
11111111
110

Y’en a de décalés, j’ai pas pris ça en compte pour mon “étude” vu que le 110 à la fin ne bouge pas (signature ?) (et aussi que j’avais une grosse flème de prendre le décalage en compte :grin:)

Si quelqu’un arrive à faire un parseur/une lib (avant moi :p) avec mes travaux, ce serai bien de me citer (au moins dans la source, ça fait toujours plaisir) merci .

PS: je n’ai trouvé aucune explication sur le fonctionnement de cette manette sur le net, j’ai tout fait tout seul !