Tabla de contenido:

Pistola de luz Wiimote precisa para Raspberry PI: 9 pasos (con imágenes)
Pistola de luz Wiimote precisa para Raspberry PI: 9 pasos (con imágenes)

Video: Pistola de luz Wiimote precisa para Raspberry PI: 9 pasos (con imágenes)

Video: Pistola de luz Wiimote precisa para Raspberry PI: 9 pasos (con imágenes)
Video: BOBCERA-Juega con Light guns en BATOCERA-TUTORIAL 2024, Mes de julio
Anonim
Pistola de luz Wiimote precisa para Raspberry PI
Pistola de luz Wiimote precisa para Raspberry PI
Pistola de luz Wiimote precisa para Raspberry PI
Pistola de luz Wiimote precisa para Raspberry PI

Normalmente, el mando de Wii utilizado como pistola de luz no es lo suficientemente preciso para juegos retro como NES Duck Hunt, porque el mando de Wii no selecciona el punto del televisor al que apunta. ¡No puede! El Wii Remote tiene una cámara infrarroja en su frente que ve la línea de LED infrarrojos en la barra de sensores, pero no puede saber qué tan lejos (o en qué dirección) está el televisor de la barra o qué tan grande es el televisor. Los emuladores y los juegos solucionan este problema mostrando una cruz u otro indicador de orientación, pero esa no es una experiencia precisa de tiro al blanco.

Para que el mando de Wii funcione como una pistola de luz precisa que puedas apuntar para seleccionar un objetivo en un televisor, se requieren cuatro LED infrarrojos dispuestos en un patrón cuadrilátero conocido (no una línea recta) en el mismo plano que el televisor. El Wii Remote luego ve los cuatro LED y la imagen de la cámara se puede usar para calcular una homografía que nos permite averiguar hacia dónde apunta la cámara.

El hardware para este proyecto es simple. Hay cuatro LED infrarrojos en carcasas impresas en 3D simples que se pueden pegar en la parte superior e inferior de la carcasa del televisor y enchufarlas a un cargador USB. Además, en caso de que no tengas la carcasa de la pistola Wii, tengo un mango y miras impresos en 3D simples que puedes conectar al mando de Wii (aunque para ahorrar plástico, hice el mío un híbrido entre madera y plástico impreso en 3D).

El software basado en Python fue más difícil de hacer que el hardware y actualmente es solo para Linux. Calibra los LED y el Wii Remote y luego usa cálculos de homografía para emular un mouse absoluto que funciona bastante bien en el emulador fceumm NES de Retroarch (y probablemente algunos otros emuladores) en mi Raspberry PI 3B +.

Suministros

  • Wii Remote
  • Cuatro LED infrarrojos de 940 nm y 5 mm
  • Cable USB antiguo con un enchufe de tipo A que funciona
  • Raspberry PI 3 u otra computadora Linux con soporte Bluetooth
  • Impresora 3D y filamento (opcional)

Paso 1: Cadena de LED infrarrojos

Cadena de LED infrarrojos
Cadena de LED infrarrojos
Cadena de LED infrarrojos
Cadena de LED infrarrojos

Consiga un cable USB antiguo con una toma macho de tipo A que funcione (por lo general, los cables de carga de mi teléfono se rompen en el extremo micro USB, por lo que tengo cables sobrantes con una toma macho de tipo A que funcione). En realidad, incluso está bien si los cables de datos están roto mientras las líneas eléctricas funcionen. Corta el otro extremo. En teoría, el cable rojo debe ser de + 5V y el negro debe estar conectado a tierra, pero verifíquelo con un multímetro (conéctelo a un cargador y luego verifique el voltaje entre los cables rojo y negro).

Dado que los LED infrarrojos tienen una caída de voltaje de aproximadamente 1,2-1,3 V, solo soldé cuatro de ellos en bucle en serie al cable USB. Asegúrese de que los cables que suelde sean lo suficientemente largos como para poder colocar LED en la parte inferior del televisor y dos en la parte superior, con una cantidad decente de espacio horizontal entre los LED (aproximadamente 10 pulgadas más o menos).

Más precisamente para hacer el bucle LED:

  • suelde el lado negativo (cátodo, pata más corta, con borde plano) del primer LED al cable USB de + 5V
  • une el lado positivo del primer LED (ánodo, pata más larga, con borde redondo) al lado negativo del segundo LED
  • repita para unir el segundo LED al tercero y del tercero al cuarto
  • luego conecte el lado positivo del cuarto LED con un cable al cable USB de tierra.

Para hacer las cosas más ordenadas, puede usar tubos termorretráctiles cuando haga las conexiones. De lo contrario, use cinta aislante para evitar cortocircuitos.

Asegúrese de no tener cortocircuitos. Luego, conéctelo a un cargador USB y verifique que esté emitiendo luz infrarroja mirando los LED con la cámara de un teléfono. (Muchas cámaras de teléfonos son sensibles a los infrarrojos).

Paso 2: adjuntar a la TV

Adjuntar a la TV
Adjuntar a la TV
Adjuntar a la TV
Adjuntar a la TV
Adjuntar a la TV
Adjuntar a la TV

Ahora, coloque dos de los LED en la parte inferior del televisor y dos en la parte superior. El espacio horizontal debe ser de unas diez pulgadas. Si es demasiado, es posible que tengas problemas con el campo de visión de la cámara del Wii Remote para capturarlos todos. Pero si están demasiado cerca, entonces mi intuición geométrica dice que tendrás menor precisión.

Para las pruebas, pegué los LED con cinta aislante y luego, para una conexión permanente, diseñé e imprimí cuatro pequeños clips de LED (los archivos están aquí) que pegué en caliente al televisor. Debe hacer que los LED estén lo más cerca posible del plano de la pantalla del televisor, sin que el bisel los oscurezca de la ubicación donde disparará.

Paso 3: Instale el software

Actualmente, el software es solo para Linux. La siguiente configuración está diseñada para Raspberry PI 3 con Raspbian Stretch. Otros sistemas Linux requerirán algunos cambios. En los modelos anteriores, necesitará un dongle Bluetooth y también deberá ejecutarlo desde una línea de comandos:

sudo get-apt instalar bluetooth

Paso A: udev

A continuación, cree un archivo en /etc/udev/rules.d/wiimote.rules que contenga una sola línea:

NÚCLEO == "uinput", MODO = "0666"

Puede hacerlo, por ejemplo, con un editor de texto o escribiendo lo siguiente en la línea de comandos:

sudo sh -c 'echo KERNEL == / "uinput \", MODE = / "0666 \"> /etc/udev/rules.d/wiimote.rules'

Y luego reinicie udev:

sudo /etc/init.d/udev reiniciar

Paso B: cwiid

A continuación, necesitará mi paquete cwiid modificado. Aquí se pone un poco complicado, ya que idealmente necesitarías construirlo en tu Raspberry PI, pero tengo que confesar que he perdido la noción de qué paquetes necesitas instalar para que funcione. Hay tres opciones para hacer esto.

Opción B1: construye tu mismo

cd ~

git clone https://github.com/arpruss/cwiid-1 autoconf./configure make -C libcwiid sudo make -C libcwiid install make -C python sudo make -C python install

Desafortunadamente, es muy probable que te falten un montón de cosas necesarias para construir esto, y./configure se quejará. Puede ver todas las cosas de las que se queja y ejecutar sudo apt install en todas ellas.

Opción B2: usar mis binarios

cd ~

wget https://github.com/arpruss/cwiid-1/releases/download/0.0.1/cwiid-rpi.tar.gz tar zxvf cwiid-rpi.tar.gz cd cwiid sudo make install

Paso C: bibliotecas de Python

Finalmente, obtenga material de soporte para mi script de Python Lightgun:

sudo pip3 instalar uinput numpy pygame opencv-python

sudo apt-get install libatlas-base-dev sudo apt-get install libjasper-dev sudo apt-get install libqtgui4 sudo apt-get install python3-pyqt5

Paso D: lightgun.py

Finalmente, obtenga mi secuencia de comandos de Python Lightgun:

cd ~

clon de git

Si todo ha ido bien, ahora tiene ~ / lightgun.py que puede usar para calibrar la pistola de luz.

Paso 4: Calibración Parte I: Centrado de la cámara

Calibración Parte I: Centrado de la cámara
Calibración Parte I: Centrado de la cámara
Calibración Parte I: Centrado de la cámara
Calibración Parte I: Centrado de la cámara
Calibración Parte I: Centrado de la cámara
Calibración Parte I: Centrado de la cámara

Hay dos aspectos de la calibración. El primero es calibrar el centro de la cámara en cada Wiimote. Esto requiere usar la cámara para tomar dos imágenes de los LED alrededor de la pantalla de su televisor, una con el control remoto hacia arriba y la otra boca abajo.

Para evitar presionar los botones cuando colocas el Wii Remote en su frente, y para que el Wii Remote tenga una elevación constante, puedes imprimir en 3D la herramienta de calibración que incluí aquí. Básicamente, necesitas cosas de 10,5 mm de grosor que puedas colocar debajo del mando de Wii cuando esté boca abajo. De hecho, utilicé algunos trozos de madera contrachapada para ahorrar plástico.

Encienda los LED y asegúrese de que su Raspberry PI u otra computadora se muestre en el televisor. Conecte un teclado (esto no funcionará con ssh) o use VNC. Entonces corre:

python3 ~ / lightgun / lightgun.py -M

Si todo va bien, aparecerá una pantalla completa que le pedirá que presione 1 + 2 en el control remoto de Wii. Haz eso. Las luces parpadearán en el Wii Remote y luego las luces 1 y 4 permanecerán encendidas. También verás un pequeño rectángulo verde en la parte superior de la pantalla, con la vista desde la cámara del Wii Remote. Apunta con el mando de Wii a los LED y, si todo va bien, verás los cuatro LED, numerados del 1 al 4.

Ahora necesitas encontrar una superficie sólida con un borde afilado, como una mesa de café, que puedas apuntar a la pantalla del televisor y que permita que el Wii Remote vea todos los LED con el Wii Remote alineado contra el borde. Comienza alineando el Wii Remote con el lado derecho hacia arriba, con el lado del mando alineado contra el borde de la superficie, asegurándote de que se vean los cuatro LED. Luego presione ESPACIO en su teclado (o adjunte un Nunchuck y presione C si le resulta más conveniente). Luego se te pedirá que gires el Wii Remote. Ahora, asegúrese de que esté elevado a 10,5 mm de su superficie, utilizando la herramienta de calibración o algo más, y lo más cerca posible de la misma ubicación que antes (por ejemplo, alineado contra el mismo borde de su superficie). Presione ESPACIO nuevamente.

Si todo va bien, ahora pasará al paso de calibración de LED. ¡Sí, esto es complicado! Pero vas a tener una pistola de luz muy precisa. Ese es solo el precio.

Nota: Si, como yo, tienes una Wii debajo del televisor, la Wii debe apagarse por dos razones: primero, si la Wii está encendida, se conectará al Wiimote y, segundo, los LED infrarrojos de la barra de sensores interferirán con este proyecto. Por razones similares, mientras usa la Wii, es una buena idea desconectar los LED alrededor del televisor.

Paso 5: Calibración Paso II: LED

Paso de calibración II: LED
Paso de calibración II: LED
Paso de calibración II: LED
Paso de calibración II: LED

Ahora debe indicarle al software dónde se encuentran los LED alrededor del borde del televisor. Verá una pantalla de calibración que muestra cuatro flechas, una de ellas seleccionada (brillante) y tres de ellas atenuadas, alrededor del borde del televisor. Utilice +/- para cambiar y cambiar la flecha que está ajustando.

Para cada una de las cuatro flechas alrededor del borde, haga lo siguiente:

  1. presione izquierda / derecha en el Wiimote para mover las flechas hasta que apunten con la mayor precisión posible hacia el LED correspondiente;
  2. presione hacia arriba / abajo en el Wiimote para cambiar la longitud de la flecha hasta que la longitud de la flecha coincida con la distancia entre el LED y el borde de la pantalla del televisor; en otras palabras, la longitud de la flecha debe ser igual a la distancia desde la punta de la flecha al LED.

Una vez que sus cuatro flechas sean correctas (y tal vez incluso antes), verá una cruz roja cuando apunte el Wiimote a la pantalla. Puedes comprobar que aquí es donde debería estar. (Recuerde que debe estar lo suficientemente lejos para que el Wiimote pueda ver todos los LED. También es importante que no haya otras fuentes de infrarrojos en el campo de visión. Una vez tuve problemas debido a que la luz solar se reflejaba en la cabeza de un tornillo en el Soporte TV.)

Finalmente, hay una quinta flecha, que solo aparece cuando presiona + desde la cuarta flecha LED o - desde la primera (y por defecto tiene una longitud cero, por lo que es solo un píxel). Esta flecha ajusta a qué distancia por encima de la cámara del Wii Remote se registrará la toma. El problema es este: verás a lo largo de la superficie superior del Wii Remote. Pero la cámara está ubicada a cierta distancia debajo de esa superficie, en el medio del rectángulo negro en la parte frontal del Wii Remote. Si registramos los disparos hacia donde apunta la cámara, se registrarían unos 8 mm por debajo de la superficie superior del Wii Remote. Puede comprobarlo observando que, a medida que mira a lo largo de la superficie superior, la cámara oculta el centro del retículo.

Puedes vivir con esto, o puedes hacer crecer esta quinta flecha para que el software alinee las tomas con la parte superior del Wii Remote, o puedes ajustar los archivos imprimibles en 3D de las miras de hierro para compensar esto (pero la compensación solo funcionará para una distancia particular a la TV). Yo mismo fui por la alineación del software.

Pulsa INICIO en el mando de Wii para salir de la calibración y guardar todos los datos en el directorio ~ /.wiilightgun.

Paso 6: prueba y uso

Prueba y uso
Prueba y uso
Prueba y uso
Prueba y uso
Prueba y uso
Prueba y uso

Probablemente quieras probar tu arma de luz ahora. Simplemente ejecute en un emulador de terminal (o un script):

python3 ~ / lightgun / lightgun.py -t

Deberá presionar los botones 1 + 2 al mismo tiempo, y después de eso, si todo va bien, mientras lightgun.py se esté ejecutando, la pistola de luz emulará un mouse absoluto de dos botones. El botón disparador es el botón 1 del mouse y el botón A es el botón 2 del mouse. Presione ctrl-c para salir.

Ahora solo necesita configurar sus emuladores y / o juegos para que funcionen con un mouse absoluto. Desafortunadamente, eso no siempre será tan fácil.

Una cosa divertida que podrías probar es mi mod de pato-pato-disparar de iminurnamez:

cd ~

clon de git https://github.com/arpruss/duck-duck-shoot cd pato-pato-disparar python play_game.py

Para los juegos de NES, uso el núcleo libretro fceumm en Retroarch. Vaya al menú Opciones y configure el Zapper para que sea una pantalla táctil. (Configurarlo como un mouse en realidad no funciona, ya que fceumm espera un movimiento relativo en lugar de un mouse de posición absoluta).

Si comienza sus juegos con un guión, puede editar la parte que inicia el juego o el emulador para decir:

python3 ~ / lightgun / lightgun.py -t -B 30 "comando para iniciar el juego"

Luego, durante los primeros 30 segundos de ejecución del juego (de ahí la opción -B 30), puedes conectar tu pistola de luz manteniendo presionado 1 + 2.

Por cierto, el script lightgun.py también se puede usar para juegos generales de Wii Remote con Retroarch. Simplemente agregue la opción -o y las funciones de la pistola de luz se apagarán, y en su lugar, el control remoto de Wii funcionará horizontalmente, con los tres botones 1, 2 y B respectivamente. Hay otras funciones relacionadas con Retroarch en las asignaciones de lightgun.py que descubrirás leyendo el código. Por ejemplo, la tecla menos actúa como un cambio, y junto con el dpad controla el guardado y la carga (arriba / abajo = cambiar el número de guardado; izquierda = restaurar; derecha = guardar).

Paso 7: Mango de pistola y apuntar

Mango de pistola y apuntar
Mango de pistola y apuntar
Mango de pistola y apuntar
Mango de pistola y apuntar
Mango de pistola y apuntar
Mango de pistola y apuntar

Puedes usar el mando de Wii solo como arma, apuntando a lo largo de la parte superior. También puede comprar una de las carcasas de armas comerciales. Pero debido a que el control remoto de Wii original no se podía usar como un arma visible, las carcasas tienden a no tener miras de hierro, y las miras de hierro mejoran en gran medida la precisión.

Diseñé un sistema simple imprimible en 3D de tres partes: un mango deslizante que se coloca justo detrás del gatillo (por lo que se parece un poco a un phaser de la serie original de Star Trek) y miras deslizantes. Los archivos imprimibles están aquí. Si quieres ahorrar plástico a expensas de la madera de desecho, también puedes hacer lo que hice yo y en lugar de imprimir todo el asa, imprimir solo la parte que sujeta el Wiimote, recortar una pieza de madera y atornillarla.

Para ver, enfoca tus ojos en las miras. Alinee la protuberancia de la mira delantera entre las protuberancias de la vista trasera para que el espacio de aire en cualquiera de ellas sea igual y las tres protuberancias sobresalgan igualmente alto. Luego, alinee el centro del objetivo con la parte superior de las protuberancias.

Nota: La altura de las protuberancias es ligeramente desigual, con la protuberancia de la mira frontal un poco más baja, para compensar la altura de las protuberancias de la vista cuando miras a lo largo de ellas a una distancia de 2,5 metros (mi distancia a la TV). Si tiene una distancia significativamente diferente al televisor, puede ponerla en los archivos OpenSCAD. Sin embargo, este ajuste puede estar por debajo de las tolerancias de la impresora. Además, si no realizó el ajuste vertical en el software, puede agregar más ajustes a las miras en el software configurando extraSightAdjust en algo alrededor de -8 (en milímetros).

Paso 8: Calibración III (opcional): Ajuste fino

Si desea aún más precisión, puede ejecutar:

python3 ~ / lightgun / lightgun.py -d

(para demostración) y observe cuidadosamente si las miras se alinean con el retículo. Si no es así, salga y edite manualmente ~ /.wiilightgun / wiimotecalibration, y modifique ligeramente las coordenadas xey del centro de la cámara para ajustar la vista. Por ejemplo, mi arma estaba disparando ligeramente hacia la derecha, así que terminé cambiando la coordenada x de 529 a 525. Los números de todos probablemente serán diferentes.

Paso 9: Apéndice: el algoritmo

Apéndice: el algoritmo
Apéndice: el algoritmo

El código de emulación del mouse funciona de la siguiente manera.

  • Pulsaciones de botón de proceso.
  • Obtenga datos de la cámara y ajústelos para la calibración de centrado de la cámara.
  • Si hay menos de tres LED visibles en la cámara:

    Mantenga la última posición del mouse

  • Si hay tres o cuatro LED visibles:

    • Utilice los datos del acelerómetro de Wiimote para obtener la orientación de Wiimote e identificar qué imagen de la cámara LED corresponde a qué LED físico.
    • Si hay cuatro LED visibles:

      • Calcule la homografía entre las imágenes de la cámara LED y las ubicaciones de los LED (en coordenadas de pantalla).
      • Utilice la homografía para calcular qué ubicación de la pantalla corresponde al centro del campo de visión de la cámara.
      • Realice el ajuste Y para ajustar el centro del cañón de la pistola virtual por debajo de la línea de visión. Este es un algoritmo algo torpe pero funciona.
      • Establezca la posición del mouse en la ubicación de la pantalla ajustada.
    • Si hay tres LED visibles:

      • Utilice OpenCV para resolver el problema P3P entre las imágenes de la cámara LED y las ubicaciones físicas de los LED. Esto genera hasta cuatro soluciones.
      • Si tiene éxito:

        • Si tenemos un cálculo de ubicación anterior exitoso, elija la solución que haga que el LED faltante esté más cerca de la última posición observada o calculada de ese LED.
        • Si no tenemos un cálculo de ubicación anterior exitoso, elija la solución que mejor predice el rumbo del acelerómetro.
        • Utilice la mejor solución para calcular dónde debería ir el cuarto LED.
        • Haz el resto como en el caso de los cuatro LED.
      • Si no tiene éxito:

        Mantenga la última posición del mouse

Recomendado: