Innehållsförteckning:
- Tillbehör
- Steg 1: Infraröd LED -kedja
- Steg 2: Anslut till TV: n
- Steg 3: Installera programvara
- Steg 4: Kalibrering Del I: Centrering av kameran
- Steg 5: Kalibrering Steg II: Lysdioder
- Steg 6: Testa och använd
- Steg 7: Pistolhandtag och siktning
- Steg 8: Kalibrering III (tillval): Finjustering
- Steg 9: Bilaga: Algoritmen
Video: Exakt Wiimote Light Gun för Raspberry PI: 9 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:39
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
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
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
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
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:
- tryck på vänster/höger på Wiimote för att flytta pilarna tills de pekar så exakt som möjligt mot motsvarande lysdiod;
- 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
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
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
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:
Waveshare E-ink Display exakt voltmeter (0-90v DC) med Arduino Nano: 3 steg
Waveshare E-ink Display Precise Voltmeter (0-90v DC) Med Arduino Nano: I denna instruktör använder jag en 2,9 '' Waveshare E-Paper-display med en Arduino Nano, en spänningsdelare och en ADS1115 för att visa exakta spänningar upp till 90 volt DC på E-Paper Display. Denna instruerbara kombinerar dessa två tidigare projekt:- Ardui
3d -tryckt slutspel Arc Reactor (film exakt och bärbar): 7 steg (med bilder)
3d Printed Endgame Arc Reactor (Movie Accurate and Wearable): Full Youtube -tutorial: Jag kunde inte hitta några särskilt filmnoggranna 3d -filer för Mark 50 bågreaktorn/höljet för nanopartiklar så min kompis och jag lagade några söta. Det tog massor av tweaking för att få saken att se exakt och fantastisk ut
En exakt modell av en Cepheid -variabel stjärna: 5 steg (med bilder)
En exakt modell av en Cepheid -variabel stjärna: Utrymmet är stort. Väldigt stor. Astronomiskt sett kan man till och med säga. Det har ingen betydelse för det här projektet, jag ville bara använda ordspelet. Det är ingen överraskning att det finns många stjärnor på natthimlen. Det kan dock överraska några som är nya på marknaden
Väggfäste för iPad som kontrollpanel för hemautomation, med servostyrd magnet för att aktivera skärmen: 4 steg (med bilder)
Väggfäste för iPad Som kontrollpanel för hemautomation, med servostyrd magnet för att aktivera skärmen: På senare tid har jag ägnat ganska mycket tid åt att automatisera saker i och runt mitt hus. Jag använder Domoticz som min hemautomationsapplikation, se www.domoticz.com för mer information. I min sökning efter en instrumentpanelapplikation som visar all Domoticz -information tillsammans
DIY billigt och exakt alternativ för flexsensorhandske: 8 steg (med bilder)
DIY billigt och exakt alternativ för flexsensorhandske: Hej alla, det här är min första instruerbara och i den här instruerbara lär jag dig att göra en billig och exakt flexsensorhandske. Jag använde många alternativ till flex -sensorn, men ingen av dem fungerade för mig. Så jag googlade och hittade en ny