Taula de continguts:

Pistola lleugera Wiimote precisa per a Raspberry PI: 9 passos (amb imatges)
Pistola lleugera Wiimote precisa per a Raspberry PI: 9 passos (amb imatges)

Vídeo: Pistola lleugera Wiimote precisa per a Raspberry PI: 9 passos (amb imatges)

Vídeo: Pistola lleugera Wiimote precisa per a Raspberry PI: 9 passos (amb imatges)
Vídeo: Как играть в игры со световым пистолетом для Nintendo Wii на вашем компьютере 2024, Desembre
Anonim
Pistola lleugera Wiimote precisa per a Raspberry PI
Pistola lleugera Wiimote precisa per a Raspberry PI
Pistola lleugera Wiimote precisa per a Raspberry PI
Pistola lleugera Wiimote precisa per a Raspberry PI

Normalment, el comandament Wii utilitzat com a arma lleugera no és prou precís per a jocs retro com NES Duck Hunt, perquè el comandament Wii no selecciona el punt del televisor al qual apunta. No pot! El comandament Wii té una càmera d’infrarojos a la part frontal que veu la línia de LEDs d’infrarojos a la barra del sensor, però no sap fins a quin punt (ni en quina direcció) es troba el televisor de la barra ni fins a quin punt és gran el televisor. Els emuladors i els jocs solucionen aquesta qüestió mostrant pèls creuats o un altre indicador d’orientació, però no és una experiència precisa de disparar objectius.

Per fer que el comandament Wii funcioni com una pistola lleugera precisa que es pot veure per seleccionar un objectiu en un televisor, calen quatre LEDs d’infrarojos disposats en un patró quadrilàter conegut (no una línia recta) en el mateix pla que el televisor. El comandament Wii veu els quatre LED i la imatge de la càmera es pot utilitzar per calcular una homografia que ens permet esbrinar cap a on apunta la càmera.

El maquinari d’aquest projecte és senzill. Hi ha quatre LEDs infrarojos en carcasses senzilles impreses en 3D que es poden enganxar a la part superior i inferior de la carcassa del televisor i connectar-les a un carregador USB. A més, en cas que no tingueu carcassa per a armes Wii, tinc un simple mànec imprès en 3D i mires que podeu fixar al comandament Wii (tot i que per estalviar plàstic, he fet del meu un híbrid entre fusta i plàstic imprès en 3D).

El programari basat en Python era més difícil de fabricar que el maquinari i actualment només és Linux. Calibra els LEDs i el comandament Wii Remote i, a continuació, utilitza càlculs d’homografia per emular un ratolí absolut que funciona bastant bé a l’emulador NES (i probablement a alguns emuladors) de Retroarch del meu Raspberry PI 3B +.

Subministraments

  • Comandament Wii
  • Quatre LEDs d'infrarojos de 5 mm de 940 nm
  • Vell cable USB amb un endoll tipus A.
  • Raspberry PI 3 o un altre ordinador Linux amb compatibilitat Bluetooth
  • Impressora 3D i filament (opcional)

Pas 1: cadena LED d'infrarojos

Cadena LED d'infrarojos
Cadena LED d'infrarojos
Cadena LED d'infrarojos
Cadena LED d'infrarojos

Aconseguiu un cable USB antic amb una presa de corrent tipus A masculina (normalment els cables de càrrega del meu telèfon es trenquen a l’extrem micro USB, així que tinc cables sobrants amb una presa de corrent tipus A de treball). En realitat, fins i tot està bé si els cables de dades estan trencat mentre funcionen les línies elèctriques. Tallar l'altre extrem. En teoria, el cable vermell hauria de ser de + 5 V i el negre hauria d’estar connectat a terra, però comproveu-lo amb un multímetre (connecteu-lo a un carregador i, a continuació, comproveu el voltatge entre els cables vermell i negre).

Com que els LED d'infrarojos tenen una caiguda de voltatge d'1,2-1,3 V, acabo de soldar-ne quatre en bucle de sèrie al cable USB. Assegureu-vos que els cables que heu soldat siguin prou llargs perquè pugueu posar LED a la part inferior del televisor i dos a la part superior, amb una bona quantitat d’espai horitzontal entre els LED (aproximadament 10 polzades més o menys).

Més precisament per fer el bucle LED:

  • soldar el costat menys (càtode, cama més curta, amb vora plana) del primer LED al cable USB de + 5V
  • uniu el costat positiu del primer LED (ànode, cama més llarga, amb vora rodona) al costat negatiu del segon LED
  • repeteix per unir el segon LED al tercer i el tercer al quart
  • a continuació, connecteu el costat positiu del quart LED amb un cable al cable USB de terra.

Per fer que les coses siguin més netes, podeu fer servir tubs termoretràctils quan feu les connexions. En cas contrari, utilitzeu cinta elèctrica per evitar curtmetratges.

Assegureu-vos que no teniu cap curtcircuit. A continuació, connecteu-lo a un carregador USB i comproveu que emet llum infraroja mirant els LED amb una càmera del telèfon. (Moltes càmeres de telefonia són sensibles als infrarojos).

Pas 2: connecteu-lo al televisor

Connecteu-lo al televisor
Connecteu-lo al televisor
Connecteu-lo al televisor
Connecteu-lo al televisor
Connecteu-lo al televisor
Connecteu-lo al televisor

Ara, poseu dos dels LEDs a la part inferior del televisor i dos a la part superior. L'espaiat horitzontal ha de ser d'uns deu centímetres. Si és massa, és possible que tingueu problemes amb el camp visual de la càmera Wii Remote per capturar-los tots. Però si són massa a prop, la meva intuïció geomètrica diu que tindreu una precisió inferior.

Per provar, vaig gravar els LEDs amb cinta elèctrica i, per obtenir una connexió permanent, vaig dissenyar i imprimir quatre petits clips LED (aquí hi ha fitxers) que he enganxat al televisor. Haureu de fer que els LED estiguin el més a prop possible del pla de la pantalla del televisor, sense que el bisell els oculti des de la ubicació on feu la fotografia.

Pas 3: Instal·leu el programari

Actualment, el programari només és Linux. La configuració següent està dissenyada per a Raspberry PI 3 amb Raspbian Stretch. Altres sistemes Linux requeriran alguns canvis. En els models anteriors, necessitareu un dongle Bluetooth i també haureu d’executar-lo des d’una línia de comandes:

sudo get-apt install bluetooth

Pas A: udev

A continuació, creeu un fitxer a /etc/udev/rules.d/wiimote.rules que contingui la línia única:

KERNEL == "uinput", MODE = "0666"

Podeu fer-ho, per exemple, amb un editor de text o escrivint el següent a la línia d'ordres:

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

I després reinicieu udev:

sudo /etc/init.d/udev reiniciar

Pas B: cwiid

A continuació, necessitareu el meu paquet cwiid modificat. Aquí es torna una mica pelut, ja que idealment caldria construir-lo al vostre Raspberry PI, però he de confessar que he perdut el coneixement de quins paquets heu d’instal·lar perquè funcionin. Hi ha tres opcions per fer-ho.

Opció B1: Creeu-vos

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

Malauradament, hi ha força probabilitats de perdre un munt de coses necessàries per construir-ho i./configure es queixarà. Podeu veure totes les coses que es queixen i executar sudo apt install a totes elles.

Opció B2: utilitzeu els meus fitxers binaris

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

Pas C: llibreries Python

Finalment, obteniu material de suport per al meu script lightth python:

sudo pip3 instal·la 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

Pas D: lightgun.py

Finalment, obteniu el meu script lightth python:

cd ~

git clone

Si tot ha anat bé, ara teniu ~ / lightgun.py que podeu utilitzar per calibrar el lightgun.

Pas 4: Calibratge Part I: Centrar la càmera

Calibració Part I: Centrar la càmera
Calibració Part I: Centrar la càmera
Calibració Part I: Centrar la càmera
Calibració Part I: Centrar la càmera
Calibració Part I: Centrar la càmera
Calibració Part I: Centrar la càmera

El calibratge té dos aspectes. El primer és calibrar el centre de la càmera de cada Wiimote. Per a això, cal que utilitzeu la càmera per fer dues imatges dels LED al voltant de la pantalla del televisor, una amb el comandament dret situat cap amunt i l’altra cap per avall.

Per evitar prémer els botons quan col·loqueu el comandament Wii a la part frontal i, per tal de fer que el comandament Wii tingui una elevació constant, podeu imprimir en 3D l'eina de calibratge que he inclòs aquí. Bàsicament necessiteu coses que tinguin un gruix de 10,5 mm i que pugueu posar sota el comandament Wii quan estigui a la part frontal. De fet, he utilitzat una mica de fusta contraxapada per estalviar en plàstic.

Enceneu els LEDs i assegureu-vos que el vostre Raspberry PI o un altre ordinador aparegui al televisor. Connecteu un teclat (això no funcionarà amb ssh) o utilitzeu VNC. A continuació, executeu:

python3 ~ / lightgun / lightgun.py -M

Si tot va bé, obtindreu una pantalla a pantalla completa que us demanarà que premeu 1 + 2 al comandament Wii. Fer això. Els llums parpellejaran al comandament Wii i, a continuació, els llums 1 i 4 es mantindran encesos. També veureu un petit rectangle verd a la part superior de la pantalla, amb la vista des de la càmera Wii Remote. Apunteu el comandament Wii cap als LEDs i, si tot va bé, veureu els quatre LED, numerats de l'1 al 4.

Ara heu de trobar una superfície sòlida amb una vora afilada, com una taula de centre, que pugueu apuntar cap a la pantalla del televisor i que pugui permetre que el comandament Wii vegi tots els LEDs amb el comandament Wii alineat contra la vora. Comenceu alineant el comandament Wii amb el costat dret cap amunt, amb el costat del comandament alineat contra la vora de la superfície, assegurant-vos que es vegin els quatre LED. A continuació, premeu ESPAI al teclat (o poseu un Nunchuck i premeu C si és més convenient). A continuació, se us demanarà que gireu el comandament Wii. Ara, assegureu-vos que estigui elevat a 10,5 mm de la vostra superfície, mitjançant l’eina de calibratge o alguna cosa més, i que estigui tan a prop de la mateixa ubicació que abans (per exemple, alineada amb la mateixa vora de la vostra superfície). Torneu a prémer ESPAI.

Si tot va bé, ara anireu al pas de calibratge del LED. Sí, això és complicat. Però tindràs una pistola molt precisa. Aquest és només el preu.

Nota: Si, com a mi, teniu una Wii sota el televisor, la Wii s’ha d’apagar per dos motius: primer, si la Wii està activada, es connectarà al Wiimote i, en segon lloc, els LED infrarojos de la barra del sensor interferiran aquest projecte. Per raons similars, mentre utilitzeu la Wii, és una bona idea desconnectar els LED del televisor.

Pas 5: Calibratge Pas II: LEDs

Pas de calibració II: LEDs
Pas de calibració II: LEDs
Pas de calibració II: LEDs
Pas de calibració II: LEDs

Ara heu d’indicar al programari on es troben els LED al voltant de la vora del televisor. Veureu una pantalla de calibratge que mostra quatre fletxes, una d'elles seleccionada (brillant) i tres d'elles en gris, al voltant de la vora del televisor. Feu servir +/- per canviar la fletxa que voleu ajustar.

Feu això per a cadascuna de les quatre fletxes que hi ha al voltant de la vora:

  1. premeu esquerra / dreta a la Wiimote per moure les fletxes fins que apuntin amb la màxima precisió cap al LED corresponent;
  2. premeu amunt / avall al Wiimote per canviar la longitud de la fletxa fins que la longitud de la fletxa coincideixi amb la distància entre el LED i la vora de la pantalla del televisor; en altres paraules, la longitud de la fletxa ha de ser igual a la distància des de la punta de la fletxa fins al LED.

Un cop les quatre fletxes siguin correctes (i potser fins i tot abans), veureu un mirall vermell quan assenyalareu el Wiimote cap a la pantalla. Podeu comprovar que és aquí on hauria d’estar. (Recordeu que cal estar prou lluny perquè el Wiimote pugui veure tots els LED. També és important que no hi hagi altres fonts d’infrarojos al camp de visió. Una vegada vaig tenir problemes a causa de la llum solar que es reflectia en un cap de cargol al Suport de TV.)

Finalment, hi ha una cinquena fletxa, que només apareix quan premeu + des de la quarta fletxa LED o - des de la primera (i per defecte té una longitud zero, de manera que només és un píxel). Aquesta fletxa ajusta fins a quin punt es registrarà la presa per sobre de la càmera del comandament Wii. El problema és el següent: observareu la superfície superior del comandament Wii. Però la càmera es troba a una distància inferior a aquesta superfície, al mig del rectangle negre situat a la part frontal del comandament Wii. Si registréssim les fotos cap a on apunta la càmera, es registrarien uns 8 mm per sota de la superfície superior del comandament Wii. Podeu comprovar-ho observant que a mesura que observeu per la superfície superior, la càmera amaga el centre dels pèls creuats.

Podeu conviure amb això, o podeu fer créixer aquesta cinquena fletxa per alinear els programes amb la part superior del comandament Wii o podeu ajustar els fitxers imprimibles en 3D per a les vistes de ferro per compensar-ho (però la compensació només funcionarà per a una distància particular al televisor). Jo mateix vaig anar a l’alineació del programari.

Premeu INICI al comandament Wii per sortir del calibratge i desar totes les dades al directori ~ /.wiilightgun.

Pas 6: prova i ús

Prova i ús
Prova i ús
Prova i ús
Prova i ús
Prova i ús
Prova i ús

Probablement vulgueu provar ara la pistola lleugera. Només cal executar-lo en un emulador de terminal (o un script):

python3 ~ / lightgun / lightgun.py -t

Haureu de prémer els botons 1 + 2 alhora i, després, si tot va bé, sempre que lightgun.py estigui funcionant, la pistola emularà un ratolí absolut de dos botons. El botó d’activació és el botó 1 del ratolí i el botó A és el botó 2 del ratolí. Premeu ctrl-c per sortir.

Ara només heu de configurar els vostres emuladors i / o jocs perquè funcionin amb un ratolí absolut. Malauradament, això no sempre serà tan fàcil.

Una de les coses divertides que podeu provar és la meva modificació del brot d'ànec-ànec d'Iminurnamez:

cd ~

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

Per als jocs NES, faig servir el nucli libretro fceumm a Retroarch. Aneu al menú Opcions i configureu el Zapper perquè sigui una pantalla tàctil. (Configurar-lo com a ratolí no funciona, ja que fceumm espera un moviment relatiu en lloc de ratolí de posició absoluta.)

Si comenceu els vostres jocs amb un script, podeu editar la part que inicia el joc o l'emulador per dir:

python3 ~ / lightgun / lightgun.py -t -B Comanda 30 "per iniciar el joc"

Després, durant els primers 30 segons de l'execució del joc (per tant, l'opció -B 30), podeu connectar la pistola lleugera mantenint premut 1 + 2.

Per cert, l’escriptura lightgun.py també es pot utilitzar per a jocs Wii Remote generals amb Retroarch. Només cal afegir l’opció -o i les funcions lightgun estaran desactivades i, en canvi, el comandament Wii funcionarà horitzontalment, amb els tres botons 1, 2 i B respectivament. Hi ha altres funcions relacionades amb Retroarch a les assignacions de lightgun.py que descobrireu llegint el codi. Per exemple, la tecla menys actua com a desplaçament i, juntament amb el dpad, controla l’emmagatzematge i la càrrega (amunt / avall = canvia el número de desament; esquerra = restaura; dreta = desa).

Pas 7: Mànec i punteria de l'arma

Mànec i punteria de l'arma
Mànec i punteria de l'arma
Mànec i punteria de l'arma
Mànec i punteria de l'arma
Mànec i punteria de l'arma
Mànec i punteria de l'arma

Podeu utilitzar el comandament Wii per si mateix com a arma de foc, observant la part superior. També podeu comprar-ne una de les carcasses comercials. Però, com que el comandament Wii original no era capaç d’utilitzar-se com a pistola visible, les carcasses tendeixen a no venir amb mires de ferro, i les mires de ferro milloren molt la precisió.

Vaig dissenyar un sistema senzill per imprimir en tres parts en 3D: un mànec lliscant que es troba just darrere del gallet (de manera que s’assembla una mica al faser de la Sèrie Original Star Trek) i mires lliscants. Els fitxers imprimibles són aquí. Si voleu estalviar en plàstic a costa de ferralla, també podeu fer el que he fet i, en lloc d’imprimir tot el mànec, imprimiu només la part que conté el Wiimote i retalleu una peça de fusta i enrosqueu-la.

Per veure, enfoqueu els ulls a la vista. Alineeu la protuberància de la mira davantera entre les protuberàncies de la vista posterior de manera que l'espai aeri de qualsevol dels dos sigui igual i els tres ressalts sobresurten igualment alts. A continuació, alineeu el centre de l'objectiu amb la part superior dels cops.

Nota: l’alçada de les protuberàncies és lleugerament desigual, amb la protuberància de la mira frontal lleugerament inferior, per tal de compensar l’alçada de les protuberàncies pròpies quan les observa a una distància de 2,5 metres (la meva distància amb la TV). Si teniu una distància significativament diferent a la televisió, podeu introduir-la als fitxers OpenSCAD. Tanmateix, aquest ajust pot estar per sota de les toleràncies de la impressora. A més, si no heu fet l’ajust vertical al programari, podeu afegir-hi un altre ajust a les vistes del programari configurant extraSightAdjust a aproximadament -8 (en mil·límetres).

Pas 8: calibració III (opcional): ajust fi

Si voleu encara més precisió, podeu executar:

python3 ~ / lightgun / lightgun.py -d

(per a la demostració) i fixeu-vos bé si les vistes s’alineen amb els pèls creuats. Si no ho fan, sortiu i editeu manualment ~ /.wiilightgun / wiimotecalibration i ajusteu lleugerament les coordenades x i y del centre de la càmera per ajustar l'observació. Per exemple, la meva pistola disparava lleugerament cap a la dreta, de manera que vaig acabar canviant la coordenada x de 529 a 525. Els números de tothom probablement seran diferents.

Pas 9: Apèndix: l'algorisme

Apèndix: l'algorisme
Apèndix: l'algorisme

El codi d'emulació del ratolí funciona aproximadament de la manera següent.

  • Premeu el botó de procés.
  • Obteniu dades de la càmera i ajusteu-les per calibrar el centre de la càmera.
  • Si hi ha menys de tres LEDs visibles a la càmera:

    Mantingueu la darrera posició del ratolí

  • Si són visibles tres o quatre LED:

    • Utilitzeu les dades de l’acceleròmetre Wiimote per obtenir l’orientació Wiimote i identificar quina imatge de càmera LED correspon a quin LED físic.
    • Si són visibles quatre LED:

      • Calculeu l'homografia entre imatges de càmeres LED i ubicacions de LED (en coordenades de pantalla).
      • Utilitzeu l'homografia per calcular quina ubicació de pantalla correspon al centre del camp de visió de la càmera.
      • Feu l'ajustament en Y per ajustar-lo al centre del canó virtual de la pistola per sota de la línia de visió. Aquest és un algorisme una mica desconcertant, però funciona.
      • Establiu la posició del ratolí a la ubicació de la pantalla ajustada.
    • Si són visibles tres LED:

      • Utilitzeu OpenCV per resoldre el problema P3P entre les imatges de la càmera LED i les ubicacions físiques del LED. Això genera fins a quatre solucions.
      • Si té èxit:

        • Si tenim un càlcul d’ubicació previ amb èxit, trieu la solució que fa que el LED que falti sigui el més proper a l’última posició observada o calculada d’aquest LED.
        • Si no tenim un càlcul d’ubicació previ amb èxit, trieu la solució que millor prediu l’encapçalament de l’acceleròmetre.
        • Utilitzeu la millor solució per calcular cap a on ha d’anar el quart LED.
        • Feu la resta com a la caixa de quatre LED.
      • Si no té èxit:

        Mantingueu la darrera posició del ratolí

Recomanat: