Съдържание:

Точен светлинен пистолет Wiimote за Raspberry PI: 9 стъпки (със снимки)
Точен светлинен пистолет Wiimote за Raspberry PI: 9 стъпки (със снимки)

Видео: Точен светлинен пистолет Wiimote за Raspberry PI: 9 стъпки (със снимки)

Видео: Точен светлинен пистолет Wiimote за Raspberry PI: 9 стъпки (със снимки)
Видео: 15 лучших инструментов RYOBI, которые упрощают работу над проектами DIY 2024, Юли
Anonim
Точен светлинен пистолет Wiimote за Raspberry PI
Точен светлинен пистолет Wiimote за Raspberry PI
Точен светлинен пистолет Wiimote за Raspberry PI
Точен светлинен пистолет Wiimote за Raspberry PI

Обикновено Wii Remote, използван като светлинен пистолет, не е достатъчно точен за ретро игри като NES Duck Hunt, тъй като Wii Remote всъщност не избира точката на телевизора, към която е насочен. Не може! Wii Remote има инфрачервена камера отпред, която вижда линията на инфрачервените светодиоди в сензорната лента, но не може да знае колко далеч (или в каква посока) е телевизорът от лентата или колко голям е телевизорът. Емулаторите и игрите заобикалят това, като показват кръстосани косми или друг индикатор за насочване, но това не е точно преживяване при стрелба с мишена.

За да накарате Wii Remote да работи като точен светлинен пистолет, който можете да видите заедно, за да изберете цел на телевизор, са необходими четири инфрачервени светодиода, подредени в известен четириъгълен модел (не права линия) в същата равнина като телевизора. След това Wii Remote вижда четирите светодиода и изображението на камерата може да се използва за изчисляване на хомография, която ни позволява да разберем къде е насочена камерата.

Хардуерът за този проект е прост. Има четири инфрачервени светодиода в прости 3D отпечатани корпуси, които могат да бъдат залепени в горната и долната част на корпуса на телевизора и да се включат в USB зарядно устройство. Плюс това, в случай, че нямате корпус за пистолет Wii, имам проста дръжка с 3D печат и мерници, които можете да прикрепите към Wii Remote (макар че за да спестя пластмаса, направих моя хибрид между дърво и 3D печатна пластмаса).

Софтуерът, базиран на python, беше по-труден за изработка от хардуера и в момента е само за Linux. Той калибрира светодиодите и Wii Remote и след това използва хомографски изчисления, за да емулира абсолютна мишка, която работи доста добре в емулатора на Retroarch fceumm NES (и вероятно някои други емулатори) на моя Raspberry PI 3B+.

Консумативи

  • Wii Remote
  • Четири 940nm 5 мм инфрачервени светодиода
  • Стар USB кабел с работещ щепсел тип А.
  • Raspberry PI 3 или друг Linux компютър с Bluetooth поддръжка
  • 3D принтер и нажежаема жичка (по избор)

Стъпка 1: Инфрачервена LED верига

Инфрачервена LED верига
Инфрачервена LED верига
Инфрачервена LED верига
Инфрачервена LED верига

Вземете стар USB кабел с работещ гнездо тип А (обикновено кабелите за зареждане на телефона ми се скъсват на края на микро USB, така че имам остатъчни кабели с работещ гнездо тип А). Всъщност дори е наред, ако кабелите за данни са прекъснати, докато електропроводите работят. Отрежете другия край. На теория червеният кабел трябва да бъде +5V, а черният трябва да бъде заземен, но проверете го с мултицет (включете го в зарядно устройство и след това проверете напрежението между червения и черния проводник).

Тъй като инфрачервените светодиоди имат около 1,2-1,3 V спад на напрежението, току-що запоех четири от тях последователно в USB кабела. Уверете се, че проводниците, които запоявате, са достатъчно дълги, за да можете да поставите светодиоди в долната част на телевизора и два отгоре, с прилично количество хоризонтално пространство между светодиодите (около 10 инча или повече).

По -точно, за да направите LED контура:

  • запоявайте минусовата страна (катод, по -къс крак, с плосък ръб) на първия светодиод към +5V USB проводник
  • присъединете положителната страна на първия светодиод (анод, по -дълъг крак, с кръгъл ръб) към минусовата страна на втория светодиод
  • повторете, за да присъедините втория светодиод към третия и третия към четвъртия
  • след това свържете плюсовата страна на четвъртия светодиод с проводник към заземяващия USB проводник.

За да направите нещата по -спретнати, можете да използвате термосвиваеми тръби, когато осъществявате връзките. В противен случай използвайте електрическа лента, за да избегнете къси панталони.

Уверете се, че няма късо съединение. След това го включете в USB зарядно устройство и проверете дали излъчва инфрачервена светлина, като погледнете светодиодите с камера на телефона. (Много камери на телефона са чувствителни към инфрачервени лъчи.)

Стъпка 2: Прикрепете към телевизора

Прикрепете към телевизора
Прикрепете към телевизора
Прикрепете към телевизора
Прикрепете към телевизора
Прикрепете към телевизора
Прикрепете към телевизора

Сега прикрепете два от светодиодите към долната страна на телевизора и два към горната страна. Хоризонталното разстояние трябва да бъде около десет инча. Ако е твърде много, може да имате проблеми с полето на видимост на камерата на Wii Remote, което ги заснема. Но ако са твърде близки, тогава геометричната ми интуиция казва, че ще имате по -ниска точност.

За тестване залепих светодиодите с електрическа лента, а след това за постоянна връзка, проектирах и отпечатах четири чисти малки LED клипа (файловете са тук), които горещо залепих към телевизора. Трябва да направите светодиодите възможно най -близо до равнината на телевизионния дисплей, без рамката да ги скрива от мястото, където ще снимате.

Стъпка 3: Инсталирайте софтуер

Понастоящем софтуерът е само за Linux. Следващата настройка е предназначена за Raspberry PI 3 с Raspbian Stretch. Други системи на 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 рестартиране

Стъпка Б: cwiid

След това ще ви е необходим моят модифициран пакет cwiid. Тук става малко космат, тъй като в идеалния случай би трябвало да го изградите на вашия Raspberry PI, но трябва да призная, че съм загубил представа какви пакети трябва да инсталирате, за да работи. Има три варианта за това.

Вариант В1: Изградете себе си

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

За съжаление, има доста голям шанс да пропуснете куп неща, необходими за изграждането на това, и./configure ще се оплаче. Можете да разгледате всички неща, от които се оплаква, и да стартирате sudo apt install на всички тях.

Вариант В2: Използвайте моите двоични файлове

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

Стъпка C: библиотеки на python

И накрая, вземете поддръжка за моя скрипт на python на lightgun:

sudo pip3 инсталирайте 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

Стъпка D: lightgun.py

И накрая, вземете моя скрипт на python на lightgun:

cd ~

git clone

Ако всичко е наред, сега имате ~/lightgun.py, който можете да използвате за калибриране на пистолета.

Стъпка 4: Калибриране Част I: Центриране на камерата

Калибриране Част I: Центриране на камерата
Калибриране Част I: Центриране на камерата
Калибриране Част I: Центриране на камерата
Калибриране Част I: Центриране на камерата
Калибриране Част I: Центриране на камерата
Калибриране Част I: Центриране на камерата

Калибрирането има два аспекта. Първият е да калибрирате центъра на камерата на всеки Wiimote. Това изисква използването на камерата за заснемане на две изображения на светодиодите около екрана на телевизора, едното с дистанционното от дясната страна нагоре, а другото с него с главата надолу.

За да избегнете натискането на бутоните, когато поставите Wii Remote отпред, и за да направите Wii Remote да има постоянна височина, можете да отпечатате 3D инструмента за калибриране, който включих тук. По принцип се нуждаете от неща с дебелина 10,5 мм, които можете да поставите под Wii Remote, когато лежи отпред. Всъщност използвах малко шперплат за скрап, за да спестя от пластмаса.

Включете светодиодите и се уверете, че вашият Raspberry PI или друг компютър се показва на телевизора. Свържете клавиатура (това няма да работи през ssh) или използвайте VNC. След това стартирайте:

python3 ~/lightgun/lightgun.py -M

Ако всичко върви добре, ще получите екран на цял екран, който ще ви помоли да натиснете 1+2 на Wii Remote. Направи го. Светлините ще мигат на Wii Remote, а след това светлините 1 и 4 ще останат включени. Също така ще видите малък зелен правоъгълник в горната част на екрана, с изглед от камерата Wii Remote. Насочете Wii Remote към светодиодите и ако всичко върви добре, ще видите четирите светодиода, номерирани от 1 до 4.

Сега трябва да намерите твърда повърхност с остър ръб, като масичка за кафе, която да насочите към телевизионния екран и която може да позволи на Wii Remote да вижда всички светодиоди с Wii Remote, подравнено към ръба. Започнете, като подравните Wii Remote с дясната страна нагоре, като страната на Remote е подравнена към ръба на повърхността, като се уверите, че се виждат и четирите светодиода. След това натиснете SPACE на клавиатурата си (или прикрепете Nunchuck и натиснете C, ако е по -удобно). След това ще бъдете подканени да завъртите Wii Remote. Сега се уверете, че е повдигнат на 10,5 мм нагоре от повърхността ви, като използвате инструмента за калибриране или нещо друго, и толкова близо до същото място като преди (напр. Подравнено към същия ръб на повърхността ви). Натиснете отново SPACE.

Ако всичко върви добре, сега ще преминете към стъпката за калибриране на LED. Да, това е сложно! Но ще имате много прецизен светлинен пистолет. Това е само цената.

Забележка: Ако като мен имате Wii под телевизора, Wii трябва да бъде изключен по две причини: първо, ако Wii е включен, той ще се свърже с Wiimote и, второ, инфрачервените светодиоди на сензорната лента ще пречат на този проект. Поради подобни причини, докато използвате Wii, е добра идея да изключите светодиодите около телевизора.

Стъпка 5: Калибриране Стъпка II: Светодиоди

Калибриране Стъпка II: Светодиоди
Калибриране Стъпка II: Светодиоди
Калибриране Стъпка II: Светодиоди
Калибриране Стъпка II: Светодиоди

Сега трябва да кажете на софтуера къде се намират светодиодите около ръба на телевизора. Ще видите екран за калибриране, показващ четири стрелки, една от тях избрана (ярка) и три от тях в сиво, около ръба на телевизора. Използвате +/- за превключване, за да промените коя стрелка регулирате.

За всяка от четирите стрелки около ръба направете следното:

  1. натиснете наляво/надясно на Wiimote, за да преместите стрелките, докато сочат възможно най -точно към съответния светодиод;
  2. натиснете нагоре/надолу върху Wiimote, за да промените дължината на стрелката, докато дължината на стрелката съответства на разстоянието между светодиода и ръба на телевизора; с други думи, дължината на стрелката трябва да бъде равна на разстоянието от върха на стрелката до светодиода.

След като четирите ви стрелки са правилни (а може би дори по -рано), ще видите червен прицел, когато насочите Wiimote към екрана. Можете да проверите дали това е мястото, където трябва да бъде. (Не забравяйте, че трябва да сте достатъчно далеч, за да може Wiimote да вижда всички светодиоди. Важно е също така да няма други източници на инфрачервени лъчи в зрителното поле. Веднъж имах проблеми поради отражението на слънчевата светлина от главата на винта на Стойка за телевизор.)

И накрая, има пета стрелка, която се показва само когато натиснете + от четвъртата LED стрелка или - от първата (и тя по подразбиране има нулева дължина, така че е само пиксел). Тази стрелка регулира колко далеч над камерата на Wii Remote ще бъде регистриран кадърът. Проблемът е следният: ще наблюдавате по горната повърхност на Wii Remote. Но камерата всъщност се намира на известно разстояние под тази повърхност, в средата на черния правоъгълник в предната част на Wii Remote. Ако регистрирахме снимките, където камерата сочи, те биха били регистрирани на около 8 мм под горната повърхност на Wii Remote. Можете да проверите това, като отбележите, че докато гледате по горната повърхност, центърът на напречните косми е скрит от камерата.

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

Натиснете HOME на Wii Remote, за да излезете от калибрирането и да запазите всички данни в директорията ~/.wiilightgun.

Стъпка 6: Тествайте и използвайте

Тествайте и използвайте
Тествайте и използвайте
Тествайте и използвайте
Тествайте и използвайте
Тествайте и използвайте
Тествайте и използвайте

Вероятно искате да опитате своя лек пистолет сега. Просто стартирайте в терминален емулатор (или скрипт):

python3 ~/lightgun/lightgun.py -t

Ще трябва да натиснете бутоните 1+2 едновременно и след това, ако всичко върви добре, докато lightgun.py работи, светлинният пистолет ще емулира абсолютна мишка с два бутона. Бутонът за задействане е бутон на мишката 1, а бутонът A е бутон на мишката 2. Натиснете ctrl-c, за да излезете.

Сега трябва само да конфигурирате вашите емулатори и/или игри да работят с абсолютна мишка. За съжаление, това не винаги ще бъде толкова лесно.

Едно забавно нещо, което може да опитате, е моят мод на изстрел на патица-патица на iminurnamez:

cd ~

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

За игри на NES използвам ядрото libretro fceumm в Retroarch. Отидете в менюто Опции и конфигурирайте Zapper да бъде сензорен екран. (Конфигурирането му като мишка всъщност не работи, тъй като fceumm очаква относително движение, а не абсолютна позиция на мишката.)

Ако започнете игрите си със скрипт, можете да редактирате частта, която стартира играта или емулатора, за да кажете:

python3 ~/lightgun/lightgun.py -t -B 30 "команда за стартиране на играта"

След това през първите 30 секунди от изпълнението на играта (оттук и опцията -B 30), можете да свържете вашия пистолет, като задържите 1+2.

Между другото, скриптът lightgun.py може да се използва и за общи Wii Remote игри с Retroarch. Просто добавете опцията -o и функциите на светлинния пистолет ще бъдат изключени и вместо това Wii Remote ще работи хоризонтално, като трите бутона са съответно 1, 2 и B. В картите на lightgun.py има и други свързани с Retroarch функции, които ще откриете, като прочетете кода. Например клавишът минус действа като смяна и заедно с dpad контролира запазването и зареждането (нагоре/надолу = промяна на номера за запазване; наляво = възстановяване; надясно = запазване).

Стъпка 7: Дръжка на пистолета и прицелване

Дръжка на пистолета и прицелване
Дръжка на пистолета и прицелване
Дръжка на пистолета и прицелване
Дръжка на пистолета и прицелване
Дръжка на пистолета и прицелване
Дръжка на пистолета и прицелване

Можете да използвате Wii Remote самостоятелно като пистолет, като гледате отгоре. Можете също така да закупите един от търговските гилзи за него. Но тъй като оригиналното Wii Remote не можеше да се използва като пистолет за видимост, корпусите обикновено не идват с железни прицели, а железните прицели значително подобряват точността.

Проектирах проста триизмерна система за триизмерно отпечатване: плъзгаща се дръжка, която седи точно зад спусъка (така че прилича малко на фазер от Star Trek Original Series) и плъзгащи се прицели. Файлове за печат са тук. Ако искате да спестите от пластмаса за сметка на скрап, можете също да направите това, което направих аз и вместо да отпечатате цялата дръжка, отпечатайте само частта, която държи Wiimote, и изрежете дървено парче и го завийте.

За да видите, фокусирайте очите си върху забележителностите. Подравнете изпъкналостта на предния мерник между неравностите на задната част, така че въздушното пространство на двете да е равно и всичките три неравности да стърчат еднакво високо. След това подравнете средата на целта с върха на неравностите.

Забележка: Височината на неравностите е леко неравна, като ударът на мушката е малко по -нисък, за да се компенсира височината на самите неравности на зрението, когато ги погледнете по протежение на тях на разстояние 2,5 метра (моето разстояние до телевизора). Ако имате значително различно разстояние до телевизора, можете да го поставите във файловете на OpenSCAD. Тази корекция обаче може да е под допустимите отклонения за принтера. Също така, ако не сте направили вертикалната настройка в софтуера, можете да добавите още корекция към забележителностите в софтуера, като зададете extraSightAdjust на нещо около -8 (в милиметри).

Стъпка 8: Калибриране III (по избор): Фина настройка

Ако искате още по -голяма точност, можете да изпълните:

python3 ~/lightgun/lightgun.py -d

(за демонстрация) и погледнете внимателно дали забележителностите се подравняват с кръстосаните косми. Ако не го направите, излезте и ръчно редактирайте ~/.wiilightgun/wiimotecalibration и променете леко координатите x и y на центъра на камерата, за да регулирате прицела. Например пистолетът ми стреля леко надясно, така че в крайна сметка промених координатата x от 529 на 525. Номерата на всички вероятно ще бъдат различни.

Стъпка 9: Приложение: Алгоритъмът

Приложение: Алгоритъмът
Приложение: Алгоритъмът

Емулационният код на мишката работи приблизително по следния начин.

  • Натискане на бутон за процес.
  • Вземете данни от камерата и коригирайте за калибриране на центрирането на камерата.
  • Ако в камерата се виждат по -малко от три светодиода:

    Запазете последната позиция на мишката

  • Ако се виждат три или четири светодиода:

    • Използвайте данните за акселерометъра Wiimote, за да получите ориентация на Wiimote и да определите кое изображение на LED камера отговаря на кой физически светодиод.
    • Ако се виждат четири светодиода:

      • Изчислете хомографията между изображенията на LED камерите и местоположенията на LED (в координати на екрана).
      • Използвайте хомография, за да изчислите какво място на екрана съответства на центъра на зрителното поле на камерата.
      • Направете Y-настройка, за да настроите центъра на виртуалната цев на оръжието под линията на прицела. Това е малко досаден алгоритъм, но работи.
      • Задайте позицията на мишката в коригираното местоположение на екрана.
    • Ако се виждат три светодиода:

      • Използвайте OpenCV, за да разрешите проблема с P3P между изображенията на LED камерата и физическите LED места. Това генерира до четири решения.
      • При успех:

        • Ако имаме предишно успешно изчисляване на местоположението, изберете решението, което прави липсващия светодиод най -близо до последното наблюдавано или изчислено положение на този светодиод.
        • Ако нямаме предишно успешно изчисляване на местоположението, изберете решението, което най -добре предсказва заглавието на акселерометъра.
        • Използвайте най -доброто решение, за да изчислите къде трябва да отиде четвъртият светодиод.
        • Направете останалото, както в четирите LED кутии.
      • Ако не успее:

        Запазете последната позиция на мишката

Препоръчано: