Spisu treści:
- Kieszonkowe dzieci
- Krok 1: Łańcuch LED na podczerwień
- Krok 2: Podłącz do telewizora
- Krok 3: Zainstaluj oprogramowanie
- Krok 4: Kalibracja Część I: Centrowanie kamery
- Krok 5: Kalibracja Krok II: Diody LED
- Krok 6: Testuj i używaj
- Krok 7: Uchwyt pistoletu i celowanie
- Krok 8: Kalibracja III (opcjonalnie): Dokładna regulacja
- Krok 9: Dodatek: algorytm
Wideo: Dokładny pistolet świetlny Wiimote dla Raspberry PI: 9 kroków (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:28
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ń
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
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 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
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:
- naciśnij lewo/prawo na Wiimote, aby przesunąć strzałki, aż będą wskazywać jak najdokładniej w kierunku odpowiedniej diody LED;
- 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
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
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
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:
Reaktor łukowy z nadrukiem 3D (film dokładny i nadający się do noszenia): 7 kroków (ze zdjęciami)
3d Printed Endgame Arc Reactor (film dokładny i nadający się do noszenia): Pełny samouczek na YouTube: Nie mogłem znaleźć żadnych szczególnie dokładnych plików 3D dla reaktora łukowego Mark 50 / obudowy dla nanocząstek, więc mój kumpel i ja ugotowaliśmy kilka słodkich. Wymagało to mnóstwa poprawek, aby rzecz wyglądała dokładnie i niesamowicie
Łatwy pokaz świetlny dla laptopa: 3 kroki
Easy Light Show for Laptop: Jest to tani sposób na dodanie lekkiej atmosfery podczas odtwarzania filmów lub teledysków. Koszt to 19 USD. Myślę, że dzieci to pokochają! Mój kot uwielbia oglądać ekran. Uwielbiam to !Narzędzia potrzebne do projektu:1. Plac zabaw dla dzieci - programista
Dokładny model gwiazdy zmiennej cefeidy: 5 kroków (ze zdjęciami)
Dokładny model gwiazdy zmiennej cefeidy: przestrzeń jest duża. Bardzo duży. Można by nawet powiedzieć, że astronomicznie. To nie ma żadnego związku z tym projektem, chciałem tylko użyć kalamburu. Nic dziwnego, że na nocnym niebie jest wiele gwiazd. Może jednak zaskoczyć niektórych, którzy są nowicjuszami w tej dziedzinie
Jak zrobić dokładny czujnik przepływu powietrza z Arduino za mniej niż 20 funtów respiratora COVID-19: 7 kroków
Jak zrobić dokładny czujnik przepływu powietrza z Arduino dla respiratora COVID-19 poniżej 20 GBP: Zobacz ten raport, aby zapoznać się z najnowszym projektem tego czujnika przepływu kryzy: https://drive.google.com/file/d/1TB7rhnxQ6q6C1cNb. ..Ta instrukcja pokazuje, jak zbudować czujnik natężenia przepływu powietrza przy użyciu niedrogiego czujnika różnicy ciśnień i łatwo
Visuino - Uzyskaj dokładny czas z internetowego serwera NIST za pomocą NodeMCU: 8 kroków
Visuino - Uzyskaj dokładny czas z internetowego serwera NIST przy użyciu NodeMCU: W tym samouczku użyjemy NodeMCU Mini, OLED Lcd i Visuino do wyświetlania czasu internetowego na żywo z serwera NIST na Lcd. Obejrzyj film demonstracyjny. To zasługa inspiracji użytkownika youtube "Ciprian Balalau"