Innholdsfortegnelse:

Nøyaktig Wiimote Light Gun for Raspberry PI: 9 trinn (med bilder)
Nøyaktig Wiimote Light Gun for Raspberry PI: 9 trinn (med bilder)

Video: Nøyaktig Wiimote Light Gun for Raspberry PI: 9 trinn (med bilder)

Video: Nøyaktig Wiimote Light Gun for Raspberry PI: 9 trinn (med bilder)
Video: Light Gun Setup Guide For Batocera | How To Setup Wii Remote For Mame Light Gun Games | RetroPie Guy 2024, Juli
Anonim
Nøyaktig Wiimote Light Gun for Raspberry PI
Nøyaktig Wiimote Light Gun for Raspberry PI
Nøyaktig Wiimote Light Gun for Raspberry PI
Nøyaktig Wiimote Light Gun for Raspberry PI

Normalt er Wii -fjernkontrollen som brukes som en lyspistol ikke nøyaktig nok for retrospill som NES Duck Hunt, fordi Wii -fjernkontrollen faktisk ikke velger punktet på TVen den er pekt på. Det kan ikke! Wii -fjernkontrollen har et infrarødt kamera foran som ser linjen av infrarøde lysdioder i sensorlinjen, men den kan ikke vite hvor langt (eller i hvilken retning) TV -en er fra baren eller hvor stor TV -en er. Emulatorer og spill omgår dette ved å vise krysshår eller annen målrettingsindikator, men det er ikke en nøyaktig målskyting.

For å få Wii -fjernkontrollen til å fungere som en nøyaktig lyspistol som du kan se langs for å velge et mål på en TV, kreves fire infrarøde lysdioder arrangert i et kjent firkantmønster (ikke en rett linje) i samme plan som TV -en. Wii -fjernkontrollen ser deretter de fire lysdiodene, og kamerabildet kan brukes til å beregne en homografi som lar oss finne ut hvor kameraet peker på.

Maskinvaren for dette prosjektet er enkel. Det er fire infrarøde lysdioder i enkle 3D-trykte hus som kan limes på toppen og bunnen av TV-huset og kobles til en USB-lader. I tillegg, hvis du ikke har Wii -pistolhus, har jeg et enkelt 3D -trykt håndtak og severdigheter som du kan feste til Wii -fjernkontrollen (men for å spare plast gjorde jeg min til en hybrid mellom tre og 3D -trykt plast).

Den pytonbaserte programvaren var vanskeligere å lage enn maskinvaren og er for tiden bare Linux. Den kalibrerer lysdiodene og Wii -fjernkontrollen og bruker deretter homografiregninger til å etterligne en absolutt mus som fungerer ganske bra i Retroarchs fceumm NES -emulator (og sannsynligvis noen andre emulatorer) på min Raspberry PI 3B+.

Rekvisita

  • Wii -fjernkontroll
  • Fire 940 nm 5 mm infrarøde lysdioder
  • Gammel USB -kabel med en fungerende type A -kontakt
  • Raspberry PI 3 eller annen Linux -datamaskin med Bluetooth -støtte
  • 3D -skriver og filament (valgfritt)

Trinn 1: Infrarød LED -kjede

Infrarød LED -kjede
Infrarød LED -kjede
Infrarød LED -kjede
Infrarød LED -kjede

Skaff deg en gammel USB -kabel med en hanstikkontakt av type A (vanligvis går telefonens ladekabler i mikro -USB -enden, så jeg har igjen kabler med en arbeidsstikkontakt av type A). Egentlig er det til og med OK hvis datakablene er ødelagt så lenge kraftledningene fungerer. Klipp av den andre enden. I teorien skal den røde kabelen være +5V og den svarte skal jordes, men sjekk den med et multimeter (koble den til en lader, og kontroller deretter spenningen mellom de røde og svarte ledningene).

Siden infrarøde lysdioder har et spenningsfall på 1,2-1,3V, loddet jeg nettopp fire av dem i serie-sløyfe til USB-kabelen. Sørg for at ledningene du lodder er lange nok til at du kan sette lysdioder nederst på TV -en og to øverst, med en anstendig mengde horisontalt mellomrom mellom lysdiodene (ca. 10 tommer eller så).

Mer presist for å lage LED -sløyfen:

  • lodd minussiden (katode, kortere ben, med flat kant) av den første LED -en til +5V USB -ledningen
  • koble plussiden til den første lysdioden (anode, lengre ben, med rund kant) til minussiden av den andre lysdioden
  • gjenta for å koble den andre LED -en til den tredje og den tredje til den fjerde
  • koble deretter plussiden til den fjerde LED -en med en ledning til den jordede USB -kabelen.

For å gjøre ting penere, kan du bruke krympeslanger når du gjør tilkoblingene. Ellers bruk elektrisk tape for å unngå shorts.

Sørg for at du ikke har noen kortslutning. Koble den deretter til en USB -lader og sjekk at den sender ut infrarødt lys ved å se på lysdiodene med et telefonkamera. (Mange telefonkameraer er infrarøde følsomme.)

Trinn 2: Fest til TV

Fest til TV
Fest til TV
Fest til TV
Fest til TV
Fest til TV
Fest til TV

Fest nå to av lysdiodene til undersiden av TV -en og to til oversiden. Den horisontale avstanden skal være omtrent ti tommer. Hvis det er for mye, kan du ha problemer med at Wii Remote -kameraets synsfelt fanger dem alle. Men hvis de er for nære, så sier min geometriske intuisjon at du vil ha lavere presisjon.

For testing tapte jeg lysdiodene med elektrisk tape, og for en permanent tilkobling designet og skrev jeg ut fire fine små LED -klipp (filer er her) som jeg limte fast til TV -en. Du bør få lysdiodene til å være så nær planen på TV -skjermen som du kan, uten at rammen skjuler dem fra stedet der du skal skyte.

Trinn 3: Installer programvare

Foreløpig er programvaren bare Linux. Følgende oppsett er designet for Raspberry PI 3 med Raspbian Stretch. Andre Linux -systemer krever noen endringer. På tidligere modeller trenger du en Bluetooth -dongle, og du må også kjøre dette fra en kommandolinje:

sudo get-apt install bluetooth

Trinn A: udev

Deretter lager du en fil i /etc/udev/rules.d/wiimote.rules som inneholder den ene linjen:

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

Du kan for eksempel gjøre det med et tekstredigeringsprogram eller ved å skrive følgende på kommandolinjen:

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

Og start deretter udev på nytt:

sudo /etc/init.d/udev start på nytt

Trinn B: cwiid

Deretter trenger du min modifiserte cwiid -pakke. Her blir det litt hårete, ettersom du ideelt sett trenger du å bygge det på din Raspberry PI, men jeg må innrømme at jeg har mistet oversikten over hvilke pakker du må installere for å få det til å fungere. Det er tre alternativer for å gjøre dette.

Alternativ B1: Bygg selv

cd ~

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

Dessverre er det en ganske god sjanse for at du mangler en haug med ting du trenger for å bygge dette, og./configure vil klage. Du kan se på alle tingene det klager over og kjøre sudo apt install på dem alle.

Alternativ B2: Bruk 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 gjør installasjon

Trinn C: python -biblioteker

Til slutt får du støttestoffer for mitt lightgun python -skript:

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

Trinn D: lightgun.py

Til slutt, få mitt lightgun python -skript:

cd ~

git-klon

Hvis alt har gått bra, har du nå ~/lightgun.py som du kan bruke til å kalibrere lightgun.

Trinn 4: Kalibrering Del I: Sentrering av kameraet

Kalibrering del I: Sentrering av kameraet
Kalibrering del I: Sentrering av kameraet
Kalibrering del I: Sentrering av kameraet
Kalibrering del I: Sentrering av kameraet
Kalibrering del I: Sentrering av kameraet
Kalibrering del I: Sentrering av kameraet

Det er to aspekter ved kalibrering. Den første er å kalibrere midten av kameraet på hver Wiimote. Dette krever at du bruker kameraet til å ta to bilder av lysdiodene rundt TV-skjermen, den ene med fjernkontrollen til høyre og den andre opp ned.

For å unngå å trykke på knappene når du legger Wii -fjernkontrollen på forsiden, og for å få Wii -fjernkontrollen til å ha en konsekvent høyde, kan du 3D -skrive ut kalibreringsverktøyet jeg inkluderte her. Du trenger i utgangspunktet ting som er 10,5 mm tykke som du kan legge under Wii -fjernkontrollen når den ligger på forsiden. Jeg brukte faktisk litt kryssfiner for å spare på plast.

Slå på lysdiodene dine og kontroller at Raspberry PI eller en annen datamaskin vises på TV -en. Koble til et tastatur (dette fungerer ikke over ssh) eller bruk VNC. Kjør deretter:

python3 ~/lightgun/lightgun.py -M

Hvis alt går bra, får du en fullskjermsvisning som ber deg om å trykke 1+2 på Wii-fjernkontrollen. Gjør det. Lysene blinker på Wii -fjernkontrollen, og deretter lyser lampene 1 og 4. Du vil også se et lite grønt rektangel øverst på skjermen, med utsikt fra Wii Remote -kameraet. Pek Wii -fjernkontrollen mot lysdiodene, og hvis alt går bra, vil du se de fire lysdiodene, nummerert 1 til 4.

Nå må du finne en solid overflate med en skarp kant, som et salongbord, som du kan peke på TV -skjermen og som kan la Wii -fjernkontrollen se alle lysdiodene med Wii -fjernkontrollen justert mot kanten. Begynn med å justere Wii -fjernkontrollen med høyre side opp, med fjernkontrollens side rettet mot overflatekanten, og sørg for at alle fire lysdiodene er synlige. Trykk deretter på SPACE på tastaturet (eller fest en Nunchuck og trykk C hvis det er mer praktisk). Du blir deretter bedt om å rotere Wii -fjernkontrollen. Sørg nå for at den er hevet 10,5 mm opp fra overflaten din, ved hjelp av kalibreringsverktøyet eller noe annet, og så nær samme sted som før (f.eks. Justert mot den samme kanten av overflaten). Trykk på mellomrom igjen.

Hvis alt går bra, går du nå til LED -kalibreringstrinnet. Jepp, dette er komplisert! Men du kommer til å ha en veldig presis lightgun. Det er bare prisen.

Merk: Hvis du som meg har en Wii under TV -en, må Wii slås av av to grunner: For det første, hvis Wii er på, kobles den til Wiimote, og for det andre vil sensorstangens infrarøde lysdioder forstyrre dette prosjektet. Av lignende årsaker, mens du bruker Wii, er det en god idé å koble lysdiodene rundt TV -en.

Trinn 5: Kalibrering Trinn II: Lysdioder

Kalibrering Trinn II: Lysdioder
Kalibrering Trinn II: Lysdioder
Kalibrering Trinn II: Lysdioder
Kalibrering Trinn II: Lysdioder

Nå må du fortelle programvaren hvor lysdiodene er plassert rundt TV -kanten. Du vil se en kalibreringsskjerm som viser fire piler, en av dem valgt (lys) og tre av dem nedtonet, rundt kanten av TV -en. Du bruker +/- for å bytte for å endre hvilken pil du justerer.

Gjør dette for hver av de fire pilene rundt kanten:

  1. Trykk på venstre/høyre på Wiimote for å flytte pilene til de peker så presist du kan mot den tilsvarende LED -en;
  2. trykk opp/ned på Wiimote for å endre pilens lengde til pilens lengde samsvarer med avstanden mellom LED -en og kanten på TV -skjermen; med andre ord må lengden på pilen være lik avstanden fra spissen av pilen til lysdioden.

Når de fire pilene er riktige (og kanskje enda tidligere) vil du se et rødt hårkors når du retter Wiimote mot skjermen. Du kan sjekke at det er her det skal være. (Husk at du må være langt nok unna til at Wiimote kan se alle lysdiodene. Det er også viktig at det ikke er andre kilder til infrarød i synsfeltet. Jeg hadde en gang problemer på grunn av sollys som reflekterte fra et skruehode på TV-benk.)

Til slutt er det en femte pil som bare vises når du trykker på + fra den fjerde LED -pilen eller - fra den første (og den har som standard null lengde, så det er bare en piksel). Denne pilen justerer hvor langt over kameraet på Wii -fjernkontrollen bildet blir registrert. Problemet er dette: du vil se langs den øvre overflaten av Wii -fjernkontrollen. Men kameraet er faktisk plassert et stykke under overflaten, midt i det svarte rektangelet foran Wii -fjernkontrollen. Hvis vi registrerte bildene der kameraet peker, ville de være registrert omtrent 8 mm under toppen av Wii -fjernkontrollen. Du kan sjekke dette ved å merke at når du ser langs den øvre overflaten, er midten av krysshårene skjult av kameraet.

Du kan leve med dette, eller du kan vokse denne femte pilen for å programvarejustere bildene med toppen av Wii -fjernkontrollen, eller du kan justere 3D -utskrivbare filer for jernsiktene for å kompensere for dette (men kompensasjonen fungerer bare for en bestemt avstand til TV -en). Jeg gikk for programvarejusteringen selv.

Trykk på HOME på Wii Remote for å avslutte kalibreringen og lagre alle dataene i ~/.wiilightgun -katalogen.

Trinn 6: Test og bruk

Test og bruk
Test og bruk
Test og bruk
Test og bruk
Test og bruk
Test og bruk

Du vil sannsynligvis prøve lyspistolen din nå. Bare kjør i en terminalemulator (eller et skript):

python3 ~/lightgun/lightgun.py -t

Du må trykke på 1+2-knappene samtidig, og etter det hvis alt går bra, så lenge lightgun.py kjører, vil lightgun etterligne en to-knappers absolutt mus. Utløserknappen er museknapp 1, og A-knappen er museknapp 2. Trykk på ctrl-c for å gå ut.

Du trenger nå bare å konfigurere emulatorene og/eller spillene dine for å fungere med en absolutt mus. Dessverre kommer det ikke alltid til å være så enkelt.

En morsom ting du kan prøve er min mod av iminernamez's and-duck-shoot:

cd ~

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

For NES -spill bruker jeg libretro fceumm -kjernen i Retroarch. Gå til Alternativer -menyen, og konfigurer Zapper til å være en berøringsskjerm. (Å konfigurere den som en mus fungerer faktisk ikke, ettersom fceumm forventer en relativ bevegelse i stedet for mus med absolutt posisjon.)

Hvis du starter spillene dine med et skript, kan du redigere delen som starter spillet eller emulatoren for å si:

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

I løpet av de første 30 sekundene av spillets utførelse (derav -B 30 -alternativet) kan du koble til lyspistolen din ved å holde nede 1+2.

Forresten, lightgun.py -skriptet kan også brukes til generelt Wii Remote -spill med Retroarch. Bare legg til -o -alternativet, så blir lightgun -funksjonene slått av, og i stedet fungerer Wii -fjernkontrollen horisontalt, med de tre knappene henholdsvis 1, 2 og B. Det er andre Retroarch-relaterte funksjoner i lightgun.pys kartlegginger som du vil oppdage ved å lese koden. Minustasten fungerer for eksempel som et skift, og sammen med dpad -kontrollene lagrer og laster du inn (opp/ned = endre lagre nummer; venstre = gjenopprette; høyre = lagre).

Trinn 7: Pistolhåndtak og sikte

Pistolhåndtak og sikte
Pistolhåndtak og sikte
Pistolhåndtak og sikte
Pistolhåndtak og sikte
Pistolhåndtak og sikte
Pistolhåndtak og sikte

Du kan bruke Wii -fjernkontrollen i seg selv som en pistol og se langs toppen. Du kan også kjøpe en av de kommersielle pistolhylstrene for den. Men fordi den originale Wii -fjernkontrollen ikke var i stand til å brukes som en synlig pistol, har foringsrørene en tendens til ikke å komme med jernsikt, og jernsikt forbedrer nøyaktigheten sterkt.

Jeg designet et enkelt tredelt 3D-utskrivbart system: et glidbart håndtak som sitter like bak avtrekkeren (så det ser litt ut som en Phaser i Star Trek Original Series) og severdigheter. Utskrivbare filer er her. Hvis du vil spare på plast på bekostning av skrapvirke, kan du også gjøre det jeg gjorde, og i stedet for å skrive ut hele håndtaket, skrive ut bare delen som holder Wiimote, og klippe ut et trebit og skru det fast.

For å se, fokuser du øynene på severdighetene. Juster frontsiktens støt mellom det bakre sikts støt, slik at luftrommet på begge er like og alle tre støtene stikker like høyt ut. Juster deretter midten av målet med toppen av støtene.

Merk: Høyden på støtene er litt ulik, med frontsumpens støt er litt lavere, for å kompensere for høyden på selve sumpene når du ser langs dem i en avstand på 2,5 meter (min avstand til TV). Hvis du har en vesentlig annen avstand til TV -en, kan du sette det inn i OpenSCAD -filene. Denne justeringen kan imidlertid være under skrivertoleranser. Hvis du ikke gjorde den vertikale justeringen i programvaren, kan du legge til litt mer justering av severdighetene i programvaren ved å sette extraSightAdjust til noe rundt -8 (i millimeter).

Trinn 8: Kalibrering III (valgfritt): Finjustering

Hvis du vil ha enda mer presisjon, kan du kjøre:

python3 ~/lightgun/lightgun.py -d

(for demo) og se nøye på om severdighetene stemmer overens med tverrhårene. Hvis de ikke gjør det, avslutt og rediger ~/.wiilightgun/wiimotecalibration manuelt, og juster x- og y -koordinatene til kamerasenteret litt for å justere synet. For eksempel skjøt pistolen min litt til høyre, så jeg endte med å endre x -koordinaten fra 529 til 525. Alle vil sannsynligvis være forskjellige.

Trinn 9: Vedlegg: Algoritmen

Vedlegg: Algoritmen
Vedlegg: Algoritmen

Musemuleringskoden fungerer omtrent som følger.

  • Behandle knappene.
  • Få data fra kameraet og juster for kamerasentreringskalibrering.
  • Hvis færre enn tre lysdioder er synlige i kameraet:

    Behold siste museposisjon

  • Hvis tre eller fire lysdioder er synlige:

    • Bruk Wiimote -akselerometerdata for å få Wiimote -retningen og identifisere hvilket LED -kamerabilde som tilsvarer hvilken fysisk LED.
    • Hvis fire lysdioder er synlige:

      • Beregn homografi mellom LED -kamerabilder og LED -steder (i skjermkoordinater).
      • Bruk homografi til å beregne hvilken skjermplassering som tilsvarer midten av kamerafeltet.
      • Gjør Y-justering for å justere for midten av det virtuelle pistolrøret under siktlinjen. Dette er en litt sliten algoritme, men den fungerer.
      • Still museposisjonen til den justerte skjermplasseringen.
    • Hvis tre lysdioder er synlige:

      • Bruk OpenCV for å løse P3P -problemet mellom LED -kamerabilder og de fysiske LED -plasseringene. Dette genererer opptil fire løsninger.
      • Hvis det lykkes:

        • Hvis vi har en tidligere vellykket lokaliseringsberegning, velger du løsningen som gjør at den manglende lysdioden er nærmest den siste observerte eller beregnede posisjonen til den.
        • Hvis vi ikke har en tidligere vellykket lokaliseringsberegning, velger du løsningen som best forutsier akselerometerets kurs.
        • Bruk den beste løsningen til å beregne hvor den fjerde LED -en skal gå.
        • Gjør resten som i de fire LED -dekslene.
      • Hvis det ikke lykkes:

        Behold siste museposisjon

Anbefalt: