Sadržaj:

Precizan Wiimote Light Gun za Raspberry PI: 9 koraka (sa slikama)
Precizan Wiimote Light Gun za Raspberry PI: 9 koraka (sa slikama)

Video: Precizan Wiimote Light Gun za Raspberry PI: 9 koraka (sa slikama)

Video: Precizan Wiimote Light Gun za Raspberry PI: 9 koraka (sa slikama)
Video: #20 Hettich šablon za šarke, klizače i nosače - Precizan rez 2024, Juli
Anonim
Tačan Wiimote Light Gun za Raspberry PI
Tačan Wiimote Light Gun za Raspberry PI
Tačan Wiimote Light Gun za Raspberry PI
Tačan Wiimote Light Gun za Raspberry PI

Uobičajeno, Wii Remote koji se koristi kao svjetlosni pištolj nije dovoljno precizan za retro igre poput NES Duck Hunt, jer Wii Remote zapravo ne odabire točku na TV -u na koju je usmjeren. Ne može! Wii daljinski upravljač ima infracrvenu kameru na prednjoj strani koja vidi liniju infracrvenih LED dioda u senzorskoj traci, ali ne može znati koliko je (ili u kojem smjeru) televizor udaljen od šipke ili koliko je veliki televizor. Emulatori i igre zaobilaze ovo prikazivanjem križanja ili drugog pokazatelja ciljanja, ali to nije točno iskustvo gađanja mete.

Da bi Wii daljinski upravljač radio kao precizan svjetlosni pištolj koji možete gledati zajedno kako biste odabrali metu na televizoru, potrebne su četiri infracrvene LED diode raspoređene po poznatom četverokutnom uzorku (ne pravoj liniji) u istoj ravnini s televizorom. Wii daljinski upravljač tada vidi četiri LED diode, a slika kamere može se koristiti za izračunavanje homografije koja nam omogućava da shvatimo kamo kamera pokazuje.

Hardver za ovaj projekt je jednostavan. Postoje četiri infracrvene LED diode u jednostavnim 3D štampanim kućištima koja se mogu zalijepiti za gornju i donju stranu kućišta televizora i priključiti na USB punjač. Osim toga, u slučaju da nemate kućište pištolja za Wii, imam jednostavnu 3D štampanu ručku i nišane koje možete pričvrstiti na Wii daljinski upravljač (iako sam radi uštede plastike napravio svoj hibrid između drveta i 3D štampane plastike).

Softver zasnovan na pythonu bilo je teže napraviti od hardvera i trenutno je samo za Linux. Kalibrira LED diode i Wii daljinski upravljač, a zatim koristi proračune homografije za oponašanje apsolutnog miša koji prilično dobro radi u Retroarch -ovom fceumm NES emulatoru (i vjerovatno nekim drugim emulatorima) na mom Raspberry PI 3B+.

Supplies

  • Wii Remote
  • Četiri 940nm 5 mm infracrvene LED diode
  • Stari USB kabel sa radnim utikačem tipa A.
  • Raspberry PI 3 ili drugi Linux računar sa Bluetooth podrškom
  • 3D štampač i filament (opcionalno)

Korak 1: Infracrveni LED lanac

Infracrveni LED lanac
Infracrveni LED lanac
Infracrveni LED lanac
Infracrveni LED lanac

Nabavite stari USB kabel s radnom utičnicom tipa A (obično mi se kablovi za punjenje telefona puknu na mikro USB kraju, tako da imam preostale kablove s radnom utičnicom tipa A). Zapravo je čak i u redu ako su podatkovni kabeli slomljena sve dok električni vodovi rade. Odsecite drugi kraj. U teoriji bi crveni kabel trebao biti +5V, a crni bi trebao biti uzemljen, ali provjerite to multimetrom (uključite ga u punjač, a zatim provjerite napon između crvene i crne žice).

Budući da infracrvene LED diode imaju pad napona od 1,2-1,3 V, upravo sam lemio četiri od njih u serijskoj petlji na USB kabel. Provjerite da li su žice koje lemite dovoljno dugačke da možete staviti LED diode na dno televizora i dvije na vrh, s pristojnom količinom vodoravnog prostora između LED dioda (oko 10 inča ili više).

Tačnije za izradu LED petlje:

  • lemite minus stranu (katoda, kraća noga, s ravnim rubom) prve LED diode na +5V USB žicu
  • spojite plus stranu prve LED diode (anodu, dužu nogu, sa okruglim rubom) na minus stranu druge LED diode
  • ponovite da biste spojili drugu LED lampicu na treću i treću na četvrtu
  • zatim povežite plus stranu četvrte LED sa žicom na USB žicu uzemljenja.

Da biste stvari učinili urednijim, prilikom povezivanja možete koristiti termoskupljajuće cijevi. U suprotnom, upotrijebite električnu traku kako biste izbjegli kratke hlače.

Uvjerite se da nema kratkih spojeva. Zatim ga priključite u USB punjač i provjerite emitira li infracrveno svjetlo gledajući LED diode s kamerom telefona. (Mnoge kamere telefona su osjetljive na infracrvenu vezu.)

Korak 2: Priključite na televizor

Priključite na TV
Priključite na TV
Priključite na TV
Priključite na TV
Priključite na TV
Priključite na TV

Sada, pričvrstite dvije LED diode na donju stranu televizora i dvije na gornju stranu. Horizontalni razmak trebao bi biti oko 10 cm. Ako je previše, možda ćete imati problema sa vidnim poljem kamere Wii Remote koja ih sve snima. Ali ako su preblizu, moja geometrijska intuicija kaže da ćete imati manju preciznost.

Za testiranje, zalijepio sam LED diode električnom trakom, a zatim sam za trajnu vezu dizajnirao i odštampao četiri uredne male LED isječke (datoteke se nalaze ovdje) koje sam vruće zalijepio za televizor. LED diode trebate postaviti što je moguće bliže ravnini TV ekrana, a da ih okvir ne zaklanja od lokacije na kojoj ćete snimati.

Korak 3: Instalirajte softver

Trenutno je softver samo za Linux. Sledeće podešavanje je dizajnirano za Raspberry PI 3 sa Raspbian Stretch -om. Drugi Linux sustavi zahtijevaju neke promjene. Na ranijim modelima trebat će vam Bluetooth ključ i ovo ćete morati pokrenuti iz naredbenog retka:

sudo get-apt install bluetooth

Korak A: udev

Zatim kreirajte datoteku u /etc/udev/rules.d/wiimote.rules koja sadrži jednu liniju:

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

To možete učiniti, na primjer, s uređivačem teksta ili upisivanjem sljedećeg u naredbenu liniju:

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

A zatim ponovo pokrenite udev:

sudo /etc/init.d/udev ponovno pokretanje

Korak B: cwiid

Zatim će vam trebati moj izmijenjeni paket cwiid. Ovdje postaje pomalo dlakavo jer bi idealno bilo da ga trebate izgraditi na svom Raspberry PI -u, ali moram priznati da sam izgubio trag o tome koje pakete trebate instalirati da bi funkcionirao. Postoje tri opcije za to.

Opcija B1: Izgradite sami

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

Nažalost, postoji prilično velika šansa da vam nedostaje gomila stvari potrebnih za izgradnju ovoga, a./configure će se žaliti. Možete pogledati sve stvari na koje se žali i pokrenuti sudo apt install na svima.

Opcija B2: Koristi moje binarne datoteke

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

Korak C: python biblioteke

Konačno, nabavite podršku za moju lightgun python skriptu:

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

Korak D: lightgun.py

Konačno, nabavite moju lightgun python skriptu:

cd ~

git clone

Ako je sve prošlo u redu, sada imate ~/lightgun.py koji možete koristiti za kalibraciju pištolja.

Korak 4: Kalibracija I dio: Centriranje kamere

Kalibracija Dio I: Centriranje kamere
Kalibracija Dio I: Centriranje kamere
Kalibracija Dio I: Centriranje kamere
Kalibracija Dio I: Centriranje kamere
Kalibracija Dio I: Centriranje kamere
Kalibracija Dio I: Centriranje kamere

Postoje dva aspekta kalibracije. Prvi je kalibriranje središta kamere na svakom Wiimoteu. Za to je potrebno da kamerom snimite dvije slike LED dioda oko ekrana televizora, jednu s daljinskim upravljačem okrenutim nagore, a drugu s naopako.

Da biste izbjegli pritiskanje tipki kada postavite Wii Remote na prednju stranu, a kako bi Wii Remote imao dosljednu visinu, možete 3D ispisati alat za kalibraciju koji sam ovdje uključio. U osnovi vam trebaju stvari debljine 10,5 mm koje možete staviti ispod Wii daljinskog upravljača kada leži na prednjoj strani. Zapravo sam upotrijebio određenu šperploču za uštedu na plastici.

Uključite LED diode i provjerite prikazuje li se Raspberry PI ili drugi računar na TV -u. Povežite tastaturu (ovo neće raditi preko ssh -a) ili koristite VNC. Zatim pokrenite:

python3 ~/lightgun/lightgun.py -M

Ako sve prođe u redu, prikazat će se prikaz na cijelom ekranu koji od vas traži da pritisnete 1+2 na Wii daljinskom upravljaču. Učini to. Svjetla će treperiti na Wii daljinskom upravljaču, a zatim će svjetla 1 i 4 ostati upaljena. Vidjet ćete i mali zeleni pravokutnik na vrhu ekrana s pogledom s Wii Remote kamere. Usmjerite Wii daljinski upravljač prema LED diodama i ako sve prođe dobro, vidjet ćete četiri LED diode, označene brojevima od 1 do 4.

Sada morate pronaći čvrstu površinu s oštrim rubovima, poput stolića za kavu, koju možete usmjeriti prema TV ekranu i koja može omogućiti Wii daljinskom upravljaču da vidi sve LED diode s Wii daljinskim upravljačem poravnatim prema rubu. Počnite tako da Wii daljinski upravljač poravnate desnom stranom prema gore, sa stranom daljinskog upravljača poravnatom prema rubu površine, pazeći da se vide sve četiri LED diode. Zatim pritisnite SPACE na tastaturi (ili pričvrstite Nunchuck i pritisnite C ako je to prikladnije). Tada će se od vas tražiti da rotirate Wii daljinski upravljač. Sada provjerite je li uzdignuta 10,5 mm od vaše površine, pomoću alata za kalibraciju ili nečeg drugog, i što bliže istoj lokaciji kao i prije (npr. Poravnana s istim rubom vaše površine). Ponovo pritisnite SPACE.

Ako sve prođe dobro, prijeđite na korak kalibracije LED diode. Da, ovo je komplikovano! Ali imat ćete vrlo preciznu pištolj. To je samo cena.

Napomena: Ako kao ja imate Wii ispod televizora, Wii se mora isključiti iz dva razloga: prvo, ako je Wii uključen, povezat će se s Wiimoteom, i drugo, infracrvene LED diode senzorske trake ometat će ovaj projekat. Iz sličnih razloga, dok koristite Wii, dobra je ideja isključiti LED diode oko televizora.

Korak 5: Kalibracija Korak II: LED diode

Korak II kalibracije: LED diode
Korak II kalibracije: LED diode
Korak II kalibracije: LED diode
Korak II kalibracije: LED diode

Sada morate softveru reći gdje se LED diode nalaze oko ruba televizora. Vidjet ćete ekran za kalibraciju koji prikazuje četiri strelice, od kojih je jedna odabrana (svijetla), a tri zasivljene, oko ruba televizora. Koristite +/- za prebacivanje za promjenu strelice koju podešavate.

Za svaku od četiri strelice oko ruba učinite sljedeće:

  1. pritisnite lijevo/desno na Wiimoteu za pomicanje strelica dok ne pokažu što je moguće preciznije prema odgovarajućoj LED lampici;
  2. pritisnite gore/dolje na Wiimoteu da promijenite dužinu strelice sve dok se dužina strelice ne podudara s udaljenošću između LED diode i ivice TV ekrana; drugim riječima, dužina strelice mora biti jednaka udaljenosti od vrha strelice do LED diode.

Kada vaše četiri strelice budu ispravne (a možda čak i ranije), vidjet ćete crveni nišan kada usmjerite Wiimote prema ekranu. Možete provjeriti da li bi ovdje trebalo biti. (Upamtite da morate biti dovoljno udaljeni da Wiimote može vidjeti sve LED diode. Također je važno da u vidnom polju nema drugih izvora infracrvenih zraka. Jednom sam imao problema zbog sunčeve svjetlosti koja se reflektira od glave vijka na TV postolje.)

Konačno, postoji i peta strelica koja se prikazuje samo kada pritisnete + sa četvrte LED strelice ili - sa prve (i ona prema zadanim postavkama ima nultu dužinu, pa je to samo piksel). Ova strelica podešava koliko će iznad kamere Wii daljinskog upravljača biti snimljen snimak. Problem je sljedeći: vi ćete gledati po gornjoj površini Wii daljinskog upravljača. Ali kamera se zapravo nalazi na određenoj udaljenosti ispod te površine, u sredini crnog pravokutnika ispred Wii daljinskog upravljača. Da smo snimili snimke na kojima kamera pokazuje, oni bi bili snimljeni oko 8 mm ispod gornje površine Wii daljinskog upravljača. To možete provjeriti tako što ćete primijetiti da dok gledate uz gornju površinu, središte ukrštenih dlačica skriva kamera.

Možete živjeti s ovim, ili možete povećati ovu petu strelicu da softver softverski poravna fotografije s vrhom Wii daljinskog upravljača, ili možete prilagoditi datoteke za 3D ispis za željezne nišane kako biste to nadoknadili (ali kompenzacija će raditi samo za jedna određena udaljenost od televizora). I sam sam otišao na usklađivanje softvera.

Pritisnite HOME na Wii daljinskom upravljaču da izađete iz kalibracije i spremite sve podatke u direktorij ~/.wiilightgun.

Korak 6: Testirajte i koristite

Testiranje i upotreba
Testiranje i upotreba
Testiranje i upotreba
Testiranje i upotreba
Testiranje i upotreba
Testiranje i upotreba

Vjerojatno sada želite isprobati svoj laki pištolj. Samo pokrenite terminalski emulator (ili skriptu):

python3 ~/lightgun/lightgun.py -t

Morat ćete pritisnuti tipke 1+2 istovremeno, a nakon toga, ako sve bude u redu, sve dok je lightgun.py pokrenut, svjetlosna pištolj će oponašati apsolutno miša s dva gumba. Okidač je tipka miša 1, a tipka A tipka miša 2. Pritisnite ctrl-c za izlaz.

Sada trebate samo konfigurirati svoje emulatore i/ili igre za rad s apsolutnim mišem. Nažalost, to neće uvijek biti tako lako.

Jedna zabavna stvar koju biste mogli isprobati je moj mod iminurnamezove patke-patke:

cd ~

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

Za NES igre koristim jezgro libretro fceumm u Retroarchu. Idite na izbornik Opcije i konfigurirajte Zapper da bude zaslon osjetljiv na dodir. (Konfiguriranje kao miša zapravo ne funkcionira, jer fceumm očekuje miš s relativnim kretanjem, a ne s apsolutnim položajem.)

Ako započnete igre skriptom, možete urediti dio koji pokreće igru ili emulator tako da kaže:

python3 ~/lightgun/lightgun.py -t -B 30 "naredba za pokretanje igre"

Zatim, tokom prvih 30 sekundi izvođenja igre (otuda opcija -B 30), možete spojiti svoju pištolj držeći pritisnutom 1+2.

Inače, lightgun.py skripta se može koristiti i za općenite Wii Remote igre s Retroarch -om. Samo dodajte opciju -o i funkcije svjetlosne puške će se isključiti, a umjesto toga Wii Remote će raditi vodoravno, s tri tipke 1, 2 i B. Postoje i druge funkcije vezane za Retroarch u preslikavanjima lightgun.py koje ćete otkriti čitajući kôd. Na primjer, tipka minus djeluje kao pomak i zajedno s dpadom kontrolira spremanje i učitavanje (gore/dolje = promijeni broj spremanja; lijevo = vrati; desno = spremi).

Korak 7: Drška pištolja i nišanjenje

Drška pištolja i nišanjenje
Drška pištolja i nišanjenje
Drška pištolja i nišanjenje
Drška pištolja i nišanjenje
Drška pištolja i nišanjenje
Drška pištolja i nišanjenje

Wii daljinski upravljač možete sami koristiti kao pištolj, gledajući po vrhu. Za njega možete kupiti i jednu od komercijalnih čahura. No, budući da se originalni Wii daljinski upravljač nije mogao koristiti kao pištolj za vidljivost, kućišta obično nemaju željezne nišane, a željezni nišani uvelike poboljšavaju točnost.

Dizajnirao sam jednostavan trodijelni sistem za 3D štampanje: kliznu ručku koja se nalazi odmah iza okidača (tako da pomalo liči na Phaser iz originalne serije Star Trek) i klizne nišane. Ovdje su datoteke za štampanje. Ako želite uštedjeti na plastici na račun starog drva, možete učiniti i ono što sam ja učinio i umjesto da odštampam cijelu dršku, odštampati samo dio koji drži Wiimote, te izrezati drveni komad i pričvrstiti ga.

Za gledanje, fokusirajte oči na znamenitosti. Poravnajte izbočinu prednjeg nišana između udaraca stražnjeg pogleda, tako da je zračni prostor na bilo kojem od njih jednak, a sve tri izbočine ističu jednako visoko. Zatim poravnajte sredinu mete s vrhom izbočina.

Napomena: Visina izbočina je blago nejednaka, pri čemu je izbočina prednjeg nišana nešto niža, kako bi se kompenzirala visina samih izbočina pri pogledu kada ih gledate uzduž njih na udaljenosti od 2,5 metra (moja udaljenost od televizora). Ako imate znatno drugačiju udaljenost od televizora, to možete staviti u OpenSCAD datoteke. Ipak, ovo podešavanje može biti ispod tolerancija pisača. Također, ako niste izvršili vertikalno podešavanje u softveru, možete dodati još neko prilagođavanje nišanima u softveru postavljanjem extraSightAdjust na nešto oko -8 (u milimetrima).

Korak 8: Kalibracija III (opcionalno): Fino podešavanje

Ako želite još veću preciznost, možete pokrenuti:

python3 ~/lightgun/lightgun.py -d

(za demonstraciju) i pažljivo pogledajte da li se znamenitosti poklapaju s prečkama. Ako to ne učine, izađite i ručno uredite ~/.wiilightgun/wiimotecalibration i malo prilagodite koordinate x i y centra kamere kako biste prilagodili viziju. Na primjer, moj pištolj je pucao malo udesno, pa sam na kraju promijenio x koordinatu sa 529 na 525. Brojevi će se vjerojatno razlikovati.

Korak 9: Dodatak: Algoritam

Dodatak: Algoritam
Dodatak: Algoritam

Kod emulacije miša funkcionira otprilike na sljedeći način.

  • Pritiskom na dugme procesa.
  • Dobijte podatke s kamere i prilagodite kalibraciju centriranja kamere.
  • Ako su u kameri vidljive manje od tri LED diode:

    Zadržite zadnji položaj miša

  • Ako su vidljive tri ili četiri LED diode:

    • Upotrijebite podatke Wiimote akcelerometra da biste dobili Wiimote orijentaciju i identificirali koja slika LED kamere odgovara kojoj fizičkoj LED.
    • Ako su vidljive četiri LED diode:

      • Izračunajte homografiju između slika LED kamera i LED lokacija (u koordinatama ekrana).
      • Pomoću homografije izračunajte koja lokacija ekrana odgovara središtu vidnog polja kamere.
      • Podesite Y kako biste prilagodili središte virtualne cijevi pištolja ispod nišana. Ovo je pomalo glup algoritam, ali radi.
      • Postavite položaj miša na prilagođenu lokaciju ekrana.
    • Ako su vidljive tri LED diode:

      • Koristite OpenCV za rješavanje P3P problema između slika LED kamere i fizičkih LED lokacija. Ovo generira do četiri rješenja.
      • Ako uspe:

        • Ako imamo prethodni uspješan proračun lokacije, odaberite rješenje kojim će nestala LED biti najbliža posljednjoj promatranoj ili izračunatoj poziciji te LED diode.
        • Ako nemamo prethodni uspješan izračun lokacije, odaberite rješenje koje najbolje predviđa zaglavlje ubrzanja.
        • Koristite najbolje rješenje za izračun kuda bi trebala ići četvrta LED.
        • Učinite ostalo kao u četiri LED kućišta.
      • Ako ne uspe:

        Zadržite zadnji položaj miša

Preporučuje se: