Obsah:

Presná svetelná pištoľ Wiimote pre Raspberry PI: 9 krokov (s obrázkami)
Presná svetelná pištoľ Wiimote pre Raspberry PI: 9 krokov (s obrázkami)

Video: Presná svetelná pištoľ Wiimote pre Raspberry PI: 9 krokov (s obrázkami)

Video: Presná svetelná pištoľ Wiimote pre Raspberry PI: 9 krokov (s obrázkami)
Video: Играйте в «Утиную охоту» на плоскопанельных телевизорах! HYPERKIN анонсирует световой пистолет NES для плоских HD-телевизоров! 2024, Júl
Anonim
Presná svetelná pištoľ Wiimote pre Raspberry PI
Presná svetelná pištoľ Wiimote pre Raspberry PI
Presná svetelná pištoľ Wiimote pre Raspberry PI
Presná svetelná pištoľ Wiimote pre Raspberry PI

Wii Remote používaný ako ľahká zbraň zvyčajne nie je dostatočne presný pre retro hry, ako je NES Duck Hunt, pretože Wii Remote v skutočnosti nevyberá bod na televízore, na ktorý ukazuje. To nemôže! Wii Remote má vpredu infračervenú kameru, ktorá vidí líniu infračervených diód LED v senzorovej lište, ale nemôže vedieť, ako ďaleko (alebo v akom smere) je televízor od lišty alebo aký veľký je televízor. Emulátory a hry to obchádzajú tak, že ukazujú krížiky alebo iný ukazovateľ zamerania, ale nie je to presný zážitok zo streľby na cieľ.

Aby Wii Remote fungoval ako presná svetelná pištoľ, na ktorú sa môžete zamerať pri výbere cieľa na televízore, vyžaduje štyri infračervené diódy LED usporiadané v známom štvoruholníkovom vzore (nie v priamke) v rovnakej rovine ako televízor. Wii Remote potom uvidí štyri LED diódy a z obrazu z kamery je možné vypočítať homografiu, ktorá nám umožní zistiť, kam kamera smeruje.

Hardvér tohto projektu je jednoduchý. K dispozícii sú štyri infračervené diódy LED v jednoduchých puzdrách s 3D tlačou, ktoré je možné prilepiť k hornej a spodnej časti puzdra televízora a zapojiť do nabíjačky USB. Navyše, v prípade, že nemáte puzdro na zbraň Wii, mám jednoduchú 3D tlačenú rukoväť a mieridlá, ktoré môžete pripevniť k diaľkovému ovládaniu Wii (aj keď kvôli šetreniu plastu som z neho urobil hybrid medzi drevom a 3D tlačeným plastom).

Vytvorenie softvéru založeného na pythone bolo ťažšie ako hardvér a v súčasnosti je k dispozícii iba pre Linux. Kalibruje LED diódy a Wii Remote a potom pomocou homografických výpočtov emuluje absolútnu myš, ktorá funguje celkom dobre v emulátore NES (a pravdepodobne aj iných emulátoroch) Retroarchu na mojom Raspberry PI 3B+.

Zásoby

  • Diaľkové ovládanie Wii
  • Štyri 940 nm 5 mm infračervené diódy LED
  • Starý kábel USB s funkčnou zástrčkou typu A.
  • Raspberry PI 3 alebo iný počítač s Linuxom s podporou Bluetooth
  • 3D tlačiareň a vlákno (voliteľné)

Krok 1: Infračervený reťazec LED

Infračervený LED reťazec
Infračervený LED reťazec
Infračervený LED reťazec
Infračervený LED reťazec

Zaobstarajte si starý kábel USB s fungujúcou zásuvkou typu A (zvyčajne sa moje nabíjacie káble telefónu lámu na konci micro USB, takže mi zostanú káble s fungujúcou zásuvkou typu A). V skutočnosti je dokonca v poriadku, ak sú dátové káble prerušené, pokiaľ fungujú elektrické vedenia. Odrežte druhý koniec. Teoreticky by mal byť červený kábel +5 V a čierny by mal byť uzemnený, ale skontrolujte to pomocou multimetra (zapojte ho do nabíjačky a potom skontrolujte napätie medzi červeným a čiernym vodičom).

Pretože infračervené diódy LED majú pokles napätia približne o 1,2-1,3 V, štyri z nich som práve spájkoval do sériovej slučky s káblom USB. Uistite sa, že drôty, ktoré spájkujete, sú dostatočne dlhé, aby ste mohli umiestniť LED diódy na spodok televízora a dva na vrch, so slušným horizontálnym priestorom medzi diódami LED (asi 10 palcov).

Presnejšie na vytvorenie slučky LED:

  • spájkujte mínusovú stranu (katóda, kratšia noha, s plochým okrajom) prvej LED diódy na vodič +5 V USB
  • spojte plusovú stranu prvej LED (anóda, dlhšia noha, s okrúhlym okrajom) k mínusovej strane druhej LED
  • opakujte, aby ste spojili druhú LED s treťou a tretiu so štvrtou
  • potom pripojte kladnú stranu štvrtej LED diódy káblom k uzemňovaciemu vodiču USB.

Aby boli veci krajšie, môžete pri spájaní použiť zmršťovaciu hadičku. V opačnom prípade použite elektrickú pásku, aby ste sa vyhli skratom.

Uistite sa, že nemáte skrat. Potom ho zapojte do nabíjačky USB a skontrolujte, či vyžaruje infračervené svetlo, a to pomocou pohľadu na diódy LED pomocou fotoaparátu telefónu. (Mnoho kamier telefónov je citlivých na infračervené žiarenie.)

Krok 2: Pripojenie k televízoru

Pripojiť k televízoru
Pripojiť k televízoru
Pripojiť k televízoru
Pripojiť k televízoru
Pripojiť k televízoru
Pripojiť k televízoru

Teraz pripevnite dve diódy LED k spodnej strane televízora a dve k hornej strane. Horizontálne rozstupy by mali byť asi desať palcov. Ak je toho priveľa, môžete mať problémy so zorným poľom kamery Wii Remote, ktoré ich všetky zachytáva. Ale ak sú príliš blízko, potom moja geometrická intuícia hovorí, že budete mať nižšiu presnosť.

Na testovanie som LED diódy zalepil elektrickou páskou a potom pre trvalé pripojenie navrhol a vytlačil štyri úhľadné malé LED klipy (súbory sú tu), ktoré som za tepla prilepil k televízoru. LED diódy by ste mali nastaviť tak, aby boli čo najbližšie k rovine televízneho displeja, bez toho, aby ich rám zakrýval z miesta, kde budete fotografovať.

Krok 3: Nainštalujte softvér

V súčasnosti je softvér iba pre Linux. Nasledujúce nastavenie je navrhnuté pre Raspberry PI 3 s Raspbian Stretch. Ostatné systémy Linux budú vyžadovať určité zmeny. Na starších modeloch budete potrebovať hardvérový kľúč Bluetooth a budete ho musieť spustiť aj z príkazového riadka:

sudo get-apt nainštalovať bluetooth

Krok A: udev

Potom vytvorte súbor v /etc/udev/rules.d/wiimote.rules, ktorý obsahuje jeden riadok:

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

Môžete to urobiť napríklad pomocou textového editora alebo zadaním nasledujúceho príkazu do príkazového riadka:

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

A potom reštartujte udev:

sudo /etc/init.d/udev reštart

Krok B: cwiid

Ďalej budete potrebovať môj upravený balíček cwiid. Tu to začína byť trochu chlpaté, pretože v ideálnom prípade by ste to museli postaviť na svojom Raspberry PI, ale musím priznať, že som stratil prehľad o tom, aké balíky je potrebné nainštalovať, aby to fungovalo. Existujú tri možnosti, ako to urobiť.

Možnosť B1: Postavte sa

CD ~

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

Žiaľ, je dosť pravdepodobné, že vám chýba veľa vecí potrebných na jeho stavbu a./configure sa bude sťažovať. Môžete sa pozrieť na všetky veci, na ktoré sa sťažuje, a na všetkých spustiť sudo apt install.

Možnosť B2: Použiť moje binárne súbory

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 make install

Krok C: Knižnice pythonu

Nakoniec získajte podporu pre môj skript python lightgun:

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

Krok D: lightgun.py

Nakoniec získajte môj skript python pre lightgun:

CD ~

klon git

Ak je všetko v poriadku, máte ~/lightgun.py, ktorý môžete použiť na kalibráciu svetelnej pištole.

Krok 4: Kalibrácia Časť I: Vycentrovanie kamery

Kalibrácia Časť I: Vycentrovanie kamery
Kalibrácia Časť I: Vycentrovanie kamery
Kalibrácia Časť I: Vycentrovanie kamery
Kalibrácia Časť I: Vycentrovanie kamery
Kalibrácia Časť I: Vycentrovanie kamery
Kalibrácia Časť I: Vycentrovanie kamery

Kalibrácia má dva aspekty. Prvým je kalibrácia stredu kamery na každom zariadení Wiimote. Na to je potrebné použiť fotoaparát na nasnímanie dvoch fotografií LED diód okolo obrazovky televízora, pričom jeden bude diaľkovým ovládačom smerovať nahor a druhým bude otočený hore nohami.

Aby ste sa vyhli stláčaniu tlačidiel, keď položíte Wii Remote na prednú stranu, a aby mal Wii Remote konzistentnú výšku, môžete si tu vytlačiť kalibračný nástroj, ktorý som pridal. V zásade potrebujete veci s hrúbkou 10,5 mm, ktoré môžete položiť pod Wii Remote, keď leží na prednej strane. V skutočnosti som použil šrotovú preglejku, aby som ušetril na plastoch.

Zapnite LED diódy a uistite sa, že sa váš Raspberry PI alebo iný počítač zobrazuje na televízore. Pripojte klávesnicu (cez ssh to nebude fungovať) alebo použite VNC. Potom spustite:

python3 ~/lightgun/lightgun.py -M

Ak všetko pôjde dobre, zobrazí sa obrazovka na celej obrazovke s výzvou na stlačenie 1+2 na Wii Remote. Urob to. Na ovládači Wii Remote začnú blikať svetlá a potom svetlá 1 a 4 zostanú svietiť. V hornej časti obrazovky uvidíte aj malý zelený obdĺžnik s pohľadom z kamery Wii Remote. Namierte Wii Remote na LED diódy a ak všetko pôjde dobre, uvidíte štyri LED diódy očíslované od 1 do 4.

Teraz musíte nájsť pevný povrch s ostrými hranami, napríklad konferenčný stolík, ktorý môžete nasmerovať na televíznu obrazovku a vďaka ktorému bude Wii Remote vidieť všetky LED diódy, pričom Wii Remote bude zarovnaný s okrajom. Začnite zarovnaním diaľkového ovládača Wii Remote pravou stranou nahor, pričom strana diaľkového ovládača je zarovnaná s okrajom povrchu a uistite sa, že sú viditeľné všetky štyri diódy LED. Potom stlačte medzerník na klávesnici (alebo pripojte Nunchuck a stlačte C, ak je to pohodlnejšie). Potom budete vyzvaní na otočenie Wii Remote. Teraz sa uistite, že je vyvýšený o 10,5 mm od vášho povrchu pomocou kalibračného nástroja alebo niečoho iného a v takej blízkosti ako predtým (napr. Zarovnaný s rovnakým okrajom povrchu). Znova stlačte medzerník.

Ak všetko pôjde dobre, teraz prejdete na krok kalibrácie LED. Áno, je to komplikované! Ale budete mať veľmi presnú svetelnú zbraň. To je len cena.

Poznámka: Ak máte ako ja Wii pod televízorom, je potrebné Wii vypnúť z dvoch dôvodov: po prvé, ak je Wii zapnutý, pripojí sa k zariadeniu Wiimote a po druhé, infračervené diódy LED na paneli senzora budú rušiť tento projekt. Z podobných dôvodov je pri použití Wii vhodné odpojiť diódy LED okolo televízora.

Krok 5: Kalibrácia Krok II: LED diódy

Kalibračný krok II: LED diódy
Kalibračný krok II: LED diódy
Kalibračný krok II: LED diódy
Kalibračný krok II: LED diódy

Teraz musíte softvéru povedať, kde sú diódy LED umiestnené okolo okraja televízora. Okolo okraja televízora uvidíte kalibračnú obrazovku so štyrmi šípkami, z ktorých jedna je vybratá (svetlá) a tri sú sivé. Pomocou tlačidiel +/- môžete meniť, ktorú šípku upravujete.

Pri každej zo štyroch šípok okolo okraja postupujte takto:

  1. stláčaním šípok doľava/doprava na zariadení Wiimote pohybujte šípkami tak, aby ukazovali čo najpresnejšie na príslušnú diódu LED;
  2. stlačením šípky hore/dole na zariadení Wiimote zmeníte dĺžku šípky, kým sa dĺžka šípky nezhoduje so vzdialenosťou medzi diódou LED a okrajom televízneho displeja; inými slovami, dĺžka šípky sa musí rovnať vzdialenosti od špičky šípky k dióde LED.

Akonáhle sú vaše štyri šípky správne (a možno ešte skôr), uvidíte červený krížový kríž, keď namierite Wiimote na obrazovku. Môžete skontrolovať, či by to malo byť tam. (Nezabudnite, že musíte byť dostatočne ďaleko, aby Wiimote videl všetky diódy LED. Je tiež dôležité, aby v zornom poli neboli žiadne iné zdroje infračerveného žiarenia. Raz som mal problémy kvôli slnečnému žiareniu odrážajúcemu sa od hlavy skrutky na Televízny stolík.)

Nakoniec je tu piata šípka, ktorá sa zobrazí iba vtedy, keď stlačíte + zo štvrtej LED šípky alebo - z prvej (a tá má štandardne nulovú dĺžku, takže je to len pixel). Táto šípka nastavuje, ako dlho bude snímka zaregistrovaná nad kamerou diaľkového ovládača Wii. Problém je v tom, že budete pozorovať horný povrch diaľkového ovládača Wii Remote. Fotoaparát je však v skutočnosti umiestnený v určitej vzdialenosti pod týmto povrchom, v strede čierneho obdĺžnika v prednej časti ovládača Wii Remote. Ak by sme zaregistrovali zábery, na ktoré ukazuje fotoaparát, boli by zaregistrované asi 8 mm pod horným povrchom Wii Remote. Môžete to skontrolovať tak, že keď sa pozriete na horný povrch, stred krížikov je skrytý fotoaparátom.

Môžete s tým žiť, alebo môžete vypestovať túto piatu šípku tak, aby boli zábery zarovnané s vrchom diaľkového ovládača Wii Remote, alebo môžete súbory 3D tlače upraviť tak, aby to kompenzovali mieridlá (kompenzácia však bude fungovať iba v prípade jedna konkrétna vzdialenosť od televízora). Sám som išiel na zarovnanie softvéru.

Stlačením HOME na Wii Remote ukončíte kalibráciu a uložíte všetky údaje do adresára ~/.wiilightgun.

Krok 6: Testovanie a používanie

Test a použitie
Test a použitie
Test a použitie
Test a použitie
Test a použitie
Test a použitie

Teraz pravdepodobne budete chcieť vyskúšať svoju ľahkú zbraň. Stačí spustiť emulátor terminálu (alebo skript):

python3 ~/lightgun/lightgun.py -t

Budete musieť súčasne stlačiť tlačidlá 1+2 a potom, ak všetko pôjde dobre, pokiaľ beží lightgun.py, bude svetelná zbraň napodobňovať dvojtlačidlovú absolútnu myš. Spúšťacie tlačidlo je tlačidlo myši 1 a tlačidlo A je tlačidlo myši 2. Na ukončenie stlačte ctrl-c.

Teraz potrebujete iba nakonfigurovať svoje emulátory a/alebo hry na prácu s absolútnou myšou. Žiaľ, nie vždy to bude také jednoduché.

Jedna zábavná vec, ktorú by ste mohli vyskúšať, je môj režim iminurnamezovho kačacieho-kačacieho strieľania:

CD ~

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

Pri hrách NES používam jadro libretro fceumm v programe Retroarch. Prejdite do ponuky Možnosti a nakonfigurujte Zapper na dotykový displej. (Konfigurácia ako myš v skutočnosti nefunguje, pretože fceumm očakáva skôr relatívny pohyb ako absolútnu polohu myši.)

Ak začínate hry so skriptom, môžete upraviť časť, ktorou sa hra alebo emulátor začína, tak, aby hovorila:

python3 ~/lightgun/lightgun.py -t -B 30 "príkaz na spustenie hry"

Potom počas prvých 30 sekúnd spustenia hry (odtiaľ možnosť -B 30) môžete pripojiť svoju svetelnú zbraň podržaním 1+2.

Mimochodom, skript lightgun.py je možné použiť aj na všeobecné hranie hier na Wii Remote s Retroarchom. Stačí pridať možnosť -o a funkcie svetiel sa vypnú a namiesto toho bude Wii Remote pracovať horizontálne, pričom tri tlačidlá budú 1, 2 a B. V mapovaní lightgun.py sú ďalšie funkcie súvisiace s Retroarchom, ktoré objavíte prečítaním kódu. Kláves mínus napríklad slúži ako posun a spolu s klávesnicou ovláda ukladanie a načítanie (hore/dole = zmeniť číslo uloženia; vľavo = obnoviť; vpravo = uložiť).

Krok 7: Rukoväť pištole a mierenie

Rukoväť pištole a mierenie
Rukoväť pištole a mierenie
Rukoväť pištole a mierenie
Rukoväť pištole a mierenie
Rukoväť pištole a mierenie
Rukoväť pištole a mierenie

Diaľkové ovládanie Wii môžete používať ako zbraň, pričom ho budete pozorovať zhora. Môžete si k nemu kúpiť aj jeden z komerčných puzdier na zbrane. Pretože však pôvodný diaľkový ovládač Wii nebol možné použiť ako viditeľnú zbraň, puzdrá zvyčajne neobsahujú železné mieridlá a železné mieridlá výrazne zlepšujú presnosť.

Navrhol som jednoduchý trojdielny systém s 3D tlačou: nasúvaciu rukoväť, ktorá sedí tesne za spúšťou (takže vyzerá trochu ako phaser zo série Star Trek Original Series), a nasúvacie mieridlá. Súbory na tlač sú tu. Ak chcete ušetriť na plastoch na úkor šrotu, môžete urobiť aj to, čo som urobil a namiesto potlačenia celej rukoväte vytlačte iba časť, na ktorej je držiak Wiimote, a vystrihnite drevený kus a zaskrutkujte ho.

Ak chcete vidieť, zamerajte svoje oči na pamiatky. Zarovnajte náraz predného pohľadu medzi hrbole zadného pohľadu, aby bol vzduchový priestor na oboch rovnakých a všetky tri nerovnosti trčali rovnako vysoko. Potom zarovnajte stred cieľa s hornou časťou hrboľov.

Poznámka: Výška hrboľov je mierne nerovnomerná, pričom hrboľ predného zraku je o niečo nižší, aby sa vyrovnala výška samotných hrbolčekov, keď ich pozeráte vo vzdialenosti 2,5 metra (moja vzdialenosť k televízoru). Ak máte k televízoru výrazne odlišnú vzdialenosť, môžete to vložiť do súborov OpenSCAD. Táto úprava však môže byť pod toleranciami tlačiarne. Tiež, ak ste v softvéri nevykonali zvislú úpravu, môžete pridať ďalšie úpravy mieridiel v softvéri nastavením extraSightAdjust na hodnotu okolo -8 (v milimetroch).

Krok 8: Kalibrácia III (voliteľné): Jemné nastavenie

Ak chcete ešte väčšiu presnosť, môžete spustiť:

python3 ~/lightgun/lightgun.py -d

(pre ukážku) a pozorne sa pozrite, či sa mieridlá zhodujú s krížikmi. Ak tak neurobia, ukončite a ručne upravte ~/.wiilightgun/wiimotecalibration a mierne upravte súradnice x a y v strede kamery, aby ste upravili pozorovanie. Napríklad moja zbraň mierila mierne doprava, takže som zmenil súradnicu x z 529 na 525. Čísla všetkých budú pravdepodobne iné.

Krok 9: Príloha: algoritmus

Príloha: Algoritmus
Príloha: Algoritmus

Emulačný kód myši funguje zhruba nasledovne.

  • Stlačte tlačidlo procesu.
  • Získajte údaje z fotoaparátu a upravte kalibráciu centrovania kamery.
  • Ak sú vo fotoaparáte viditeľné menej ako tri diódy LED:

    Ponechajte poslednú pozíciu myši

  • Ak sú viditeľné tri alebo štyri diódy LED:

    • Pomocou údajov akcelerometra Wiimote získate orientáciu Wiimote a identifikujete, ktorý obraz z LED kamery zodpovedá ktorej fyzickej LED.
    • Ak sú viditeľné štyri LED diódy:

      • Vypočítajte homografiu medzi obrázkami LED kamery a umiestneniami LED (v súradniciach obrazovky).
      • Pomocou homografie vypočítajte, ktoré umiestnenie obrazovky zodpovedá stredu zorného poľa kamery.
      • Vykonajte úpravu Y a upravte tak, aby sa stred virtuálnej pištole nachádzal pod mierkou. Je to trochu kludgy algoritmus, ale funguje to.
      • Nastavte polohu myši na upravené umiestnenie obrazovky.
    • Ak sú viditeľné tri diódy LED:

      • Použite OpenCV na vyriešenie problému P3P medzi obrázkami LED kamier a fyzickými umiestneniami LED. To generuje až štyri riešenia.
      • Ak bude úspešný:

        • Ak máme predchádzajúci úspešný výpočet polohy, zvoľte riešenie, vďaka ktorému bude chýbajúca LED najbližšie k poslednej pozorovanej alebo vypočítanej polohe danej LED.
        • Ak nemáme predchádzajúci úspešný výpočet polohy, zvoľte riešenie, ktoré najlepšie predpovedá smer akcelerometra.
        • Pomocou najlepšieho riešenia vypočítajte, kam by mala ísť štvrtá LED dióda.
        • Ostatné urobte ako v prípade štyroch LED diód.
      • Ak nie je úspešný:

        Ponechajte poslednú pozíciu myši

Odporúča: