Showing posts with label como funciona el wiimote. Show all posts
Showing posts with label como funciona el wiimote. Show all posts

Wednesday, September 17, 2008

HID my ass...

Interfaz HID
El estándar HID, permite que los dispositivos se puedan describir a si mismos, utilizando un bloque descriptor de HID. Este bloque incluye una enumeración de reportes que el dispositivo entiende.Un reporte, puede ser visto como un puerto de una red, que está asigando con algún servicio en particular. La única diferencia, es que los reportes son unidireccionales, y el descriptor HID lista para cada puerto la dirección, ya sea de salida o de entrada, también dice cual sera el tamaño payload para cada uno de los puertos. Como todos los dispositivos HID, el Wiimote reporta su bloque descriptor HID, cuando se le pide información usando el protocolo SDP. Su descriptor, se ve de la siguiente forma:



Salidas





















Salidas:
ID del Reporte Tamaño
Payload
Función
0x11 1 Player LEDs, Rumble
0x12 2 Tipo de reporte/ID
0x13 1 Habilita el sensor infrarojo
0x14 1 Habilita bocina
0x15 1 Controla el estátus
0x16 21 Escribe datos
0x17 6 Lee datos
0x18 21 Le da datos a la bocina
0x19 1 Pone a la bocina en silencio
0x1a 1 Habilita el sensor infrarojo 2

Entradas






























Entradas:
Reporte ID Tamaño
Payload
Función
0x20 6 Puerto de expansión
0x21 21 Lee datos
0x22 4 Escribe datos
0x30 2 Es sólo para los botonesButtons only
0x31 5 Da un reporte de sensado de los botones.
0x32 16 Es puerto de expansión para los botones
0x33 17 Da un reporte del sensado del movimiento , así como de los botones.
0x34 21 Puerto de expansión del infrarojo
0x35 21 Da un reporte del sensado del movimiento , así como de los botones.
0x36 21 Da un reporte del sensado del movimiento , así como de los botones.
0x37 21 Da un reporte del sensado del movimiento , así como de los botones.
0x38 21 Da un reporte del sensado del movimiento , así como de los botones.
0x3d 21 Da un reporte del sensado del movimiento , así como de los botones.
0x3e 21 Da un reporte del sensado del movimiento , así como de los botones.
0x3f 21 Da un reporte del sensado del movimiento , así como de los botones.


Nótese que "salida" se refiere a paquetes, que son enviados del host al wiimote, y "entrada" se refiere a paquetes que van del Wiimote al host.

La notación de escritura, que se llevará acabo, es:

Incluir la cabecera del Bluetooth en paréntesis, el ID del reporte, y finalmente el payload. Cada byte se escribe en hexadecimal, sin tomar el prefijo 0x y separado por espacios.
Por ejemplo:
(a1) 30 00 00

Es un paquete de datos de entrada (0xa1), en el canal 0x30, con 2 bytes de payload 0x00, 0x00.

You got an incomming call from Mr. Wiimote

Comunicaciones.
El Wiimote se puede comunicar a la computadora, vía Bluetooth. El controlador Bluetooth que se utiliza es el chip Broadcom 2042. El cual es diseñado para ser utilizado con dispositivos, que siguen el estándar Bluetooth de dispositivos de Interfaces Humanas, (HID por sus siglas en inglés) como pueden ser teclados o mice. El Bluetooth HID se basa directamente en el estándar USB, y mucha de la misma documentación es aplicable.


La computadora, le puede pedir información al Wiimote, mediante el protocolo de descubrimiento de servicios, (SDP, por sus siglas en inglés). En este caso, el Wiimote reportará y regresará una gran cantidad de información.
En particular reporta:
Nombre :Nintendo RVL-CNT-01
ID Vendedor0:x057e
ID del Producto :0x0306


El Wiimote envía reportes al host, con una frecuencia máxima de 100 reportes por segundo. Del estándar Bluetooth, El Wiimote no utiliza ninguna de sus validaciónes o codificaciónes.


Ahora bien, para que la computadora tenga conexión con él, uno debe poner al control en modo de descubrimiento de servicios, esto se logra al apretar los botones 1 y 2 al mismo tiempo, o al apretar el botón rojo de sincronización, que se encuentra en la parte de atrás, cerca de la batería. Una vez que se encuentra en este modo, el HID driver del host, puede empezar a pedirle información al Wiimote.
Pero, si el driver HID del host no logra conectarse con el Wiimote, en menos de 20 segundos, el Wiimote se apagará . Apretando los botones 1 y 2 continuamente, hará que el Wiimote, se tenga que mantener en modo de descubrimiento, por lo que no se apagará. Esto, no funciona cuando se utiliza el botón de sincronizar.
Cuando se encuentra en modo de descubrimiento, los LEDS del Wiimote parpadearán. El número de parpadeos es directamente proporcional con lo que le queda de vida a la pila.

Tuesday, September 16, 2008

What wiitle Wiimote gives out...

El Wiimote (Control Remoto Wii ) es el control principal de la consola Wii de Nintendo. Sus características más destacables son la capacidad de detección de movimiento en el espacio y la habilidad de apuntar hacia objetos en la pantalla. Este control, se está usando mucho ya, en video juegos, que pueden ser corridos en una PC, sin necesidad de la consola Wii. El Wiimote mantiene comunciación con la computadora, mediate Bluetooth.

Analicemos ahora, la salidas que posee este control

Salidas:

LEDS:Se encuentran en la punta del control, son 4 LEDS azules. Mientras se está jugando, estos LEDS se usan para indicar que el wiimote se encuentra en modo descubrible de Bluetooth (cuando parpadea, indica el nivel de batería) también sirven estos LEDS, para indicar el número de jugador al que corresponde ese control. (si es el número de jugador es 2, se prenderían dos LEDS) Los LEDS se pueden controlar de manera independiente.

Rumble:
El rumble se da via un motor, que posee un peso desbalanceado, este motor puede ser activado para hacer así que el control vibre. El motor puede ser activado, al enviar un paquete de salida
[SET_REPORT] a los canales 0x11, 0x13, 0x14, 0x15, 0x19 o 0x1a con el bit menos significativo puesto en: (52) 13 01
La vibración, se puede eliminar al poner ese bit en cero: (52) 13 00
Se puede utilizar cualquiera de los canales anteriores, aunque el canal 0x11 no es muy recomendable, ya que también se usa para controlar a los LEDS .


Bocina:
El Wiimote, posee una pequeña bocina de baja calidad, la cual se utiliza para dar durante el juego efectos de sonidos cortos. El flujo de sonido que se debe tocar, se obtiene del host directamente.
La bocina, es controlada mediante 3 reportes de salida, el reporte 0x14 se utiliza para habilitar o deshabilitar la bocina. Al poner en alto el segundo bit, se habilita la bocina, y al ponerlo en bajo, se deshabilita. Por ejmplo, para habiliar la bocina, se enviaría: (52) 14 04
El reporte 0x19, se usa para silenciar o des-silenciar la bocina, funciona de la misma manera, que el reporte 0x14. 0x04 callaría a la bocina, y 0x00 haría que nuevamente sonará. (Una especie de mute y de unmute!)
El reporte 0x18, se usa para enviar datos de sonido a la bocina. 1-20 bytes se pueden enviar en un sólo paquete.
Ejemplo de un paquete que se podría enviar a la bocina:
(52) 18 LL DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD

LL especifica el tamaño del dato que se enviará. Los bytes DD son el dato de sonido. Cuando el dato, posee un tamaño que es menor al de 20 bytes, se deben rellenar los lugares restantes. Los datos de sonido, por otro lado, se deben enviar a una frecuencia adeucada, se puede escojer la freucncia de muestreo durante la inicialización.

Secuencia de Inicialización de la bocina.
Las siguientes secuencias, inicializarían a la bocina:

*Habilita la bocina (Envia 0x04 la salida del reporte 0x14)
*Pon en silencio a la bocina (Envia 0x04 a la salida del reporte 0x19)
*Escribe 0x01 al registro 0x04a20009
*Escribe 0x08 al registro 0x04a20001
*Escribe una configuración de 7 byte a los registros 0x04a20001-0x04a20008
*Escribe 0x01al registro 0x04a20008 (La configuraión de 7 byte de la bocin, controlan justo la configuarión de la bocina, como es su frecuencia de muestreo. )
*Regresa el sonido a la bocina (Envía 0x00 al reporte de salida 0x19)

Formato del dato de sonido: Parece ser un sonido ADPCM de 4 bits. ADPCM (Adaptive Differential Pulse Code Modulation) utiliza una modulación, de modo que en vez de cuantificar la señal directamente, como el PCM, cuantifican la diferencia entre la señal y una predicción hecha a partir de la señal, por lo que se trata de una codificación diferencial

Monday, September 08, 2008

Las entradas del Wiimote

Aquí un poco de información, acerca de las entradas que tiene nuestro querido Wiimote:


Botones

Existen 12 botones, en el wiimote, 4 de ellos están en la cruzecita que sirve para dar dirección, y los demás están exparcidos a lo largo de todo el control.

Cuando algún botón, se presiona o se suelta, un paquete es enviado a la comptadora via un reporte de entrada HID (Un reporte HID se usa para transimitir datos de tipo HID control de y hacia dispositivos HIDClass, es importante aclarar de una vez, que un HD control, es una fuente de información ascoiada a un HIDClass devicereport) 30H, este paquete contiene una máscara de bit, con el estado actual de todos los botones. El estado de los botones, parece siempre incluirse en todos los reportes que brinda el Wimote a la computadora, esta información suele estar en los primeros dos bits.

Por ejemplo, cuando se presiona el boton A, el paquete de entrada HID DATA que recibe la computadora es:

 (a1) 30 00 08

y cuando se suelta, el paquete que se recibe es:

(a1) 30 00 00

La asignación de bit para los botones es:

Botón Numero (dec) Valor (hex)
Two 1 0x0001
One 2 0x0002
B 3 0x0004
A 4 0x0008
Minus 5 0x0010
? motion ? 6 0x0020
? motion ? 7 0x0040
Home 8 0x0080
Izquierda
9 0x0100
Derecha
10 0x0200
Abajo
11 0x0400
Arriba
12 0x0800
Más
13 0x1000
? motion ? 14 0x2000
? motion ? 15 0x4000
? Reading Mii ? 16 0x8000

El boton de encendido, es inusual debido a que cuando se aprieta, envia una petición de desconectar en vez de enviar un código normal de botón

Sensor de movimiento:




Tanzmaus


El movimiento del control, se sensa gracias a un acelerometro de 3 ejes lineal localizado a la izquierda de donde está el botón A. El circuto integrado es el ADXL330 , el cual es construido por Analog Devices. Este dispositivo se calibra para que pueda medir aceleraciones que se encuentran en un rango de +/- 3g con 10% de sensiblidad.

Dentro del chip, se encuentra una pequeña estructura micromecánica, la cual es sujetada por unos resortes hechos de silicon. Mediciones de diferencias en capacitancias, permiten que el desplazamiento neto de la pequeña masa, pueda ser convertido en un voltaje, el cual es digitalizado. Es importante aclarar, que el sensor no mide la aceleración del Wiimote, sino la fuerza ejercida por la masa de prueba a los resortes que la sujetan. Gracias a la convención de signo que se usa, esa cantidad es proporcional a la fuerza neta que ejerce la mano del jugador sobre el wiimote cuando lo agarra. Por eso, cuando se deja el wiimote sobre una mesa, el acelerometro marca la fuerza vertical de +g (la masa puede ser normalizada en unidades arbitrarias) y cuando cae se reporta una fuerza de casi zero.


El sensor utiliza un sistema coordenado de mano derecha, con el eje X positivo a la izquierda, y ele eje Z positivo apuntando hacia arriba.

El Wiimote, no suele reportar lecturas de los sensores a la computadora, aunque si se peuden pedir estos valores, al enviar al canal 0x12 SET_REPORT:


 (52) 12 00 31

El tercer byte de la cadena anterior es una máscara de bit. 0x01 habilita el rumble o el vibreo del wiimote, 0x04 habiltia que las salida sean continuas. si 0x04 no está habilitado, los paquets sólo se sacan cuando sus valores cambian. (casi siempre, si es que el sensor de movimiento esta habilitado) . El Wiimote enivará a la computadora paquetes , donde los bytes 5, 6 y 7 contienen información acerca de las lecturas de X, Y y Z en el acelerómetro.

Un ejemplo del paquete que se envia cuando el Wiimote esta acostado hacia arriba en una mesa es:


 (a1) 31 40 20 86 8a a5

donde 0x86 es la medicion del eje de la X, 0x8a es la lectura en el eje Y, 0xa5, es la lectura en el eje Z.

Se pueden escojer otro canales para los reortes de movimientos, como peude ser 0x31, 0x33, 0x35, 0x37, 0x3e y 0x3f. Si 0x3e o 0x3f son seleccionados, entocnes las lecturas de los sensores se alternarán entre estos dos canales.

Se pude parar de hacer reportes de movimiento, al enviar al canal de salida un 0x30.
 (52) 12 00 30

Parece ser, que modo del canal es relamente un modo selección por máscara de bits. La salida de los botones, siempre se haya habilitada. el modo 0x30 son sólo boones, 0x31 es sólo sensado de movimiento, 0x32 se cree que es la cámara infraroja, y 0x33 es tanto la cámara infraroja, como el sensor de movimeinto.




Calibracion:
Los puntos de inicio, es decir los puntos que se consideran cero, asi como los valores de gravedad para los 3 ejes del acelerometro, se guardan al principio de la memoria Flash del Wiimote. La informacion se empieza a guardar apartir de la direccion 0x16 de la memoria. Esta informacion se repite en la direccion

0x20.0x16 punto cero para el eje X
0x17 Punto cero para el eje Y
0x18 Punto cero para el eje Z
0x19 no se sabe que guarda
0x1A +1G punto para el eje X
0x1B +1G punto para el eje Y
0x1C +1G punto para el eje Z
0x1D no se sabe
0x1E-0x1F checksum?