¡Comparto esto que me parecio alucinante, ya que mi juego favorito es Zelda!
¿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, te pongo un vídeo del resultado.
¿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
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:
+3.3V – Alimentación. No lo usamos ya que el arduino tiene su propia alimentación.
Datos – Conectado con el pin digital 8
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.
¿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, te pongo un vídeo del resultado.
¿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
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:
+3.3V – Alimentación. No lo usamos ya que el arduino tiene su propia alimentación.
Datos – Conectado con el pin digital 8
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.