Tartalomjegyzék:

Pontos Wiimote fénypisztoly a málna PI -hez: 9 lépés (képekkel)
Pontos Wiimote fénypisztoly a málna PI -hez: 9 lépés (képekkel)

Videó: Pontos Wiimote fénypisztoly a málna PI -hez: 9 lépés (képekkel)

Videó: Pontos Wiimote fénypisztoly a málna PI -hez: 9 lépés (képekkel)
Videó: Higienização Nunchuck do Nintendo Wii 2024, Július
Anonim
Pontos Wiimote fénypisztoly a málna PI -hez
Pontos Wiimote fénypisztoly a málna PI -hez
Pontos Wiimote fénypisztoly a málna PI -hez
Pontos Wiimote fénypisztoly a málna PI -hez

Általában a könnyű fegyverként használt Wii távirányító nem elég pontos az olyan retro játékokhoz, mint a NES Duck Hunt, mivel a Wii Remote valójában nem választja ki azt a pontot a tévén, amelyre mutat. Nem lehet! A Wii Remote infravörös kamerája elöl van, amely látja az infravörös LED -ek sorát az érzékelő sávban, de nem tudhatja, hogy a TV milyen távolságra van (vagy milyen irányban) a sávotól, vagy mekkora a TV. Az emulátorok és a játékok megkerülik ezt, ha szőrszálakat vagy más célzási mutatókat jelenítenek meg, de ez nem pontos célpontlövés.

Ahhoz, hogy a Wii Remote pontos fénypisztolyként működjön, és a TV -n egy célpont kiválasztásához láthat, négy infravörös LED -re van szükség, amelyek ismert négyszögmintában (nem egyenes vonalban) vannak elrendezve a TV -vel azonos síkban. A Wii Remote ezután látja a négy LED -et, és a kamera képe felhasználható egy homográfia kiszámításához, amely lehetővé teszi számunkra, hogy kitaláljuk, hová mutat a kamera.

A projekt hardvere egyszerű. Négy infravörös LED található egyszerű 3D nyomtatott házban, amelyek a TV-készülékház tetejére és aljára ragaszthatók, és USB-töltőhöz csatlakoztathatók. Ezenkívül, ha nincs Wii pisztolyháza, van egy egyszerű 3D nyomtatott fogantyúm és látnivalóim, amelyeket a Wii távirányítóhoz rögzíthet (bár a műanyag megtakarítása érdekében hibridet készítettem a fa és a 3D nyomtatott műanyag között).

A python-alapú szoftvert nehezebb volt elkészíteni, mint a hardvert, és jelenleg csak Linux-os. Kalibrálja a LED -eket és a Wii Remote -t, majd homográfiai számítások segítségével abszolút egeret emulál, amely meglehetősen jól működik a Retroarch fceumm NES emulátorában (és valószínűleg néhány más emulátorban) a Raspberry PI 3B+készüléken.

Kellékek

  • Wii távirányító
  • Négy 940 nm 5 mm -es infravörös LED
  • Régi USB kábel működő A típusú csatlakozóval
  • Raspberry PI 3 vagy más Linux -számítógép Bluetooth -támogatással
  • 3D nyomtató és szál (opcionális)

Lépés: Infravörös LED lánc

Infravörös LED lánc
Infravörös LED lánc
Infravörös LED lánc
Infravörös LED lánc

Szerezzen be egy régi USB -kábelt, működő A -típusú dugaszolóaljzattal (általában a telefon töltőkábelei elszakadnak a mikro -USB -csatlakozón, tehát megmaradt kábeleim vannak, amelyek működőképes A -típusú csatlakozóaljzattal rendelkeznek). Valójában még az is rendben van, ha az adatkábelek megszakad, amíg az elektromos vezetékek működnek. Vágja le a másik végét. Elméletileg a piros kábelnek +5V -nak kell lennie, a feketét pedig földelni kell, de ellenőrizze multiméterrel (csatlakoztassa a töltőhöz, majd ellenőrizze a feszültséget a piros és a fekete vezetékek között).

Mivel az infravörös LED-ek körülbelül 1,2-1,3 V feszültségcsökkenéssel rendelkeznek, most négyet sorba hurkolva az USB-kábelhez forrasztottam. Győződjön meg arról, hogy a forrasztott vezetékek elég hosszúak ahhoz, hogy a LED -eket a TV aljára, kettőt pedig a tetejére tegye, a LED -ek között megfelelő távolságban vízszintesen (kb. 10 hüvelyk).

Pontosabban a LED hurok elkészítéséhez:

  • forrasztja az első LED mínusz oldalát (katód, rövidebb láb, lapos éllel) a +5V USB vezetékhez
  • csatlakoztassa az első LED plusz oldalát (anód, hosszabb láb, kerek éllel) a második LED mínusz oldalához
  • ismételje meg, hogy a második LED -et a harmadikhoz, a harmadikat a negyedikhez kapcsolja
  • majd csatlakoztassa a negyedik LED plusz oldalát egy vezetékkel a földelt USB -vezetékhez.

Ahhoz, hogy a dolgok rendesebbek legyenek, használhatja a zsugorcsöveket a csatlakozások elvégzésekor. Ellenkező esetben használjon elektromos szalagot, hogy elkerülje a rövidzárlatot.

Ügyeljen arra, hogy ne legyen rövidzárlat. Ezután csatlakoztassa az USB -töltőhöz, és ellenőrizze, hogy infravörös fényt bocsát -e ki, ha a telefon kamerájával nézi a LED -eket. (Sok telefon kamera infravörös érzékeny.)

2. lépés: Csatlakoztassa a TV -hez

Csatlakoztassa a TV -hez
Csatlakoztassa a TV -hez
Csatlakoztassa a TV -hez
Csatlakoztassa a TV -hez
Csatlakoztassa a TV -hez
Csatlakoztassa a TV -hez

Most rögzítse a LED -ek közül kettőt a TV aljára és kettőt a felső oldalára. A vízszintes távolságnak körülbelül tíz hüvelyknek kell lennie. Ha túl sok, akkor problémái lehetnek a Wii Remote kamera látómezőjével, amely mindet rögzíti. De ha túl közel vannak, akkor a geometriai megérzésem szerint alacsonyabb lesz a pontosság.

Teszteléshez elektromos szalaggal ragasztottam a LED -eket, majd az állandó csatlakozáshoz megterveztem és kinyomtattam négy ügyes kis LED -klipet (fájlok itt vannak), amelyeket forróan ragasztottam a TV -hez. A LED -eknek olyan közel kell lenniük a TV -képernyő síkjához, amennyire csak lehet, anélkül, hogy a keret eltakarná őket a fényképezés helyétől.

3. lépés: Telepítse a szoftvert

A szoftver jelenleg csak Linuxra használható. A következő beállítás a Raspberry PI 3 Raspbian Stretch -hez készült. Más Linux rendszerek némi változtatást igényelnek. A korábbi modelleken Bluetooth -kulcsra van szüksége, és ezt parancssorból is futtatnia kell:

sudo get-apt telepítse a Bluetooth-ot

A lépés: udev

Ezután hozzon létre egy fájlt az /etc/udev/rules.d/wiimote.rules fájlban, amely egyetlen sort tartalmaz:

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

Ezt megteheti például egy szövegszerkesztővel, vagy a következő parancssorba írva:

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

Ezután indítsa újra az udev -t:

sudo /etc/init.d/udev restart

B lépés: cwiid

Ezután szüksége lesz a módosított cwiid csomagomra. Itt kissé szőrös lesz, mivel ideális esetben a Raspberry PI -re kell építenie, de be kell vallanom, hogy elvesztettem a nyomát annak, hogy milyen csomagokat kell telepítenie, hogy működjön. Ennek három lehetősége van.

B1. Lehetőség: Építsd magad

cd ~

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

Sajnos nagy az esélye annak, hogy hiányzik egy csomó dolog, ami ehhez szükséges, és a./configure panaszkodni fog. Megnézheti az összes panaszkodott dolgot, és mindegyiken futtathatja a sudo apt install alkalmazást.

B2 lehetőség: Használja a bináris fájljaimat

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

C lépés: python könyvtárak

Végül kérjen támogatást a lightgun python szkriptemhez:

sudo pip3 telepítse az uinput numpy pygame opencv-python alkalmazást

sudo apt-get install libatlas-base-dev sudo apt-get install libjasper-dev sudo apt-get install libqtgui4 sudo apt-get install python3-pyqt5

D lépés: lightgun.py

Végül szerezze be a lightgun python szkriptemet:

cd ~

git klón

Ha minden jól ment, akkor most van a ~/lightgun.py, amellyel kalibrálhatja a lőfegyvert.

4. lépés: Kalibrálás I. rész: A kamera központosítása

Kalibrálás I. rész: A kamera központosítása
Kalibrálás I. rész: A kamera központosítása
Kalibrálás I. rész: A kamera központosítása
Kalibrálás I. rész: A kamera központosítása
Kalibrálás I. rész: A kamera központosítása
Kalibrálás I. rész: A kamera központosítása

A kalibrálásnak két aspektusa van. Az első a kamera közepének kalibrálása minden Wiimote -on. Ehhez a fényképezőgéppel két képet kell készítenie a LED-ekről a TV-képernyő körül, az egyiket a távvezérlő jobb oldalával felfelé, a másikat pedig fejjel lefelé.

Annak érdekében, hogy elkerülje a gombok megnyomását, amikor a Wii távirányítót az előlapra helyezi, és annak érdekében, hogy a Wii távirányító egyenletes magasságban legyen, 3D nyomtatással kinyomtathatja az itt található kalibráló eszközt. Alapvetően 10,5 mm vastag dolgokra van szüksége, amelyeket a Wii távirányító alá helyezhet, ha az elülső oldalon fekszik. Valójában használtam egy kis hulladék rétegelt lemezt, hogy spóroljak a műanyagon.

Kapcsolja be a LED -eket, és győződjön meg arról, hogy a Raspberry PI vagy más számítógép megjelenik a TV -n. Csatlakoztasson billentyűzetet (ez nem működik ssh -n), vagy használja a VNC -t. Ezután futtassa:

python3 ~/lightgun/lightgun.py -M

Ha minden jól megy, akkor egy teljes képernyős kijelzőt kap, amely kéri, hogy nyomja meg az 1+2 gombot a Wii távirányítón. Csináld. A Wii távirányítón villogni kezdenek, majd az 1 -es és a 4 -es lámpa világít. A képernyő tetején egy kis zöld téglalap is látható, a Wii Remote kamerából. Irányítsa a Wii távirányítót a LED -ekre, és ha minden jól megy, látni fogja a négy LED -et, 1 -től 4 -ig számozva.

Most meg kell találnia egy szilárd felületet, éles széllel, például egy dohányzóasztalt, amelyet a TV képernyőjére mutathat, és amely lehetővé teszi a Wii Remote számára, hogy lássa az összes LED -et, ha a Wii távirányító a széléhez igazodik. Kezdje úgy, hogy a Wii távirányítót a jobb oldalával felfelé igazítja, a távirányító oldalát pedig a felület széléhez igazítja, és győződjön meg arról, hogy mind a négy LED látható. Ezután nyomja meg a SPACE gombot a billentyűzeten (vagy csatoljon egy Nunchuckot, és nyomja meg a C gombot, ha ez kényelmesebb). Ezután a rendszer kéri a Wii Remote elforgatását. Most győződjön meg arról, hogy a kalibráló szerszámmal vagy valami mással 10,5 mm -rel feljebb van a felületétől, és olyan közel, mint az előző helyen (pl. A felület azonos széléhez igazítva). Nyomja meg ismét a SPACE gombot.

Ha minden jól megy, akkor lépjen a LED -kalibrálási lépésre. Igen, ez bonyolult! De nagyon precíz fénypisztolyod lesz. Ez csak az ára.

Megjegyzés: Ha hozzám hasonlóan van Wii -je a TV alatt, akkor a Wii -t két okból ki kell kapcsolni: először is, ha a Wii be van kapcsolva, akkor csatlakozik a Wiimote -hoz, másodszor pedig az érzékelősáv infravörös LED -je zavarja ez a projekt. Hasonló okokból, amíg a Wii -t használja, jó ötlet a TV -készülék körül húzni a LED -eket.

5. lépés: Kalibrálás II. Lépés: LED -ek

Kalibrálás II. Lépés: LED -ek
Kalibrálás II. Lépés: LED -ek
Kalibrálás II. Lépés: LED -ek
Kalibrálás II. Lépés: LED -ek

Most meg kell mondania a szoftvernek, hogy a LED -ek hol találhatók a TV szélén. Látni fog egy kalibrációs képernyőt, amelyen négy nyíl látható, amelyek közül az egyik kiválasztott (világos), és közülük három szürke, a TV szélén. A +/- gombokkal válthat a módosítani kívánt nyíl megváltoztatásához.

Tegye a következőket a szélén lévő négy nyíl mindegyikéhez:

  1. nyomja meg balra/jobbra a Wiimote gombot a nyilak mozgatásához, amíg a lehető legpontosabban mutatnak a megfelelő LED felé;
  2. nyomja meg a fel/le gombot a Wiimote -on a nyíl hosszának megváltoztatásához, amíg a nyíl hossza megegyezik a LED és a TV -képernyő széle közötti távolsággal; más szóval a nyíl hosszának meg kell egyeznie a nyílhegy és a LED közötti távolsággal.

Miután a négy nyíl helyes (és talán még korábban is), piros szálkeresztet lát, amikor a Wiimote -ot a képernyőre irányítja. Ellenőrizheti, hogy ennek hol kell lennie. (Ne feledje, hogy elég messze kell lennie attól, hogy a Wiimote láthassa az összes LED -et. Az is fontos, hogy ne legyenek más infravörös források a látómezőben. Egyszer bajom volt a napfény miatt, ami visszaverődött a csavarfejről TV állvány.)

Végül van egy ötödik nyíl, amely csak akkor jelenik meg, ha megnyomja a + gombot a negyedik LED nyílból vagy - az elsőtől (és alapértelmezés szerint nulla hosszúságú, tehát csak egy képpont). Ez a nyíl beállítja, hogy a Wii Remote kamerája milyen magasan legyen rögzítve. A probléma a következő: a Wii Remote felső felülete mentén fog látni. De a kamera valójában bizonyos távolságban található a felület alatt, a fekete téglalap közepén, a Wii távirányító elején. Ha regisztrálnánk azokat a felvételeket, ahová a kamera mutat, akkor azokat körülbelül 8 mm -rel a Wii Remote felső felülete alatt rögzítenénk. Ezt úgy ellenőrizheti, hogy megjegyzi, hogy a felső felület mentén látva a szőrszálak közepét elrejti a kamera.

Lehet élni ezzel, vagy megnövelhetjük ezt az ötödik nyilat, hogy a szoftverek a Wii Remote tetejéhez igazítsák a felvételeket, vagy beállíthatják a 3D nyomtatható fájlokat a vasalókhoz, hogy ezt kompenzálják (de a kompenzáció csak egy bizonyos távolság a TV -től). Én magam mentem a szoftverek összehangolásához.

Nyomja meg a HOME gombot a Wii távirányítón, hogy kilépjen a kalibrálásból, és mentse az összes adatot a ~/.wiilightgun könyvtárba.

6. lépés: Tesztelés és használat

Teszt és használat
Teszt és használat
Teszt és használat
Teszt és használat
Teszt és használat
Teszt és használat

Valószínűleg most szeretné kipróbálni a könnyű fegyvert. Csak futtassa egy terminál emulátorban (vagy egy szkriptben):

python3 ~/lightgun/lightgun.py -t

Egyidejűleg le kell nyomnia az 1+2 gombokat, és ezt követően, ha minden jól megy, amíg a lightgun.py fut, a lightgun kétgombos abszolút egeret fog emulálni. A trigger gomb az 1. egérgomb, az A gomb pedig a 2. egérgomb. A kilépéshez nyomja meg a ctrl-c billentyűt.

Most már csak az emulátorokat és/vagy játékokat kell konfigurálnia, hogy abszolút egérrel működjenek. Sajnos ez nem mindig lesz ilyen egyszerű.

Egy szórakoztató dolog, amit kipróbálhat, az iminurnamez kacsa-kacsa-hajtásmódja:

cd ~

git klón https://github.com/arpruss/duck-duck-shoot cd duck-duck-shoot python play_game.py

A NES játékokhoz a libretro fceumm magját használom a Retroarchban. Lépjen a Beállítások menübe, és konfigurálja a Zapper -t érintőképernyővé. (Az egérként való konfigurálás valójában nem működik, mivel az fceumm relatív mozgást vár el, nem pedig abszolút helyzetű egeret.)

Ha szkripttel indítja a játékokat, akkor a játékot vagy az emulátort elindító részt szerkesztheti a következőképpen:

python3 ~/lightgun/lightgun.py -t -B 30 "parancs a játék elindításához"

Ezután a játék végrehajtásának első 30 másodpercében (innen a -B 30 opció) csatlakoztathatja a lőfegyvert az 1+2 lenyomva tartásával.

A lightgun.py szkript egyébként általános Wii Remote játékokhoz is használható Retroarch segítségével. Csak adja hozzá a -o opciót, és a lightgun funkciók kikapcsolnak, ehelyett a Wii Remote vízszintesen fog működni, a három gomb 1, 2 és B lesz. A lightgun.py leképezéseiben vannak más Retroarch-hoz kapcsolódó funkciók is, amelyeket a kód olvasásával fedezhet fel. Például a mínusz gomb eltolásként működik, és a dpaddal együtt vezérli a mentést és a betöltést (fel/le = mentési szám megváltoztatása; bal = visszaállítás; jobb = mentés).

7. lépés: Pisztoly fogantyú és célzás

Pisztoly fogantyú és célzás
Pisztoly fogantyú és célzás
Pisztoly fogantyú és célzás
Pisztoly fogantyú és célzás
Pisztoly fogantyú és célzás
Pisztoly fogantyú és célzás

A Wii távirányítót önmagában is használhatja fegyverként, a tetején észlelve. Vásárolhat hozzá egy kereskedelmi pisztolyházat is. De mivel az eredeti Wii távirányító nem volt alkalmas sóhajtható pisztolyként, a burkolatok általában nem tartoznak vasélességgel, és a vasalók jelentősen javítják a pontosságot.

Egy egyszerű, három részből álló, 3D-nyomtatható rendszert terveztem: egy csúsztatható fogantyút, amely közvetlenül a ravasz mögött helyezkedik el (tehát kicsit hasonlít a Star Trek eredeti sorozatú fázeréhez), és csúsztatható látnivalókat. A nyomtatható fájlok itt találhatók. Ha műanyagon akar spórolni a fahulladék rovására, akkor azt is megteheti, amit én, és az egész fogantyú kinyomtatása helyett csak azt a részt nyomtassa ki, amely a Wiimote -ot tartja, és vágjon ki egy fadarabot, és csavarja fel.

A látáshoz összpontosítsa a szemét a látnivalókra. Igazítsa az elülső irányzék dudorát a hátsó látómező dudorjai közé úgy, hogy a légtér mindkét oldalon egyenlő legyen, és mindhárom dudor egyformán magasan lógjon ki. Ezután igazítsa a céltábla közepét a dudorok tetejéhez.

Megjegyzés: A dudorok magassága kissé egyenlőtlen, az elülső látómező dudorja kissé alacsonyabb, hogy kompenzálja a látómező magasságát, amikor 2,5 méter távolságban látja őket (a távolságom a TV -től). Ha lényegesen eltér a TV -től, akkor ezt beillesztheti az OpenSCAD fájlokba. Ez a beállítás azonban a nyomtató tűrései alatt maradhat. Továbbá, ha nem a függőleges beállítást végezte el a szoftverben, akkor további beállításokat adhat a szoftver látnivalóihoz az extraSightAdjust beállításával -8 körül (milliméterben).

8. lépés: III. Kalibrálás (opcionális): finombeállítás

Ha még nagyobb pontosságot szeretne, futtathatja:

python3 ~/lightgun/lightgun.py -d

(demóhoz), és alaposan nézze meg, hogy a látnivalók illeszkednek-e a szőrszálakhoz. Ha nem, lépjen ki és manuálisan szerkessze a ~/.wiilightgun/wiimotecalibration programot, és kissé módosítsa a kameraközpont x és y koordinátáit a látásmód beállításához. Például a fegyverem kissé jobbra lőtt, így végül az x koordinátát 529 -ről 525 -re változtattam. Valószínűleg mindenkinek más lesz a száma.

9. lépés: Függelék: az algoritmus

Függelék: Az algoritmus
Függelék: Az algoritmus

Az egér emulációs kód nagyjából a következőképpen működik.

  • A folyamat gomb megnyomása.
  • Szerezzen adatokat a fényképezőgépről, és állítsa be a kamera központosító kalibrálását.
  • Ha háromnál kevesebb LED látható a fényképezőgépben:

    Tartsa az egér utolsó pozícióját

  • Ha három vagy négy LED látható:

    • Használja a Wiimote gyorsulásmérő adatait a Wiimote tájolásának meghatározásához és annak azonosításához, hogy melyik LED kamera képe melyik fizikai LED -nek felel meg.
    • Ha négy LED látható:

      • Számítsa ki a homográfiát a LED fényképezőgép képei és a LED helyek között (képernyőkoordinátákban).
      • A homográfia segítségével kiszámíthatja, hogy a képernyő melyik helye felel meg a kamera látómezőjének közepéhez.
      • Végezze el az Y-beállítást, hogy beállítsa a virtuális pisztolycső közepét a látóhatár alatt. Ez egy kicsit furcsa algoritmus, de működik.
      • Állítsa be az egér pozícióját a beállított képernyőhelyre.
    • Ha három LED látható:

      • Az OpenCV használatával oldja meg a P3P problémát a LED -es kamera képei és a fizikai LED -ek között. Ez legfeljebb négy megoldást eredményez.
      • Ha sikeres:

        • Ha korábbi sikeres helymeghatározással rendelkezünk, válassza azt a megoldást, amely a hiányzó LED -t a legközelebb áll a LED utolsó megfigyelt vagy kiszámított pozíciójához.
        • Ha nem rendelkezünk korábbi sikeres helyszámítással, válassza azt a megoldást, amely a legjobban megjósolja a gyorsulásmérő irányát.
        • Használja a legjobb megoldást annak kiszámításához, hogy hová kell mennie a negyedik LED -nek.
        • A többit végezze el, mint a négy LED -es házban.
      • Ha nem sikerül:

        Tartsa az egér utolsó pozícióját

Ajánlott: