Cuprins:

Pistol ușor Wiimote precis pentru Raspberry PI: 9 pași (cu imagini)
Pistol ușor Wiimote precis pentru Raspberry PI: 9 pași (cu imagini)

Video: Pistol ușor Wiimote precis pentru Raspberry PI: 9 pași (cu imagini)

Video: Pistol ușor Wiimote precis pentru Raspberry PI: 9 pași (cu imagini)
Video: TUTO LIGHT GUN RECALBOX COMPLET + CALIBRATION, PARAMÈTRES, MATÉRIEL... 2024, Iulie
Anonim
Pistola ușoară Wiimote precisă pentru Raspberry PI
Pistola ușoară Wiimote precisă pentru Raspberry PI
Pistola ușoară Wiimote precisă pentru Raspberry PI
Pistola ușoară Wiimote precisă pentru Raspberry PI

În mod normal, telecomanda Wii utilizată ca pistol ușor nu este suficient de precisă pentru jocurile retro, cum ar fi NES Duck Hunt, deoarece telecomanda Wii nu selectează de fapt punctul de pe televizor spre care este îndreptat. Nu se poate! Telecomanda Wii are în față o cameră cu infraroșu care vede linia de LED-uri cu infraroșu în bara senzorului, dar nu poate ști cât de departe (sau în ce direcție) este televizorul de bară sau cât de mare este televizorul. Emulatoarele și jocurile se bazează pe acest lucru arătând părul încrucișat sau alt indicator de direcționare, dar aceasta nu este o experiență precisă de fotografiere a țintei.

Pentru ca telecomanda Wii să funcționeze ca un pistol ușor precis pe care îl puteți vedea pentru a selecta o țintă pe un televizor, este nevoie de patru LED-uri cu infraroșu dispuse într-un model patrulater cunoscut (nu o linie dreaptă) în același plan cu televizorul. Telecomanda Wii vede apoi cele patru LED-uri, iar imaginea camerei poate fi utilizată pentru a calcula o omografie care ne permite să ne dăm seama unde este îndreptată camera.

Hardware-ul pentru acest proiect este simplu. Există patru LED-uri cu infraroșu în carcase simple imprimate 3D care pot fi lipite în partea superioară și inferioară a carcasei televizorului și conectate la un încărcător USB. În plus, în cazul în care nu aveți carcasă pentru pistol Wii, am un mâner simplu tipărit și obiective turistice pe care le puteți atașa la telecomanda Wii (deși pentru a economisi plastic, am făcut din al meu un hibrid între lemn și plastic imprimat 3D).

Software-ul bazat pe Python a fost mai greu de realizat decât hardware-ul și este în prezent exclusiv Linux. Calibrează LED-urile și telecomanda Wii și apoi folosește calcule de omografie pentru a emula un mouse absolut care funcționează destul de bine în emulatorul NES de retroarch (și probabil alți emulatori) de pe Raspberry PI 3B +.

Provizii

  • Telecomandă Wii
  • Patru LED-uri cu infraroșu de 940nm 5mm
  • Cablu USB vechi cu o fișă de tip A.
  • Raspberry PI 3 sau alt computer Linux cu suport Bluetooth
  • Imprimantă 3D și filament (opțional)

Pasul 1: Lant LED cu infraroșu

Lant LED cu infraroșu
Lant LED cu infraroșu
Lant LED cu infraroșu
Lant LED cu infraroșu

Obțineți un cablu USB vechi cu o priză masculină de tip A (de obicei cablurile de încărcare a telefonului se rup pe capătul micro USB, așa că am resturi de cabluri cu o priză masculină de tip A).. De fapt, este chiar OK dacă cablurile de date sunt sparte atâta timp cât funcționează liniile electrice. Tăiați celălalt capăt. În teorie, cablul roșu ar trebui să fie + 5V, iar negrul să fie împământat, dar verificați-l cu un multimetru (conectați-l la un încărcător, apoi verificați tensiunea dintre firele roșu și negru).

Deoarece LED-urile cu infraroșu au o cădere de tensiune de 1,2-1,3V, tocmai am lipit patru dintre ele în buclă de serie pe cablul USB. Asigurați-vă că firele pe care le lipiți sunt suficient de lungi încât să puteți pune LED-uri în partea de jos a televizorului și două în partea de sus, cu o cantitate decentă de spațiu orizontal între LED-uri (aproximativ 10 inci).

Mai precis pentru a face bucla LED:

  • lipiți partea minus (catod, picior mai scurt, cu marginea plană) a primului LED la firul USB + 5V
  • alăturați partea pozitivă a primului LED (anod, picior mai lung, cu margine rotundă) la partea minus a celui de-al doilea LED
  • repetați pentru a alătura al doilea LED la al treilea și al treilea la al patrulea
  • apoi conectați partea plus a celui de-al patrulea LED cu un fir la firul de masă USB.

Pentru a face lucrurile mai îngrijite, puteți utiliza tuburi termocontractabile atunci când faceți conexiunile. În caz contrar, utilizați bandă electrică pentru a evita scurtcircuitele.

Asigurați-vă că nu aveți scurtcircuite. Apoi conectați-l la un încărcător USB și verificați dacă emite lumină infraroșie uitându-vă la LED-urile cu o cameră telefonică. (Multe camere de telefon sunt sensibile la infraroșu.)

Pasul 2: Atașați la televizor

Atașați la televizor
Atașați la televizor
Atașați la televizor
Atașați la televizor
Atașați la televizor
Atașați la televizor

Acum, atașați două dintre LED-urile la partea inferioară a televizorului și două la partea superioară. Distanța orizontală ar trebui să fie de aproximativ zece inci. Dacă este prea mult, este posibil să aveți probleme cu câmpul vizual al camerei Wii Remote, capturându-le pe toate. Dar dacă sunt prea aproape, atunci intuiția mea geometrică spune că veți avea o precizie mai mică.

Pentru testare, am înregistrat LED-urile cu bandă electrică, iar apoi pentru o conexiune permanentă, am proiectat și tipărit patru clipuri LED îngrijite (fișierele sunt aici) pe care le-am lipit la televizor. Ar trebui să faceți LED-urile să fie cât mai aproape de planul afișajului televizorului, fără ca rama să le ascundă din locația în care veți fotografia.

Pasul 3: Instalați software-ul

În prezent, software-ul este numai Linux. Următoarea configurare este concepută pentru Raspberry PI 3 cu Raspbian Stretch. Alte sisteme Linux vor necesita unele modificări. La modelele anterioare veți avea nevoie de un dongle Bluetooth și va trebui să rulați și de la o linie de comandă:

sudo get-apt install bluetooth

Pasul A: udev

Apoi, creați un fișier în /etc/udev/rules.d/wiimote.rules care conține o singură linie:

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

Puteți face acest lucru, de exemplu, cu un editor de text sau tastând următoarele pe linia de comandă:

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

Și apoi reporniți udev:

sudo /etc/init.d/udev reporniți

Pasul B: cwiid

Apoi, veți avea nevoie de pachetul meu cwiid modificat. Aici devine puțin păros, deoarece în mod ideal ar fi nevoie să-l construiești pe Raspberry PI, dar trebuie să mărturisesc că am pierdut evidența pachetelor pe care trebuie să le instalezi pentru a funcționa. Există trei opțiuni pentru a face acest lucru.

Opțiunea B1: Construiește-te

cd ~

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

Din păcate, există șanse destul de mari să pierzi o grămadă de lucruri necesare pentru construirea acestui lucru și./configure se va plânge. Puteți privi toate lucrurile despre care se plânge și puteți rula sudo apt install pe toate.

Opțiunea B2: Utilizați binarele mele

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

Pasul C: biblioteci python

În cele din urmă, obțineți lucruri de asistență pentru scriptul meu lightgun python:

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

Pasul D: lightgun.py

În cele din urmă, obțineți scriptul meu lightgun python:

cd ~

git clone

Dacă totul a mers bine, aveți acum ~ / lightgun.py pe care îl puteți utiliza pentru a calibra arma de lumină.

Pasul 4: Calibrare Partea I: Centrarea camerei

Calibrare Partea I: Centrarea camerei
Calibrare Partea I: Centrarea camerei
Calibrare Partea I: Centrarea camerei
Calibrare Partea I: Centrarea camerei
Calibrare Partea I: Centrarea camerei
Calibrare Partea I: Centrarea camerei

Calibrarea are două aspecte. Primul este calibrarea centrului camerei pe fiecare Wiimote. Acest lucru necesită utilizarea camerei pentru a face două imagini ale LED-urilor din jurul ecranului televizorului, una cu telecomanda în partea dreaptă în sus și cealaltă cu ea în jos.

Pentru a evita apăsarea butoanelor atunci când așezați telecomanda Wii pe fața sa și pentru a face telecomanda Wii să aibă o înălțime constantă, puteți imprima 3D instrumentul de calibrare pe care l-am inclus aici. Practic aveți nevoie de lucruri care au o grosime de 10,5 mm pe care le puteți pune sub telecomanda Wii atunci când se află pe față. De fapt, am folosit niște resturi de placaj pentru a economisi plastic.

Porniți LED-urile și asigurați-vă că Raspberry PI sau alt computer se afișează pe televizor. Conectați o tastatură (acest lucru nu va funcționa pe ssh) sau utilizați VNC. Apoi rulați:

python3 ~ / lightgun / lightgun.py -M

Dacă totul merge bine, veți obține un ecran complet care vă va solicita să apăsați 1 + 2 pe telecomanda Wii. Fa aia. Luminile vor clipi pe telecomanda Wii, iar apoi luminile 1 și 4 vor rămâne aprinse. De asemenea, veți vedea un mic dreptunghi verde în partea de sus a ecranului, cu vizualizarea de pe camera Wii Remote. Îndreptați telecomanda Wii către LED-uri și, dacă totul merge bine, veți vedea cele patru LED-uri, numerotate de la 1 la 4.

Acum trebuie să găsiți o suprafață solidă cu o margine ascuțită, ca o măsuță de cafea, pe care să o puteți îndrepta spre ecranul televizorului și care să permită telecomandei Wii să vadă toate LED-urile cu telecomanda Wii aliniată la margine. Începeți prin alinierea telecomenzii Wii cu partea dreaptă în sus, cu partea telecomenzii aliniată de marginea suprafeței, asigurându-vă că toate cele patru LED-uri sunt văzute. Apoi apăsați SPACE pe tastatură (sau atașați un Nunchuck și apăsați C dacă este mai convenabil). Apoi vi se va solicita să rotiți telecomanda Wii. Acum, asigurați-vă că este ridicat la 10,5 mm în sus de suprafața dvs., utilizând instrumentul de calibrare sau altceva și la fel de aproape de aceeași locație ca înainte (de exemplu, aliniată la aceeași margine a suprafeței). Apăsați din nou pe SPACE.

Dacă totul merge bine, veți merge acum la pasul de calibrare a LED-urilor. Da, acest lucru este complicat! Dar vei avea un pistol foarte precis. Acesta este doar prețul.

Notă: Dacă la fel ca mine aveți un Wii sub televizor, Wii trebuie oprit din două motive: în primul rând, dacă Wii este pornit, se va conecta la Wiimote și, în al doilea rând, LED-urile infraroșii ale barei senzorului vor interfera cu acest proiect. Din motive similare, în timp ce utilizați Wii, este o idee bună să deconectați LED-urile din jurul televizorului.

Pasul 5: Calibrare Pasul II: LED-uri

Etapa II de calibrare: LED-uri
Etapa II de calibrare: LED-uri
Etapa II de calibrare: LED-uri
Etapa II de calibrare: LED-uri

Acum trebuie să spuneți software-ului unde se află LED-urile în jurul marginii televizorului. Veți vedea un ecran de calibrare care afișează patru săgeți, una dintre ele selectată (luminoasă) și trei dintre ele înnegrite, în jurul marginii televizorului. Folosiți +/- pentru a comuta pentru a schimba ce săgeată ajustați.

Pentru fiecare dintre cele patru săgeți din jurul marginii, faceți acest lucru:

  1. apăsați stânga / dreapta pe Wiimote pentru a muta săgețile până când acestea indică cât mai precis posibil către LED-ul corespunzător;
  2. apăsați sus / jos pe Wiimote pentru a modifica lungimea săgeții până când lungimea săgeții se potrivește cu distanța dintre LED și marginea afișajului TV; cu alte cuvinte, lungimea săgeții trebuie să fie egală cu distanța de la vârful săgeții la LED.

Odată ce cele patru săgeți sunt corecte (și poate chiar mai devreme), veți vedea o cruce roșie când îndreptați Wiimote către ecran. Puteți verifica dacă acesta ar trebui să fie. (Amintiți-vă că trebuie să fiți suficient de departe pentru ca Wiimote să poată vedea toate LED-urile. Este, de asemenea, important să nu existe alte surse de infraroșu în câmpul vizual. Odată am avut probleme din cauza luminii solare care se reflectă de la un cap de șurub pe Suport TV.)

În cele din urmă, există a cincea săgeată, care apare doar atunci când apăsați + din a patra săgeată LED sau - din prima (și implicit are o lungime zero, deci este doar un pixel). Această săgeată reglează cât de mult deasupra camerei telecomenzii Wii va fi înregistrată fotografia. Problema este următoarea: veți observa de-a lungul suprafeței superioare a telecomenzii Wii. Dar camera este de fapt situată la o anumită distanță sub acea suprafață, în mijlocul dreptunghiului negru din fața telecomenzii Wii. Dacă am înregistra fotografiile către care este îndreptată camera, acestea ar fi înregistrate la aproximativ 8 mm sub suprafața superioară a telecomenzii Wii. Puteți verifica acest lucru observând că, pe măsură ce vedeți de-a lungul suprafeței superioare, centrul părului încrucișat este ascuns de cameră.

Puteți trăi cu acest lucru sau puteți crește această a cincea săgeată pentru a alinia software-ul fotografiilor cu partea superioară a telecomenzii Wii sau puteți regla fișierele printabile 3D pentru obiectivele de fier pentru a compensa acest lucru (dar compensarea va funcționa numai pentru o distanță specială de televizor). M-am orientat eu pentru alinierea software-ului.

Apăsați HOME pe telecomanda Wii pentru a ieși din calibrare și a salva toate datele în directorul ~ /.wiilightgun.

Pasul 6: Testare și utilizare

Test și utilizare
Test și utilizare
Test și utilizare
Test și utilizare
Test și utilizare
Test și utilizare

Probabil că vrei să încerci arma ușoară acum. Rulați doar într-un emulator de terminal (sau un script):

python3 ~ / lightgun / lightgun.py -t

Va trebui să apăsați butoanele 1 + 2 în același timp și, după aceea, dacă totul merge bine, atâta timp cât lightgun.py rulează, lightgun va emula un mouse absolut cu două butoane. Butonul de declanșare este butonul mouse-ului 1, iar butonul A este butonul mouse-ului 2. Apăsați ctrl-c pentru a ieși.

Acum trebuie doar să vă configurați emulatoarele și / sau jocurile pentru a funcționa cu un mouse absolut. Din păcate, asta nu va fi întotdeauna atât de ușor.

Un lucru distractiv pe care l-ați putea încerca este modul meu de mișcare de rață-rață a lui Iminurnamez:

cd ~

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

Pentru jocurile NES, folosesc nucleul libretro fceumm în Retroarch. Accesați meniul Opțiuni și configurați Zapper pentru a fi un ecran tactil. (Configurarea acestuia ca mouse nu funcționează de fapt, deoarece fceumm așteaptă o mișcare relativă mai degrabă decât un mouse cu poziție absolută.)

Dacă începeți jocurile cu un script, puteți edita partea care pornește jocul sau emulatorul pentru a spune:

python3 ~ / lightgun / lightgun.py -t -B 30 "comanda pentru a începe jocul"

Apoi, în primele 30 de secunde de execuție a jocului (de unde și opțiunea -B 30), vă puteți conecta arma ușoară ținând apăsat 1 + 2.

Apropo, scriptul lightgun.py poate fi folosit și pentru jocurile generale Wii Remote cu Retroarch. Doar adăugați opțiunea -o și funcțiile pistolului ușor vor fi dezactivate și telecomanda Wii va funcționa orizontal, cele trei butoane fiind 1, 2 și respectiv B. Există alte funcții legate de Retroarch în mapările lightgun.py pe care le veți descoperi citind codul. De exemplu, tasta minus acționează ca o schimbare și, împreună cu dpad, controlează salvarea și încărcarea (sus / jos = schimbare număr salvare; stânga = restaurare; dreapta = salvare).

Pasul 7: Mânerul pistolului și țintirea

Mânerul pistolului și țintirea
Mânerul pistolului și țintirea
Mânerul pistolului și țintirea
Mânerul pistolului și țintirea
Mânerul pistolului și țintirea
Mânerul pistolului și țintirea

Puteți utiliza telecomanda Wii de la sine ca pistol, observând de-a lungul vârfului. De asemenea, puteți cumpăra una dintre carcasele comerciale pentru arme. Dar, deoarece telecomanda Wii originală nu era capabilă să fie folosită ca pistol vizibil, carcasele tind să nu vină cu obiective de fier, iar obiectivele de fier îmbunătățesc foarte mult acuratețea.

Am proiectat un sistem simplu de tipărit în trei părți 3D: un mâner glisant care stă chiar în spatele declanșatorului (deci arată un pic ca un fazer Star Trek Original Series) și obiective glisante. Fișierele tipărite sunt aici. Dacă doriți să economisiți pe plastic în detrimentul resturilor de lemn, puteți face și ceea ce am făcut și, în loc să imprimați întregul mâner, tipăriți doar partea care ține Wiimote și decupați o bucată de lemn și înșurubați-o.

Pentru vedere, concentrați-vă ochii asupra obiectivelor turistice. Aliniați denivelarea vederii din față între denivelările lunetei, astfel încât spațiul de aer de pe oricare dintre ele să fie egal și toate cele trei denivelări să iasă la fel de sus. Apoi aliniați mijlocul țintei cu partea superioară a denivelărilor.

Notă: Înălțimea umflăturilor este ușor inegală, umflătura vederii frontale fiind ușor mai mică, pentru a compensa înălțimea umflăturilor de vedere atunci când le priviți de-a lungul lor la o distanță de 2,5 metri (distanța mea față de televizor). Dacă aveți o distanță semnificativ diferită de televizor, o puteți introduce în fișierele OpenSCAD. Totuși, această ajustare poate fi sub toleranțele imprimantei. De asemenea, dacă nu ați făcut ajustarea verticală în software, puteți adăuga mai multe ajustări la obiectivele din software setând extraSightAdjust la ceva în jurul valorii de -8 (în milimetri).

Pasul 8: Calibrare III (Opțional): Reglare fină

Dacă doriți și mai multă precizie, puteți rula:

python3 ~ / lightgun / lightgun.py -d

(pentru demonstrație) și căutați cu atenție dacă obiectivele sunt aliniate cu părul încrucișat. Dacă nu, ieșiți și editați manual ~ /.wiilightgun / wiimotecalibration și modificați ușor coordonatele x și y ale centrului camerei pentru a regla vederea. De exemplu, arma mea trăgea ușor spre dreapta, așa că am ajuns să schimb coordonata x de la 529 la 525. Numerele tuturor vor fi probabil diferite.

Pasul 9: Anexă: algoritmul

Anexă: algoritmul
Anexă: algoritmul

Codul de emulare a mouse-ului funcționează aproximativ după cum urmează.

  • Apăsați butonul Procesare.
  • Obțineți date de la cameră și reglați pentru calibrarea centrării camerei.
  • Dacă mai puțin de trei LED-uri sunt vizibile în cameră:

    Păstrați ultima poziție a mouse-ului

  • Dacă sunt vizibile trei sau patru LED-uri:

    • Utilizați datele accelerometrului Wiimote pentru a obține orientarea Wiimote și pentru a identifica ce imagine a camerei LED corespunde cu ce LED fizic.
    • Dacă sunt vizibile patru LED-uri:

      • Calculați omografia între imaginile camerei LED și locațiile LED-ului (în coordonatele ecranului).
      • Folosiți omografia pentru a calcula ce locație a ecranului corespunde centrului câmpului vizual al camerei.
      • Efectuați reglarea în Y pentru a regla centrul barilului virtual al pistolului sub linia de vedere. Acesta este un algoritm oarecum slab, dar funcționează.
      • Setați poziția mouse-ului la locația ajustată a ecranului.
    • Dacă sunt vizibile trei LED-uri:

      • Utilizați OpenCV pentru a rezolva problema P3P dintre imaginile camerei LED și locațiile fizice ale LED-urilor. Acest lucru generează până la patru soluții.
      • Dacă aveți succes:

        • Dacă avem un calcul anterior al locației cu succes, alegeți soluția care face ca LED-ul lipsă să fie cel mai apropiat de ultima poziție observată sau calculată a acelui LED.
        • Dacă nu avem un calcul de locație anterior reușit, alegeți soluția care prezice cel mai bine direcția accelerometrului.
        • Folosiți cea mai bună soluție pentru a calcula unde ar trebui să meargă al patrulea LED.
        • Faceți restul ca în carcasa cu patru LED-uri.
      • Dacă nu are succes:

        Păstrați ultima poziție a mouse-ului

Recomandat: