İçindekiler:

Raspberry PI için Doğru Wiimote Hafif Tabancası: 9 Adım (Resimlerle)
Raspberry PI için Doğru Wiimote Hafif Tabancası: 9 Adım (Resimlerle)

Video: Raspberry PI için Doğru Wiimote Hafif Tabancası: 9 Adım (Resimlerle)

Video: Raspberry PI için Doğru Wiimote Hafif Tabancası: 9 Adım (Resimlerle)
Video: Raspberry Pi - How to use a Wiimote! 2024, Temmuz
Anonim
Raspberry PI için Doğru Wiimote Hafif Tabancası
Raspberry PI için Doğru Wiimote Hafif Tabancası
Raspberry PI için Doğru Wiimote Hafif Tabancası
Raspberry PI için Doğru Wiimote Hafif Tabancası

Normalde, hafif silah olarak kullanılan Wii Remote, NES Duck Hunt gibi retro oyunlar için yeterince hassas değildir, çünkü Wii Remote aslında TV'de işaret ettiği noktayı seçmez. Yapamaz! Wii Remote'un önünde, sensör çubuğundaki kızılötesi LED'lerin çizgisini gören bir kızılötesi kamera vardır, ancak TV'nin çubuktan ne kadar (veya hangi yönde) olduğunu veya TV'nin ne kadar büyük olduğunu bilemez. Öykünücüler ve oyunlar, artı işareti veya diğer hedefleme göstergelerini göstererek bu sorunu çözer, ancak bu doğru bir hedef vurma deneyimi değildir.

Wii Remote'un bir TV'de bir hedef seçmek üzere görüşebileceğiniz hassas bir hafif silah olarak çalışmasını sağlamak için TV ile aynı düzlemde bilinen bir dörtgen düzende (düz bir çizgi değil) düzenlenmiş dört kızılötesi LED gerekir. Wii Remote daha sonra dört LED'i görür ve kamera görüntüsü, kameranın nereye işaret ettiğini bulmamızı sağlayan bir homografiyi hesaplamak için kullanılabilir.

Bu projenin donanımı basittir. TV muhafazasının üstüne ve altına yapıştırılabilen ve bir USB şarj cihazına takılabilen basit 3D baskılı muhafazalarda dört kızılötesi LED vardır. Ayrıca, Wii tabanca muhafazanız yoksa, Wii Remote'a ekleyebileceğiniz basit bir 3D baskılı tutamağım ve manzaralarım var (plastikten tasarruf etmek için benimkini ahşap ve 3D baskılı plastik arasında bir melez yaptım).

Python tabanlı yazılımı yapmak donanımdan daha zordu ve şu anda yalnızca Linux'ta. LED'leri ve Wii Remote'u kalibre eder ve ardından Retroarch'ın fceumm NES öykünücüsünde (ve muhtemelen diğer bazı öykünücülerde) Raspberry PI 3B+'mda oldukça iyi çalışan mutlak bir fareyi öykünmek için homografi hesaplamalarını kullanır.

Gereçler

  • Wii Uzaktan Kumanda
  • Dört adet 940nm 5mm kızılötesi LED
  • Çalışan tip A fişli eski USB kablosu
  • Raspberry PI 3 veya Bluetooth destekli diğer Linux bilgisayar
  • 3D yazıcı ve filament (isteğe bağlı)

Adım 1: Kızılötesi LED Zinciri

Kızılötesi LED Zinciri
Kızılötesi LED Zinciri
Kızılötesi LED Zinciri
Kızılötesi LED Zinciri

Çalışan tip A erkek soketli eski bir USB kablosu alın (genellikle telefon şarj kablolarım mikro USB ucunda kırılır, bu nedenle çalışan A tipi erkek soketli artık kablolarım var). elektrik hatları çalıştığı sürece bozulur. Diğer ucunu kesin. Teoride kırmızı kablo +5V olmalı ve siyah kablo topraklanmalıdır, ancak bir multimetre ile kontrol edin (şarj cihazına takın ve ardından kırmızı ve siyah kablolar arasındaki voltajı kontrol edin).

Kızılötesi LED'lerin yaklaşık 1.2-1.3V voltaj düşüşü olduğundan, dördünü seri döngüde USB kablosuna lehimledim. Lehim yaptığınız kabloların, LED'leri TV'nin altına ve iki tanesini LED'ler arasında yeterli miktarda yatay boşluk olacak şekilde (yaklaşık 10 inç) yerleştirebileceğiniz kadar uzun olduğundan emin olun.

Daha doğrusu LED döngüsünü yapmak için:

  • +5V USB kablosuna ilk LED'in eksi tarafını (katot, kısa bacak, düz kenarlı) lehimleyin
  • ilk LED'in artı tarafını (anot, uzun bacak, yuvarlak kenarlı) ikinci LED'in eksi tarafına birleştirin
  • ikinci LED'i üçüncüye ve üçüncüyü dördüncüye bağlamak için tekrarlayın
  • ardından dördüncü LED'in artı tarafını bir kabloyla topraklama USB kablosuna bağlayın.

İşleri daha düzenli hale getirmek için, bağlantıları yaparken ısıyla daralan makaron kullanabilirsiniz. Aksi takdirde, kısa devre yapmamak için elektrik bandı kullanın.

Kısa devre olmadığından emin olun. Ardından bir USB şarj cihazına takın ve bir telefon kamerasıyla LED'lere bakarak kızılötesi ışık yaydığını kontrol edin. (Birçok telefon kamerası kızılötesi duyarlıdır.)

2. Adım: TV'ye takın

TV'ye ekle
TV'ye ekle
TV'ye ekle
TV'ye ekle
TV'ye ekle
TV'ye ekle

Şimdi, LED'lerden ikisini TV'nin alt tarafına ve ikisini de üst tarafına takın. Yatay boşluk yaklaşık on inç olmalıdır. Çok fazlaysa, Wii Remote kameranın görüş alanı hepsini yakalarken sorun yaşayabilirsiniz. Ama eğer çok yakınlarsa, o zaman benim geometrik sezgim daha düşük hassasiyete sahip olacağınızı söylüyor.

Test için LED'leri elektrik bandıyla bantladım ve ardından kalıcı bir bağlantı için TV'ye sıcak yapıştırdığım dört adet düzgün küçük LED klipsi (dosyalar burada) tasarlayıp yazdırdım. LED'leri, çerçevenin çekim yapacağınız yerden engellemeden, TV ekranının düzlemine mümkün olduğunca yakın olmasını sağlamalısınız.

3. Adım: Yazılımı Yükleyin

Şu anda yazılım yalnızca Linux'tur. Aşağıdaki kurulum, Raspbian Stretch ile Raspberry PI 3 için tasarlanmıştır. Diğer Linux sistemleri bazı değişiklikler gerektirecektir. Daha önceki modellerde bir Bluetooth dongle'a ihtiyacınız olacak ve bunu bir komut satırından da çalıştırmanız gerekecek:

sudo get-apt bluetooth'u kurun

Adım A: udev

Ardından, /etc/udev/rules.d/wiimote.rules içinde tek satırı içeren bir dosya oluşturun:

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

Bunu, örneğin bir metin düzenleyiciyle veya komut satırına aşağıdakini yazarak yapabilirsiniz:

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

Ve sonra udev'i yeniden başlatın:

sudo /etc/init.d/udev yeniden başlat

Adım B: cwiid

Ardından, değiştirilmiş cwiid paketime ihtiyacınız olacak. Burada ideal olarak Raspberry PI'niz üzerine kurmanız gerektiği için biraz tüylü oluyor, ancak işe yaraması için hangi paketleri kurmanız gerektiğinin izini kaybettiğimi itiraf etmeliyim. Bunu yapmak için üç seçenek vardır.

Seçenek B1: Kendiniz oluşturun

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

Ne yazık ki, bunu oluşturmak için gereken bir sürü şeyi kaçırıyor olma ihtimaliniz oldukça yüksek ve./configure şikayet edecek. Şikayet ettiği her şeye bakabilir ve hepsinde sudo apt install çalıştırabilirsiniz.

Seçenek B2: İkili dosyalarımı kullan

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

Adım C: piton kitaplıkları

Son olarak, lightgun python betiğim için destek malzemeleri alın:

sudo pip3 uinput numpy pygame opencv-python yükleyin

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

D Adımı: lightgun.py

Son olarak, lightgun python betiğimi alın:

cd ~

git klonu

Her şey yolunda gittiyse, artık ~/lightgun.py'ye sahipsiniz ve bu da hafif silahı kalibre etmek için kullanabilirsiniz.

Adım 4: Kalibrasyon Bölüm I: Kamerayı Ortalama

Kalibrasyon Bölüm I: Kamerayı Ortalama
Kalibrasyon Bölüm I: Kamerayı Ortalama
Kalibrasyon Bölüm I: Kamerayı Ortalama
Kalibrasyon Bölüm I: Kamerayı Ortalama
Kalibrasyon Bölüm I: Kamerayı Ortalama
Kalibrasyon Bölüm I: Kamerayı Ortalama

Kalibrasyonun iki yönü vardır. Birincisi, her Wiimote'de kameranın merkezini kalibre etmektir. Bu, TV ekranınızın etrafındaki LED'lerin, biri uzaktan kumanda sağ tarafı yukarı, diğeri ise baş aşağı olacak şekilde iki görüntüsünü çekmek için kamerayı kullanmayı gerektirir.

Wii Remote'u öne yatırdığınızda düğmelere basmaktan kaçınmak ve Wii Remote'un tutarlı bir yükseltiye sahip olmasını sağlamak için buraya eklediğim kalibrasyon aracını 3D olarak yazdırabilirsiniz. Temel olarak, Wii Remote ön tarafındayken altına koyabileceğiniz 10,5 mm kalınlığında şeylere ihtiyacınız var. Aslında plastikten tasarruf etmek için biraz hurda kontrplak kullandım.

LED'lerinizi açın ve Raspberry PI veya diğer bilgisayarınızın TV'de görüntülendiğinden emin olun. Bir klavye bağlayın (bu ssh üzerinden çalışmaz) veya VNC kullanın. O zaman koş:

python3 ~/lightgun/lightgun.py -M

Her şey yolunda giderse, Wii Remote'ta 1+2'ye basmanızı isteyen tam ekran bir görüntü elde edeceksiniz. Yap bunu. Wii Remote'ta ışıklar yanıp sönecek ve ardından ışıklar 1 ve 4 yanık kalacaktır. Wii Remote kameranın görünümü ile ekranın üst kısmında küçük bir yeşil dikdörtgen de göreceksiniz. Wii Remote'u LED'lere doğrultun ve her şey yolunda giderse 1'den 4'e kadar numaralandırılmış dört LED'i göreceksiniz.

Şimdi, TV ekranına işaret edebileceğiniz ve Wii Remote'un kenarda hizalanmış Wii Remote ile tüm LED'leri görmesini sağlayabilecek, sehpa gibi keskin kenarlı sağlam bir yüzey bulmanız gerekiyor. Wii Remote'u sağ tarafı yukarı, Remote'un tarafı yüzey kenarına hizalı olacak şekilde hizalayarak başlayın ve dört LED'in de görüldüğünden emin olun. Ardından klavyenizde SPACE tuşuna basın (veya daha uygunsa bir Nunchuck takın ve C tuşuna basın). Daha sonra Wii Remote'u döndürmeniz istenecektir. Şimdi, kalibrasyon aracını veya başka bir şeyi kullanarak yüzeyinizden 10,5 mm yukarı kaldırıldığından ve öncekiyle aynı konuma yakın olduğundan emin olun (örneğin, yüzeyinizin aynı kenarına hizalı). SPACE tuşuna tekrar basın.

Her şey yolunda giderse, şimdi LED kalibrasyon adımına gideceksiniz. Evet, bu karmaşık! Ama çok hassas bir hafif silahınız olacak. Sadece fiyat bu.

Not: Benim gibi TV'nin altında bir Wii'niz varsa, Wii'nin iki nedenden dolayı kapatılması gerekir: ilk olarak, Wii açıksa, Wiimote'a bağlanır ve ikincisi, sensör çubuğunun kızılötesi LED'leri parazite neden olur. bu proje. Benzer nedenlerle, Wii'yi kullanırken TV'nin etrafındaki LED'leri çıkarmak iyi bir fikirdir.

Adım 5: Kalibrasyon Adım II: LED'ler

Kalibrasyon Adımı II: LED'ler
Kalibrasyon Adımı II: LED'ler
Kalibrasyon Adımı II: LED'ler
Kalibrasyon Adımı II: LED'ler

Şimdi yazılıma LED'lerin TV'nin kenarında nerede olduğunu söylemeniz gerekiyor. TV'nin kenarında, biri seçili (parlak) ve üçü gri renkte olmak üzere dört ok gösteren bir kalibrasyon ekranı göreceksiniz. Ayarladığınız oku değiştirmek için +/- tuşlarını kullanırsınız.

Kenarın etrafındaki dört okun her biri için şunu yapın:

  1. okları mümkün olduğu kadar hassas bir şekilde ilgili LED'i gösterene kadar hareket ettirmek için Wiimote üzerinde sola/sağa basın;
  2. okun uzunluğunu değiştirmek için Wiimote üzerinde yukarı/aşağı basın, okun uzunluğu LED ile TV ekranının kenarı arasındaki mesafeyle eşleşene kadar; başka bir deyişle, okun uzunluğu, okun ucundan LED'e olan mesafeye eşit olmalıdır.

Dört okunuz doğru olduğunda (ve belki daha da erken), Wiimote'u ekrana doğrulttuğunuzda kırmızı bir artı işareti göreceksiniz. Olması gereken yerin burası olduğunu kontrol edebilirsiniz. (Wiimote'un tüm LED'leri görebileceği kadar uzakta olmanız gerektiğini unutmayın. Görüş alanında başka kızılötesi kaynaklarının olmaması da önemlidir. Televizyon sehpası.)

Son olarak, yalnızca dördüncü LED okundan + veya ilkinden - düğmesine bastığınızda görünen beşinci bir ok vardır (ve varsayılan olarak sıfır uzunluğa sahiptir, bu nedenle yalnızca bir pikseldir). Bu ok, çekimin Wii Remote'un kamerasının ne kadar yukarısında kaydedileceğini ayarlar. Sorun şu: Wii Remote'un üst yüzeyi boyunca nişan alacaksınız. Ancak kamera aslında Wii Remote'un önündeki siyah dikdörtgenin ortasında, bu yüzeyin biraz altında bulunuyor. Kameranın işaret ettiği çekimleri kaydetseydik, bunlar Wii Remote'un üst yüzeyinin yaklaşık 8 mm altına kaydedilirdi. Bunu, üst yüzeyi gördüğünüzde artı işaretinin merkezinin kamera tarafından gizlendiğine dikkat ederek kontrol edebilirsiniz.

Bununla yaşayabilir veya bu beşinci oku, çekimleri Wii Remote'un üst kısmıyla hizalamak için yazılım olarak büyütebilirsiniz veya demir manzaraları için 3B yazdırılabilir dosyaları bunu telafi edecek şekilde ayarlayabilirsiniz (ancak tazminat yalnızca TV'ye belirli bir mesafe). Yazılım hizalaması için kendim gittim.

Kalibrasyondan çıkmak ve tüm verileri ~/.wiilightgun dizinine kaydetmek için Wii Remote'ta HOME düğmesine basın.

Adım 6: Test Et ve Kullan

Test Et ve Kullan
Test Et ve Kullan
Test Et ve Kullan
Test Et ve Kullan
Test Et ve Kullan
Test Et ve Kullan

Muhtemelen şimdi hafif silahınızı denemek istersiniz. Sadece bir terminal öykünücüsünde (veya bir komut dosyasında) çalıştırın:

python3 ~/lightgun/lightgun.py -t

1+2 düğmelerine aynı anda basmanız gerekecek ve bundan sonra her şey yolunda giderse, lightgun.py çalıştığı sürece, lightgun iki düğmeli bir mutlak fareyi taklit edecektir. Tetik düğmesi fare düğmesi 1'dir ve A düğmesi fare düğmesi 2'dir. Çıkmak için ctrl-c tuşlarına basın.

Artık yalnızca emülatörlerinizi ve/veya oyunlarınızı mutlak bir fare ile çalışacak şekilde yapılandırmanız gerekiyor. Ne yazık ki, bu her zaman o kadar kolay olmayacak.

Deneyebileceğiniz eğlenceli bir şey, benim iminurnamez'in ördek-ördek-çekimi modum:

cd ~

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

NES oyunları için Retroarch'ta libretro fceumm çekirdeğini kullanıyorum. Seçenekler menüsüne gidin ve Zapper'ı dokunmatik ekran olacak şekilde yapılandırın. (Fceumm, mutlak konumlu fare yerine göreli bir hareket beklediğinden, fare olarak yapılandırmak aslında çalışmaz.)

Oyunlarınızı bir komut dosyasıyla başlatırsanız, oyunu veya öykünücüyü başlatan bölümü düzenleyerek şunları söyleyebilirsiniz:

python3 ~/lightgun/lightgun.py -t -B 30 "oyunu başlatma komutu"

Ardından oyunun ilk 30 saniyesinde (dolayısıyla -B 30 seçeneği), 1+2'yi basılı tutarak hafif silahınızı bağlayabilirsiniz.

Bu arada, lightgun.py betiği Retroarch ile genel Wii Remote oyunları için de kullanılabilir. Sadece -o seçeneğini ekleyin ve hafif silah işlevleri kapatılacak ve bunun yerine Wii Remote yatay olarak çalışacak ve üç düğme sırasıyla 1, 2 ve B olacak. Lightgun.py'nin eşlemelerinde, kodu okuyarak keşfedeceğiniz Retroarch ile ilgili başka işlevler vardır. Örneğin, eksi tuşu bir kaydırma işlevi görür ve dpad ile birlikte kaydetme ve yüklemeyi kontrol eder (yukarı/aşağı = kayıt numarasını değiştir; sol=geri yükle; sağ=kaydet).

Adım 7: Silah Kolu ve Nişan Alma

Silah Kolu ve Nişan Alma
Silah Kolu ve Nişan Alma
Silah Kolu ve Nişan Alma
Silah Kolu ve Nişan Alma
Silah Kolu ve Nişan Alma
Silah Kolu ve Nişan Alma

Wii Remote'u tek başına bir silah olarak kullanabilirsiniz, üst kısımda nişan alabilirsiniz. Bunun için ticari silah kovanlarından birini de satın alabilirsiniz. Ancak orijinal Wii Remote, görülebilir bir silah olarak kullanılamadığından, muhafazalar demir nişangahlarla gelmeme eğilimindedir ve demir nişangahlar isabetliliği büyük ölçüde artırır.

Basit bir üç parçalı 3D yazdırılabilir sistem tasarladım: tetiğin hemen arkasına oturan sürgülü bir tutamak (böylece biraz Star Trek Orijinal Serisi fazerine benziyor) ve kayar manzaralar. Yazdırılabilir dosyalar burada. Hurda ahşap pahasına plastikten tasarruf etmek istiyorsanız, benim yaptığımı da yapabilirsiniz ve tüm sapı yazdırmak yerine, sadece Wiimote'u tutan kısmı yazdırın ve tahta bir parçayı kesip vidalayın.

Görmek için, gözlerinizi manzaralara odaklayın. Arpacık tümseklerini gezgin tümsekleri arasında hizalayın, böylece her ikisindeki hava boşluğu eşit olur ve üç tümsek de eşit yükseklikte dışarı çıkar. Ardından hedefin ortasını tümseklerin üst kısmıyla hizalayın.

Not: Tümseklerin yüksekliği biraz eşitsizdir, arpacık tümsekleri biraz daha aşağıdadır, bu sayede 2,5 metrelik bir mesafeden (benim televizyona uzaklığım) onları gördüğünüzde görüş tümseklerinin yüksekliğini telafi eder. TV'ye olan önemli ölçüde farklı bir mesafeniz varsa, bunu OpenSCAD dosyalarına koyabilirsiniz. Bu ayar yine de yazıcı toleranslarının altında olabilir. Ayrıca, yazılımda dikey ayar yapmadıysanız, extraSightAdjust'ı -8 (milimetre olarak) civarında bir değere ayarlayarak yazılımdaki manzaralara biraz daha ayar ekleyebilirsiniz.

Adım 8: Kalibrasyon III (Opsiyonel): İnce Ayar

Daha fazla hassasiyet istiyorsanız, şunları çalıştırabilirsiniz:

python3 ~/lightgun/lightgun.py -d

(demo için) ve manzaraların artı işaretleriyle aynı hizada olup olmadığına dikkatlice bakın. Aksi takdirde, çıkın ve ~/.wiilightgun/wiimotecalibration'ı manuel olarak düzenleyin ve görüşü ayarlamak için kamera merkezinin x ve y koordinatlarını hafifçe değiştirin. Örneğin, silahım biraz sağa ateş ediyordu, bu yüzden x koordinatını 529'dan 525'e değiştirdim. Herkesin sayıları muhtemelen farklı olacaktır.

9. Adım: Ek: Algoritma

Ek: Algoritma
Ek: Algoritma

Fare öykünme kodu kabaca aşağıdaki gibi çalışır.

  • İşlem düğmesine basar.
  • Kameradan veri alın ve kamera merkezleme kalibrasyonu için ayarlayın.
  • Kamerada üçten az LED görünüyorsa:

    Son fare konumunu koru

  • Üç veya dört LED görünüyorsa:

    • Wiimote yönünü almak ve hangi LED kamera görüntüsünün hangi fiziksel LED'e karşılık geldiğini belirlemek için Wiimote ivmeölçer verilerini kullanın.
    • Dört LED görünüyorsa:

      • LED kamera görüntüleri ve LED konumları arasındaki homografiyi hesaplayın (ekran koordinatlarında).
      • Hangi ekran konumunun kamera görüş alanının merkezine karşılık geldiğini hesaplamak için homografiyi kullanın.
      • Görüş hattının altındaki sanal silah namlusunun merkezini ayarlamak için Y ayarı yapın. Bu biraz ağır bir algoritma ama işe yarıyor.
      • Fare konumunu ayarlanan ekran konumuna ayarlayın.
    • Üç LED görünüyorsa:

      • LED kamera görüntüleri ve fiziksel LED konumları arasındaki P3P sorununu çözmek için OpenCV kullanın. Bu, dört adede kadar çözüm üretir.
      • Başarılıysa:

        • Daha önce başarılı bir konum hesaplamamız varsa, eksik LED'i o LED'in en son gözlenen veya hesaplanan konumuna en yakın yapan çözümü seçin.
        • Daha önce başarılı bir konum hesaplamamız yoksa, ivmeölçer yönünü en iyi tahmin eden çözümü seçin.
        • Dördüncü LED'in nereye gitmesi gerektiğini hesaplamak için en iyi çözümü kullanın.
        • Gerisini dört LED durumda olduğu gibi yapın.
      • Başarılı değilse:

        Son fare konumunu koru

Önerilen: