Étape 9: Lecture de la Wii Classic Controller
La manette classique Wii a l’adresse 0 x 52, qui doit être spécifié comme le premier octet de toutes transmissions I2C afin qu’il sache qu’il est parlé à.Dans le code source de notre projet, nous initialisons la manette classique Wii par :
- Lors de l’initialisation du module de TWI/I2C de l’AVR, permettant les résistances de pull-up
- Envoyer 0x40 0x00
- Envoyer une séquence de chiffrement fausses clés, ainsi que le décryptage est facile
Les données circulant sur le bus après avoir effectué cette initialisation seront toujours chiffrées, mais étant donné que nous avons juste lui donnait les clés de fausses, nous savons exactement comment le déchiffrer. Voir le code source pour plus de détails.
Dans la boucle principale du code, les données sont lues dans la manette classique Wii par
- Il envoi 0 x 00, cette commande définit un pointeur de lecture
- Lire les 6 octets de données dans
Voici le format de données pour les 6 octets de données que nous avons lu de la manette classique Wii :
Bit | ||||||||
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | RX< 4:3 > | LX< 5:0 > | ||||||
1 | RX< 2:1 > | LY< 5:0 > | ||||||
2 | RX< 0 > | LT< 4:3 > | RY< 4:0 > | |||||
3 | LT< 2:0 > | RT< 4:0 > | ||||||
4 | B DR | B DD | B LT | B- | B H | B+ | B RT | 1 |
5 | B ZL | B B | B Y | B A | B X | B ZR | B DL | B DU |
LX, LY sont gauche Analog Stick X et Y (0-63), RX et RY sont droite Analog Stick X et Y (0-31) et LT et RT sont la gauche et la droite déclencheurs (0-31). Le Stick analogique gauche a deux fois la précision des autres valeurs analogiques.
BD {L, R, U, D} sont les boutons de direction D-Pad. B {ZR, ZL, A, B, X, Y, +, H,-} sont les touches discrètes. B {LT, RT} sont le clic de bouton numérique de LT et RT. Tous les boutons sont 0 lorsque vous appuyez sur.
Merci à http://wiibrew.org/wiki/Wiimote/Extension_Controllers pour cette précieuse information.
Dans notre projet, le format de données doit être envoyé via USB dans ce format :
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Octet 0 | Bouton | Bouton | Bouton | Bouton | Bouton | Bouton | Bouton | Bouton |
Octet 1 | Bouton | Bouton | Bouton | Bouton | Bouton | Bouton | Bouton | Bouton |
Octet 2 | Axe du stick analogique gauche X as Integer signé Char | |||||||
Octet 3 | Axe du stick analogique gauche Y as Integer signé Char | |||||||
Octet 4 | Axe du Stick droit X as Integer signé Char | |||||||
Octet 5 | Axe du Stick droit Y as Integer signé Char |
Notre code source fait un peu de mathématiques binaires simples pour effectuer la transformation. Notez que les boutons doit être 1 pressée donc nous inversons les données de bouton de la manette classique Wii.
Le microcontrôleur au démarrage, il faut également un centre de référence de lecture pour le joysticks pour l’étalonner, cette valeur de centre est combinée avec un décalage de low-pass-filtrée pour éliminer les lectures bruyants.
Voir le code source entier pour plus de détails.
J’ai également joint un fichier de session analyseur logique (.logicsession fichier, peut être affichée avec une Logique de Saleae 1.1.9) et un fichier journal au format texte de la communication I2C avec la manette classique Wii. Vous pouvez télécharger ces et étudier la communication approfondie.