sábado, 26 de octubre de 2013

Wii Classic Controller

http://www.flickr.com/photos/hdaniel/10499561965/in/set-72157633601027807/
Wii Classic Controller, originally uploaded by hdaniel.

Hace rato que debí postear este mensaje (la fecha del programa fuente indica 9 de junio del 2013) así que voy a aprovechar mientras se actualiza Pidora.

Echar a andar un control Wii Nunchuck en la Raspberry Pi no tiene ningún chiste, tal como dice Resident Bull. Echar a andar un Control Clásico Wii tampoco debe tener mucho chiste :-P. De eso trata este post.

Materiales:

  • 1 Raspberry Pi (y todo que lleva alrededor, por supuesto)
  • 1 Control Clásico Wii
  • 1 Adaptador WiiChuck
  • 4 cables jumper F-F

Conexiones:

De la Raspberry Pi al Adaptador WiiChuck:

  • Pin 1 a "+".
  • Pin 6 a "-".
  • Pin 3 a "d".
  • Pin 5 a "c".

Al igual que el Wii Nunchuck, el Control Clásico envía un paquete de datos I2C de 48 bits. Pero el formato es totalmente diferente:

  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 BDR BDD BLT B- BH B+ BRT 1
5 BZL BB BY BA BX BZR BDL BDU

Allí caben: los joysticks analógicos izquierdo (LX,LY) y derecho (RX,RY); dos disparadores LT, LR; el D-Pad: arriba, abajo, izquierda, derecha; y un titipuchal de botones: A, B, X, Y, ZL, ZR, +, -, HOME, LT y LR (sí, los disparadores también tienen botones).

Decodificar semejante estructura de datos requiere de unas de las tres virtudes del programador: lazziness. En lugar de andar aplicando máscaras y corrimientos cada vez que tienes que utilizar un dato, lo mejor es dejar que el compilador de encargue de todo eso:

struct wii_classic {
  unsigned lx:6;
  unsigned rx43:2;
  unsigned ly:6;
  unsigned rx21:2;
  unsigned ry:5;
  unsigned lt43:2;
  unsigned rx0:1;
  unsigned rt:5;
  unsigned lt20:3;

  unsigned padding:1;
  unsigned brt:1;
  unsigned bplus:1;
  unsigned bhome:1;
  unsigned bminus:1;
  unsigned blt:1;
  unsigned bdd:1;
  unsigned bdr:1;

  unsigned bdu:1;
  unsigned bdl:1;
  unsigned bzr:1;
  unsigned bx:1;
  unsigned ba:1;
  unsigned by:1;
  unsigned bb:1;
  unsigned bzl:1;
};

En http://xml.cie.unam.mx/~hdcg/pub/wiiclassic.c se puede bajar un pequeño programa de prueba (basado en el de Ressident Bull. La salida del programa se verá más o menos como lo siguiente:

./wiiclassic 
0x00 0x00 0xa4 0x20 0x01 0x01
33/30:15/16: 2/ 3; du dd dl dr a b x y lt zl zr rt minus home plus

Las primeros tres pares de números son los valores LX/LY:RX/RY:LT/LR. En seguida los valores del D-Pad: arriba (du), abajo (dd), izquierda (dl), derecha (dr). Y para terminar todos los botones. Cuando presiones un botón, se escribirá con MAYÚSCULAS.

Me quedan otros posts pendientes con la Pi y con el Arduino, pero por lo pronto es todo. ¡Felices códigos!