Përmbajtje:

Armë e lehtë Wiimote Light për Raspberry PI: 9 hapa (me fotografi)
Armë e lehtë Wiimote Light për Raspberry PI: 9 hapa (me fotografi)

Video: Armë e lehtë Wiimote Light për Raspberry PI: 9 hapa (me fotografi)

Video: Armë e lehtë Wiimote Light për Raspberry PI: 9 hapa (me fotografi)
Video: CS50 2013 - Week 10, continued 2024, Korrik
Anonim
Armë e lehtë Wiimote Light për Ras Pberry
Armë e lehtë Wiimote Light për Ras Pberry
Armë e lehtë Wiimote Light për Ras Pberry
Armë e lehtë Wiimote Light për Ras Pberry

Normalisht, telekomanda Wii e përdorur si një armë e lehtë nuk është mjaft e saktë për lojëra retro si NES Duck Hunt, sepse telekomanda Wii në fakt nuk zgjedh pikën në televizorin ku është drejtuar. Nuk mundet! Telekomanda Wii ka një aparat infra të kuqe në pjesën e përparme që sheh vijën e LED -ve me rreze infra të kuqe në shiritin e sensorit, por nuk mund ta dijë sa larg (ose në çfarë drejtimi) është televizori nga shiriti ose sa i madh është TV. Emulatorët dhe lojërat funksionojnë rreth kësaj duke treguar flokë të kryqëzuar ose tregues të tjerë të shënjestrimit, por kjo nuk është një përvojë e saktë e gjuajtjes së objektivit.

Për ta bërë Wii Remote të funksionojë si një armë e lehtë e lehtë që mund të shihni së bashku për të zgjedhur një objektiv në një televizor, kërkohen katër LED me rreze infra të kuqe të rregulluara në një model të njohur katërkëndësh (jo një vijë e drejtë) në të njëjtin plan me televizorin. Telekomanda Wii më pas sheh katër LED dhe imazhi i kamerës mund të përdoret për të llogaritur një homografi që na lejon të kuptojmë se ku po tregon kamera.

Pajisja për këtë projekt është e thjeshtë. Ekzistojnë katër LED me rreze infra të kuqe në kuti të thjeshta të printuara 3D që mund të ngjiten në pjesën e sipërme dhe të poshtme të kutisë së televizorit dhe të futen në një karikues USB. Plus, në rast se nuk keni strehim armësh Wii, unë kam një dorezë të thjeshtë të printuar 3D dhe pamje që mund t'i lidhni me telekomandën Wii (megjithëse për të ruajtur plastikën, unë e kam bërë timen një hibrid midis drurit dhe plastikës të printuar 3D).

Softueri i bazuar në python ishte më i vështirë për tu bërë sesa hardueri dhe aktualisht është vetëm për Linux. Ajo kalibron LED -të dhe telekomandën Wii dhe më pas përdor llogaritjet e homografisë për të imituar një mi absolut që funksionon mjaft mirë në emulatorin NES të Retroarch's fceumm (dhe ndoshta disa emulues të tjerë) në Raspberry PI 3B+.

Furnizimet

  • Telekomanda Wii
  • Katër LED me rreze infra të kuqe 940nm 5 mm
  • Kabllo e vjetër USB me një prizë pune të tipit A.
  • Raspberry PI 3 ose kompjuter tjetër Linux me mbështetje Bluetooth
  • Printer 3D dhe filament (opsional)

Hapi 1: Zinxhiri LED me rreze infra të kuqe

Zinxhir LED me rreze infra të kuqe
Zinxhir LED me rreze infra të kuqe
Zinxhir LED me rreze infra të kuqe
Zinxhir LED me rreze infra të kuqe

Merrni një kabllo të vjetër USB me një prizë mashkulli të tipit A (zakonisht kabllot e karikimit të telefonit tim prishen në anën e mikro USB, kështu që kam kabllo të mbetur me një prizë mashkull të tipit A). Në fakt, është edhe në rregull nëse kabllot e të dhënave janë prishur për sa kohë që linjat e energjisë punojnë. Pritini skajin tjetër. Në teori kablloja e kuqe duhet të jetë +5V dhe e zeza duhet të jetë e tokëzuar, por kontrolloni atë me një multimetër (futeni në një karikues, dhe pastaj kontrolloni tensionin midis telave të kuq dhe të zi).

Meqenëse LED me rreze infra të kuqe kanë një rënie të tensionit prej 1.2-1.3V, unë sapo bashkova katër prej tyre në lak seri në kabllon USB. Sigurohuni që telat që lidhni të jenë mjaft të gjatë sa të vendosni LED në pjesën e poshtme të televizorit dhe dy në krye, me një hapësirë të mirë horizontale midis LED -ve (rreth 10 inç ose më shumë).

Më saktësisht për të bërë lakin LED:

  • lidhni anën minus (katodë, këmbë më të shkurtër, me buzë të sheshtë) të LED -it të parë te teli USB +5V
  • bashkoni anën plus të LED të parë (anodë, këmbë më e gjatë, me buzë të rrumbullakët) në anën minus të LED të dytë
  • përsërisni për t'u bashkuar me LED -in e dytë me të tretin dhe të tretin me të katërtin
  • pastaj lidhni anën plus të LED -it të katërt me një tel me tela USB të tokëzuar.

Për t'i bërë gjërat më të pastra, mund të përdorni tuba për zvogëlimin e nxehtësisë kur bëni lidhjet. Përndryshe, përdorni shirit elektrik për të shmangur pantallonat e shkurtra.

Sigurohuni që të mos keni qarqe të shkurtra. Pastaj lidheni atë në një ngarkues USB dhe kontrolloni që po lëshon dritë infra të kuqe duke parë LED -të me një aparat fotografik të telefonit. (Shumë kamera telefonike janë të ndjeshme ndaj rrezeve infra të kuqe.)

Hapi 2: Bashkojuni televizorit

Bashkangjitu në TV
Bashkangjitu në TV
Bashkangjitu në TV
Bashkangjitu në TV
Bashkangjitu në TV
Bashkangjitu në TV

Tani, bashkëngjitni dy LED në pjesën e poshtme të televizorit dhe dy në anën e sipërme. Hapësira horizontale duhet të jetë rreth dhjetë centimetra. Nëse është shumë, mund të keni probleme me fushën e shikimit të kamerës Wii Remote duke i kapur të gjitha. Por nëse ato janë shumë afër, atëherë intuita ime gjeometrike thotë se do të keni saktësi më të ulët.

Për testim, i ngjita LED -të me shirit elektrik, dhe më pas për një lidhje të përhershme, projektova dhe printova katër kapëse të vogla LED të rregullta (skedarët janë këtu) të cilat i ngjita me nxehtësi në televizor. Ju duhet të bëni që LED -të të jenë sa më afër rrafshit të ekranit të televizorit, pa e mbuluar ato me kornizë nga vendi ku do të xhironi.

Hapi 3: Instaloni Softuerin

Aktualisht softueri është vetëm për Linux. Konfigurimi i mëposhtëm është krijuar për Raspberry PI 3 me Raspbian Stretch. Sistemet e tjera Linux do të kërkojnë disa ndryshime. Në modelet e mëparshme do t'ju duhet një dongle Bluetooth dhe do t'ju duhet ta ekzekutoni atë edhe nga një linjë komande:

sudo get-apt instaloni bluetooth

Hapi A: udev

Tjetra, krijoni një skedar në /etc/udev/rules.d/wiimote.rules që përmban rreshtin e vetëm:

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

Ju mund ta bëni këtë, për shembull, me një redaktues teksti ose duke shtypur sa vijon në vijën e komandës:

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

Dhe pastaj rinisni udev:

sudo /etc/init.d/udev rinis

Hapi B: cwiid

Tjetra, do t'ju duhet paketa ime e modifikuar cwiid. Këtu bëhet pak me flokë pasi në mënyrë ideale do t'ju duhet ta ndërtoni atë në PI tuaj të Mjedrës, por më duhet të rrëfej se kam humbur gjurmët e asaj pakete që ju duhet të instaloni për ta bërë atë të funksionojë. Ekzistojnë tre mundësi për ta bërë këtë.

Opsioni B1: Ndërtoni veten

cd

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

Fatkeqësisht, ekziston një shans mjaft i mirë që të humbasësh një mori gjërash të nevojshme për ndërtimin e kësaj, dhe./konfigurimi do të ankohet. Ju mund të shikoni të gjitha gjërat për të cilat ankohet dhe të ekzekutoni sudo apt install në të gjitha ato.

Opsioni B2: Përdorni binarët e mi

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 bëj instalim

Hapi C: bibliotekat python

Më në fund, merrni gjëra mbështetëse për shkrimin tim python me armë të lehta:

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

Hapi D: lightgun.py

Më në fund, merrni shkrimin tim python të armës së lehtë:

cd

git klon

Nëse gjithçka ka shkuar mirë, tani keni ~/lightgun.py të cilën mund ta përdorni për të kalibruar armën e lehtë.

Hapi 4: Kalibrimi Pjesa I: Përqëndrimi i kamerës

Kalibrimi Pjesa I: Përqëndrimi i kamerës
Kalibrimi Pjesa I: Përqëndrimi i kamerës
Kalibrimi Pjesa I: Përqëndrimi i kamerës
Kalibrimi Pjesa I: Përqëndrimi i kamerës
Kalibrimi Pjesa I: Përqëndrimi i kamerës
Kalibrimi Pjesa I: Përqëndrimi i kamerës

Ka dy aspekte të kalibrimit. E para është të kalibroni qendrën e kamerës në çdo Wiimote. Kjo kërkon përdorimin e kamerës për të marrë dy imazhe të LED-ve rreth ekranit të televizorit tuaj, njëra me anën e djathtë të telekomandës lart dhe tjetra me të përmbysur.

Për të shmangur shtypjen e butonave kur vendosni telekomandën Wii në pjesën e përparme të saj, dhe në mënyrë që telekomanda Wii të ketë lartësi të qëndrueshme, mund të printoni 3D mjetin e kalibrimit që kam përfshirë këtu. Në thelb keni nevojë për gjëra që janë të trasha 10.5 mm që mund t'i vendosni nën telekomandën Wii kur shtrihet në pjesën e përparme të saj. Unë në fakt kam përdorur disa kompensatë për të kursyer në plastikë.

Ndizni LED -et tuaj dhe sigurohuni që Raspberry PI ose kompjuteri tjetër të shfaqet në televizor. Lidhni një tastierë (kjo nuk do të funksionojë mbi ssh) ose përdorni VNC. Pastaj vraponi:

python3 ~/lightgun/lightgun.py -M

Nëse gjithçka shkon mirë, do të merrni një ekran të plotë që ju kërkon të shtypni 1+2 në telekomandën Wii. Beje ate. Dritat do të ndizen në telekomandën Wii, dhe pastaj dritat 1 dhe 4 do të qëndrojnë të ndezura. Ju gjithashtu do të shihni një drejtkëndësh të vogël të gjelbër në krye të ekranit, me pamjen nga kamera Wii Remote. Drejtojeni telekomandën Wii në LED dhe nëse gjithçka shkon mirë, do të shihni katër LED, të numëruara nga 1 në 4.

Tani ju duhet të gjeni një sipërfaqe të fortë me një buzë të mprehtë, si një tavolinë kafeje, të cilën mund ta drejtoni në ekranin e televizorit dhe që mund të lejojë që telekomanda Wii të shohë të gjitha LED -të me telekomandën Wii të përafruar në buzë. Filloni duke e rreshtuar anën e djathtë të Wii Remote lart, me anën e telekomandës të përafruar me skajin e sipërfaqes, duke u siguruar që të shihen të katër LED. Pastaj shtypni SPACE në tastierën tuaj (ose bashkëngjitni një Nunchuck dhe shtypni C nëse është më i përshtatshëm). Atëherë do t'ju kërkohet të rrotulloni telekomandën Wii. Tani, sigurohuni që të jetë ngritur 10.5 mm nga sipërfaqja juaj, duke përdorur mjetin e kalibrimit ose diçka tjetër, dhe në të njëjtin vend me të njëjtin vend si më parë (p.sh., i rreshtuar në të njëjtën skaj të sipërfaqes tuaj). Shtypni përsëri SPACE.

Nëse gjithçka shkon mirë, tani do të shkoni në hapin e kalibrimit LED. Po, kjo është e ndërlikuar! Por ju do të keni një armë zjarri shumë të saktë. Ky është vetëm çmimi.

Shënim: Nëse si unë keni një Wii nën TV, Wii duhet të fiket për dy arsye: së pari, nëse Wii është i ndezur, ai do të lidhet me Wiimote dhe, së dyti, LED -të infra të kuqe të shiritit të sensorit do të ndërhyjnë me ky projekt. Për arsye të ngjashme, ndërsa përdorni Wii është një ide e mirë të shkëputni LED -të nga televizori.

Hapi 5: Kalibrimi Hapi II: LED

Kalibrimi Hapi II: LED
Kalibrimi Hapi II: LED
Kalibrimi Hapi II: LED
Kalibrimi Hapi II: LED

Tani ju duhet t'i tregoni softuerit se ku janë vendosur LED -të rreth buzës së televizorit. Do të shihni një ekran kalibrimi që tregon katër shigjeta, njëra prej tyre e zgjedhur (e ndritshme) dhe tre prej tyre të thinjura, buzë televizorit. Ju përdorni +/- për të kaluar për të ndryshuar shigjetën që po rregulloni.

Për secilën nga katër shigjetat rreth buzës, bëni këtë:

  1. shtypni majtas/djathtas në Wiimote për të lëvizur shigjetat derisa të tregojnë sa më saktë që të mundeni drejt LED përkatës;
  2. shtypni lart/poshtë në Wiimote për të ndryshuar gjatësinë e shigjetës derisa gjatësia e shigjetës të përputhet me distancën midis LED dhe buzës së ekranit të televizorit; me fjalë të tjera, gjatësia e shigjetës duhet të jetë e barabartë me distancën nga maja e shigjetës në LED.

Pasi katër shigjetat tuaja janë të sakta (dhe ndoshta edhe më herët) do të shihni një kryq të kuq kur drejtoni Wiimote në ekran. Ju mund të kontrolloni që kjo është ajo ku duhet të jetë. (Mos harroni se duhet të jeni mjaft larg që Wiimote të mund të shohë të gjitha LED -të. Alsoshtë gjithashtu e rëndësishme që të mos ketë burime të tjera të rrezeve infra të kuqe në fushën e shikimit. Unë dikur kisha probleme për shkak të dritës së diellit që reflektonte nga një kokë vidhe në Stenda televizive.)

Së fundi, ekziston një shigjetë e pestë, e cila shfaqet vetëm kur shtypni + nga shigjeta e katërt LED ose - nga e para (dhe si parazgjedhje ka gjatësi zero, kështu që është vetëm një piksel). Ky shigjetë rregullon se sa mbi kamerën e telekomandës Wii do të regjistrohet shkrepja. Çështja është kjo: ju do të shihni përgjatë sipërfaqes së sipërme të telekomandës Wii. Por kamera është në të vërtetë e vendosur pak larg nën atë sipërfaqe, në mes të drejtkëndëshit të zi në pjesën e përparme të telekomandës Wii. Nëse i regjistrojmë fotografitë ku kamera tregon, ato do të regjistroheshin rreth 8 mm nën sipërfaqen e sipërme të telekomandës Wii. Ju mund ta kontrolloni këtë duke vënë në dukje se ndërsa shihni përgjatë sipërfaqes së sipërme, qendra e flokëve të kryqëzuar fshihet nga kamera.

Ju mund të jetoni me këtë, ose mund ta rritni këtë shigjetë të pestë për të përafruar softuerin me pjesën e sipërme të telekomandës Wii, ose mund të rregulloni skedarët 3D të printueshëm për pamjet prej hekuri për ta kompensuar këtë (por kompensimi do të funksionojë vetëm për një distancë të veçantë me televizorin). Unë vetë shkova për shtrirjen e softuerit.

Shtypni HOME në telekomandën Wii për të dalë nga kalibrimi dhe për të ruajtur të gjitha të dhënat në drejtorinë ~/.wiilightgun.

Hapi 6: Provoni dhe përdorni

Testoni dhe Përdorni
Testoni dhe Përdorni
Testoni dhe Përdorni
Testoni dhe Përdorni
Testoni dhe Përdorni
Testoni dhe Përdorni

Ju ndoshta dëshironi të provoni armën tuaj të lehtë tani. Thjesht ekzekutoni në një emulator terminal (ose një skenar):

python3 ~/lightgun/lightgun.py -t

Ju do të duhet të shtypni butonat 1+2 në të njëjtën kohë, dhe pas kësaj nëse gjithçka shkon mirë, për sa kohë që lightgun.py po funksionon, arma e lehtë do të imitojë një miun absolut me dy butona. Butoni i shkaktimit është butoni i miut 1, dhe butoni A është butoni i miut 2. Shtypni ctrl-c për të dalë.

Tani ju duhet vetëm të konfiguroni emulatorët dhe/ose lojërat tuaj për të punuar me një mouse absolut. Fatkeqësisht, kjo nuk do të jetë gjithmonë aq e lehtë.

Një gjë argëtuese që mund të provoni është mënyra ime e gjuajtjes së rosës së iminurnamez:

cd

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

Për lojërat NES, unë përdor thelbin libretro fceumm në Retroarch. Shkoni te menyja Opsionet dhe konfiguroni Zapper që të jetë një ekran me prekje. (Konfigurimi i tij si miu në të vërtetë nuk funksionon, pasi fceumm pret një mi me lëvizje relative dhe jo me pozitë absolute.)

Nëse filloni lojërat tuaja me një skenar, mund të redaktoni pjesën që fillon lojën ose emulatorin për të thënë:

python3 ~/lightgun/lightgun.py -t -B 30 "komanda për të filluar lojën"

Pastaj gjatë 30 sekondave të para të ekzekutimit të lojës (pra opsioni -B 30), mund të lidhni armën tuaj të lehtë duke mbajtur shtypur 1+2.

Nga rruga, skenari lightgun.py mund të përdoret gjithashtu për lojëra të përgjithshme Wii Remote me Retroarch. Thjesht shtoni opsionin -o dhe funksionet e armës së lehtë do të fiken, dhe në vend të kësaj telekomanda Wii do të punojë horizontalisht, me tre butonat përkatësisht 1, 2 dhe B. Ekzistojnë funksione të tjera të lidhura me Retroarch në hartat e lightgun.py të cilat do t'i zbuloni duke lexuar kodin. Për shembull, butoni minus vepron si një zhvendosje, dhe së bashku me dpad kontrollon ruajtjen dhe ngarkimin (lart/poshtë = ndrysho numrin e ruajtjes; majtas = rivendos; djathtas = ruaj).

Hapi 7: Trajtimi dhe synimi i armës

Trajtimi dhe synimi i armëve
Trajtimi dhe synimi i armëve
Trajtimi dhe synimi i armëve
Trajtimi dhe synimi i armëve
Trajtimi dhe synimi i armëve
Trajtimi dhe synimi i armëve

Mund ta përdorni telekomandën Wii në vetvete si armë, duke parë përgjatë pjesës së sipërme. Ju gjithashtu mund të blini një nga gëzhojat komerciale të armëve për të. Por për shkak se telekomanda origjinale Wii nuk ishte në gjendje të përdorej si një armë e dukshme, veshjet nuk priren të vijnë me pamje hekuri, dhe pamjet prej hekuri përmirësojnë shumë saktësinë.

Unë projektova një sistem të thjeshtë me tre pjesë të printueshëm 3D: një dorezë rrëshqitëse që qëndron prapa këmbëzës (kështu që duket pak si një fazer i serisë origjinale Star Trek), dhe pamje rrëshqitëse. Skedarët e printueshëm janë këtu. Nëse doni të kurseni në plastikë në kurriz të mbeturinave të drurit, ju gjithashtu mund të bëni atë që bëra unë dhe në vend që të printoni të gjithë dorezën, printoni vetëm pjesën që mban Wiimote, dhe prerë një copë druri dhe vidhoseni.

Për të parë, përqendroni sytë në pamjet. Rreshtoni përplasjen e pamjes së përparme midis gungave të pamjes së pasme në mënyrë që hapësira e ajrit në secilën prej tyre të jetë e barabartë dhe të tre gunga të dalin njësoj të larta. Pastaj rreshtoni mesin e objektivit me pjesën e sipërme të gungave.

Shënim: Lartësia e gungave është paksa e pabarabartë, me përplasjen e pamjes së përparme që është pak më e ulët, në mënyrë që të kompensojë vetë lartësinë e gungave të shikimit kur i shihni përgjatë tyre në një distancë prej 2.5 metrash (distanca ime me TV). Nëse keni një distancë shumë të ndryshme nga TV, mund ta vendosni në skedarët OpenSCAD. Sidoqoftë, ky rregullim mund të jetë nën tolerancat e printerit. Gjithashtu, nëse nuk keni bërë rregullimin vertikal në softuer, mund të shtoni disa rregullime të tjera në pamjet në softuer duke vendosur ekstraSightAdjust në diçka rreth -8 (në milimetra).

Hapi 8: Kalibrimi III (Opsional): Rregullim i mirë

Nëse doni edhe më shumë saktësi, mund të ekzekutoni:

python3 ~/lightgun/lightgun.py -d

(për demonstrim) dhe shikoni me kujdes nëse pamjet përputhen me flokët e kryqëzuar. Nëse nuk e bëjnë këtë, dilni dhe redaktoni manualisht ~/.wiilightgun/wiimotecalibration dhe ndryshoni pak koordinatat x dhe y të qendrës së kamerës për të rregulluar shikimin. Për shembull, arma ime po gjuante pak në të djathtë, kështu që përfundova duke ndryshuar koordinatën x nga 529 në 525. Numrat e të gjithëve ndoshta do të jenë të ndryshëm.

Hapi 9: Shtojca: Algoritmi

Shtojca: Algoritmi
Shtojca: Algoritmi

Kodi i emulimit të miut funksionon përafërsisht si më poshtë.

  • Shtypjet e butonit të procesit.
  • Merrni të dhëna nga kamera dhe rregulloni për kalibrimin në qendër të kamerës.
  • Nëse më pak se tre LED janë të dukshme në kamera:

    Mbani pozicionin e fundit të miut

  • Nëse tre ose katër LED janë të dukshëm:

    • Përdorni të dhënat e përshpejtuesit Wiimote për të marrë orientimin Wiimote dhe identifikoni se cili imazh LED i kamerës i përgjigjet cilit LED fizik.
    • Nëse janë të dukshme katër LED:

      • Llogaritni homografinë midis imazheve të kamerës LED dhe vendndodhjeve LED (në koordinatat e ekranit).
      • Përdorni homografinë për të llogaritur se cila vendndodhje e ekranit korrespondon me qendrën e fushës së shikimit të kamerës.
      • Bëni rregullimin Y për të rregulluar qendrën e tytës virtuale të armës nën vijën e shikimit. Ky është një algoritëm disi kludgy, por funksionon.
      • Vendoseni pozicionin e miut në vendndodhjen e rregulluar të ekranit.
    • Nëse tre LED janë të dukshëm:

      • Përdorni OpenCV për të zgjidhur problemin P3P midis imazheve të kamerës LED dhe vendndodhjeve fizike të LED. Kjo gjeneron deri në katër zgjidhje.
      • Nëse ka sukses:

        • Nëse kemi një llogaritje të mëparshme të suksesshme të vendndodhjes, zgjidhni zgjidhjen që e bën LED -në që mungon të jetë më afër pozicionit të fundit të vëzhguar ose të llogaritur të atij LED.
        • Nëse nuk kemi një llogaritje të mëparshme të suksesshme të vendndodhjes, zgjidhni zgjidhjen që parashikon më së miri titullin e akselerometrit.
        • Përdorni zgjidhjen më të mirë për të llogaritur se ku duhet të shkojë LED i katërt.
        • Bëni pjesën tjetër si në rastin e katër LED.
      • Nëse nuk ka sukses:

        Mbani pozicionin e fundit të miut

Recommended: