Sisällysluettelo:

Tarkka Wiimote -valopistooli vadelmalle PI: 9 vaihetta (kuvilla)
Tarkka Wiimote -valopistooli vadelmalle PI: 9 vaihetta (kuvilla)

Video: Tarkka Wiimote -valopistooli vadelmalle PI: 9 vaihetta (kuvilla)

Video: Tarkka Wiimote -valopistooli vadelmalle PI: 9 vaihetta (kuvilla)
Video: Dome: Wii U - Game & Wario 2024, Heinäkuu
Anonim
Tarkka Wiimote -valopistooli vadelmalle
Tarkka Wiimote -valopistooli vadelmalle
Tarkka Wiimote -valopistooli vadelmalle
Tarkka Wiimote -valopistooli vadelmalle

Normaalisti kevyenä aseena käytettävä Wii -kaukosäädin ei ole riittävän tarkka retro -peleille, kuten NES Duck Hunt, koska Wii -kaukosäädin ei itse asiassa valitse sitä kohtaa televisiossa, johon se osoittaa. Ei voi! Wii -kaukosäätimen etupuolella on infrapunakamera, joka näkee infrapuna -LED -valot anturipalkissa, mutta se ei voi tietää, kuinka kaukana (tai mihin suuntaan) televisio on palkista tai kuinka suuri televisio on. Emulaattorit ja pelit kiertävät tämän näyttämällä ristikkäisiä hiuksia tai muita kohdistusindikaattoreita, mutta se ei ole tarkka ammuntakokemus.

Jotta Wii -kauko -ohjain toimisi tarkana valopistoolina, jonka voit katsoa valitaksesi kohteen televisiosta, tarvitaan neljä infrapuna -LEDiä, jotka on järjestetty tunnetun nelikulmaisen kuvion (ei suoran viivan) kohdalle television kanssa. Wii -kaukosäädin näkee sitten neljä LEDiä ja kameran kuvan avulla voidaan laskea homografia, jonka avulla voimme selvittää, mihin kamera osoittaa.

Tämän projektin laitteisto on yksinkertainen. Yksinkertaisissa 3D-tulostetuissa koteloissa on neljä infrapuna-LEDiä, jotka voidaan liimata TV-kotelon ylä- ja alaosaan ja liittää USB-laturiin. Lisäksi, jos sinulla ei ole Wii -pistoolikoteloa, minulla on yksinkertainen 3D -painettu kahva ja nähtävyydet, jotka voit kiinnittää Wii -kaukosäätimeen (vaikka säästin muovia, tein kaivoksestani puun ja 3D -painetun muovin välisen hybridin).

Python-pohjaista ohjelmistoa oli vaikeampi tehdä kuin laitteistoa, ja se on tällä hetkellä vain Linux-käyttöinen. Se kalibroi LEDit ja Wii -kaukosäätimen ja käyttää sitten homografialaskelmia jäljittelemään absoluuttista hiirtä, joka toimii melko hyvin Retroarchin fceumm NES -emulaattorissa (ja luultavasti joissakin muissa emulaattoreissa) Raspberry PI 3B+-laitteessani.

Tarvikkeet

  • Wii Remote
  • Neljä 940 nm 5 mm: n infrapuna -LEDiä
  • Vanha USB -kaapeli, jossa on toimiva tyypin A pistoke
  • Raspberry PI 3 tai muu Linux -tietokone, jossa on Bluetooth -tuki
  • 3D -tulostin ja filamentti (valinnainen)

Vaihe 1: Infrapuna -LED -ketju

Infrapuna -LED -ketju
Infrapuna -LED -ketju
Infrapuna -LED -ketju
Infrapuna -LED -ketju

Hanki vanha USB -kaapeli, jossa on toimiva A -tyypin urosliitäntä (yleensä puhelimen latauskaapelit katkeavat mikro -USB -päähän, joten minulla on jäljellä olevia kaapeleita, joissa on toimiva A -urosliitin). Itse asiassa on jopa OK, jos datakaapelit ovat rikki niin kauan kuin sähkölinjat toimivat. Leikkaa toinen pää pois. Teoriassa punaisen kaapelin tulee olla +5 V ja musta maadoitettu, mutta tarkista se yleismittarilla (kytke se laturiin ja tarkista sitten jännite punaisen ja mustan johdon välillä).

Koska infrapuna-LEDeillä on noin 1,2-1,3 V: n jännitehäviö, juotin juuri neljä niistä sarjasilmukalla USB-kaapeliin. Varmista, että juotettavat johdot ovat riittävän pitkiä, jotta voit sijoittaa LED -valoja television alaosaan ja kaksi yläosaan, jolloin LED -valojen väliin jää riittävästi vaakasuoraa tilaa (noin 10 tuumaa).

Tarkemmin tehdä LED -silmukka:

  • juota ensimmäisen LEDin miinuspuoli (katodi, lyhyempi jalka, litteä reuna) +5 V: n USB -johtoon
  • liitä ensimmäisen LED -valon pluspuoli (anodi, pidempi jalka, pyöreä reuna) toisen LEDin miinuspuoli
  • toista liittääksesi toisen LEDin kolmanteen ja kolmannen neljänteen
  • kytke sitten neljännen LEDin pluspuoli johdolla maadoitettuun USB -johtoon.

Jos haluat tehdä asiat siistimmin, voit käyttää liitoskohtia kutisteputkella. Muussa tapauksessa käytä sähköteippiä oikosulkujen välttämiseksi.

Varmista, ettei sinulla ole oikosulkuja. Kytke se sitten USB -laturiin ja tarkista, että se lähettää infrapunavaloa katsomalla puhelimen kameran LED -valoja. (Monet puhelinkamerat ovat herkkiä infrapunalle.)

Vaihe 2: Kiinnitä televisioon

Kiinnitä televisioon
Kiinnitä televisioon
Kiinnitä televisioon
Kiinnitä televisioon
Kiinnitä televisioon
Kiinnitä televisioon

Kiinnitä nyt kaksi LED -valoa television alapuolelle ja kaksi yläpuolelle. Vaakasuoran etäisyyden tulisi olla noin kymmenen tuumaa. Jos se on liikaa, sinulla voi olla ongelmia Wii Remote -kameran näkökentässä, joka kaappaa ne kaikki. Mutta jos ne ovat liian lähellä, geometrisen intuitioni mukaan tarkkuus on alhaisempi.

Testiä varten teipasin LEDit sähköteipillä ja sitten jatkuvaa yhteyttä varten suunnittelin ja tulostin neljä siistiä pientä LED -leikettä (tiedostot ovat täällä), jotka liimasin kuumaan televisioon. Aseta LED -valot mahdollisimman lähelle TV -näytön tasoa ilman, että kehys peittää niitä kuvauspaikasta.

Vaihe 3: Asenna ohjelmisto

Tällä hetkellä ohjelmisto on vain Linux. Seuraava asetus on suunniteltu Raspberry PI 3: lle, jossa on Raspbian Stretch. Muut Linux -järjestelmät vaativat joitain muutoksia. Aiemmissa malleissa tarvitset Bluetooth -donglen ja sinun on suoritettava tämä myös komentoriviltä:

sudo get-apt asentaa bluetooth

Vaihe A: udev

Luo seuraavaksi tiedosto /etc/udev/rules.d/wiimote.rules, joka sisältää yhden rivin:

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

Voit tehdä sen esimerkiksi tekstieditorilla tai kirjoittamalla komentoriville seuraavan:

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

Käynnistä sitten udev uudelleen:

sudo /etc/init.d/udev Käynnistä uudelleen

Vaihe B: cwiid

Seuraavaksi tarvitset muokatun cwiid -paketin. Täällä se muuttuu hieman karvaiseksi, koska mieluiten sinun pitäisi rakentaa se Raspberry PI -laitteellesi, mutta minun on myönnettävä, että olen kadottanut, mitä paketteja sinun on asennettava, jotta se toimisi. Tähän on kolme vaihtoehtoa.

Vaihtoehto B1: Rakenna itse

cd ~

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

Valitettavasti on melko hyvät mahdollisuudet, että menetät joukon tämän rakentamiseen tarvittavia tavaroita, ja./configure valittaa. Voit tarkastella kaikkia asioita, joista se valittaa, ja suorittaa sudo apt install kaikissa.

Vaihtoehto B2: Käytä binääritiedostoja

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

Vaihe C: python -kirjastot

Lopuksi hanki tukea Lightgun Python -skriptilleni:

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

Vaihe D: lightgun.py

Lopuksi hanki lightgun python -skriptini:

cd ~

git-klooni

Jos kaikki on mennyt hyvin, sinulla on nyt ~/lightgun.py, jolla voit kalibroida valopistoolin.

Vaihe 4: Kalibrointi Osa I: Kameran keskittäminen

Kalibrointi Osa I: Kameran keskittäminen
Kalibrointi Osa I: Kameran keskittäminen
Kalibrointi Osa I: Kameran keskittäminen
Kalibrointi Osa I: Kameran keskittäminen
Kalibrointi Osa I: Kameran keskittäminen
Kalibrointi Osa I: Kameran keskittäminen

Kalibroinnissa on kaksi näkökohtaa. Ensimmäinen on kalibroida kameran keskikohta jokaisessa Wiimotessa. Tämä edellyttää kameran käyttämistä kahden kuvan ottamiseen television näytön ympärillä olevista LED-valoista, toisessa kaukosäädin oikea puoli ylöspäin ja toinen ylösalaisin.

Voit välttää painikkeiden painamisen, kun asetat Wii -kaukosäätimen sen etuosaan, ja jotta Wii -kauko -ohjaimen korkeus on tasainen, voit tulostaa tässä olevan kalibrointityökalun. Tarvitset pohjimmiltaan 10,5 mm paksuisia esineitä, jotka voit laittaa Wii -kaukosäätimen alle, kun se sijaitsee sen etupuolella. Käytän itse asiassa vaneriromua säästääkseni muovia.

Kytke LED -valot päälle ja varmista, että Raspberry PI -laitteesi tai muu tietokoneesi näkyy televisiossa. Liitä näppäimistö (tämä ei toimi ssh: n kautta) tai käytä VNC: tä. Suorita sitten:

python3 ~/lightgun/lightgun.py -M

Jos kaikki menee hyvin, saat koko näytön näytön, jossa sinua pyydetään painamaan 1+2 Wii-kaukosäätimessä. Tehdä. Valot vilkkuvat Wii -kaukosäätimessä ja sitten valot 1 ja 4 palavat. Näet myös pienen vihreän suorakulmion näytön yläosassa, josta on näkymä Wii Remote -kamerasta. Osoita Wii -kaukosäädin LED -valoja kohti ja jos kaikki menee hyvin, näet neljä LEDiä, numeroitu 1-4.

Nyt sinun on löydettävä kiinteä pinta, jossa on terävä reuna, kuten sohvapöytä, jonka voit osoittaa televisioruutuun ja jonka avulla Wii -kaukosäädin voi nähdä kaikki LEDit, kun Wii -kaukosäädin on kohdistettu reunaa vasten. Aloita kohdistamalla Wii -kaukosäädin oikea puoli ylöspäin ja kaukosäätimen puoli kohdistettuna pinnan reunaa vasten. Varmista, että kaikki neljä LED -valoa näkyvät. Paina sitten näppäimistön SPACE -näppäintä (tai kiinnitä Nunchuck ja paina C -näppäintä, jos se on kätevämpää). Sinua kehotetaan kääntämään Wii -kaukosäädin. Varmista nyt, että se on kalibrointityökalulla tai muulla tavalla 10,5 mm: n korkeudella pinnastasi ja niin lähellä samaa paikkaa kuin ennen (esim. Kohdistettuna pinnan samaa reunaa vasten). Paina SPACE uudelleen.

Jos kaikki menee hyvin, siirryt nyt LED -kalibrointivaiheeseen. Joo, tämä on monimutkaista! Mutta sinulla on erittäin tarkka valopistooli. Se on vain hinta.

Huomautus: Jos sinulla on kuten minullakin Wii television alla, Wii on kytkettävä pois päältä kahdesta syystä: ensinnäkin, jos Wii on päällä, se muodostaa yhteyden Wiimoteen ja toiseksi anturipalkin infrapuna -LEDit häiritsevät Tämä projekti. Samoista syistä, kun käytät Wiiä, on hyvä irrottaa television ympärillä olevat LED -valot.

Vaihe 5: Kalibrointi Vaihe II: LEDit

Kalibrointivaihe II: LEDit
Kalibrointivaihe II: LEDit
Kalibrointivaihe II: LEDit
Kalibrointivaihe II: LEDit

Nyt sinun on kerrottava ohjelmistolle, missä LED -valot sijaitsevat television reunan ympärillä. Näet television reunan ympärillä kalibrointinäytön, jossa on neljä nuolta, joista yksi on valittu (kirkas) ja kolme harmaana. Vaihda +/- -painikkeilla muuttaaksesi mitä nuolta säädät.

Tee jokainen neljästä reunan ympärillä olevasta nuolesta seuraavasti:

  1. Siirrä nuolia painamalla Wiimoten vasenta/oikeaa nuolta, kunnes ne osoittavat niin tarkasti kuin mahdollista vastaavaa LED -valoa kohti.
  2. paina Wiimote -näppäintä ylös/alas muuttaaksesi nuolen pituutta, kunnes nuolen pituus vastaa LED -valon ja TV -näytön reunan välistä etäisyyttä; toisin sanoen nuolen pituuden on oltava sama kuin etäisyys nuolen kärjestä LED -valoon.

Kun neljä nuolta ovat oikein (ja ehkä jopa aikaisemmin), näet punaisen hiusristikon, kun osoitat Wiimoten näyttöä. Voit tarkistaa, että tämän pitäisi olla tässä. (Muista, että sinun on oltava riittävän kaukana, jotta Wiimote näkee kaikki LED -valot. On myös tärkeää, että näkökentässä ei ole muita infrapunalähteitä. Minulla oli kerran ongelmia, koska auringonvalo heijastui ruuvin päässä Tv taso.)

Lopuksi on viides nuoli, joka näkyy vain, kun painat + -painiketta neljännestä LED -nuolesta tai - ensimmäisestä (ja sen oletuspituus on nolla, joten se on vain pikseli). Tämä nuoli säätää, kuinka pitkälle Wii Remote -kameran yläpuolella kuva tallennetaan. Ongelma on seuraava: näet Wii -kaukosäätimen yläpintaa. Mutta kamera sijaitsee itse asiassa jonkin verran tämän pinnan alapuolella, Wii -kaukosäätimen etuosan mustan suorakulmion keskellä. Jos rekisteröisimme kuvat, joihin kamera osoittaa, ne rekisteröitiin noin 8 mm Wii -kaukosäätimen yläpinnan alapuolelle. Voit tarkistaa tämän huomaamalla, että kun katsot yläpintaa pitkin, ristihiusten keskikohta on kameran piilossa.

Voit elää tämän kanssa tai kasvattaa tämän viidennen nuolen, jotta ohjelmisto kohdistaa kuvat Wii Remote -kaukosäätimen yläosaan, tai voit säätää rautakohteiden 3D -tulostettavia tiedostoja kompensoimaan tämän (mutta korvaus toimii vain yksi etäisyys televisioon). Kävin itse ohjelmiston kohdistuksen.

Poistu kalibroinnista ja tallenna kaikki tiedot ~/.wiilightgun -hakemistoon painamalla Wii -kaukosäätimen HOME -painiketta.

Vaihe 6: Testaa ja käytä

Testaa ja käytä
Testaa ja käytä
Testaa ja käytä
Testaa ja käytä
Testaa ja käytä
Testaa ja käytä

Haluat todennäköisesti kokeilla kevytaseesi nyt. Suorita vain pääteemulaattorissa (tai komentosarjassa):

python3 ~/lightgun/lightgun.py -t

Sinun on painettava 1+2-painikkeita samanaikaisesti, ja sen jälkeen, jos kaikki menee hyvin, niin kauan kuin lightgun.py on käynnissä, valopistooli jäljittelee kahden painikkeen absoluuttista hiirtä. Liipaisinpainike on hiiren painike 1 ja A-painike on hiiren painike 2. Poistu painamalla ctrl-c.

Sinun tarvitsee vain määrittää emulaattorisi ja/tai pelisi toimimaan absoluuttisen hiiren kanssa. Valitettavasti se ei aina ole niin helppoa.

Yksi hauska asia, jota voit kokeilla, on iminurnamezin ankka-ankka-ampuminen:

cd ~

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

NES -peleissä käytän libretro fceumm -ydintä Retroarchissa. Siirry Asetukset -valikkoon ja määritä Zapper kosketusnäyttöksi. (Sen määrittäminen hiireksi ei oikeastaan toimi, koska fceumm odottaa suhteellista liikettä eikä absoluuttisen sijainnin hiirtä.)

Jos aloitat pelisi komentosarjalla, voit muokata pelin tai emulaattorin käynnistävää osaa sanomalla:

python3 ~/lightgun/lightgun.py -t -B 30 "komento aloittaa pelin"

Sitten pelin suorittamisen ensimmäisten 30 sekunnin aikana (siis vaihtoehto -B 30) voit yhdistää valopistoolisi pitämällä 1+2 painettuna.

Muuten, lightgun.py -skriptiä voidaan käyttää myös yleiseen Wii -etäpelaamiseen Retroarchilla. Lisää vain -o -vaihtoehto, ja valopistoolitoiminnot sammutetaan, ja sen sijaan Wii -kaukosäädin toimii vaakatasossa kolmen painikkeen ollessa 1, 2 ja B. Lightgun.py-kartoituksissa on myös muita Retroarch-toimintoja, jotka löydät lukemalla koodin. Esimerkiksi miinusnäppäin toimii siirtona ja ohjaa yhdessä dpadin kanssa tallennusta ja latausta (ylös/alas = muuta tallennusnumeroa; vasen = palauta; oikea = tallenna).

Vaihe 7: Pistoolin kahva ja tähtäys

Pistoolin kahva ja tavoite
Pistoolin kahva ja tavoite
Pistoolin kahva ja tavoite
Pistoolin kahva ja tavoite
Pistoolin kahva ja tavoite
Pistoolin kahva ja tavoite

Voit käyttää Wii -kauko -ohjainta yksinään aseena ja nähdä sen yläosaa. Voit myös ostaa yhden kaupallisista asekoteloista sitä varten. Mutta koska alkuperäinen Wii -kauko -ohjain ei pystynyt käyttämään huokauspistoolina, koteloissa ei yleensä ole raudan tähtäimiä, ja raudan tähtäimet parantavat tarkkuutta huomattavasti.

Suunnittelin yksinkertaisen kolmiosaisen 3D-tulostettavan järjestelmän: liukuva kahva, joka sijaitsee aivan liipaisimen takana (joten se näyttää vähän Star Trek Original -sarjan phaserilta), ja liukuvat nähtävyydet. Tulostettavat tiedostot ovat täällä. Jos haluat säästää muovia puunromun kustannuksella, voit myös tehdä samoin kuin minä ja tulostaa koko kahvan tulostamisen sijaan vain osa, joka pitää Wiimoten, ja leikata puukappale ja ruuvaa se kiinni.

Nähdäksesi keskitä katseesi nähtävyyksiin. Kohdista etunäkymän kohouma takatähtäimen kuopien väliin niin, että kummankin ilmatila on yhtä suuri ja kaikki kolme kohoumaa ovat yhtä korkealla. Kohdista sitten kohteen keskikohta kuoppia vasten.

Huomautus: Kohoumien korkeus on hieman epätasainen, ja etunäkymän kohouma on hieman alhaisempi, jotta kompensoidaan itse näkyvien kohoumien korkeutta, kun näet niitä pitkin 2,5 metrin etäisyydellä (etäisyyteni televisioon). Jos etäisyys televisioon on huomattavasti erilainen, voit lisätä sen OpenSCAD -tiedostoihin. Tämä säätö voi kuitenkin olla tulostimen toleranssien alapuolella. Lisäksi, jos et tehnyt ohjelmiston pystysuuntaista säätöä, voit lisätä hieman säätöjä ohjelmiston nähtävyyksiin asettamalla extraSightAdjust jotain -8: een (millimetreinä).

Vaihe 8: Kalibrointi III (valinnainen): Hienosäätö

Jos haluat vielä tarkempaa, voit suorittaa:

python3 ~/lightgun/lightgun.py -d

(esittelyä varten) ja katso huolellisesti, ovatko nähtävyydet linjassa ristikkäisten hiusten kanssa. Jos ei, poistu ja muokkaa manuaalisesti ~/.wiilightgun/wiimotecalibration ja säädä havaintoa hieman säätämällä kameran keskipisteen x- ja y -koordinaatteja. Esimerkiksi aseeni ampui hieman oikealle, joten päädyin muuttamaan x -koordinaatin arvosta 529 arvoon 525. Kaikkien luvut ovat todennäköisesti erilaisia.

Vaihe 9: Liite: Algoritmi

Liite: Algoritmi
Liite: Algoritmi

Hiiren emulointikoodi toimii suunnilleen seuraavasti.

  • Prosessipainike painaa.
  • Hanki tietoja kamerasta ja säädä kameran keskityksen kalibrointia varten.
  • Jos kamerassa näkyy alle kolme LED -valoa:

    Pidä hiiren viimeinen asento

  • Jos kolme tai neljä LEDiä on näkyvissä:

    • Käytä Wiimote -kiihtyvyysmittarin tietoja saadaksesi Wiimote -suunnan ja tunnistaa, mikä LED -kameran kuva vastaa mitä tahansa fyysistä LEDiä.
    • Jos neljä LED -valoa on näkyvissä:

      • Laske homografia LED -kameran kuvien ja LED -sijaintien välillä (näytön koordinaateissa).
      • Laske homografian avulla, mikä näytön sijainti vastaa kameran näkökentän keskikohtaa.
      • Tee Y-säätö säätääksesi virtuaalisen aseen piipun keskikohtaa tähtäyslinjan alapuolelle. Tämä on hieman epämääräinen algoritmi, mutta se toimii.
      • Aseta hiiren asento säädettyyn näytön sijaintiin.
    • Jos kolme LED -valoa on näkyvissä:

      • Käytä OpenCV: tä ratkaisemaan P3P -ongelma LED -kameran kuvien ja fyysisten LED -sijaintien välillä. Tämä tuottaa jopa neljä ratkaisua.
      • Jos onnistuu:

        • Jos meillä on aiempi onnistunut sijaintilaskenta, valitse ratkaisu, jonka avulla puuttuva LED on lähimpänä kyseisen ledin viimeistä havaittua tai laskettua sijaintia.
        • Jos meillä ei ole aiempaa onnistunutta sijainnin laskentaa, valitse ratkaisu, joka ennustaa parhaiten kiihtyvyysmittarin suunnan.
        • Laske parhaan ratkaisun avulla, mihin neljännen LED -valon pitäisi mennä.
        • Tee loput kuten neljässä LED -kotelossa.
      • Jos ei onnistu:

        Pidä hiiren viimeinen asento

Suositeltava: