Raspberry PI үчүн так Wiimote Light Gun: 9 кадам (Сүрөттөр менен)
Raspberry PI үчүн так Wiimote Light Gun: 9 кадам (Сүрөттөр менен)
Anonim
Raspberry PI үчүн так Wiimote Light Gun
Raspberry PI үчүн так Wiimote Light Gun
Raspberry PI үчүн так Wiimote Light Gun
Raspberry PI үчүн так Wiimote Light Gun

Адатта, жеңил курал катары колдонулган Wii пульту NES Duck Hunt сыяктуу ретро оюндар үчүн жетиштүү так эмес, анткени Wii Remote чындыгында көрсөтүлгөн телеканалдагы чекитти тандабайт. Бул мүмкүн эмес! Wii Remote алдында сенсор тилкесиндеги инфракызыл диоддордун линиясын көргөн инфракызыл камера бар, бирок ал телевизор тилкеден канчалык алыс (же кайсы багытта) экенин же телевизор канчалык чоң экенин биле албайт. Эмуляторлор жана оюндар тегеректелген чачтарды же башка индикаторду көрсөтүү менен иштейт, бирок бул так бутага атуу тажрыйбасы эмес.

Телевизордо бута тандоо үчүн көрө турган Wii Remote так мылтык катары иштеши үчүн телевизор менен бир тегиздикте белгилүү төрт бурчтуу түрдө (түз сызыкта эмес) жайгаштырылган төрт инфракызыл диод керек. Wii Remote андан кийин төрт светодиодду көрөт жана камеранын сүрөтү гомографияны эсептөө үчүн колдонулушу мүмкүн, ал камера кайда көрсөтүп жатканын аныктоого мүмкүндүк берет.

Бул долбоордун жабдыктары жөнөкөй. 3D басылган жөнөкөй корпустарда төрт инфракызыл диод бар, аларды телевизор корпусунун үстү жана астына жабыштырып, USB кубаттагычка туташтырууга болот. Мындан тышкары, эгерде сизде Wii тапанчасы жок болсо, менде жөнөкөй 3D басып чыгарылган туткасы жана Wii пультуна туташтыра турган кооз жерлери бар (пластикти үнөмдөө үчүн, мен өзүмдү жыгач менен 3D басылган пластмассанын ортосундагы гибрид кылдым).

Питонго негизделген программалык камсыздоону жабдууларга караганда жасоо кыйын болгон жана учурда Linux гана иштейт. Бул диоддорду жана Wii Remote калибрлейт, андан кийин менин Raspberry PI 3B+боюнча Retroarch's fceumm NES эмуляторунда (жана, балким, башка эмуляторлордо) жакшы иштеген абсолюттук чычканды тууроо үчүн гомографиялык эсептөөлөрдү колдонот.

Жабдуулар

  • Wii Remote
  • Төрт 940нм 5мм инфракызыл диоддор
  • А типтүү штепсели бар эски USB кабели
  • Bluetooth колдоосу менен Raspberry PI 3 же башка Linux компьютери
  • 3D принтер жана жип (милдеттүү эмес)

1 -кадам: Infrared LED чынжыры

Infrared LED чынжыры
Infrared LED чынжыры
Infrared LED чынжыры
Infrared LED чынжыры

Эркек розеткасы бар эски USB кабелин алыңыз (көбүнчө менин телефонумдун кубаттоочу кабелдери микро USB учунда үзүлөт, ошондуктан менде А типтеги эркек розеткасы бар калган кабелдер бар).. Чынында, эгер маалымат кабели болсо электр линиялары иштеп турганда үзүлгөн. Экинчи башын кесип. Теориялык жактан алганда, кызыл кабель +5V, ал эми кара жер болушу керек, бирок аны мультиметр менен текшериңиз (заряддагычка сайыңыз, андан кийин кызыл жана кара зымдардын ортосундагы чыңалууну текшериңиз).

Инфракызыл диоддор 1.2-1.3V чыңалуусунун тегерегине ээ болгондуктан, мен алардын төртөөнү USB кабелине бир катар цикл менен ширеттим. Сиз ширеткен зымдар жетишерлик узун экенине көзүңүз жетсин, ошондо сиз LEDди телевизордун астына, экөөнү үстү жагына коюңуз, LEDлердин ортосундагы горизонталдуу боштук (болжол менен 10 дюйм).

Тагыраак айтканда, LED укуругун жасоо үчүн:

  • биринчи LEDдын минус тарабын (катод, кыска буту, жалпак чети менен) +5V USB зымына ширетүү
  • биринчи светодиоддун оң жагына кошулуңуз (анод, узун буту, тегерек кыры менен) экинчи LEDдин минус тарабына
  • экинчи LEDди үчүнчүгө жана үчүнчүдөн төртүнчүгө кошуу үчүн кайталаңыз
  • анда төртүнчү LEDдин плюс жагын зым менен жерге USB зымына туташтырыңыз.

Нерселерди тыкан кылуу үчүн, туташтырганда жылуулукту кысуучу түтүктү колдонсоңуз болот. Болбосо, шорты болбош үчүн электр лентасын колдонуңуз.

Кыска туташууңуз жок экенин текшериңиз. Андан кийин аны USB кубаттагычка туташтырып, телефондун камерасы менен светодиоддорго карап, инфракызыл нур чыгарарын текшериңиз. (Көптөгөн телефон камералары инфракызыл сезгич.)

2 -кадам: Телевизорго тиркөө

Телевизорго тиркөө
Телевизорго тиркөө
Телевизорго тиркөө
Телевизорго тиркөө
Телевизорго тиркөө
Телевизорго тиркөө

Эми, эки LEDди телевизордун астына, экөөнү үстү жагына тиркеңиз. Горизонталдык аралык болжол менен он дюйм болушу керек. Эгерде бул өтө эле көп болсо, анда Wii Remote камерасынын көрүү талаасында алардын бардыгын тартып алуу менен көйгөйлөр жаралышы мүмкүн. Бирок эгер алар өтө жакын болсо, анда менин геометриялык туюмума караганда, сизде тактык төмөн болот.

Сыноо үчүн, мен светодиоддорду лента менен, анан туруктуу туташуу үчүн, сыналгыга ысык чаптаган төрт тыкан кичинекей LED клиптерди (файлдар ушул жерде) иштеп чыктым жана басып чыгардым. Сиз светодиоддорду телевизордун дисплейинин тегиздигине мүмкүн болушунча жакыныраак кылышыңыз керек, аларды чырак сиз тарткан жерден тоспойт.

3 -кадам: Программаны орнотуу

Учурда программа Linux үчүн гана. Төмөнкү орнотуу Raspbian Stretch менен Raspberry PI 3 үчүн иштелип чыккан. Башка Linux системалары кээ бир өзгөртүүлөрдү талап кылат. Мурунку моделдерде сизге Bluetooth ключогу керек болот жана муну командалык саптан иштетүү керек болот:

sudo get-apt bluetooth орнотуу

А кадам: udev

Андан кийин, /etc/udev/rules.d/wiimote.rules файлын түзүңүз, ал бир сапты камтыйт:

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

Сиз муну, мисалы, текст редактору менен же буйрук сабында төмөнкүлөрдү терүү менен жасай аласыз:

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

Анан udev кайра:

sudo /etc/init.d/udev өчүрүп күйгүзүү

B кадамы: cwiid

Кийинки, сизге менин өзгөртүлгөн cwiid пакетим керек болот. Бул жерде бир аз түктүү болуп калат, идеалдуу түрдө сиз аны Raspberry PIге курушуңуз керек болчу, бирок мен анын иштеши үчүн кандай пакеттерди орнотушуңуз керектигин унутуп койгонумду моюнга алам. Бул үчүн үч вариант бар.

В1 варианты: Өзүңүздү куруңуз

cd ~

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

Тилекке каршы, муну куруу үчүн керектүү нерселерди жоготуп алууңуз үчүн абдан жакшы мүмкүнчүлүк бар жана./configure нааразы болот. Сиз нааразы болгон нерселердин бардыгын карап, баарына sudo apt install орното аласыз.

Вариант B2: Менин экилик файлдарымды колдонуңуз

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 install

C кадамы: python китепканалары

Акырында, менин lightgun python сценарийим үчүн колдоо нерселерди алыңыз:

sudo pip3 uinput numpy pygame opencv-python орнотуңуз

Sudo apt-get libatlas-base-dev орнотуу libojasper-dev sudo apt-get орнотуу libqtgui4 sudo apt-get install python3-pyqt5

Step D: lightgun.py

Акыр -аягы, менин жарык питон сценарийимди алыңыз:

cd ~

git clone

Эгерде баары ойдогудай болсо, анда сизде тапанчаны калибрлөө үчүн колдоно турган ~/lightgun.py бар.

4 -кадам: Калибрлөө I -бөлүк: Камераны борборлоштуруу

Калибрлөө 1 -бөлүк: Камераны борборлоштуруу
Калибрлөө 1 -бөлүк: Камераны борборлоштуруу
Калибрлөө 1 -бөлүк: Камераны борборлоштуруу
Калибрлөө 1 -бөлүк: Камераны борборлоштуруу
Калибрлөө 1 -бөлүк: Камераны борборлоштуруу
Калибрлөө 1 -бөлүк: Камераны борборлоштуруу

Калибрлөөнүн эки аспектиси бар. Биринчиси, ар бир Wiimoteте камеранын ортосун калибрлөө. Бул үчүн ТВ экраныңыздын айланасындагы LED диоддорунун эки сүрөтүн тартуу үчүн камераны колдонуу керек, бири алыскы оң жакта, экинчиси тескери.

Wii пультун алдыңкы бетине коюп жатканда, баскычтарды басуудан сактануу үчүн жана Wii Remote ырааттуу бийиктикке ээ болуу үчүн, мен киргизген калибрлөө куралын 3D басып чыгара аласыз. Сизге негизинен калыңдыгы 10,5 мм болгон нерселер керек, аны Wii Remote алдына коюп койсоңуз болот. Мен чындыгында пластикти үнөмдөө үчүн фанеранын сыныктарын колдондум.

Жарык диоддоруңузду күйгүзүңүз жана Raspberry PI же башка компьютериңиз сыналгыда көрсөтүлүп жаткандыгын текшериңиз. Баскычтопту туташтырыңыз (бул sshте иштебейт) же VNCди колдонуңуз. Андан кийин чуркаңыз:

python3 ~/жарык мылтык/светильник.py -M

Эгер баары ойдогудай болсо, Wii Remote'де 1+2 басууңузду суранган толук экранды аласыз. Муну кыл. Жарыктар Wii пультунда жаркырайт, андан кийин 1 жана 4 жарыктары күйүп калат. Ошондой эле экрандын жогору жагында кичинекей жашыл тик бурчтукту көрөсүз, Wii Remote камерасынан. Wii пультун LEDга буруңуз, эгер баары ойдогудай болсо, анда 1ден 4кө чейинки төрт LEDди көрөсүз.

Эми сиз сыналгы экранына көрсөтө турган жана кофе столу сыяктуу курч кыры бар катуу бетти табышыңыз керек жана Wii Remote Wii Remote менен бардык LED диапазонунун четине тизилгенин көрүүгө мүмкүндүк берет. Баштоо үчүн Wii Remote оң жагын өйдө караңыз, алыстан башкаруунун тарабы үстүнкү четине карама -каршы коюлуп, төрт LED тең көрүнүп турганын текшериңиз. Андан кийин клавиатураңыздагы боштукту басыңыз (же ыңгайлуу болсо Nunchuck тиркеп, C баскычын басыңыз). Андан кийин Wii Remoteты айлантуу сунушталат. Эми, ал калибрлөө куралын же башка нерсени колдонуп, бетиңизден 10,5 мм өйдө көтөрүлгөнүн жана мурунку эле жерге жакын жайгашканын текшериңиз (мис., Бетиңиздин бир четине каршы тегизделген). Кайра боштукту басыңыз.

Эгер баары ойдогудай болсо, сиз азыр LED калибрлөө кадамына өтөсүз. Ооба, бул татаал! Бирок сизде абдан так мылтык болот. Бул жөн гана баа.

Эскертүү: Эгерде мен сыяктуу сизде сыналгынын астында Wii болсо, Wii эки себептен улам өчүрүлүшү керек: биринчиден, эгер Wii күйүк болсо, ал Wiimote менен туташат, экинчиден, сенсор тилкесинин инфракызыл диоддору тоскоолдук кылат. бул долбоор. Ушуга окшош себептерден улам, сиз Wii колдонуп жатканда, сыналгынын айланасындагы LEDди ажыратуу жакшы.

5 -кадам: Калибрлөө 2 -кадам: Светодиоддор

Калибрлөө кадамы II: LED
Калибрлөө кадамы II: LED
Калибрлөө кадамы II: LED
Калибрлөө кадамы II: LED

Эми сиз ТВнын четинде LEDлер кайда жайгашканын программалык камсыздоого айтышыңыз керек. Сиз калибрлөө экранын көрөсүз, төрт жебе, алардын бири тандалган (жарык) жана үчөө боз болуп, сыналгынын четинде. Сиз жөнгө салып жаткан жебени өзгөртүүгө өтүү үчүн +/- колдонуңуз.

Четтеги төрт жебенин ар бири үчүн муну кылыңыз:

  1. Wiimote'тогу солго/оңго басып, жебелерди тиешелүү LEDди карай мүмкүн болушунча так көрсөткөнгө чейин жылдыруу;
  2. жебенин узундугу LED менен ТВ дисплейинин четине чейинки аралыкка дал келгенге чейин жебенин узундугун өзгөртүү үчүн Wiimoteту өйдө/ылдый басыңыз; башкача айтканда, жебенин узундугу жебенин учу менен светодиодго чейинки аралыкка барабар болушу керек.

Төрт жебеңиз туура болгондон кийин (жана, балким, эртерээк дагы), сиз Wiimote'ду экранда көрсөткөнүңүздө, кызыл кайчылашты көрөсүз. Сиз бул жерде болушу керек экенин текшере аласыз. (Эсиңизде болсун, Wiimote бардык светодиоддорду көрө алгыдай алыс болушуңуз керек. Көрүү талаасында инфракызылдын башка булактары болбошу да маанилүү. Күн нурунун кесепетинен бурама баштын чагылышын чагылдырып койгом. Телевизор.)

Акырында, бешинчи жебе бар, ал төртүнчү LED жебесинен + басканда гана көрүнөт же - биринчиден (жана анын демейки боюнча нөлдүк узундугу бар, демек бул жөн эле пиксель). Бул жебе Wii Remote камерасынын канчалык жогору тартылганын каттайт. Маселе мындай: сиз Wii Remote'тун үстүңкү бетин көрө аласыз. Бирок камера чындыгында Wii алыстан башкаруусунун алдындагы кара тик бурчтуктун ортосунда, ошол беттин ылдый жагында жайгашкан. Эгерде биз камера көрсөтүп жаткан кадрларды каттаган болсок, алар Wii Remote'дун үстүңкү бетинен 8 ммдей төмөндө катталмак. Сиз муну текшере аласыз, үстүңкү бетин көргөндө, кайчылаш түктөрдүн борбору камера менен жашырылган.

Сиз ушуну менен жашасаңыз болот, же сиз бешинчи жебени чоңойтуп, Wii Remote чокусунун үстүнө кадрларды тегиздей аласыз, же 3D үчүн басып чыгарылган файлдарды темир көрүнүштөр үчүн туураласаңыз болот (бирок компенсация бул үчүн гана иштейт) сыналгыдан белгилүү бир аралык). Мен программалык камсыздоону тууралоого өзүм бардым.

Калибрлөөдөн чыгуу жана ~/.wiilightgun каталогуна бардык маалыматтарды сактоо үчүн Wii Remote'тогу HOME баскычын басыңыз.

6 -кадам: Сыноо жана колдонуу

Сыноо жана колдонуу
Сыноо жана колдонуу
Сыноо жана колдонуу
Сыноо жана колдонуу
Сыноо жана колдонуу
Сыноо жана колдонуу

Сиз, балким, азыр мылтыгыңызды сынап көргүңүз келет. Жөн эле терминал эмуляторунда (же скриптте) иштетиңиз:

python3 ~/жарык мылтык/снаряд.py -t

Сиз 1+2 баскычтарын бир убакта басышыңыз керек болот, андан кийин баары ойдогудай болсо, lightgun.py иштеп турганда, мылтык эки баскычтуу абсолюттук чычканды туурайт. Триггер баскычы чычкан 1 баскычы, ал эми А баскычы 2 баскыч. Чыгуу үчүн ctrl-c баскычын басыңыз.

Эми абсолюттук чычкан менен иштөө үчүн эмуляторлорду жана/же оюндарды конфигурациялоо керек. Тилекке каршы, бул дайыма эле оңой боло бербейт.

Сиз аракет кыла турган бир кызыктуу нерсе-бул менин iminurnamezдин өрдөк-өрдөк атуусу:

cd ~

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

NES оюндары үчүн мен Retroarchтагы libretro fceumm өзөгүн колдоном. Жолдор менюсуна өтүп, Zapperди сенсордук экран кылып конфигурациялаңыз. (Чычкан катары конфигурациялоо чындыгында иштебейт, анткени fceumm абсолюттук позициялык чычкандын ордуна салыштырмалуу кыймылды күтөт.)

Эгерде сиз оюнуңузду сценарий менен баштасаңыз, анда оюнду же эмуляторду баштай турган бөлүктү түзөтө аласыз:

python3 ~/lightgun/lightgun.py -t -B 30 "оюнду баштоо буйругу"

Андан кийин оюндун аткарылышынын алгачкы 30 секундунда (демек -B 30 варианты), сиз 1+2 басып кармап, мылтыгыңызды туташтыра аласыз.

Баса, lightgun.py скрипти Retroarch менен жалпы Wii Remote оюндары үчүн да колдонулушу мүмкүн. Жөн гана -o опциясын кошсоңуз, мылтыктын функциялары өчүрүлөт, анын ордуна Wii Remote горизонталдуу түрдө иштейт, үч баскыч тиешелүү түрдө 1, 2 жана В болот. Lightgun.py'дин карталарында Retroarch менен байланышкан башка функциялар бар, аларды кодду окуу менен ачасыз. Мисалы, минус баскыч жылышуу милдетин аткарат жана dpad менен бирге үнөмдөөнү жана жүктөөнү көзөмөлдөйт (өйдө/ылдый = өзгөртүү номерин; сол = калыбына келтирүү; оң = сактоо).

7 -кадам: Мылтыкты кармоо жана көздөө

Мылтыкты кармоо жана максат кылуу
Мылтыкты кармоо жана максат кылуу
Мылтыкты кармоо жана максат кылуу
Мылтыкты кармоо жана максат кылуу
Мылтыкты кармоо жана максат кылуу
Мылтыкты кармоо жана максат кылуу

Сиз Wii Remoteту курал катары колдонуп, үстүн карай карай аласыз. Сиз ошондой эле ал үчүн соода куралынын корпусун сатып алсаңыз болот. Бирок баштапкы Wii пульту көрүнүктүү курал катары колдонууга жөндөмдүү болбогондуктан, корпустары темир көрүнүштөр менен келбейт жана темир көрүнүштөр тактыкты жакшыртат.

Мен үч бөлүктөн турган 3D басып чыгаруучу жөнөкөй системаны иштеп чыктым: триггердин артында жайгашкан слайд туткасы (андыктан Star Trek Original Series фазасына окшош) жана слайддын кооз жерлери. Басып чыгарылуучу файлдар бул жерде. Эгерде сиз пластикти отундун эсебинен үнөмдөөнү кааласаңыз, анда мен кылганды кыла аласыз жана туткасын бүт басып чыгаруунун ордуна, Wiimote кармаган бөлүгүн басып чыгарып, жыгач бөлүгүн кесип, бурап койсоңуз болот.

Көрүү үчүн, көзүңүздү кооз жерлерге буруңуз. Алдыңкы көрүнүштүн арткы бөртмөлөрүнүн ортосуна тегиздеңиз, ошондо экөөнүн тең аба мейкиндиги бирдей болуп, үч бүдүр тең бирдей бийик болуп чыгат. Андан кийин бутанын ортосун тегиздиктердин чокусуна тууралаңыз.

Эскертүү: Дөңгөлөктөрдүн бийиктиги бир аз тең эмес, алдыңкы көздүн шишиги бир аз ылдыйыраак болгондуктан, аларды 2,5 метр аралыкта көргөндө, өзүлөрүнүн бийиктигинин ордун толтуруу үчүн (менин телевизорго чейинки аралык). Эгер сизде сыналгыдан такыр башка аралык болсо, аны OpenSCAD файлдарына коюңуз. Бул тууралоо принтердин толеранттуулугунан төмөн болушу мүмкүн. Ошондой эле, эгер сиз программалык камсыздоонун вертикалдык тууралоосун жасабасаңыз, анда -8 (миллиметрде) тегерегиндеги бир нерсеге extraSightAdjust орнотуу менен, программалык камсыздоонун кооз жерлерине дагы бир жөндөөнү кошо аласыз.

8 -кадам: Калибрлөө III (Милдеттүү эмес): Туура тууралоо

Эгерде сиз дагы тактыкты кааласаңыз, анда иштете аласыз:

python3 ~/жарык мылтык/светильник.py -d

(демо үчүн) жана кооз чачтар менен кооз жерлердин дал келерин кылдаттык менен караңыз. Эгерде алар андай кылбаса, чыгып, кол менен ~/.wiilightgun/wiimotecalibration түзөтүп, камеранын борборунун x жана y координаттарын бир аз көрүүнү тууралаңыз. Мисалы, менин мылтыгым бир аз оңго карай атылып жаткандыктан, мен 529дан 525ке чейин х координатын алмаштырып бүттүм.

9 -кадам: Тиркеме: Алгоритм

Тиркеме: Алгоритм
Тиркеме: Алгоритм

Чычканды эмуляциялоо коду болжол менен төмөнкүдөй иштейт.

  • Процесс баскычы басылат.
  • Камерадан маалыматтарды алыңыз жана камераны борборлоштуруу калибрлөө үчүн тууралаңыз.
  • Эгерде камерада үчтөн аз светодиод көрүнсө:

    Чычкандын акыркы абалын сактаңыз

  • Эгерде үч же төрт LED көрүнсө:

    • Wiimote акселерометринин маалыматын колдонуп, Wiimote багытын алыңыз жана кайсы LED камеранын сүрөтү физикалык LEDга туура келерин аныктаңыз.
    • Эгерде төрт LED көрүнсө:

      • LED камерасынын сүрөттөрү менен LED жайгашкан жерлердин ортосундагы гомографияны эсептөө (экран координаттарында).
      • Экрандын жайгашкан жери камеранын көрүү талаасынын борборуна туура келерин эсептөө үчүн гомографияны колдонуңуз.
      • Виртуалдык мылтыктын баррелинин борборун көздүн чегинен ылдый тууралоо үчүн Y-тууралоону жасаңыз. Бул кичине алгоритм, бирок ал иштейт.
      • Чычкандын абалын туураланган экранга коюңуз.
    • Эгерде үч LED көрүнсө:

      • LED камера сүрөттөрү менен физикалык LED жерлеринин ортосундагы P3P көйгөйүн чечүү үчүн OpenCV колдонуңуз. Бул төрткө чейин чечим чыгарат.
      • Эгер ийгиликтүү болсо:

        • Эгерде бизде мурунку ийгиликтүү жайгашкан жерди эсептөө болсо, анда жок болгон LEDди ошол диоддун акыркы байкалган же эсептелген абалына эң жакын кылган чечимди тандаңыз.
        • Эгерде бизде мурунку ийгиликтүү жайгашкан жерди эсептөө жок болсо, акселерометрдин аталышын эң жакшы болжолдогон чечимди тандаңыз.
        • Төртүнчү LED кайда кетиши керек экенин эсептөө үчүн эң жакшы чечимди колдонуңуз.
        • Калганын төрт LED корпусундагыдай кылыңыз.
      • Эгер ийгиликтүү болбосо:

        Чычкандын акыркы абалын сактаңыз

Сунушталууда: