Akkurate Wiimote Light Gun vir Framboos PI: 9 stappe (met foto's)
Akkurate Wiimote Light Gun vir Framboos PI: 9 stappe (met foto's)
Anonim
Akkurate Wiimote Light Gun vir Framboos PI
Akkurate Wiimote Light Gun vir Framboos PI
Akkurate Wiimote Light Gun vir Framboos PI
Akkurate Wiimote Light Gun vir Framboos PI

Gewoonlik is die Wii -afstandsbediening wat as 'n liggeweer gebruik word, nie akkuraat genoeg vir retro -speletjies soos NES Duck Hunt nie, want die Wii -afstandsbediening kies eintlik nie die punt op die TV waarna dit wys nie. Dit kan nie! Die Wii Remote het 'n infrarooi kamera aan die voorkant wat die lyn infrarooi LED's in die sensorbalk sien, maar dit kan nie weet hoe ver (of in watter rigting) die TV van die kroeg is of hoe groot die TV is nie. Emulators en speletjies werk hierdeur deur middel van kruishare of ander teikenaanwysers, maar dit is nie 'n akkurate skietervaring nie.

Om die Wii -afstandsbediening te laat werk as 'n akkurate liggeweer wat u kan sien om 'n teiken op 'n TV te kies, benodig u vier infrarooi LED's in 'n bekende vierhoekige patroon (nie 'n reguit lyn nie) in dieselfde vlak as die TV. Die Wii -afstandsbediening sien dan die vier LED's en die kamera -beeld kan gebruik word om 'n homografie te bereken waarmee ons kan uitvind waarheen die kamera wys.

Die hardeware vir hierdie projek is eenvoudig. Daar is vier infrarooi LED's in eenvoudige 3D-gedrukte behuise wat aan die bokant en onderkant van die TV-behuising vasgeplak kan word en in 'n USB-laaier aangesluit kan word. Boonop, as u nie 'n Wii -geweerhuis het nie, het ek 'n eenvoudige 3D -gedrukte handvatsel en toerisme -aantreklikhede wat u aan die Wii -afstandsbediening kan heg (maar om plastiek te bespaar, het ek 'n mengsel van hout en 3D -gedrukte plastiek gemaak).

Die op python gebaseerde sagteware was moeiliker om te maak as die hardeware en is tans slegs Linux. Dit kalibreer die LED's en die Wii Remote en gebruik dan homografiese berekeninge om 'n absolute muis na te boots wat redelik goed werk in Retroarch se fceumm NES -emulator (en waarskynlik 'n paar ander emulators) op my Raspberry PI 3B+.

Voorrade

  • Wii -afstandsbediening
  • Vier 940nm 5mm infrarooi LED's
  • Ou USB -kabel met 'n werkende tipe A -prop
  • Framboos PI 3 of ander Linux -rekenaar met Bluetooth -ondersteuning
  • 3D -drukker en filament (opsioneel)

Stap 1: Infrarooi LED -ketting

Infrarooi LED -ketting
Infrarooi LED -ketting
Infrarooi LED -ketting
Infrarooi LED -ketting

Kry 'n ou USB -kabel met 'n werkende tipe A -aansluiting (gewoonlik breek my laaikabels aan die mikro -USB -kant, so ek het oorblywende kabels met 'n werkende tipe A -aansluiting). Eintlik is dit selfs OK as die datakabels stukkend solank die kragdrade werk. Sny die ander kant af. In teorie moet die rooi kabel +5V wees en die swart moet gemaal wees, maar kontroleer dit met 'n multimeter (steek dit in 'n laaier en kontroleer dan die spanning tussen die rooi en swart drade).

Aangesien infrarooi LED's 'n spanningsval van 1.2-1.3V het, het ek net vier in serie-lus aan die USB-kabel gesoldeer. Maak seker dat die drade wat u soldeer lank genoeg is om LED's onderaan die TV te plaas en twee bo -aan, met 'n behoorlike hoeveelheid horisontale spasie tussen LED's (ongeveer 10 duim of so).

Meer presies om die LED -lus te maak:

  • soldeer die minuskant (katode, korter been, met plat rand) van die eerste LED aan die +5V USB -draad
  • verbind die pluskant van die eerste LED (anode, langer been, met ronde rand) aan die minuskant van die tweede LED
  • herhaal om die tweede LED by die derde en die derde tot die vierde aan te sluit
  • verbind dan die pluskant van die vierde LED met 'n draad aan die grond USB -draad.

Om dinge netjieser te maak, kan u 'n krimpbuis gebruik wanneer u die verbindings doen. Gebruik andersins elektriese band om kortbroek te vermy.

Maak seker dat u geen kortsluitings het nie. Koppel dit dan aan 'n USB -laaier en kyk of dit infrarooi lig uitstraal deur na die LED's met 'n telefoonkamera te kyk. (Baie telefoonkameras is infrarooi sensitief.)

Stap 2: Koppel aan die TV

Heg aan TV
Heg aan TV
Heg aan TV
Heg aan TV
Heg aan TV
Heg aan TV

Heg nou twee van die LED's aan die onderkant van die TV en twee aan die bokant. Die horisontale afstand moet ongeveer tien sentimeter wees. As dit te veel is, kan u probleme ondervind met die gesigsveld van die Wii Remote -kamera wat hulle almal vaslê. Maar as hulle te naby is, sê my geometriese intuïsie dat u 'n laer presisie het.

Vir die toets het ek die LED's met elektriese band vasgeplak, en vir 'n permanente verbinding het ek vier netjiese klein LED -snitte (lêers hier) ontwerp en gedruk wat ek op die TV vasgeplak het. U moet die LED's so na as moontlik aan die vlak van die TV -skerm laat staan, sonder dat die ring dit verberg van die plek waar u gaan skiet.

Stap 3: Installeer sagteware

Tans is die sagteware slegs Linux. Die volgende opstelling is ontwerp vir die Raspberry PI 3 met Raspbian Stretch. Ander Linux -stelsels sal 'n paar veranderinge vereis. Op vorige modelle benodig u 'n Bluetooth -dongle, en u moet dit ook vanaf 'n opdraglyn laat loop:

sudo get-apt installeer bluetooth

Stap A: udev

Skep vervolgens 'n lêer in /etc/udev/rules.d/wiimote.rules wat die enkele reël bevat:

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

U kan dit byvoorbeeld doen met 'n teksredakteur of deur die volgende op die opdraglyn in te tik:

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

En herbegin dan udev:

sudo /etc/init.d/udev herbegin

Stap B: cwiid

Vervolgens benodig u my aangepaste cwiid -pakket. Hier word dit 'n bietjie harig, want ideaal sou u dit op u Framboos -PI moes bou, maar ek moet erken dat ek die pakkette wat u moet installeer, verloor het om dit te laat werk. Daar is drie opsies om dit te doen.

Opsie B1: Bou self

cd ~

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

Ongelukkig is die kans groot dat u 'n klomp goed mis wat u nodig het om dit te bou, en./configure sal kla. U kan na al die dinge waaroor dit kla, kyk en sudo apt install op almal gebruik.

Opsie B2: Gebruik my binaries

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 maak installeer

Stap C: python -biblioteke

Laastens, kry ondersteuningsvoorwerpe vir my lightgun -python -script:

sudo pip3 installeer 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

Stap D: lightgun.py

Laastens, kry my lightgun python script:

cd ~

git-kloon

As alles goed afgeloop het, het u nou ~/lightgun.py wat u kan gebruik om die vuurwapen te kalibreer.

Stap 4: Kalibrasie Deel I: Sentreer die kamera

Kalibrasie Deel I: Sentreer die kamera
Kalibrasie Deel I: Sentreer die kamera
Kalibrasie Deel I: Sentreer die kamera
Kalibrasie Deel I: Sentreer die kamera
Kalibrasie Deel I: Sentreer die kamera
Kalibrasie Deel I: Sentreer die kamera

Daar is twee aspekte van kalibrasie. Die eerste is om die middel van die kamera op elke Wiimote te kalibreer. Hiervoor moet u die kamera gebruik om twee beelde van die LED's rondom u TV-skerm te neem, een met die regterkant na bo en die ander onderstebo.

Om te verhoed dat u op die knoppies druk as u die Wii -afstandsbediening aan die voorkant lê, en om die Wii -afstandsbediening konsekwent te laat lyk, kan u die kalibrasiehulpmiddel wat ek hier ingesluit het, 3D druk. U benodig basies dinge wat 10,5 mm dik is wat u onder die Wii -afstandsbediening kan plaas as dit aan die voorkant lê. Ek het eintlik 'n bietjie laaghout gebruik om plastiek te bespaar.

Skakel u LED's aan en maak seker dat u Raspberry PI of 'n ander rekenaar op die TV verskyn. Koppel 'n sleutelbord (dit werk nie oor ssh nie) of gebruik VNC. Hardloop dan:

python3 ~/lightgun/lightgun.py -M

As alles goed verloop, kry u 'n volskerm-skerm waarin u gevra word om 1+2 op die Wii-afstandsbediening te druk. Doen dit. Ligte flikker op die Wii -afstandsbediening, en dan bly ligte 1 en 4 aan. U sal ook 'n klein groen reghoek aan die bokant van die skerm sien, met die uitsig vanaf die Wii Remote -kamera. Wys die Wii -afstandsbediening op die LED's, en as alles goed gaan, sien u die vier LED's, genommer 1 tot 4.

Nou moet u 'n soliede oppervlak vind met 'n skerp rand, soos 'n koffietafel, wat u op die TV -skerm kan wys en waarmee die Wii -afstandbeheer alle LED's met die Wii -afstandsbediening teen die rand kan sien. Begin deur die Wii -afstandsbediening met die regterkant boontoe in lyn te bring, met die kant van die afstandsbediening in lyn met die oppervlakrand, en maak seker dat al vier die LED's gesien word. Druk dan SPACE op u sleutelbord (of heg 'n Nunchuck aan en druk C as dit geriefliker is). U sal dan gevra word om die Wii -afstandbeheer te draai. Maak nou seker dat dit 10,5 mm van u oppervlak af is, met behulp van die kalibrasiehulpmiddel of iets anders, en so naby aan dieselfde plek as voorheen (bv. In lyn met dieselfde rand van u oppervlak). Druk weer op SPACE.

As alles goed gaan, gaan u nou na die LED -kalibrasie -stap. Ja, dit is ingewikkeld! Maar jy gaan 'n baie presiese liggeweer hê. Dit is net die prys.

Let wel: as u net soos ek 'n Wii onder die TV het, moet die Wii om twee redes afgeskakel word: eerstens, as die Wii aan is, sal dit aan die Wiimote koppel, en tweedens sal die infrarooi LED's van die sensorbalk inmeng hierdie projek. Om soortgelyke redes, terwyl u die Wii gebruik, is dit 'n goeie idee om die LED's rondom die TV te ontkoppel.

Stap 5: Kalibrasie Stap II: LED's

Kalibrasie Stap II: LED's
Kalibrasie Stap II: LED's
Kalibrasie Stap II: LED's
Kalibrasie Stap II: LED's

Nou moet u die sagteware vertel waar die LED's aan die rand van die TV geleë is. U sien 'n kalibrasieskerm met vier pyle, een daarvan gekies (helder) en drie van hulle grys, om die rand van die TV. U gebruik +/- om oor te skakel na die pyltjie wat u aanpas.

Doen dit vir elk van die vier pyle rondom die rand:

  1. druk links/regs op die Wiimote om die pyle te skuif totdat hulle so presies moontlik na die ooreenstemmende LED wys;
  2. druk op/af op die Wiimote om die lengte van die pyltjie te verander totdat die lengte van die pyl ooreenstem met die afstand tussen die LED en die rand van die TV -skerm; met ander woorde, die lengte van die pyl moet gelyk wees aan die afstand van die punt van die pyl na die LED.

Sodra u vier pyle reg is (en miskien selfs vroeër), sal u 'n rooi hare sien as u die Wiimote op die skerm wys. U kan seker maak dat dit is waar dit moet wees. (Onthou dat u ver genoeg moet wees sodat die Wiimote al die LED's kan sien. Dit is ook belangrik dat daar geen ander infrarooi bronne in die gesigsveld is nie. Ek het eens probleme ondervind weens sonlig wat deur 'n skroefkop op die TV -staanplek.)

Uiteindelik is daar 'n vyfde pyl wat slegs verskyn as u op + van die vierde LED -pyltjie druk of - van die eerste af (en dit het standaard nul lengte, dus dit is net 'n pixel). Hierdie pyltjie pas aan hoe ver bo die kamera van die Wii Remote die opname geregistreer sal word. Die probleem is dit: u sal langs die boonste oppervlak van die Wii -afstandsbediening sien. Maar die kamera is eintlik 'n entjie onder die oppervlak geleë, in die middel van die swart reghoek aan die voorkant van die Wii -afstandsbediening. As ons die opnames registreer waar die kamera wys, sou dit ongeveer 8 mm onder die boonste oppervlak van die Wii -afstandsbediening geregistreer wees. U kan dit kontroleer deur op te let dat die middel van die dwarshare deur die kamera weggesteek word terwyl u langs die boonste oppervlak sien.

U kan hiermee saamleef, of u kan hierdie vyfde pyl laat groei om die foto's met die bokant van die Wii -afstandsbediening te pas, of u kan die 3D -drukbare lêers vir die ysterbesienswaardighede aanpas om dit te vergoed (maar die vergoeding werk slegs vir 'n spesifieke afstand na die TV). Ek het self na die sagteware -belyning gegaan.

Druk HOME op die Wii Remote om die kalibrasie te verlaat en alle data in die ~/.wiilightgun -gids te stoor.

Stap 6: Toets en gebruik

Toets en gebruik
Toets en gebruik
Toets en gebruik
Toets en gebruik
Toets en gebruik
Toets en gebruik

U wil waarskynlik nou u liggeweer probeer. Begin net met 'n terminale emulator (of 'n script):

python3 ~/lightgun/lightgun.py -t

U moet terselfdertyd op die 1+2 knoppies druk, en daarna, as alles goed verloop, solank lightgun.py aan die gang is, sal die vuurwapen 'n absolute muis met twee knoppies navolg. Die snellerknoppie is muisknop 1, en die A-knoppie is muisknop 2. Druk op ctrl-c om te verlaat.

U hoef slegs u emulators en/of speletjies op te stel om met 'n absolute muis te werk. Ongelukkig gaan dit nie altyd so maklik wees nie.

Een prettige ding wat jy kan probeer, is my model vir iminernamez se eend-eend-shoot:

cd ~

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

Vir NES -speletjies gebruik ek die libretro fceumm -kern in Retroarch. Gaan na die keuselys en stel die Zapper in as 'n raakskerm. (Om dit as 'n muis op te stel, werk eintlik nie, aangesien fceumm 'n relatiewe beweging verwag eerder as 'n absolute-posisie muis.)

As u u speletjies met 'n script begin, kan u die deel wat die spel of emulator begin, wysig om te sê:

python3 ~/lightgun/lightgun.py -t -B 30 "opdrag om die spel te begin"

Gedurende die eerste 30 sekondes van die spel se uitvoering (vandaar die -B 30 -opsie) kan u u vuurwapen aansluit deur 1+2 ingedruk te hou.

Terloops, die lightgun.py -script kan ook gebruik word vir algemene Wii Remote -speletjies met Retroarch. Voeg net die -o -opsie by en die liggeweer -funksies word afgeskakel, en in plaas daarvan werk die Wii -afstandsbediening horisontaal, met die drie knoppies onderskeidelik 1, 2 en B. Daar is ander funksies wat verband hou met Retroarch in die kartering van lightgun.py wat u sal ontdek deur die kode te lees. Die minus -sleutel tree byvoorbeeld op as 'n verskuiwing, en saam met die dpad kan u stoor en laai (op/af = verander stoor nommer; links = herstel; regs = stoor).

Stap 7: Handvatsel en doelwit

Geweerhandvatsel en mik
Geweerhandvatsel en mik
Geweerhandvatsel en mik
Geweerhandvatsel en mik
Geweerhandvatsel en mik
Geweerhandvatsel en mik

U kan die Wii -afstandsbediening op sigself as 'n geweer aan die bokant sien. U kan ook een van die kommersiële geweeromhulsels daarvoor koop. Maar omdat die oorspronklike Wii -afstandsbediening nie as 'n sigbare geweer gebruik kan word nie, is die omhulsels geneig om nie met ysterbesienswaardighede te kom nie, en ysterbesienswaardighede verbeter die akkuraatheid aansienlik.

Ek het 'n eenvoudige driedelige 3D-drukbare stelsel ontwerp: 'n skuifhandvatsel wat net agter die sneller sit (so dit lyk 'n bietjie soos 'n Star Trek Original Series-faser) en skuif-besienswaardighede. Drukbare lêers is hier. As u op plastiek wil bespaar ten koste van afvalhout, kan u ook doen wat ek gedoen het, en in plaas van die hele handvatsel te druk, druk u net die deel wat die Wiimote bevat, en sny 'n houtstuk uit en skroef dit vas.

Om te sien, fokus u oë op die besienswaardighede. Rig die hobbel van die voorkant tussen die hobbels van die agterkant sodat die lugruimte gelyk is en al drie die hobbels ewe hoog uitsteek. Rig dan die middel van die teiken met die bokant van die stampe.

Let wel: die hoogte van die stampe is effens ongelyk, met die stamp van die voorkant effens laer om die hoogte van die sigbultjies self te vergoed as u op 'n afstand van 2,5 meter (my afstand na die TV) langs hulle sien. As u 'n aansienlik ander afstand tot die TV het, kan u dit in die OpenSCAD -lêers plaas. Hierdie aanpassing is in elk geval onder druktoleransies. As u ook nie die vertikale aanpassing in die sagteware gedoen het nie, kan u nog meer aanpassings aan die toerisme -aantreklikhede in die sagteware gee deur extraSightAdjust in te stel op ongeveer -8 (in millimeter).

Stap 8: Kalibrasie III (opsioneel): Fyn verstelling

As u nog meer presisie wil hê, kan u die volgende uitvoer:

python3 ~/lightgun/lightgun.py -d

(vir demonstrasie) en kyk noukeurig of die besienswaardighede in lyn is met die kruishare. As dit nie die geval is nie, moet u ~/.wiilightgun/wiimotecalibration handmatig bewerk en aanpas en die x- en y -koördinate van die kamerasentrum effens aanpas om die sig te verander. My geweer skiet byvoorbeeld effens na regs, so ek het uiteindelik die x -koördinaat van 529 na 525 verander. Almal se getalle sal waarskynlik anders wees.

Stap 9: Bylaag: die algoritme

Bylaag: die algoritme
Bylaag: die algoritme

Die muisemulasiekode werk ongeveer soos volg.

  • Verwerk knoppie druk.
  • Kry data van die kamera af en pas aan vir kalibrasie van die kamera -sentrering.
  • As minder as drie LED's in die kamera sigbaar is:

    Hou die laaste muisposisie

  • As drie of vier LED's sigbaar is:

    • Gebruik die Wiimote -versnellingsmeterdata om die Wiimote -oriëntasie te kry en identifiseer watter LED -kamera -beeld ooreenstem met watter fisiese LED.
    • As vier LED's sigbaar is:

      • Bereken homografie tussen LED -kamerabeelde en LED -liggings (in skermkoördinate).
      • Gebruik homografie om te bereken watter skermposisie ooreenstem met die middel van die kamera se gesigsveld.
      • Doen Y-verstelling om in die middel van die virtuele geweerloop onder die siglyn aan te pas. Dit is 'n ietwat onstuimige algoritme, maar dit werk.
      • Stel die muisposisie op die aangepaste skermposisie.
    • As drie LED's sigbaar is:

      • Gebruik OpenCV om die P3P -probleem tussen die LED -kamerabeelde en die fisiese LED -liggings op te los. Dit genereer tot vier oplossings.
      • Indien suksesvol:

        • As ons 'n vorige suksesvolle liggingberekening het, kies die oplossing waarmee die ontbrekende LED die naaste aan die laas waargenome of berekende posisie van die LED is.
        • As ons nie 'n vorige suksesvolle liggingberekening het nie, kies die oplossing wat die versnellingsmeter se koers die beste voorspel.
        • Gebruik die beste oplossing om te bereken waar die vierde LED moet gaan.
        • Doen die res soos in die vier LED -kaste.
      • Indien nie suksesvol nie:

        Hou die laaste muisposisie