Tartalomjegyzék:
- Kellékek
- Lépés: Infravörös LED lánc
- 2. lépés: Csatlakoztassa a TV -hez
- 3. lépés: Telepítse a szoftvert
- 4. lépés: Kalibrálás I. rész: A kamera központosítása
- 5. lépés: Kalibrálás II. Lépés: LED -ek
- 6. lépés: Tesztelés és használat
- 7. lépés: Pisztoly fogantyú és célzás
- 8. lépés: III. Kalibrálás (opcionális): finombeállítás
- 9. lépés: Függelék: az algoritmus
Videó: Pontos Wiimote fénypisztoly a málna PI -hez: 9 lépés (képekkel)
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:40
Á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
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
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
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
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:
- nyomja meg balra/jobbra a Wiimote gombot a nyilak mozgatásához, amíg a lehető legpontosabban mutatnak a megfelelő LED felé;
- 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
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
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
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:
Arduino pontos és pontos voltmérő (0-90V DC): 3 lépés
Arduino precíz és pontos voltmérő (0-90V DC): Ebben az oktatóanyagban egy voltmérőt építettem a nagyfeszültségű DC (0-90v) viszonylagos pontossággal és pontossággal történő mérésére Arduino Nano segítségével. Az elvégzett tesztmérések elég pontosak voltak, többnyire 0,3 V -on belül a tényleges feszültséggel, amelyet egy
Málna PI Vision processzor (SpartaCam): 8 lépés (képekkel)
Raspberry PI Vision Processor (SpartaCam): Málna PI látásprocesszor rendszer az ELSŐ Robotics Competition robothoz. A FIRST -ről A Wikipedia ingyenes enciklopédiája https://en.wikipedia.org/wiki/FIRST_Robotics_Compe … Az FIRST Robotics Competition (FRC) egy nemzetközi középiskolai
Korai figyelmeztető málna PI kifutópálya -fény a repülési leképezési adatok használatával: 14 lépés (képekkel)
Korai figyelmeztető málna PI kifutópálya -lámpa a repülés leképezési adatainak felhasználásával: Ez a lámpa több okból is előállt, mivel mindig érdekelnek a repülőgépek, amelyek felülről repülnek, és nyáron a hétvégén gyakran repülnek izgalmas repülőgépek. Bár hajlamosak csak hallani őket menet közben
Retro-játékgép málna PI-vel, RetroPie-vel és házi tokkal: 17 lépés (képekkel)
Retro-játékgép Raspberry PI-vel, RetroPie-vel és házi tokkal: Valamikor régen találtam egy Linux-disztribúciót a Raspberry Pi számára RetroPie néven. Azonnal rájöttem, hogy ez egy remek ötlet, nagyszerű megvalósítással. Egycélú retrójáték-rendszer felesleges funkciók nélkül. Zseniális. Nem sokkal később úgy döntöttem, hogy
Málna PI kamera és fényvezérlő Halálcsillag: 5 lépés (képekkel)
Málna PI kamera és fényvezérlő Halálcsillag: Mint mindig, olyan eszközöket szeretnék építeni, amelyek hasznosak, robusztusak és gyakran még javulást is jelentenek a jelenlegi polcokhoz képest. Itt van még egy nagyszerű projekt, eredeti nevén Shadow 0f Phoenix, a Raspberry PI pajzs a közös