Sadržaj:

Precizni svjetlosni pištolj Wiimote za malinu PI: 9 koraka (sa slikama)
Precizni svjetlosni pištolj Wiimote za malinu PI: 9 koraka (sa slikama)

Video: Precizni svjetlosni pištolj Wiimote za malinu PI: 9 koraka (sa slikama)

Video: Precizni svjetlosni pištolj Wiimote za malinu PI: 9 koraka (sa slikama)
Video: Зак Каплан и Кейт Шахт показывают игрушки будущего 2024, Srpanj
Anonim
Točan Wiimote Light Gun za Raspberry PI
Točan Wiimote Light Gun za Raspberry PI
Točan Wiimote Light Gun za Raspberry PI
Točan Wiimote Light Gun za Raspberry PI

Uobičajeno, Wii Remote koji se koristi kao svjetlosni pištolj nije dovoljno točan za retro igre poput NES Duck Hunt, jer Wii Remote zapravo ne odabire točku na televizoru na koju je usmjeren. Ne može! Wii Remote 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 velik 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 promatrati kako biste odabrali metu na televizoru, potrebne su četiri infracrvene LED diode raspoređene u poznatom četverokutnom uzorku (ne ravnoj liniji) u istoj ravnini s televizorom. Wii daljinski upravljač tada vidi četiri LED diode, a slika kamere može se koristiti za izračun homografije koja nam omogućuje da shvatimo kamo kamera pokazuje.

Hardver za ovaj projekt je jednostavan. Postoje četiri infracrvene LED diode u jednostavnim 3D ispisanim kućištima koja se mogu zalijepiti na 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 ručicu s 3D printom 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 tiskane plastike).

Softver temeljen 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 izračune homografije za oponašanje apsolutnog miša koji prilično dobro radi u Retroarchovom emulatoru fceumm NES (i vjerojatno nekim drugim emulatorima) na mom Raspberry PI 3B+.

Pribor

  • Wii daljinski upravljač
  • Četiri 940nm 5 mm infracrvene LED diode
  • Stari USB kabel s ispravnim utikačem tipa A.
  • Raspberry PI 3 ili drugo Linux računalo s Bluetooth podrškom
  • 3D pisač 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 kabeli za punjenje telefona puknu na mikro USB kraju pa imam preostale kabele s radnom utičnicom tipa A). Zapravo je čak i u redu ako su podatkovni kabeli slomljena sve dok električni vodovi rade. Odrežite 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 serijski u petlju 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).

Toč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 kako biste drugu LED diodu spojili s trećom, a treću s četvrtom
  • zatim spojite plus stranu četvrte LED sa žicom na uzemljenu USB žicu.

Da biste stvari učinili urednijima, prilikom spajanja 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 osjetljive su 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, a dvije na gornju. Vodoravni razmak trebao bi biti oko deset centimetara. Ako je previše, možda ćete imati problema s vidljivim poljem kamere daljinskog upravljača Wii da ih sve zabilježi. 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 ispisao četiri uredna mala LED isječka (datoteke su ovdje) koje sam vruće zalijepio na televizor. LED diode trebate postaviti što je moguće bliže ravnini TV zaslona, a da ih okvir ne zaklanja s mjesta na kojem ćete snimati.

Korak 3: Instalirajte softver

Trenutno je softver samo za Linux. Sljedeće postavljanje je dizajnirano za Raspberry PI 3 s Raspbian Stretch. Ostali Linux sustavi zahtijevaju neke promjene. Na ranijim modelima trebat će vam Bluetooth ključ i ovo ćete morati pokrenuti iz naredbenog retka:

sudo get-apt instalirajte bluetooth

Korak A: udev

Zatim stvorite datoteku u /etc/udev/rules.d/wiimote.rules koja sadrži jedan redak:

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

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

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

Zatim ponovno 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 mogućnosti 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 velika vjerojatnost da ste propustili hrpu 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: Upotrijebite 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: knjižnice python

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

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

Korak D: lightgun.py

Konačno, nabavite moju python skriptu za lightgun:

cd ~

git klon

Ako je sve prošlo u redu, sada imate ~/lightgun.py koji možete koristiti za kalibriranje svjetlosne puške.

Korak 4: Kalibracija Dio I: Centriranje kamere

Kalibracija I dio: Centriranje kamere
Kalibracija I dio: Centriranje kamere
Kalibracija I dio: Centriranje kamere
Kalibracija I dio: Centriranje kamere
Kalibracija I dio: Centriranje kamere
Kalibracija I dio: Centriranje kamere

Postoje dva aspekta kalibracije. Prvi je kalibrirati središte kamere na svakom Wiimoteu. To zahtijeva da fotoaparatom snimite dvije slike LED dioda oko ekrana televizora, jednu s daljinskim upravljačem okrenutim prema gore, a drugu s naopako.

Kako biste izbjegli pritiskanje gumba 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 odrezenu šperploču za uštedu na plastici.

Uključite LED diode i provjerite prikazuje li se Raspberry PI ili drugo računalo na televizoru. Spojite tipkovnicu (ovo neće raditi preko ssh -a) ili upotrijebite VNC. Zatim pokrenite:

python3 ~/lightgun/lightgun.py -M

Ako sve prođe u redu, prikazat će se prikaz na cijelom zaslonu koji od vas traži da pritisnete 1+2 na daljinskom upravljaču Wii. Učiniti. Svjetla će treperiti na Wii daljinskom upravljaču, a zatim će svjetla 1 i 4 ostati upaljena. Također ćete vidjeti mali zeleni pravokutnik pri vrhu zaslona, s pogledom s kamere Wii Remote. Usmjerite Wii Remote 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 rubom, 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 uz rub. Počnite tako da Wii Remote 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 tipkovnici (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 uzdignut 10,5 mm od vaše površine pomoću alata za kalibraciju ili nečeg drugog i na što bližem mjestu kao i prije (npr. Poravnato s istim rubom vaše površine). Ponovno pritisnite SPACE.

Ako sve prođe dobro, sada ćete prijeći na korak kalibracije LED diode. Da, ovo je komplicirano! Ali imat ćete vrlo preciznu svjetlosnu pištolj. To je samo cijena.

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 projekt. 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 zaslon za kalibraciju koji prikazuje četiri strelice, od kojih je jedna odabrana (svijetla), a tri zasivljene, oko ruba televizora. Za promjenu strelice koju namještate koristite +/-.

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 preciznije prema odgovarajućoj LED;
  2. pritisnite gore/dolje na Wiimoteu za promjenu duljine strelice sve dok duljina strelice ne odgovara udaljenosti između LED diode i ruba TV ekrana; drugim riječima, duljina strelice mora biti jednaka udaljenosti od vrha strelice do LED diode.

Nakon što su vaše četiri strelice ispravne (a možda čak i ranije), vidjet ćete crveni nišan kada usmjerite Wiimote prema ekranu. Možete provjeriti je li to mjesto gdje treba biti. (Zapamtite 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 Stalak za televizor.)

Konačno, postoji i peta strelica koja se prikazuje samo kada pritisnete + s četvrte LED strelice ili - s prve (i ona prema zadanim postavkama ima nultu duljinu, 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đat ćete uz gornju površinu Wii daljinskog upravljača. No kamera se zapravo nalazi na određenoj udaljenosti ispod te površine, u sredini crnog pravokutnika ispred Wii daljinskog upravljača. Kad bismo snimili snimke na kojima kamera pokazuje, bile bi snimljene 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 križanih dlačica skriva kamera.

Možete živjeti s ovim ili možete povećati ovu petu strelicu kako biste softver poravnali snimke 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 za izlaz iz kalibracije i spremanje svih podataka 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 u isto vrijeme, a nakon toga, ako sve bude u redu, sve dok je lightgun.py pokrenut, svjetlosna će puška oponašati apsolutni miš 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 način 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 jezgru 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, tijekom prvih 30 sekundi izvođenja igre (dakle opcija -B 30), možete spojiti svoju svjetlosnu pušku držeći pritisnutom 1+2.

Usput, lightgun.py skripta može se koristiti i za općenito Wii Remote igre s Retroarch -om. Samo dodajte opciju -o i funkcije svjetlosne pištolja će se isključiti, a umjesto toga Wii Remote će raditi vodoravno, s tri tipke 1, 2 i B. Postoje i druge funkcije povezane s Retroarhom 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: Ruč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 Remote možete koristiti sami 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 sustav za 3D ispis: kliznu ručku koja se nalazi odmah iza okidača (tako da pomalo izgleda kao Phaser iz originalne serije Star Trek) i klizne nišane. Ovdje su datoteke za ispis. Ako želite uštedjeti na plastici na štetu starog drva, možete učiniti i ono što sam ja učinio i umjesto da isprintate cijelu ručku, ispišite samo dio koji drži Wiimote, te izrežite drveni komad i pričvrstite ga.

Za gledanje usmjerite oči na znamenitosti. Poravnajte izbočinu prednjeg nišana između udara 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, s tim da je izbočina prednjeg nišana nešto niža, kako bi se kompenzirala visina samih vidnih izbočina kada gledate uz njih na udaljenosti od 2,5 metra (moja udaljenost od televizora). Ako imate znatno drugačiju udaljenost od televizora, to možete staviti u datoteke OpenSCAD. 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š neke prilagodbe znamenitostima u softveru postavljanjem extraSightAdjust na nešto oko -8 (u milimetrima).

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

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

python3 ~/lightgun/lightgun.py -d

(za demonstraciju) i pažljivo pogledajte jesu li znamenitosti usklađene s križama. Ako to ne učine, izađite i ručno uredite ~/.wiilightgun/wiimotecalibration te lagano prilagodite x i y koordinate središta kamere kako biste prilagodili nišanjenje. Na primjer, moj pištolj je pucao malo udesno pa sam na kraju promijenio koordinatu x s 529 na 525. Brojevi će se vjerojatno razlikovati.

Korak 9: Dodatak: Algoritam

Dodatak: Algoritam
Dodatak: Algoritam

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

  • Pritisak tipki za proces.
  • 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 mjerača ubrzanja Wiimote 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 zaslona).
      • Pomoću homografije izračunajte koja lokacija zaslona 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đeno mjesto zaslona.
    • Ako su vidljive tri LED diode:

      • Koristite OpenCV za rješavanje problema P3P između slika LED kamera i fizičkih LED lokacija. Time se generiraju do četiri rješenja.
      • Ako uspije:

        • Ako imamo prethodni uspješan izračun lokacije, odaberite rješenje prema kojem nestalu LED diodu čini najbližom 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 kamo bi trebala ići četvrta LED.
        • Učinite ostalo kao u četiri LED kućišta.
      • Ako ne uspije:

        Zadržite zadnji položaj miša

Preporučeni: