Innehållsförteckning:

Exakt Wiimote Light Gun för Raspberry PI: 9 steg (med bilder)
Exakt Wiimote Light Gun för Raspberry PI: 9 steg (med bilder)

Video: Exakt Wiimote Light Gun för Raspberry PI: 9 steg (med bilder)

Video: Exakt Wiimote Light Gun för Raspberry PI: 9 steg (med bilder)
Video: Area 51 RetroPie Light Gun Gameplay Demo Walkthrough on Raspberry Pi 4 - RetroPie Guy Light Gun 2024, Juli
Anonim
Exakt Wiimote Light Gun för Raspberry PI
Exakt Wiimote Light Gun för Raspberry PI
Exakt Wiimote Light Gun för Raspberry PI
Exakt Wiimote Light Gun för Raspberry PI

Normalt är Wii -fjärrkontrollen som används som en lättpistol inte tillräckligt noggrann för retrospel som NES Duck Hunt, eftersom Wii -fjärrkontrollen faktiskt inte väljer den punkt på TV: n den riktas mot. Det kan inte! Wii -fjärrkontrollen har en infraröd kamera i fronten som ser raden av infraröda lysdioder i sensorfältet, men den kan inte veta hur långt (eller i vilken riktning) TV: n är från stapeln eller hur stor TV: n är. Emulatorer och spel kringgår detta genom att visa hårstrån eller annan inriktningsindikator, men det är inte en exakt målskytteupplevelse.

För att få Wii -fjärrkontrollen att fungera som en exakt ljuspistol som du kan se längs för att välja ett mål på en TV krävs fyra infraröda lysdioder arrangerade i ett känt fyrkantigt mönster (inte en rak linje) i samma plan som TV: n. Wii -fjärrkontrollen ser sedan de fyra lysdioderna och kamerabilden kan användas för att beräkna en homografi som gör att vi kan ta reda på var kameran pekar.

Hårdvaran för detta projekt är enkel. Det finns fyra infraröda lysdioder i enkla 3D-tryckta höljen som kan limmas på ovansidan och botten av TV-huset och anslutas till en USB-laddare. Dessutom, om du inte har Wii -pistolhus, har jag ett enkelt 3D -tryckt handtag och sevärdheter som du kan fästa på Wii -fjärrkontrollen (men för att spara plast gjorde jag min till en hybrid mellan trä och 3D -tryckt plast).

Den pythonbaserade programvaran var svårare att göra än hårdvaran och är för närvarande endast Linux. Den kalibrerar lysdioderna och Wii -fjärrkontrollen och använder sedan homografiska beräkningar för att emulera en absolut mus som fungerar ganska bra i Retroarchs fceumm NES -emulator (och förmodligen några andra emulatorer) på min Raspberry PI 3B+.

Tillbehör

  • Wii -fjärrkontroll
  • Fyra 940 nm 5 mm infraröda lysdioder
  • Gammal USB -kabel med en fungerande typ A -kontakt
  • Raspberry PI 3 eller annan Linux -dator med Bluetooth -stöd
  • 3D -skrivare och filament (tillval)

Steg 1: Infraröd LED -kedja

Infraröd LED -kedja
Infraröd LED -kedja
Infraröd LED -kedja
Infraröd LED -kedja

Skaffa en gammal USB -kabel med ett fungerande han -uttag (vanligtvis går min telefons laddningskablar i mikro -USB -änden, så jag har kvar kablar med ett fungerande han -uttag).. Egentligen är det till och med OK om datakablarna är trasiga så länge kraftledningarna fungerar. Skär av den andra änden. I teorin ska den röda kabeln vara +5V och den svarta ska jordas, men kontrollera den med en multimeter (anslut den till en laddare och kontrollera sedan spänningen mellan de röda och svarta ledningarna).

Eftersom infraröda lysdioder har ett spänningsfall på 1,2-1,3V har jag bara lödt fyra av dem i serie-slinga till USB-kabeln. Se till att trådarna du lödar är tillräckligt långa för att du kan sätta lysdioder längst ner på TV: n och två upptill, med en anständig mängd horisontellt utrymme mellan lysdioderna (cirka 10 tum eller så).

Mer exakt för att göra LED -slingan:

  • löd minussidan (katod, kortare ben, med platt kant) på den första lysdioden till +5V USB -kabeln
  • anslut plussidan av den första lysdioden (anod, längre ben, med rund kant) till minussidan av den andra lysdioden
  • upprepa för att ansluta den andra lysdioden till den tredje och den tredje till den fjärde
  • Anslut sedan den positiva sidan av den fjärde lysdioden med en kabel till den jordade USB -kabeln.

För att göra saker snyggare kan du använda värmekrympslangar när du gör anslutningarna. Använd annars eltejp för att undvika shorts.

Se till att du inte har några kortslutningar. Anslut sedan den till en USB -laddare och kontrollera att den avger infrarött ljus genom att titta på lysdioderna med en telefonkamera. (Många telefonkameror är infraröda.)

Steg 2: Anslut till TV: n

Anslut till TV: n
Anslut till TV: n
Anslut till TV: n
Anslut till TV: n
Anslut till TV: n
Anslut till TV: n

Fäst nu två av lysdioderna på TV: ns undersida och två på ovansidan. Det horisontella avståndet ska vara cirka tio tum. Om det är för mycket kan du ha problem med att Wii Remote -kamerans synfält fångar dem alla. Men om de är för nära så säger min geometriska intuition att du kommer att ha lägre precision.

För testning tejpade jag på lysdioderna med eltejp, och sedan för en permanent anslutning, designade och skrev jag ut fyra snygga små LED -klipp (filer finns här) som jag varmt limde på TV: n. Du bör låta lysdioderna vara så nära TV -skärmens plan som du kan, utan att ramen döljer dem från platsen där du ska skjuta.

Steg 3: Installera programvara

För närvarande är programvaran endast Linux. Följande inställning är utformad för Raspberry PI 3 med Raspbian Stretch. Andra Linux -system kräver vissa ändringar. På tidigare modeller behöver du en Bluetooth -dongel och du måste också köra detta från en kommandorad:

sudo get-apt installera bluetooth

Steg A: udev

Skapa sedan en fil i /etc/udev/rules.d/wiimote.rules som innehåller den enda raden:

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

Du kan till exempel göra det med en textredigerare eller genom att skriva följande på kommandoraden:

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

Och starta om udev:

sudo /etc/init.d/udev starta om

Steg B: cwiid

Därefter behöver du mitt modifierade cwiid -paket. Här blir det lite hårigt eftersom du helst skulle behöva bygga det på din Raspberry PI, men jag måste erkänna att jag har tappat koll på vilka paket du behöver installera för att få det att fungera. Det finns tre alternativ för att göra detta.

Alternativ B1: Bygg själv

cd ~

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

Tyvärr finns det en ganska god chans att du saknar en massa saker som behövs för att bygga detta, och./configure kommer att klaga. Du kan titta på alla saker det klagar över och köra sudo apt install på dem alla.

Alternativ B2: Använd mina binärer

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 gör installation

Steg C: pythonbibliotek

Slutligen, få supportgrejer för mitt lightgun python -skript:

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

Steg D: lightgun.py

Slutligen, få mitt lightgun python -skript:

cd ~

git-klon

Om allt har gått bra har du nu ~/lightgun.py som du kan använda för att kalibrera lightgun.

Steg 4: Kalibrering Del I: Centrering av kameran

Kalibrering del I: Centrera kameran
Kalibrering del I: Centrera kameran
Kalibrering del I: Centrera kameran
Kalibrering del I: Centrera kameran
Kalibrering del I: Centrera kameran
Kalibrering del I: Centrera kameran

Det finns två aspekter av kalibrering. Den första är att kalibrera mitten av kameran på varje Wiimote. Detta kräver att du använder kameran för att ta två bilder av lysdioderna runt din TV-skärm, en med fjärrkontrollen uppåt och den andra med den upp och ner.

För att undvika att trycka på knapparna när du lägger Wii -fjärrkontrollen på framsidan och för att få Wii -fjärrkontrollen att ha en konsekvent höjd kan du 3D -skriva ut kalibreringsverktyget som jag inkluderade här. Du behöver i princip saker som är 10,5 mm tjocka som du kan lägga under Wii -fjärrkontrollen när den ligger på framsidan. Jag använde faktiskt lite plywoodskrot för att spara på plast.

Slå på dina lysdioder och se till att din Raspberry PI eller annan dator visas på TV: n. Anslut ett tangentbord (detta fungerar inte över ssh) eller använd VNC. Kör sedan:

python3 ~/lightgun/lightgun.py -M

Om allt går bra får du en helskärmsvisning som ber dig trycka på 1+2 på Wii-fjärrkontrollen. Gör det. Ljusen blinkar på Wii -fjärrkontrollen och sedan lyser lamporna 1 och 4. Du kommer också att se en liten grön rektangel högst upp på skärmen, med utsikten från Wii Remote -kameran. Rikta Wii -fjärrkontrollen mot lysdioderna och om allt går bra ser du de fyra lysdioderna, numrerade 1 till 4.

Nu måste du hitta en fast yta med en skarp kant, som ett soffbord, som du kan peka på TV -skärmen och som gör att Wii -fjärrkontrollen kan se alla lysdioder med Wii -fjärrkontrollen inriktade mot kanten. Börja med att rikta in Wii -fjärrkontrollen med höger sida uppåt, med fjärrkontrollens sida riktad mot ytkanten, se till att alla fyra lysdioderna syns. Tryck sedan på SPACE på tangentbordet (eller bifoga en Nunchuck och tryck på C om det är bekvämare). Du uppmanas sedan att rotera Wii -fjärrkontrollen. Se nu till att den är höjd 10,5 mm upp från din yta, med hjälp av kalibreringsverktyget eller något annat, och så nära samma plats som tidigare (t.ex. inriktad mot samma kant på ytan). Tryck på SPACE igen.

Om allt går bra går du nu till LED -kalibreringssteget. Ja, det här är komplicerat! Men du kommer att ha en mycket exakt lightgun. Det är bara priset.

Obs! Om du, precis som jag, har en Wii under TV: n måste Wii stängas av av två skäl: för det första, om Wii är på, kommer den att ansluta till Wiimote och för det andra kommer sensorfältets infraröda lysdioder att störa det här projektet. Av liknande skäl, medan du använder Wii är det en bra idé att koppla bort lysdioderna runt TV: n.

Steg 5: Kalibrering Steg II: Lysdioder

Kalibrering Steg II: Lysdioder
Kalibrering Steg II: Lysdioder
Kalibrering Steg II: Lysdioder
Kalibrering Steg II: Lysdioder

Nu måste du berätta för programvaran var lysdioderna är placerade runt TV: ns kant. Du kommer att se en kalibreringsskärm som visar fyra pilar, en av dem valda (ljusa) och tre av dem nedtonade, runt TV -kanten. Du använder +/- för att växla för att ändra vilken pil du justerar.

Gör var och en av de fyra pilarna runt kanten:

  1. tryck på vänster/höger på Wiimote för att flytta pilarna tills de pekar så exakt som möjligt mot motsvarande lysdiod;
  2. tryck upp/ner på Wiimote för att ändra pilens längd tills pilens längd matchar avståndet mellan lysdioden och kanten på TV -skärmen; Med andra ord måste pilens längd vara lika med avståndet från pilens spets till lysdioden.

När dina fyra pilar är korrekta (och kanske till och med tidigare) ser du ett rött hårkors när du riktar Wiimote mot skärmen. Du kan kontrollera att det är här det ska vara. (Kom ihåg att du måste vara tillräckligt långt borta för att Wiimote kan se alla lysdioder. Det är också viktigt att det inte finns några andra källor till infrarött i synfältet. Jag hade en gång problem på grund av solljus som reflekterade från ett skruvhuvud på skärmen TV -stativ.)

Slutligen finns det en femte pil som bara visas när du trycker på + från den fjärde LED -pilen eller - från den första (och den har som standard nollängd, så det är bara en pixel). Denna pil justerar hur långt ovanför kameran på Wii -fjärrkontrollen bilden kommer att registreras. Problemet är detta: du kommer att se längs den övre ytan av Wii -fjärrkontrollen. Men kameran är faktiskt placerad en bit under den ytan, mitt i den svarta rektangeln på framsidan av Wii -fjärrkontrollen. Om vi registrerade bilderna där kameran pekar skulle de registreras cirka 8 mm under Wii -fjärrkontrollens ovansida. Du kan kontrollera detta genom att notera att när du ser längs den övre ytan, är mitten av hårstrån dold av kameran.

Du kan leva med detta, eller så kan du växa den femte pilen för att programvaran justerar bilderna med toppen av Wii -fjärrkontrollen, eller så kan du justera 3D -utskrivbara filer för järnsikten för att kompensera för detta (men kompensationen fungerar bara för ett särskilt avstånd till TV: n). Jag gick själv på programjusteringen.

Tryck på HOME på Wii -fjärrkontrollen för att avsluta kalibreringen och spara all data i katalogen ~/.wiilightgun.

Steg 6: Testa och använd

Testa och använd
Testa och använd
Testa och använd
Testa och använd
Testa och använd
Testa och använd

Du vill förmodligen prova din ljuspistol nu. Kör bara i en terminalemulator (eller ett skript):

python3 ~/lightgun/lightgun.py -t

Du måste trycka på 1+2-knapparna samtidigt, och efter det om allt går bra, så länge lightgun.py körs, kommer lightgun att efterlikna en tvåknapps absolut mus. Utlösarknappen är musknapp 1 och A-knappen är musknapp 2. Tryck på ctrl-c för att avsluta.

Du behöver nu bara konfigurera dina emulatorer och/eller spel för att fungera med en absolut mus. Tyvärr kommer det inte alltid att vara så enkelt.

En rolig sak du kan prova är min mod av iminernamez's duck-duck-shoot:

cd ~

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

För NES -spel använder jag libretro fceumm -kärnan i Retroarch. Gå till menyn Alternativ och konfigurera Zapper till en pekskärm. (Att konfigurera den som en mus fungerar faktiskt inte, eftersom fceumm förväntar sig en relativ rörelse snarare än mus med absolut position.)

Om du startar dina spel med ett manus kan du redigera delen som startar spelet eller emulatorn för att säga:

python3 ~/lightgun/lightgun.py -t -B 30 "kommando för att starta spelet"

Under de första 30 sekunderna av spelets körning (därav alternativet -B 30) kan du ansluta din lightgun genom att hålla ner 1+2.

Förresten, lightgun.py -skriptet kan också användas för allmänt Wii Remote -spel med Retroarch. Lägg bara till -o -alternativet så stängs lightgun -funktionerna av, och istället fungerar Wii -fjärrkontrollen horisontellt, med de tre knapparna 1, 2 respektive B. Det finns andra Retroarch-relaterade funktioner i lightgun.pys mappningar som du kommer att upptäcka genom att läsa koden. Till exempel fungerar minustangenten som ett skift, och tillsammans med dpad -kontrollerna sparar och laddar (upp/ner = ändra spara nummer; vänster = återställa; höger = spara).

Steg 7: Pistolhandtag och siktning

Pistolhandtag och siktning
Pistolhandtag och siktning
Pistolhandtag och siktning
Pistolhandtag och siktning
Pistolhandtag och siktning
Pistolhandtag och siktning

Du kan använda Wii -fjärrkontrollen själv som en pistol, som ser längs toppen. Du kan också köpa ett av de kommersiella pistolhöljena för det. Men eftersom den ursprungliga Wii -fjärrkontrollen inte kunde användas som en synlig pistol, tenderar höljen inte att ha järnsikt, och järnsikten förbättrar noggrannheten avsevärt.

Jag konstruerade ett enkelt tredelat 3D-utskrivbart system i tre delar: ett skjutbart handtag som sitter precis bakom avtryckaren (så det ser lite ut som en Star Trek Original Series-faser) och skjutbara sevärdheter. Utskrivbara filer finns här. Om du vill spara på plast på bekostnad av skrot, kan du också göra det jag gjorde och istället för att skriva ut hela handtaget, skriva ut bara den del som rymmer Wiimote, och klipp ut en träbit och skruva fast den.

För syn, fokusera ögonen på sevärdheterna. Rikta framsiktens bult mellan den bakre siktens stötar så att luftutrymmet på endera är lika och alla tre stötar sticker ut lika högt. Rikta sedan in mitten av målet med toppen av stötarna.

Obs! Stötarnas höjd är något ojämlik, med främre siktens bump är något lägre, för att kompensera för höjden på själva sumparna när du ser längs dem på ett avstånd av 2,5 meter (mitt avstånd till TV). Om du har ett väsentligt annorlunda avstånd till TV: n kan du lägga in det i OpenSCAD -filerna. Denna justering kan dock ligga under skrivartoleranser. Om du inte gjorde den vertikala justeringen i programvaran kan du lägga till lite mer justering av sevärdheterna i programvaran genom att ställa in extraSightAdjust till något runt -8 (i millimeter).

Steg 8: Kalibrering III (tillval): Finjustering

Om du vill ha ännu mer precision kan du köra:

python3 ~/lightgun/lightgun.py -d

(för demo) och titta noga om sevärdheterna ligger i linje med korshåren. Om de inte gör det, avsluta och redigera ~/.wiilightgun/wiimotecalibration manuellt och justera x- och y -koordinaterna för kameramitten något för att justera synen. Till exempel sköt min pistol något åt höger, så jag slutade ändra x -koordinaten från 529 till 525. Alla kommer antagligen att vara olika.

Steg 9: Bilaga: Algoritmen

Bilaga: Algoritmen
Bilaga: Algoritmen

Musemuleringskoden fungerar ungefär så här.

  • Behandla knapparna.
  • Hämta data från kameran och justera för kameracentreringskalibrering.
  • Om färre än tre lysdioder syns i kameran:

    Behåll sista muspositionen

  • Om tre eller fyra lysdioder är synliga:

    • Använd Wiimote -accelerometerdata för att få Wiimote -orienteringen och identifiera vilken LED -kamerabild som motsvarar vilken fysisk LED.
    • Om fyra lysdioder syns:

      • Beräkna homografi mellan LED -kamerabilder och LED -platser (i skärmkoordinater).
      • Använd homografi för att beräkna vilken skärmplats som motsvarar mitten av kamerans synfält.
      • Gör Y-justering för att justera för mitten av det virtuella pistolröret under siktlinjen. Detta är en lite klurig algoritm men den fungerar.
      • Ställ in muspositionen på den justerade skärmplatsen.
    • Om tre lysdioder syns:

      • Använd OpenCV för att lösa P3P -problemet mellan LED -kamerabilderna och de fysiska LED -platserna. Detta ger upp till fyra lösningar.
      • Om det lyckas:

        • Om vi har en tidigare framgångsrik platsberäkning väljer du den lösning som gör att den saknade lysdioden är närmast den sist observerade eller beräknade positionen för den lysdioden.
        • Om vi inte har en tidigare framgångsrik platsberäkning väljer du den lösning som bäst förutsäger accelerometerns kurs.
        • Använd den bästa lösningen för att beräkna vart den fjärde lysdioden ska gå.
        • Gör resten som i de fyra LED -fodralen.
      • Om det inte lyckas:

        Behåll sista muspositionen

Rekommenderad: