Paso 9: Leer el controlador clásico de Wii
El mando clásico de Wii tiene una dirección de 0x52, que debe especificarse como el primer byte de todas las transmisiones de I2C, por lo que sabe que se habla a.En nuestro código fuente del proyecto, inicializamos el mando clásico de Wii por:
- Inicializar el módulo I2C/TWI del AVR, habilitar las resistencias pull-up
- Enviarlos a 0x40 0x00
- Enviar una secuencia de claves de cifrado falso, así que el descifrado es fácil
Todavía se cifrarán los datos que viajan en el autobús después de esta inicialización se han realizado, pero ya nos hemos a sólo le dio las llaves falsas, sabemos exactamente cómo descifrarla. Ver el código fuente para más detalles.
En el bucle principal del código, los datos son leídos desde el mando clásico de Wii por
- Enviar 0 x 00, esto establece un puntero de lectura
- Lectura 6 bytes de datos de él
Aquí está el formato de datos para los 6 bytes de datos que podemos leer desde el controlador clásico de Wii:
Poco | ||||||||
Bytes | 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 son izquierda Analog Stick X e Y (0-63), RX y RY son derecha Analog Stick X e Y (0-31), y LT y RT son izquierdo y derecho desencadenadores (0-31). El Stick analógico izquierdo tiene dos veces la precisión de los valores analógicos.
BD {L, R, U, D} son los botones de dirección del D-Pad. B {ZR, ZL, A, B, X, Y + H,-} son los botones discretos. B {LT, RT} son el clic de botón digital de LT y RT. Todos los botones son 0 al presionar.
Gracias a http://wiibrew.org/wiki/Wiimote/Extension_Controllers por esta valiosa información.
En nuestro proyecto, el formato de datos debe ser enviado a través de USB en este formato:
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Byte 0 | Botón | Botón | Botón | Botón | Botón | Botón | Botón | Botón |
Byte 1 | Botón | Botón | Botón | Botón | Botón | Botón | Botón | Botón |
Byte 2 | Joystick izquierdo X eje entero firmado Char | |||||||
Byte 3 | Joystick izquierdo Y eje entero firmado Char | |||||||
Byte 4 | Palo derecho X eje entero firmado Char | |||||||
Byte 5 | Palo derecho Y eje entero firmado Char |
Nuestro código hace un poco de matemáticas binario simple para llevar a cabo la transformación. Tenga en cuenta que los botones deben ser 1 cuando presiona para que invierta los datos botón del controlador clásico de Wii.
Cuando arranca el microcontrolador, también tiene un centro de referencia de los joysticks calibrarlo, este valor de centro es combinado con un desplazamiento de filtro de paso bajo para eliminar ruidosas lecturas.
Ver el código fuente completo para más detalles.
Yo también he conectado un archivo de sesión del analizador de lógica (el archivo .logicsession, se puede ver con Saleae Logic 1.1.9) y un archivo de registro de formato de texto de la comunicación I2C con el mando clásico de Wii. Puedes descargar estos y estudio de la comunicación profunda.