Indholdsfortegnelse:

Præcis Wiimote Light Gun til Raspberry PI: 9 trin (med billeder)
Præcis Wiimote Light Gun til Raspberry PI: 9 trin (med billeder)

Video: Præcis Wiimote Light Gun til Raspberry PI: 9 trin (med billeder)

Video: Præcis Wiimote Light Gun til Raspberry PI: 9 trin (med billeder)
Video: Light Gun Reviews 243: Lichtknarre (PC Controller System) 2024, Juli
Anonim
Præcis Wiimote Light Gun til Raspberry PI
Præcis Wiimote Light Gun til Raspberry PI
Præcis Wiimote Light Gun til Raspberry PI
Præcis Wiimote Light Gun til Raspberry PI

Normalt er Wii -fjernbetjeningen, der bruges som en lyspistol, ikke præcis nok til retrospil som NES Duck Hunt, fordi Wii -fjernbetjeningen faktisk ikke vælger det punkt på tv'et, den peger på. Det kan ikke! Wii Remote har et infrarødt kamera i fronten, der ser rækken af infrarøde lysdioder i sensorbjælken, men det kan ikke vide, hvor langt (eller i hvilken retning) fjernsynet er fra baren, eller hvor stort tv'et er. Emulatorer og spil omgås dette ved at vise krydshår eller anden målretningsindikator, men det er ikke en præcis målskydningsoplevelse.

For at få Wii -fjernbetjeningen til at fungere som en præcis lyspistol, som du kan se langs for at vælge et mål på et fjernsyn, kræves fire infrarøde lysdioder arrangeret i et kendt firkantet mønster (ikke en lige linje) i samme plan som fjernsynet. Wii -fjernbetjeningen ser derefter de fire lysdioder, og kamerabilledet kan bruges til at beregne en homografi, der giver os mulighed for at finde ud af, hvor kameraet peger hen.

Hardwaren til dette projekt er enkel. Der er fire infrarøde lysdioder i simple 3D-printede huse, der kan limes til toppen og bunden af tv-huset og sættes i en USB-oplader. Plus, hvis du ikke har Wii -pistolhus, har jeg et simpelt 3D -trykt håndtag og seværdigheder, som du kan fastgøre til Wii -fjernbetjeningen (selvom jeg lavede en hybrid mellem træ og 3D -printet plast for at spare plastik).

Den python-baserede software var sværere at lave end hardwaren og er i øjeblikket kun Linux. Det kalibrerer lysdioderne og Wii -fjernbetjeningen og bruger derefter homografiregninger til at efterligne en absolut mus, der fungerer ganske godt i Retroarchs fceumm NES -emulator (og sandsynligvis nogle andre emulatorer) på min Raspberry PI 3B+.

Forbrugsvarer

  • Wii fjernbetjening
  • Fire 940nm 5 mm infrarøde lysdioder
  • Gammelt USB -kabel med et fungerende type A -stik
  • Hindbær PI 3 eller anden Linux -computer med Bluetooth -understøttelse
  • 3D -printer og filament (valgfrit)

Trin 1: Infrarød LED -kæde

Infrarød LED -kæde
Infrarød LED -kæde
Infrarød LED -kæde
Infrarød LED -kæde

Få et gammelt USB -kabel med en arbejdstype A -hanstik (normalt går min telefons opladningskabler i mikro -USB -enden, så jeg har restkabler med en fungerende hanstik af type A).. Faktisk er det endda OK, hvis datakablerne er gået i stykker, så længe ledningerne fungerer. Skær den anden ende af. I teorien skal det røde kabel være +5V, og det sorte skal jordes, men tjek det med et multimeter (tilslut det til en oplader, og kontroller derefter spændingen mellem de røde og sorte ledninger).

Da infrarøde lysdioder har et spændingsfald på 1,2-1,3V, lod jeg lige fire af dem i serie-loop til USB-kablet. Sørg for, at de ledninger, du lodder, er lange nok til, at du kan sætte lysdioder i bunden af fjernsynet og to øverst, med en anstændig mængde vandret mellemrum mellem lysdioder (ca. 10 tommer eller deromkring).

Mere præcist for at lave LED -sløjfen:

  • lod den minusside (katode, kortere ben, med flad kant) på den første LED til +5V USB -ledningen
  • slut plussiden af den første LED (anode, længere ben, med rund kant) til minussiden af den anden LED
  • gentag for at slutte den anden LED til den tredje og den tredje til den fjerde
  • Tilslut derefter plus -siden af den fjerde LED med en ledning til den jordede USB -ledning.

For at gøre tingene pænere kan du bruge varmekrympeslanger, når du laver forbindelserne. Ellers skal du bruge elektrisk tape for at undgå shorts.

Sørg for, at du ikke har kortslutninger. Tilslut den derefter til en USB -oplader, og kontroller, at den udsender infrarødt lys ved at se på lysdioderne med et telefonkamera. (Mange telefonkameraer er infrarøde følsomme.)

Trin 2: Tilslut til tv

Tilslut til tv
Tilslut til tv
Tilslut til tv
Tilslut til tv
Tilslut til tv
Tilslut til tv

Nu fastgør du to af lysdioderne til undersiden af fjernsynet og to til oversiden. Den vandrette afstand skal være omkring ti tommer. Hvis det er for meget, kan du have problemer med Wii Remote -kameraets synsfelt, der fanger dem alle. Men hvis de er for tæt på, så siger min geometriske intuition, at du vil have lavere præcision.

Til test tapede jeg lysdioderne med elektrisk tape, og derefter for en permanent forbindelse designede og printede jeg fire pæne små LED -klip (filer er her), som jeg varmlimede til fjernsynet. Du bør få lysdioderne til at være så tæt på tv -skærmens plan som du kan, uden at rammen skjuler dem fra det sted, hvor du vil optage.

Trin 3: Installer software

I øjeblikket er softwaren kun Linux. Følgende opsætning er designet til Raspberry PI 3 med Raspbian Stretch. Andre Linux -systemer kræver nogle ændringer. På tidligere modeller skal du bruge en Bluetooth -dongle, og du skal også køre dette fra en kommandolinje:

sudo get-apt installere bluetooth

Trin A: udev

Opret derefter en fil i /etc/udev/rules.d/wiimote.rules, der indeholder den enkelte linje:

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

Du kan for eksempel gøre det med en tekstredigerer eller ved at skrive følgende på kommandolinjen:

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

Og genstart derefter udev:

sudo /etc/init.d/udev genstart

Trin B: cwiid

Derefter skal du bruge min modificerede cwiid -pakke. Her bliver det lidt behåret, da du ideelt set skulle have brug for at bygge det på din Raspberry PI, men jeg må indrømme, at jeg har mistet overblikket over, hvilke pakker du skal installere for at få det til at fungere. Der er tre muligheder for at gøre dette.

Mulighed B1: Byg selv

cd ~

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

Desværre er der en ganske god chance for, at du mangler en masse ting, der er nødvendige for at bygge dette, og./configure vil klage. Du kan se på alle de ting, den klager over og køre sudo apt install på dem alle.

Mulighed B2: Brug mine binære filer

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 foretag installation

Trin C: python -biblioteker

Endelig få support ting til mit lightgun python script:

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

Trin D: lightgun.py

Hent endelig mit lightgun python script:

cd ~

git-klon

Hvis alt er gået godt, har du nu ~/lightgun.py, som du kan bruge til at kalibrere lightgun.

Trin 4: Kalibrering Del I: Centrering af kameraet

Kalibrering del I: Centrering af kameraet
Kalibrering del I: Centrering af kameraet
Kalibrering del I: Centrering af kameraet
Kalibrering del I: Centrering af kameraet
Kalibrering del I: Centrering af kameraet
Kalibrering del I: Centrering af kameraet

Der er to aspekter ved kalibrering. Den første er at kalibrere midten af kameraet på hver Wiimote. Dette kræver, at du bruger kameraet til at tage to billeder af lysdioderne omkring din tv-skærm, den ene med fjernbetjeningen til højre opad og den anden med den på hovedet.

For at undgå at trykke på knapperne, når du lægger Wii -fjernbetjeningen på forsiden, og for at få Wii -fjernbetjeningen til at have en ensartet højde, kan du 3D -udskrive det kalibreringsværktøj, jeg inkluderede her. Du har stort set brug for ting, der er 10,5 mm tykke, som du kan lægge under Wii -fjernbetjeningen, når den ligger på forsiden. Jeg brugte faktisk noget skrotfiner til at spare på plastik.

Tænd dine lysdioder, og sørg for, at din Raspberry PI eller en anden computer vises på tv'et. Tilslut et tastatur (dette fungerer ikke over ssh) eller brug VNC. Kør derefter:

python3 ~/lightgun/lightgun.py -M

Hvis alt går godt, får du et fuldskærmsvisning, hvor du bliver bedt om at trykke på 1+2 på Wii-fjernbetjeningen. Gøre det. Lysene blinker på Wii -fjernbetjeningen, og derefter lyser lys 1 og 4. Du vil også se et lille grønt rektangel øverst på skærmen med udsigten fra Wii Remote -kameraet. Ret Wii -fjernbetjeningen mod lysdioderne, og hvis alt går godt, ser du de fire lysdioder, nummereret 1 til 4.

Nu skal du finde en solid overflade med en skarp kant, som et sofabord, som du kan pege på tv -skærmen, og som kan tillade Wii -fjernbetjeningen at se alle lysdioderne med Wii -fjernbetjeningen justeret mod kanten. Begynd med at justere Wii -fjernbetjeningen med højre side opad, med fjernbetjeningens side rettet mod overfladekanten, og sørg for, at alle fire lysdioder ses. Tryk derefter på SPACE på dit tastatur (eller vedhæft en Nunchuck, og tryk på C, hvis det er mere bekvemt). Du bliver derefter bedt om at rotere Wii -fjernbetjeningen. Sørg nu for, at den er hævet 10,5 mm op fra din overflade ved hjælp af kalibreringsværktøjet eller noget andet og så tæt på det samme sted som før (f.eks. Justeret mod den samme kant af din overflade). Tryk på SPACE igen.

Hvis alt går godt, går du nu til LED -kalibreringstrinnet. Ja, det er kompliceret! Men du vil have en meget præcis lightgun. Det er bare prisen.

Bemærk: Hvis du ligesom mig har en Wii under tv'et, skal Wii slukkes af to grunde: For det første, hvis Wii er tændt, vil den oprette forbindelse til Wiimote, og for det andet vil sensorbjælkens infrarøde lysdioder forstyrre dette projekt. Af lignende grunde, mens du bruger Wii, er det en god idé at tage lysdioderne ud af tv'et.

Trin 5: Kalibrering Trin II: LED'er

Kalibrering Trin II: LED'er
Kalibrering Trin II: LED'er
Kalibrering Trin II: LED'er
Kalibrering Trin II: LED'er

Nu skal du fortælle softwaren, hvor lysdioderne er placeret omkring tv'ets kant. Du vil se en kalibreringsskærm, der viser fire pile, en af dem valgt (lys) og tre af dem nedtonede, omkring kanten af fjernsynet. Du bruger +/- til at skifte for at ændre hvilken pil du justerer.

For hver af de fire pile rundt om kanten skal du gøre følgende:

  1. tryk på venstre/højre på Wiimote for at flytte pilene, indtil de peger så præcist som muligt mod den tilsvarende LED;
  2. tryk op/ned på Wiimote for at ændre pilens længde, indtil pilens længde svarer til afstanden mellem LED'en og kanten af tv -displayet; med andre ord skal pilens længde være lig med afstanden fra pilens spids til LED'en.

Når dine fire pile er korrekte (og måske endda tidligere), vil du se et rødt hårkors, når du retter Wiimote mod skærmen. Du kan kontrollere, at det er her det skal være. (Husk, at du skal være langt nok væk til, at Wiimote kan se alle lysdioderne. Det er også vigtigt, at der ikke er andre kilder til infrarød i synsfeltet. Jeg havde engang problemer på grund af sollys, der reflekterede fra et skruehoved på skærmen TV -stander.)

Endelig er der en femte pil, der kun vises, når du trykker på + fra den fjerde LED -pil eller - fra den første (og den har som standard nul længde, så det er bare en pixel). Denne pil justerer, hvor langt over kameraet på Wii -fjernbetjeningen billedet vil blive registreret. Problemet er dette: du vil se langs den øverste overflade af Wii -fjernbetjeningen. Men kameraet er faktisk placeret et stykke under denne overflade, midt i det sorte rektangel foran Wii -fjernbetjeningen. Hvis vi registrerede de optagelser, hvor kameraet peger, ville de blive registreret cirka 8 mm under Wii -fjernbetjeningens øverste overflade. Du kan kontrollere dette ved at bemærke, at når du ser langs den øverste overflade, er midten af krydshårene skjult af kameraet.

Du kan leve med dette, eller du kan vokse denne femte pil til softwarejustering af optagelserne med toppen af Wii -fjernbetjeningen, eller du kan justere 3D -udskrivbare filer til jernsigte for at kompensere for dette (men kompensationen fungerer kun for en bestemt afstand til fjernsynet). Jeg gik selv til softwarejusteringen.

Tryk på HOME på Wii -fjernbetjeningen for at afslutte kalibrering og gemme alle data i ~/.wiilightgun -biblioteket.

Trin 6: Test og brug

Test og brug
Test og brug
Test og brug
Test og brug
Test og brug
Test og brug

Du vil sandsynligvis prøve din lette pistol nu. Bare kør i en terminalemulator (eller et script):

python3 ~/lightgun/lightgun.py -t

Du bliver nødt til at trykke på 1+2-knapperne på samme tid, og efter det, hvis alt går godt, så længe lightgun.py kører, vil lightgun efterligne en to-knappers absolut mus. Udløserknappen er museknap 1, og A-knappen er museknap 2. Tryk på ctrl-c for at afslutte.

Du skal nu kun konfigurere dine emulatorer og/eller spil til at fungere med en absolut mus. Desværre bliver det ikke altid så let.

En sjov ting du kan prøve, er min mod af iminurnamez's and-duck-shoot:

cd ~

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

Til NES -spil bruger jeg libretro fceumm -kernen i Retroarch. Gå til menuen Indstillinger, og konfigurer Zapper til at være en berøringsskærm. (Konfiguration af den som en mus virker faktisk ikke, da fceumm forventer en relativ bevægelse frem for mus med absolut position.)

Hvis du starter dine spil med et script, kan du redigere den del, der starter spillet eller emulatoren for at sige:

python3 ~/lightgun/lightgun.py -t -B 30 "kommando for at starte spillet"

I løbet af de første 30 sekunder af spillets udførelse (derfor -B 30 -indstillingen) kan du forbinde din lightgun ved at holde 1+2 nede.

I øvrigt kan lightgun.py -scriptet også bruges til almindeligt Wii Remote -spil med Retroarch. Tilføj blot -o -indstillingen, og lightgun -funktionerne slukkes, og i stedet fungerer Wii -fjernbetjeningen vandret, idet de tre knapper er henholdsvis 1, 2 og B. Der er andre Retroarch-relaterede funktioner i lightgun.pys kortlægninger, som du vil opdage ved at læse koden. F.eks. Fungerer minus -tasten som et skift, og sammen med dpad'en styrer du lagring og indlæsning (op/ned = skift gem nummer; venstre = gendannelse; højre = gem).

Trin 7: Pistolhåndtag og målretning

Pistolhåndtag og målretning
Pistolhåndtag og målretning
Pistolhåndtag og målretning
Pistolhåndtag og målretning
Pistolhåndtag og målretning
Pistolhåndtag og målretning

Du kan bruge Wii -fjernbetjeningen i sig selv som en pistol, der ser langs toppen. Du kan også købe et af de kommercielle pistolhylstre til det. Men fordi den originale Wii -fjernbetjening ikke var i stand til at bruges som en synlig pistol, har kabinetterne en tendens til ikke at komme med jernsyn, og jernsigte forbedrer nøjagtigheden i høj grad.

Jeg har designet et simpelt 3D-printbart system i tre dele: et håndtag, der kan glides på, der sidder lige bag aftrækkeren (så det ligner lidt en Star Trek Original Series-phaser) og seværdigheder, der kan glides på. Filer, der kan udskrives, er her. Hvis du vil spare på plastik på bekostning af skrot, kan du også gøre, hvad jeg gjorde, og i stedet for at printe hele håndtaget, udskrive bare den del, der holder Wiimote, og klippe et træstykke ud og skrue det fast.

Til syne, fokuser dine øjne på seværdighederne. Juster det forreste syns bump mellem det bageste syns bump, så luftrummet på begge er ens, og alle tre bump stikker lige højt ud. Juster derefter midten af målet med toppen af bumpene.

Bemærk: Bumpens højde er lidt ulige, idet frontsumpens bump er lidt lavere for at kompensere for selve højden på selve bumpene, når du ser langs dem i en afstand af 2,5 meter (min afstand til TV). Hvis du har en væsentlig anden afstand til tv'et, kan du lægge det i OpenSCAD -filerne. Denne justering kan dog alligevel være under printertolerancer. Hvis du ikke foretog den lodrette justering i softwaren, kan du tilføje nogle flere justeringer til seværdighederne i softwaren ved at indstille extraSightAdjust til noget omkring -8 (i millimeter).

Trin 8: Kalibrering III (valgfri): Finjustering

Hvis du vil have endnu mere præcision, kan du køre:

python3 ~/lightgun/lightgun.py -d

(til demo) og se omhyggeligt, om seværdighederne flugter med krydshårene. Hvis de ikke gør det, skal du afslutte og redigere ~/.wiilightgun/wiimotecalibration manuelt og justere x- og y -koordinaterne på kameramidret lidt for at justere synet. For eksempel skød min pistol lidt til højre, så jeg endte med at ændre x -koordinaten fra 529 til 525. Alle vil sandsynligvis være forskellige.

Trin 9: Tillæg: Algoritmen

Tillæg: Algoritmen
Tillæg: Algoritmen

Musemuleringskoden fungerer nogenlunde som følger.

  • Behandl knappen knap.
  • Hent data fra kameraet og juster til kameracentreringskalibrering.
  • Hvis der er mindre end tre lysdioder i kameraet:

    Behold den sidste museposition

  • Hvis tre eller fire lysdioder er synlige:

    • Brug Wiimote -accelerometerdata til at få Wiimote -orienteringen og identificere, hvilket LED -kamerabillede, der svarer til hvilken fysisk LED.
    • Hvis fire lysdioder er synlige:

      • Beregn homografi mellem LED -kamerabilleder og LED -placeringer (i skærmkoordinater).
      • Brug homografi til at beregne hvilken skærmplacering, der svarer til midten af kameraets synsfelt.
      • Gør Y-justering for at justere til midten af den virtuelle kanonrør under sigtelinjen. Dette er en lidt uforskammet algoritme, men den virker.
      • Indstil musepositionen til den justerede skærmplacering.
    • Hvis tre lysdioder er synlige:

      • Brug OpenCV til at løse P3P -problemet mellem LED -kamerabillederne og de fysiske LED -placeringer. Dette genererer op til fire løsninger.
      • Hvis det lykkes:

        • Hvis vi har en tidligere vellykket lokaliseringsberegning, skal du vælge den løsning, der gør, at den manglende LED er tættest på den sidste observerede eller beregnede position for den pågældende LED.
        • Hvis vi ikke har en tidligere vellykket lokaliseringsberegning, skal du vælge den løsning, der bedst forudsiger accelerometerets kurs.
        • Brug den bedste løsning til at beregne, hvor den fjerde LED skal gå.
        • Gør resten som i de fire LED -etuier.
      • Hvis det ikke lykkes:

        Behold den sidste museposition

Anbefalede: