Controlar WiiMote desde C#

     Llevaba tiempo oyendo acerca de la simplicidad de las WiiMoteLib, pero dado que no habia pasado la Wii por mis manos no habia podido tocarlas, por fin tengo el WiiMote en casa, y como es obvio habia que empezar a trastear. Este es un codigo simple de como conectar y hacer unas lecturas del acelerometro, ideal para adentrarse en el manejo de este dispositivo.

     Primero conectamos con cualquier programa gestor de dispositivos bluetooth, al WiiMote presionado los botones 1 y 2 a la vez, y lo conectamos como raton, interfaz humana, HID, … o como tu gestor lo denomine.

     Ahora toca agregar como referencia a nuestro proyecto la libreria WiimoteLib.dll y empezamos a picar codigo, se declaran variables globales en la clase que estamos programando:


private Wiimote mWiimote;
WiimoteCollection mWC;
private delegate void UpdateWiimoteStateDelegate(WiimoteChangedEventArgs args);

 

     Una vez declarados los objetos con los que trabajaremos declaramos las funciones encargadas de la gestion:

private void ManejaWiiMote()

{


int index = 1;
mWC =
new WiimoteCollection();
try
{

//Buscamos todos los WiiMotes existentes


mWC.FindAllWiimotes();

}

catch (Exception ex)

{

//Aplicamos nuestro protocolo de errores (por ejemplo log4net)

}

 

//Se tratan todos los WiiMote


foreach (Wiimote wm in mWC)

{

// Conectamos con el WiiMote


wm.WiimoteChanged += wm_WiimoteChanged;
wm.Connect();

if (wm.WiimoteState.ExtensionType != ExtensionType.BalanceBoard)
wm.SetReportType(
InputReport.IRExtensionAccel, IRSensitivity.Maximum, true);

//Asignamos el numero de led a encender en WiiMote


wm.SetLEDs(index++);

}

}

void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs e)

{

UpdateState(e);

}

public void UpdateState(WiimoteChangedEventArgs args)

{

WiimoteState ws = args.WiimoteState;



//Con el mando como si jugaras al MarioKart
//Y = -0,9 Izquierda -0,0 | 0 | 0,1 Derecha 0,9
//Z = -0,9 Decelera -0,0 | 0 | 0,1 Acelera 0,9



if (ws.AccelState.Values.Y > 0.5)
{

//Has girado el mando a la derecha, puedes llamar las funciones pertinentes a esta accion.

}

if (ws.AccelState.Values.Y < -0.5)
{

//Has girado el mando a la izquierda, puedes llamar las funciones pertinentes a esta accion.

}

if (ws.AccelState.Values.Z > 0.5)
{

//Has girado el mando hacia delante, puedes llamar las funciones pertinentes a esta accion.

}

if (ws.AccelState.Values.Z < -0.5)
{

//Has girado el mando hacia atras, puedes llamar las funciones pertinentes a esta accion.

}

}

 

     Desde aqui podeis seguir trabajando con el resto de la informacion que proporciona estas librerias.

 

8 comentarios en “Controlar WiiMote desde C#”

  1. hola… mira muy interesante pero queria saber que version del wiimotelib estas usando porque no me reconoce la clase WiimoteCollection… o ésta se trata de una clase creada por ti?

  2. Muy interesante todo lo que podemos hacer con el Wiimote sin embargo tengo problemas con el WiimoteColletion, el error que me da es: error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres ‘WiimoteColletion’ (¿falta una directiva using o una referencia de ensamblado?)

    Estoy usando la siguiente instrucción
    public static WiimoteCollection mWC; que es similar a la que propones, de hecho reemplacé la mía con la estructura tuya y me genera el mismo error.

    Ahh también tengo agregado la Wiimotelib.dll como referencia….

    Gracias de antemano por cualquier ayuda!

  3. Gracias mayelo799, esa justamente es la que estoy utilizando, tendrá que ver con la versión de compilador estoy usando Visual Studio 2005, ustedes que usan?

  4. Prueba con esta:

    WiimoteCollection mWC = new WiimoteCollection();

    la mayoria de las intrucciones que e visto en diversas aplicaciones estan declaradas de esta forma.

  5. hola!, querria hacerme un juego para el ordenador y aprovechar el mando de la wii y sobre todo asi aprender algo :)el objetivo es hacer un bingo, si muy facil y con el mando de la wii simular un palo que remueve la caja donde están las bolas, lo que pasa es que si uso ws.AccelState.Values, solo me detecta los giros en el eje del mando y mi idea es tener el mando fijo y moldear el movimiento circular del mando (como hacen en el sorteo de navidad xD), se puede hacer sin usar infrarrojos solo con el bluetooh? es que no se me ocurre (si soy un poco ceporro xD), gracias por todo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *