Juega a tu Nintendo 64 con tu mando de la Wii y arduino

¿Alguna vez has pensado cómo sería jugar a tu juego favorito de tu nintendo 64 con un wiimote? Yo sí, quería dar espadazos con Link en Ocarina of Time y con la ayuda de mi querido arduino he podido cumplirlo!. Se que podría haber usado un emulador pero… donde queda el romanticismo? 😛

Antes de nada, os pongo un vídeo del resultado.

[youtube]http://www.youtube.com/watch?v=HBf7m3zylcA[/youtube]

 

Sí, ese es el menda jugando. ¿Te interesa saber cómo puedes hacerlo? Si es así sigue leyendo, de lo contrario sólo perderás tu tiempo.

Lo primero y antes de nada tengo que decir que mi código del arduino es una vil copia del proyecto Gamecube-N64-Controller. Ese proyecto permite jugar a la nintendo 64 con un mando de la gamecube. De ahí básicamente saqué el protocolo de comunicación y las funciones para “dialogar” con la n64 (que ya es bastante!!).

También tengo que aclarar que jugar con el wiimote es bastante más complicado. El stick del nunchuk es bastante mediocre comparado con el joystick de la nintendo 64 (para mi uno de los mejores que han existido), de ahí mi manqueo a la hora de apuntar a ganondorf con el arco. El segundo motivo es que el juego está preparado para responder a una única pulsación, entonces responderá sólo cuando hayamos terminado el movimiento lo cual implica movimientos “retardados”. Es mucho más rápido pulsar un botón que hacer el gesto del movimiento de la espada.

Ahora voy a explicar más o menos como funciona la cosa. Tenemos un mando de la wii con nunchuk y queremos jugar a la nintendo 64. El primer problema que se nos plantea es que el mando de la n64 va por cable mientras que el wiimote es inalámbrico. Mi solución ha sido usar el ordenador como pasarela: el wiimote se conecta al ordenador por bluetooth y luego el ordenador mediante usb al arduino, quien simula ser un mando de n64. Si quieres hacer algo más profesional siempre puedes usar el módulo bluetooth para arduino y desarrollar una biblioteca de comunicación. Llegados a este punto vemos que necesitamos dos programas, uno para el arduino y otro para el ordenador. Vamos a ello.

Software para arduino

Nuestro arduino va a ser simplemente un enlace sin ningún tipo de lógica. Nosotros le enviamos los datos y directamente se lo sirve a la consola sin nada de procesamiento (en el proyecto de gamecube que mencioné antes, el arduino realiza las operaciones necesarias para convertir los comandos). El motivo es para que sea más práctico, así sólo es necesario modificar le programa de ordenador si queremos hacer cualquier cambio. La función loop del programa arduino se ha reducido bastante, ya que al recibir los datos preparaditos para enviar no tiene que hacer más que eso (recibir datos del ordenador por el puerto serie y tal cual mandarlos a la consola).

 

Software para ordenador

Utilizo la biblioteca cwiid desde python y en principio es multiplataforma (aunque sólo lo he probado en Linux). Doy por supuesto que tienes un dispositivo bluetooth funcionando y el software de arduino instalado. Este programa python también es sencillo. Lo que hace es conectarse al mando de la wii (usando cwiid), obtener las pulsaciones de botones y mandarlas al arduino. La verdad es que, sabiendo el protocolo del mando es muy sencillo pero llegar a manejar bien un protocolo cerrado de esos es un infierno. Voy a tratar de explicar (sin detalles técnicos) un poco como funciona.

Funcionamiento del mando de nintendo 64

La consola puede mandar 4 tipos de comandos diferentes al mando. Estos son de identificación, de estado, de lectura y de escritura. Los dos últimos, hasta lo que yo se (recordemos que es un protocolo cerrado y vete tu a saber que más cosas hace) es para gestionar el rumble pack (un aparato que hace al mando vibrar). Cuando encendemos la consola, ésta manda el comando de identificación al que los mandos conectados (en nuestro caso el arduino) y éstos deben responder. Si no, la consola nos mostrará un bonito “NO CONTROLLER”. Por último, la consola nos manda el comando de estado cuando necesita saber que botones estamos pulsando. Cuando la consola nos pregunte por el estado nosotros respondemos. Al contrario de lo que mucha gente pueda pensar, no es el mando quien manda información todo el rato a la consola, sino que es la consola quién pregunta al mando todo el rato que botones hay pulsados. Nuestra labor va a ser que cuando la consola pregunte por esa información el arduino se la entregue.

Ahora veamos qué información es la que mandamos. El paquete con toda la información sobre el estado del mando (los botones pulsados) son 4 Bytes. De estos 4 Bytes, los dos primeros expresan el estado de los botones y los dos últimos la posición del joystick. Para el caso de los botones es bien sencillo, bit a 1 boton pulstado y bit a 0 boton no pulsado. De esta manera con 2 Bytes podemos representar 16 botones y como la consola tiene 14 pues incluso son sobran 2 bits. El contenido exacto de los bytes es este:

Byte 1: A, B, Z, Start, PadArriba, PadAbajo, PadIzquierda, PadDerecha

Entonces si tenemos pulsado el botón A, el primer byte será: 1 0 0 0 0 0 0 0, si pulsamos A y Z será: 1 0 1 0 0 0 0 0. Sencillo de entender, verdad?
El segundo byte contiene: 0, 0, BotonL, BotonR, C-Arriba, C-Debajo, C-Izquierda, C-derecha
Como dije antes nos sobran dos bits, que son esos dos primero bits que siempre valen 0.

Por último nos quedan los bytes para el joystick, el byte 3 contiene la posición X y el byte 4 la posición Y. Para representarlo se utiliza un byte con signo más o menos desde -80 a 80. Esto es muy importante ya que cuando mandemos la información en binario hay que tener muy claro lo que mandamos para que todo funcione bien y de manera sencilla (por eso en el programa python, al empaquetar los bytes los primero con con B, unsigned char, y los dos último son b, signed char). Nosotros generaremos ese paquete de 4Bytes y por el puerto serie se lo mandaremos al arduino.

Ya conocemos la teoría así que a programar. Yo he elegido python pero puedes usar el que te de la gana siempre y cuando generes bien esos 4 Bytes. El programa de arduino te servirá igual.

Obtener el código fuente

El código fuente lo he subido a github y por supuesto con licencia GPL. Puedes clonarlo usando esta dirección https://github.com/maxpowel/Wii-N64-Controller
Si ves algun fallo o quieres compartir una configuración de botones (sobretodo es interesante el tema del acelerómetro del wiiomte) te agradecería que me hicieras un pull request 😉

 

Montaje

Material:

  • Arduino (y su cable USB)
  • 2 Cablecitos
  • Nintendo 64
  • Ordenador
  • Bluetooth

Supongo que no tendrás problemas para conectar tu arduino y bluetooth a tu PC. El siguiente paso es conectar el cable de tierra de la conexión del mando a un pin de tierra del arduino usando uno de los cablecitos. El otro cable es para unir el pin 8 (puedes usar el pin que quieras, pero en el código uso el 8 ) con el de datos de la consola. El esquema de pines del mando es el siguiente:

  1. +3.3V – Alimentación. No lo usamos ya que el arduino tiene su propia alimentación.
  2. Datos – Conectado con el pin digital 8
  3. GND – Conectado a un pin de tierra de arduino

Nota: Recuerda que este es el esquema del mando y el de la consola quedará espejado (mirando de frente a la consola se usan los dos pines de la derecha). Espero no haberte líado con esto

Como nota, decir que siempre hay que encender primero el arduino antes que la consola ya que de otra manera no detectará ningún mando. Recuerda lo que dije antes de que la consola cuando se enciende “pregunta” a los mandos para ver qué hay conectado.

Para terminar un pequeño vídeo de como tengo montado el tinglao.

 

 

[youtube]http://www.youtube.com/watch?v=1a5wc_V0vO0[/youtube]

You may also like...

14 Responses

  1. DiCrEn dice:

    Eres el pedazo de friki más grande, más crack y mas jodidamente aburrido para hacer eso que conozco xDDDD

    Ya me dejarás echar una partidilla jeje

  2. ivan cebellan dice:

    esto es una genialidad ahora podre dar espadazos con el Ocarina of Time

  3. Maxpowel dice:

    Gracias a los dos! Ya estoy trabajando en el siguiente invento jeje

  4. Piastronaco dice:

    Deja el Arduino y ponte con Wixet!!! jeje

  5. Maxpowel dice:

    Yo sólo me dejo llevar, voy a rachas 😛
    Igual estoy un mes sin tocarlo y de repente me pongo una semana a tope

  6. Koi dice:

    Que pasote!! Sabes si se puede hacer al revés? Jugar con el mando de 64 en wii?

  7. Maxpowel dice:

    Buenas Koi, para hacerlo al revés yo utilizaría un puerto de mando de game cube. Sería incluso más sencillo ya que sólo con arduino y unos cables lo tienes. En el enlace que puse “Gamecube-N64-Controller” tiene justo lo que necesitarías para convertir las señales de N64 a gamecube, y luego eso iría conectado al puerto de la wii.

  8. Sergio dice:

    Hola Amigo me preguntaba si sabes como se capta los datos de los botones y joystick de un control de xbox 360 me ayudarias mucho gracias y saludos

  9. Maxpowel dice:

    Hola Sergio, en Linux yo utilizo esto https://help.ubuntu.com/community/Xbox360Controller

    Con esos drivers y un programa sencillo (como el que he hecho en python para la n64) puedes usar el mando para lo que quieras.

    Yo lo use para manejar con los gatillos un brushless motor 😛

  10. Roms Snes dice:

    Hola Max, felicidades por el tutorial, eres un crack !
    En mi wii instalé un emulador, el wii64 y me gustaría jugar con el mando clásico de wii, sabes si es posible ?
    No sé si es por el juego ya que solo lo probé con el Mario Party 1, 2 y 3 o si es por la incompatibilidad…
    Espero que puedas resolver mis dudas, gracias crack !

  11. jesus dice:

    Hola, te felicito por este gran tutorial y espero puedas ayudarme con lo que necesito:

    -tengo mi consola n64 y con arduino quiero fabricar un mando especial, una pistola en realidad. El cableado será sencillo, mediante pulsadores y pull up el arduino sabrá qué botón está presionado y deberá enviar la orden que le corresponda al n64 (lo que tú haces en este tutorial). Sin embargo, en tu tutorial el botón y conversión se hace todo con el control de wii y se procesa con el código en python, en cambio yo quiero que todo se haga en el arduino.

    Estaba pensando que el arduino lee sentencias como la siguiente:

    if(digitalRead(7) == 1){
    //enviar boton A
    }

    Cuando está presionado un botón tal como está en tu tutorial se carga al 1er o 2do byte el botón y se envía. He estado intentado hacer lo que te digo pero no logró hacerlo, creo que fallo con varias cosas:
    1. la creacion de los byte 1, 2, 3 y 4 y modificar los 0 y 1 dependiendo de los botones presionados, esto lo estaba haciendo así:

    byte b1 = 0;
    if(digitalRead(7) == 1){
    //boton A

    }

  12. jesus dice:

    Hola, te felicito por este gran tutorial y espero puedas ayudarme con lo que necesito:

    -tengo mi consola n64 y con arduino quiero fabricar un mando especial, una pistola en realidad. El cableado será sencillo, mediante pulsadores y pull up el arduino sabrá qué botón está presionado y deberá enviar la orden que le corresponda al n64 (lo que tú haces en este tutorial pero sin el control de wii). Sin embargo, en tu tutorial el botón y conversión se hace todo con el control de wii, se procesa con el código en python y arduino solo lee los byte y los envía al n64, en cambio yo quiero que todo se haga en el arduino.

    El mando que quiero hacer cuando está presionado un botón -tal como está en tu tutorial- se carga al 1er o 2do byte y se envía el dato. He estado intentado hacer lo que te digo pero no funciona, creo que fallo con varias cosas:

    1. la creación de los byte 1, 2, 3 y 4 y modificar los 0 y 1 de los dos primeros dependiendo de los botones presionados, esto lo estaba haciendo copiándome del código de python pero no sé si en arduino sea igual (no lo creo y tampoco sé dónde buscar esa información):

    byte b1 = 0;

    if(digitalRead(7) == 1){
    //boton A
    b1 = b1 | 0x80;
    }
    ¿lo de arriba está bien para cargar en el byte 1 el botón A?

    2. dejándo de lado el presionado de botones, cuando encendí el arduino y luego el n64 no detectaba el control (muestra que no hay ninguno conectado), tuve que conectar 1, ya cuando cargó el juego desconectarlo y conectar el arduino y a lo máximo que llegué es que el n64 estaba pidiendo reconocimiento (//Serial.println(“It was 0x01: the query command”);) pero parece que la función ” n64_send(n64_buffer, 33, 1);” nunca responde porque se queda pidiendo reconocimiento continuamente.

    No te pido que me des el código que busco hecho totalmente (a menos que puedas hacerlo aunque sea con un botón, la lectura del resto de botones se entiende); pero si me pudieras dar una idea de la creación y envío de datos sería genial. Tampoco sé cómo crear lo siguiente en arduino que parece es esencial:

    ser.write(struct.pack(‘B’, byte1));
    ser.write(struct.pack(‘B’, byte2));
    ser.write(struct.pack(‘b’, stickX));
    ser.read(1)
    ser.write(struct.pack(‘b’, stickY));
    ser.read(1)

    Como yo hago la escritura del byte en arduino debo guardar el byte con B y los otros con b, ¿qué tipo de variable es byte1? Finalmente, ¿por qué luego de hacer write 3 veces haces 1 read, luego 1 write y finalmente 1 read?

    Saludos y espero puedas ayudarme, quiero jugar perfect dark o agente 007 con una pistola porque con el stick me cuesta mucho.

  13. amster dice:

    quiero mando de n64 a mi wii pero con video paso a paso o como instalar un emulador de n64 bien esplicado a wii

Deja un comentario

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