USB-Wii Classic Controller (10 / 18 steg)
Steg 9: Läsa Wii Classic Controller
Wii Classic Controller har en adress för 0x52, som måste anges som den första byten i alla I2C överföringar så den vet att det är att vara talat med.I våra projekt källkod initiera vi Wii Classic Controller av:
- Initierar TWI/I2C modulen för AVR, aktivera pull-up motstånd
- Skicka 0x40 0x00
- Skicka en sekvens av falska krypteringsnycklar, så dekryptering är lätt
Kommer fortfarande att krypteras data reser på bussen efter denna initieras har utförts, men eftersom vi har bara gav det falska nycklarna, vi vet exakt hur att dekryptera den. Se källkoden för detaljer.
I de viktigaste loop av koden läses data från Wii Classic Controller av
- Skicka det 0x00, detta anger en Läs pekare
- Läser 6 byte data från det
Här är dataformatet för de 6 byte data som vi läser från Wii Classic Controller:
Bitars | ||||||||
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 är vänster Analog Stick X och Y (0-63), RX och RY är rätt Analog Stick X och Y (0-31) och LT och RT är vänster och höger Triggers (0-31). Den vänstra analoga spakens har två gånger precision av andra analoga värden.
BD {L, R, U, D} är knapparna D-Pad riktning. B {ZR, ZL, A, B, X, Y, +, H,-} är de diskreta knapparna. B {LT, RT} är att digitala knappen Klicka på LT och RT. Alla knappar är 0 när du trycker på.
Kredit till http://wiibrew.org/wiki/Wiimote/Extension_Controllers för denna värdefulla information.
I vårt projekt, måste dataformatet som skickas via USB i detta format:
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Byte 0 | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen |
Byte 1 | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen |
Byte 2 | Vänster styrspak X Axis som signerade Char heltal | |||||||
Byte 3 | Vänster styrspak Y axeln som signerade Char heltal | |||||||
Byte 4 | Rätt pinne X Axis som signerade Char heltal | |||||||
Byte 5 | Rätt pinne Y axeln som signerade Char heltal |
Vår källkod gör lite av enkla binära matematiska att utföra omvandlingen. Observera att knappar måste vara 1 när man trycker så vi Invertera knappen data från Wii Classic Controller.
När mikrokontroller startar upp, det tar också en referens center läsning för joysticks att kalibrera den, detta center värde kombineras med ett low-pass-filtrerad offset till eliminera bullriga avläsningar.
Se hela källkoden för mer detaljer.
Jag har även bifogat en logik analyzer sessionsfil (.logicsession-fil, kan ses med Saleae logik 1.1.9), och en text format loggfil I2C kommunikation med Wii Classic Controller. Du kan ladda ner dessa och studera kommunikationen djupgående.