Stap 9: Het lezen van de Wii Classic Controller
De Wii Classic Controller heeft een adres van 0x52, die moet worden opgegeven als de eerste byte van alle I2C overbrengingen zodat het weet dat het te worden gesproken.In de broncode van onze project initialiseren we de Wii Classic Controller door:
- Initialiseren van de TWI/I2C-module van de AVR, waardoor de pull-up weerstanden
- Verzenden van het 0x40 0x00
- Verzendt het een reeks valse coderingssleutels, dus de decodering is gemakkelijk
De gegevens op de bus te reizen nadat deze initialisatie zijn uitgevoerd zal nog steeds worden gecodeerd, maar aangezien wij heb net gaf het de valse sleutels, weten wij precies hoe te ontsleutelen. Zie broncode voor meer informatie.
In de hoofdlus van het Wetboek, de gegevens worden gelezen van de Wii Classic Controller door
- Verzenden 0x00, dit stelt een lees pointer
- 6 bytes aan gegevens lezen uit het
Hier is de notatie van de gegevens voor de 6 bytes aan gegevens die we van de Wii Classic Controller worden gelezen:
Bits | ||||||||
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 zijn de linker analoge Stick X en Y (0-63), RX en RY zijn de juiste analoge Stick X en Y (0-31) en LT en RT zijn de links en rechts Triggers (0-31). De linker analoge Stick heeft tweemaal de precisie van de andere analoge waarden.
BD {L, R, U, D} zijn de toetsen D-stootkussen. B {ZR, ZL, A, B, X, Y, +, H-} zijn de aparte knoppen. B {LT, RT} zijn de digitale knop Klik van LT en RT. Alle knoppen zijn 0 wanneer gedrukt.
Krediet aan http://wiibrew.org/wiki/Wiimote/Extension_Controllers voor deze waardevolle informatie.
In ons project, moet de gegevensindeling worden verzonden via USB in dit formaat:
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
0 byte | Knop | Knop | Knop | Knop | Knop | Knop | Knop | Knop |
Byte 1 | Knop | Knop | Knop | Knop | Knop | Knop | Knop | Knop |
Byte 2 | Linker Stick X as als ondertekende Char Integer | |||||||
Byte 3 | Linker Stick Y as als ondertekende Char Integer | |||||||
Byte 4 | Juiste Stick X as als ondertekende Char Integer | |||||||
Byte 5 | Juiste Stick Y as als ondertekende Char Integer |
Onze broncode doet een beetje eenvoudige binaire wiskunde voor het uitvoeren van de transformatie. Merk op dat knoppen moet 1 wanneer gedrukt zodat we de knop gegevens van de Wii Classic Controller omkeren.
Wanneer de microcontroller wordt opgestart, duurt ook een referentiecentrum voor de joysticks te kalibreren, hoeft het lezen, de waarde van dit centrum wordt gecombineerd met een verschuiving van low-pass-gefilterd om te elimineren lawaaierige lezingen.
Zie de hele broncode voor meer details.
Ik heb ook toegevoegd een logic analyzer-sessiebestand (.logicsession-bestand, kan worden bekeken met Saleae logica 1.1.9), en een tekstlogboekbestand voor indeling van I2C communicatie met de Wii Classic Controller. U kunt deze downloaden en de mededeling van de diepgaande studie.