Spisu treści:

Dokładny pistolet świetlny Wiimote dla Raspberry PI: 9 kroków (ze zdjęciami)
Dokładny pistolet świetlny Wiimote dla Raspberry PI: 9 kroków (ze zdjęciami)

Wideo: Dokładny pistolet świetlny Wiimote dla Raspberry PI: 9 kroków (ze zdjęciami)

Wideo: Dokładny pistolet świetlny Wiimote dla Raspberry PI: 9 kroków (ze zdjęciami)
Wideo: SInden Gun ("Pistolet świetlny" nowej generacji) - Hardware 2024, Listopad
Anonim
Dokładny pistolet świetlny Wiimote dla Raspberry PI
Dokładny pistolet świetlny Wiimote dla Raspberry PI
Dokładny lekki pistolet Wiimote dla Raspberry PI
Dokładny lekki pistolet Wiimote dla Raspberry PI

Zwykle Wii Remote używany jako lekki pistolet nie jest wystarczająco dokładny w grach retro, takich jak NES Duck Hunt, ponieważ Wii Remote w rzeczywistości nie wybiera punktu na telewizorze, na który jest skierowany. Nie może! Wii Remote ma kamerę na podczerwień z przodu, która widzi linię diod podczerwieni na pasku czujnika, ale nie może wiedzieć, jak daleko (lub w jakim kierunku) znajduje się telewizor od paska ani jak duży jest telewizor. Emulatory i gry obchodzą ten problem, wyświetlając krzyżyk lub inny wskaźnik celowania, ale nie jest to dokładne strzelanie do celu.

Aby Wii Remote działał jak precyzyjny pistolet świetlny, który można celować, aby wybrać cel na telewizorze, potrzebne są cztery diody podczerwieni ustawione w znany wzór czworoboczny (nie w linii prostej) w tej samej płaszczyźnie co telewizor. Wii Remote widzi wtedy cztery diody LED, a obraz z kamery może być wykorzystany do obliczenia homografii, która pozwala nam dowiedzieć się, w którą stronę skierowana jest kamera.

Sprzęt do tego projektu jest prosty. W prostych obudowach wydrukowanych w 3D znajdują się cztery diody podczerwieni, które można przykleić do górnej i dolnej części obudowy telewizora i podłączyć do ładowarki USB. Dodatkowo, jeśli nie masz obudowy pistoletu Wii, mam prostą rączkę wydrukowaną w 3D i przyrządy celownicze, które można przymocować do Wii Remote (chociaż, aby zaoszczędzić plastik, stworzyłem hybrydę drewna i plastiku drukowanego w 3D).

Oprogramowanie oparte na Pythonie było trudniejsze do wykonania niż sprzęt i obecnie jest dostępne tylko dla Linuksa. Kalibruje diody LED i Wii Remote, a następnie używa obliczeń homografii do emulacji myszy absolutnej, która działa całkiem dobrze w emulatorze fceumm NES firmy Retroarch (i prawdopodobnie kilku innych emulatorach) na moim Raspberry PI 3B +.

Kieszonkowe dzieci

  • Pilot Wii
  • Cztery diody LED na podczerwień 940nm 5mm
  • Stary kabel USB z działającą wtyczką typu A
  • Raspberry PI 3 lub inny komputer z systemem Linux z obsługą Bluetooth
  • Drukarka 3D i filament (opcjonalnie)

Krok 1: Łańcuch LED na podczerwień

Łańcuch LED na podczerwień
Łańcuch LED na podczerwień
Łańcuch LED na podczerwień
Łańcuch LED na podczerwień

Zdobądź stary kabel USB z działającym męskim gniazdem typu A (zwykle moje kable do ładowania telefonu pękają na końcówce micro USB, więc mam resztki kabli z działającym męskim gniazdem typu A).. Właściwie to nawet OK, jeśli kable danych są uszkodzony tak długo, jak działają linie energetyczne. Odetnij drugi koniec. Teoretycznie kabel czerwony powinien mieć +5V a czarny powinien być uziemiony, ale sprawdź to multimetrem (podłącz do ładowarki, a następnie sprawdź napięcie między przewodem czerwonym i czarnym).

Ponieważ diody LED na podczerwień mają spadek napięcia o około 1,2-1,3 V, właśnie przylutowałem cztery z nich w pętli szeregowej do kabla USB. Upewnij się, że przewody, które lutujesz, są wystarczająco długie, aby można było umieścić diody LED na dole telewizora i dwie na górze, z przyzwoitą przestrzenią poziomą między diodami LED (około 10 cali).

Dokładniej, aby zrobić pętlę LED:

  • przylutuj stronę ujemną (katoda, nóżka krótsza, z płaską krawędzią) pierwszej diody LED do przewodu USB +5V
  • połącz plus pierwszej diody (anoda, dłuższa noga, z zaokrągloną krawędzią) ze stroną minus drugiej diody
  • powtórz, aby połączyć drugą diodę z trzecią i trzecią z czwartą
  • następnie podłącz dodatnią stronę czwartej diody LED przewodem do uziemionego przewodu USB.

Aby wszystko było ładniejsze, możesz użyć rurki termokurczliwej podczas wykonywania połączeń. W przeciwnym razie użyj taśmy elektrycznej, aby uniknąć szortów.

Upewnij się, że nie masz zwarć. Następnie podłącz go do ładowarki USB i sprawdź, czy emituje światło podczerwone, patrząc na diody LED aparatem w telefonie. (Wiele aparatów telefonicznych jest wrażliwych na podczerwień.)

Krok 2: Podłącz do telewizora

Dołącz do telewizora
Dołącz do telewizora
Dołącz do telewizora
Dołącz do telewizora
Dołącz do telewizora
Dołącz do telewizora

Teraz przymocuj dwie diody LED pod spodem telewizora, a dwie u góry. Odległość w poziomie powinna wynosić około dziesięciu cali. Jeśli to za dużo, możesz mieć problemy z polem widzenia kamery Wii Remote, aby je wszystkie uchwycić. Ale jeśli są zbyt blisko, moja geometryczna intuicja mówi, że będziesz miał mniejszą precyzję.

Do testów okleiłem diody taśmą elektryczną, a następnie dla trwałego połączenia zaprojektowałem i wydrukowałem cztery zgrabne klipsy LED (pliki są tutaj), które przykleiłem na gorąco do telewizora. Powinieneś ustawić diody tak blisko płaszczyzny ekranu telewizora, jak to tylko możliwe, bez ramki zasłaniającej je z miejsca, w którym będziesz kręcić.

Krok 3: Zainstaluj oprogramowanie

Obecnie oprogramowanie jest tylko dla systemu Linux. Poniższa konfiguracja jest przeznaczona dla Raspberry PI 3 z Raspbian Stretch. Inne systemy Linux będą wymagały pewnych zmian. We wcześniejszych modelach będziesz potrzebować klucza sprzętowego Bluetooth i musisz go również uruchomić z wiersza poleceń:

sudo get-apt zainstaluj bluetooth

Krok A: udev

Następnie utwórz plik w /etc/udev/rules.d/wiimote.rules zawierający pojedynczą linię:

KERNEL=="wejście", TRYB="0666"

Możesz to zrobić na przykład za pomocą edytora tekstu lub wpisując w wierszu poleceń:

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

A następnie uruchom ponownie udev:

sudo /etc/init.d/udev restart

Krok B: cwiid

Następnie będziesz potrzebować mojego zmodyfikowanego pakietu cwiid. Tutaj robi się trochę nieostro, ponieważ idealnie byłoby, gdyby trzeba było go zbudować na swoim Raspberry PI, ale muszę przyznać, że straciłem rachubę, jakie pakiety należy zainstalować, aby działało. Są na to trzy możliwości.

Opcja B1: Zbuduj siebie

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

Niestety, istnieje spora szansa, że brakuje Ci wielu rzeczy potrzebnych do zbudowania tego, a./configure będzie narzekał. Możesz spojrzeć na wszystkie rzeczy, na które narzeka i uruchomić sudo apt install na wszystkich z nich.

Opcja B2: Użyj moich plików binarnych

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

Krok C: biblioteki Pythona

Na koniec zdobądź wsparcie dla mojego skryptu python lightgun:

sudo pip3 zainstaluj uinput numpy pygame opencv-python

sudo apt-get zainstaluj libatlas-base-dev sudo apt-get zainstaluj libjasper-dev sudo apt-get zainstaluj libqtgui4 sudo apt-get zainstaluj python3-pyqt5

Krok D: lightgun.py

Na koniec zdobądź mój skrypt python lightgun:

cd ~

klon git

Jeśli wszystko poszło dobrze, masz teraz ~/lightgun.py, którego możesz użyć do kalibracji lightguna.

Krok 4: Kalibracja Część I: Centrowanie kamery

Kalibracja Część I: Centrowanie kamery
Kalibracja Część I: Centrowanie kamery
Kalibracja Część I: Centrowanie kamery
Kalibracja Część I: Centrowanie kamery
Kalibracja Część I: Centrowanie kamery
Kalibracja Część I: Centrowanie kamery

Kalibracja ma dwa aspekty. Pierwszym z nich jest kalibracja środka kamery na każdym Wiimote. Wymaga to użycia aparatu do wykonania dwóch obrazów diod LED wokół ekranu telewizora, jednego z pilotem skierowanym do góry, a drugiego z nim do góry nogami.

Aby uniknąć naciskania przycisków, gdy kładziesz Wii Remote z przodu i aby Wii Remote miał stałą wysokość, możesz wydrukować w 3D narzędzie do kalibracji, które tutaj zawarłem. Zasadniczo potrzebujesz rzeczy o grubości 10,5 mm, które możesz umieścić pod Wii Remote, gdy leży on z przodu. Właściwie użyłem kawałka sklejki, aby zaoszczędzić na plastiku.

Włącz diody LED i upewnij się, że Twój Raspberry PI lub inny komputer wyświetla się na telewizorze. Podłącz klawiaturę (to nie zadziała przez ssh) lub użyj VNC. Następnie uruchomić:

python3 ~/lightgun/lightgun.py -M

Jeśli wszystko pójdzie dobrze, pojawi się pełnoekranowy ekran z prośbą o naciśnięcie 1+2 na Wii Remote. Zrób to. Kontrolki na Wii Remote będą migać, a kontrolki 1 i 4 pozostaną włączone. Zobaczysz również mały zielony prostokąt u góry ekranu, z widokiem z kamery Wii Remote. Skieruj Wii Remote na diody LED, a jeśli wszystko pójdzie dobrze, zobaczysz cztery diody LED, ponumerowane od 1 do 4.

Teraz musisz znaleźć solidną powierzchnię z ostrą krawędzią, taką jak stolik kawowy, którą możesz skierować na ekran telewizora i która pozwoli Wii Remote zobaczyć wszystkie diody LED z Wii Remote ustawionym względem krawędzi. Rozpocznij od wyrównania Wii Remote prawą stroną do góry, z bokiem pilota wyrównanym do krawędzi powierzchni, upewniając się, że wszystkie cztery diody LED są widoczne. Następnie naciśnij spację na klawiaturze (lub podłącz Nunchuck i naciśnij C, jeśli jest to wygodniejsze). Zostaniesz poproszony o obrócenie Wii Remote. Teraz upewnij się, że jest podniesiony o 10,5 mm nad powierzchnię za pomocą narzędzia kalibracyjnego lub czegoś innego i jak najbliżej tego samego miejsca co poprzednio (np. wyrównany do tej samej krawędzi powierzchni). Ponownie naciśnij spację.

Jeśli wszystko pójdzie dobrze, przejdziesz teraz do kroku kalibracji LED. Tak, to jest skomplikowane! Ale będziesz miał bardzo precyzyjną latarnię. To tylko cena.

Uwaga: Jeśli tak jak ja masz Wii pod telewizorem, Wii musi zostać wyłączone z dwóch powodów: po pierwsze, jeśli Wii jest włączone, połączy się z Wiimote, a po drugie, diody podczerwieni paska czujnika będą zakłócać ten projekt. Z podobnych powodów, podczas korzystania z Wii, dobrym pomysłem jest odłączenie diod LED wokół telewizora.

Krok 5: Kalibracja Krok II: Diody LED

Kalibracja Krok II: Diody LED
Kalibracja Krok II: Diody LED
Kalibracja Krok II: Diody LED
Kalibracja Krok II: Diody LED

Teraz musisz poinformować oprogramowanie, gdzie znajdują się diody LED wokół krawędzi telewizora. Zobaczysz ekran kalibracji z czterema strzałkami, jedną z nich zaznaczoną (jasną), a trzema wyszarzonymi, wokół krawędzi telewizora. Użyj +/-, aby przełączyć się, aby zmienić regulowaną strzałkę.

Dla każdej z czterech strzałek wokół krawędzi wykonaj następujące czynności:

  1. naciśnij lewo/prawo na Wiimote, aby przesunąć strzałki, aż będą wskazywać jak najdokładniej w kierunku odpowiedniej diody LED;
  2. naciśnij góra/dół na Wiimote, aby zmienić długość strzałki, aż długość strzałki będzie odpowiadać odległości między diodą LED a krawędzią ekranu telewizora; innymi słowy, długość strzałki musi być równa odległości od czubka strzałki do diody LED.

Gdy twoje cztery strzałki będą prawidłowe (a może nawet wcześniej), zobaczysz czerwony celownik, gdy skierujesz Wiimote na ekran. Możesz sprawdzić, czy to właśnie tam powinno być. (Pamiętaj, że musisz być na tyle daleko, aby Wiimote mógł widzieć wszystkie diody LED. Ważne jest również, aby w polu widzenia nie było innych źródeł podczerwieni. Miałem kiedyś kłopoty z powodu światła słonecznego odbijającego się od łba śruby na Stojak TV.)

Wreszcie jest piąta strzałka, która pojawia się dopiero po naciśnięciu + od czwartej strzałki LED lub - od pierwszej (i domyślnie ma zerową długość, więc to tylko piksel). Ta strzałka reguluje, jak daleko nad kamerą Wii Remote zostanie zarejestrowane ujęcie. Problem polega na tym, że będziesz obserwował górną powierzchnię Wii Remote. Ale kamera znajduje się w pewnej odległości pod tą powierzchnią, pośrodku czarnego prostokąta z przodu Wii Remote. Gdybyśmy zarejestrowali ujęcia, w które wskazuje kamera, zostałyby zarejestrowane około 8 mm poniżej górnej powierzchni Wii Remote. Możesz to sprawdzić, zauważając, że gdy patrzysz wzdłuż górnej powierzchni, środek celownika jest zasłonięty przez kamerę.

Możesz z tym żyć lub możesz rozwinąć tę piątą strzałkę, aby oprogramowanie wyrównało strzały z górną częścią Wii Remote, lub możesz dostosować pliki do druku 3D dla żelaznych przyrządów celowniczych, aby to zrekompensować (ale kompensacja będzie działać tylko dla jedną określoną odległość od telewizora). Sam poszedłem na wyrównanie oprogramowania.

Naciśnij HOME na Wii Remote, aby wyjść z kalibracji i zapisać wszystkie dane w katalogu ~/.wiilightgun.

Krok 6: Testuj i używaj

Testuj i używaj
Testuj i używaj
Testuj i używaj
Testuj i używaj
Testuj i używaj
Testuj i używaj

Prawdopodobnie chcesz teraz wypróbować swoją lekką broń. Po prostu uruchom w emulatorze terminala (lub skrypcie):

python3 ~/lightgun/lightgun.py -t

Będziesz musiał nacisnąć przyciski 1+2 w tym samym czasie, a potem, jeśli wszystko pójdzie dobrze, dopóki lightgun.py jest uruchomiony, lightgun będzie emulował dwuprzyciskową absolutną mysz. Przycisk wyzwalacza to przycisk myszy 1, a przycisk A to przycisk myszy 2. Naciśnij ctrl-c, aby wyjść.

Teraz wystarczy skonfigurować emulatory i/lub gry, aby działały z absolutną myszą. Niestety nie zawsze będzie to takie proste.

Jedną z zabawnych rzeczy, które możesz wypróbować, jest mój mod do strzelania z kaczki iminurnameza:

cd ~

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

W przypadku gier NES używam rdzenia libretro fceumm w Retroarch. Przejdź do menu Opcje i skonfiguruj Zappera jako ekran dotykowy. (Konfigurowanie go jako myszy nie działa, ponieważ fceumm oczekuje ruchu względnego, a nie bezwzględnego).

Jeśli zaczynasz swoje gry za pomocą skryptu, możesz edytować część, która uruchamia grę lub emulator, aby powiedzieć:

python3 ~/lightgun/lightgun.py -t -B 30 „polecenie rozpoczęcia gry”

Następnie w ciągu pierwszych 30 sekund gry (stąd opcja -B 30) możesz podłączyć swoją latarnię przytrzymując 1+2.

Nawiasem mówiąc, skrypt lightgun.py może być również używany do ogólnych gier Wii Remote z Retroarch. Wystarczy dodać opcję -o, a funkcje lightgun zostaną wyłączone, a zamiast tego Wii Remote będzie działał poziomo, z trzema przyciskami odpowiednio 1, 2 i B. Istnieją inne funkcje związane z Retroarch w mapowaniach lightgun.py, które odkryjesz czytając kod. Na przykład klawisz minus działa jak przesunięcie i razem z dpadem steruje zapisywaniem i ładowaniem (góra/dół = zmiana numeru zapisu; lewo=przywróć; prawo=zapisz).

Krok 7: Uchwyt pistoletu i celowanie

Uchwyt pistoletu i celowanie
Uchwyt pistoletu i celowanie
Uchwyt pistoletu i celowanie
Uchwyt pistoletu i celowanie
Uchwyt pistoletu i celowanie
Uchwyt pistoletu i celowanie

Możesz używać samego Wii Remote jako pistoletu, mierząc wzdłuż góry. Możesz również kupić do niego jedną z komercyjnych łusek do broni. Ale ponieważ oryginalny pilot Wii nie mógł być używany jako celownik, łuski nie są wyposażone w mechaniczne przyrządy celownicze, a przyrządy celownicze znacznie poprawiają celność.

Zaprojektowałem prosty, trzyczęściowy system do druku 3D: nasuwany uchwyt, który znajduje się tuż za spustem (więc wygląda trochę jak fazer Star Trek Original Series) i nasuwane przyrządy celownicze. Pliki do druku są tutaj. Jeśli chcesz zaoszczędzić na plastiku kosztem odpadu drewna, możesz też zrobić to, co ja zrobiłem i zamiast drukować całą rączkę, wydrukować tylko tę część, która trzyma Wiimote, wyciąć kawałek drewna i przykręcić.

Aby zobaczyć, skup wzrok na widokach. Wyrównaj wybrzuszenie celownika między wybojami celownika tak, aby przestrzeń powietrzna na każdym z nich była równa, a wszystkie trzy wybrzuszenia wystawały jednakowo wysoko. Następnie wyrównaj środek celu z górną częścią wypukłości.

Uwaga: Wysokość wybojów jest nieco nierówna, a wybrzuszenie muszki jest nieco niższe, aby skompensować wysokość samych wybojów celownika, gdy patrzysz wzdłuż nich z odległości 2,5 metra (moja odległość od telewizora). Jeśli masz znacznie inną odległość od telewizora, możesz umieścić ją w plikach OpenSCAD. Ta regulacja może i tak być poniżej tolerancji drukarki. Ponadto, jeśli nie wykonałeś regulacji pionowej w oprogramowaniu, możesz dodać trochę więcej regulacji do celowników w oprogramowaniu, ustawiając extraSightAdjust na około -8 (w milimetrach).

Krok 8: Kalibracja III (opcjonalnie): Dokładna regulacja

Jeśli chcesz jeszcze większej precyzji, możesz uruchomić:

python3 ~/lightgun/lightgun.py -d

(dla wersji demonstracyjnej) i dokładnie przyjrzyj się, czy celowniki są zgodne z celownikami. Jeśli nie, wyjdź i ręcznie edytuj ~/.wiilightgun/wiimotecalibration i nieznacznie dostosuj współrzędne x i y środka kamery, aby dostosować celowanie. Na przykład, mój pistolet strzelał lekko w prawo, więc skończyłem zmieniając współrzędną x z 529 na 525. Liczby prawdopodobnie będą inne.

Krok 9: Dodatek: algorytm

Dodatek: Algorytm
Dodatek: Algorytm

Kod emulacji myszy działa mniej więcej w następujący sposób.

  • Naciśnięcie przycisku procesu.
  • Pobierz dane z kamery i dostosuj kalibrację centrowania kamery.
  • Jeśli w kamerze widać mniej niż trzy diody LED:

    Zachowaj ostatnią pozycję myszy

  • Jeśli widoczne są trzy lub cztery diody LED:

    • Użyj danych akcelerometru Wiimote, aby uzyskać orientację Wiimote i określić, który obraz z kamery LED odpowiada której fizycznej LED.
    • Jeśli widoczne są cztery diody LED:

      • Oblicz homografię między obrazami z kamer LED a lokalizacjami LED (we współrzędnych ekranowych).
      • Użyj homografii, aby obliczyć, jaka lokalizacja na ekranie odpowiada środkowi pola widzenia kamery.
      • Dokonaj regulacji Y, aby ustawić środek wirtualnej lufy działa poniżej linii celowniczej. To trochę niezgrabny algorytm, ale działa.
      • Ustaw pozycję myszy zgodnie z dopasowaną lokalizacją na ekranie.
    • Jeśli widoczne są trzy diody LED:

      • Użyj OpenCV, aby rozwiązać problem P3P między obrazami z kamer LED a fizycznymi lokalizacjami LED. Generuje to do czterech rozwiązań.
      • Jeśli się powiedzie:

        • Jeśli mamy poprzednie pomyślne obliczenie lokalizacji, wybierz rozwiązanie, które sprawi, że brakująca dioda LED będzie najbliższa ostatnio zaobserwowanej lub obliczonej pozycji tej diody.
        • Jeśli nie mamy wcześniejszego pomyślnego obliczenia lokalizacji, wybierz rozwiązanie, które najlepiej przewiduje kierunek akcelerometru.
        • Użyj najlepszego rozwiązania, aby obliczyć, gdzie powinna iść czwarta dioda LED.
        • Zrób resztę jak w przypadku czterech diod LED.
      • Jeśli się nie powiedzie:

        Zachowaj ostatnią pozycję myszy

Zalecana: