Daftar Isi:

Akurat Wiimote Light Gun untuk Raspberry PI: 9 Langkah (dengan Gambar)
Akurat Wiimote Light Gun untuk Raspberry PI: 9 Langkah (dengan Gambar)

Video: Akurat Wiimote Light Gun untuk Raspberry PI: 9 Langkah (dengan Gambar)

Video: Akurat Wiimote Light Gun untuk Raspberry PI: 9 Langkah (dengan Gambar)
Video: Lightgun retrogaming with MiSTer and a Wiimote 2024, Juli
Anonim
Senjata Ringan Wiimote Akurat untuk Raspberry PI
Senjata Ringan Wiimote Akurat untuk Raspberry PI
Senjata Ringan Wiimote Akurat untuk Raspberry PI
Senjata Ringan Wiimote Akurat untuk Raspberry PI

Biasanya, Wii Remote yang digunakan sebagai senjata ringan tidak cukup akurat untuk game retro seperti NES Duck Hunt, karena Wii Remote sebenarnya tidak memilih titik di TV yang ditunjuknya. Tidak bisa! Wii Remote memiliki kamera inframerah di bagian depan yang melihat garis LED inframerah di bar sensor, tetapi tidak dapat mengetahui seberapa jauh (atau ke arah mana) TV dari bar atau seberapa besar TV. Emulator dan game mengatasi ini dengan menunjukkan tanda silang atau indikator penargetan lainnya, tetapi itu bukan pengalaman menembak target yang akurat.

Untuk membuat Wii Remote berfungsi sebagai light gun akurat yang dapat Anda lihat untuk memilih target di TV, diperlukan empat LED inframerah yang disusun dalam pola segi empat yang diketahui (bukan garis lurus) pada bidang yang sama dengan TV. Wii Remote kemudian melihat empat LED dan gambar kamera dapat digunakan untuk menghitung homografi yang memungkinkan kita mengetahui ke mana arah kamera.

Perangkat keras untuk proyek ini sederhana. Ada empat LED inframerah dalam wadah cetak 3D sederhana yang dapat direkatkan ke bagian atas dan bawah wadah TV dan dicolokkan ke pengisi daya USB. Plus, jika Anda tidak memiliki rumah senjata Wii, saya memiliki pegangan dan pemandangan cetak 3D sederhana yang dapat Anda pasang ke Wii Remote (meskipun untuk menghemat plastik, saya membuat campuran antara kayu dan plastik cetak 3D).

Perangkat lunak berbasis python lebih sulit dibuat daripada perangkat keras dan saat ini hanya untuk Linux. Ini mengkalibrasi LED dan Wii Remote dan kemudian menggunakan perhitungan homografi untuk meniru mouse absolut yang bekerja cukup baik di emulator fceumm NES Retroarch (dan mungkin beberapa emulator lain) pada Raspberry PI 3B+ saya.

Perlengkapan

  • Wii Jarak Jauh
  • Empat LED inframerah 940nm 5mm
  • Kabel USB lama dengan colokan tipe A yang berfungsi
  • Raspberry PI 3 atau komputer Linux lainnya dengan dukungan Bluetooth
  • Printer 3D dan filamen (opsional)

Langkah 1: Rantai LED Inframerah

Rantai LED Inframerah
Rantai LED Inframerah
Rantai LED Inframerah
Rantai LED Inframerah

Dapatkan kabel USB lama dengan soket pria tipe A yang berfungsi (biasanya kabel pengisi daya ponsel saya putus di ujung micro USB, jadi saya memiliki kabel sisa dengan soket pria tipe A yang berfungsi).. Sebenarnya, tidak apa-apa jika kabel datanya rusak. rusak selama saluran listrik bekerja. Potong ujung lainnya. Secara teori kabel merah harus +5V dan hitam harus di-ground, tetapi periksa dengan multimeter (colokkan ke pengisi daya, lalu periksa tegangan antara kabel merah dan hitam).

Karena LED inframerah memiliki penurunan tegangan sekitar 1,2-1.3V, saya hanya menyolder empat di antaranya secara seri ke kabel USB. Pastikan kabel yang Anda solder cukup panjang sehingga Anda dapat meletakkan LED di bagian bawah TV dan dua di bagian atas, dengan jarak horizontal yang cukup di antara LED (sekitar 10 inci atau lebih).

Lebih tepatnya untuk membuat loop LED:

  • solder sisi minus (katoda, kaki lebih pendek, dengan tepi rata) dari LED pertama ke kabel USB +5V
  • gabungkan sisi plus dari LED pertama (anoda, kaki lebih panjang, dengan tepi bulat) ke sisi minus dari LED kedua
  • ulangi untuk bergabung dengan LED kedua ke yang ketiga dan yang ketiga ke yang keempat
  • kemudian sambungkan sisi plus dari keempat LED dengan kabel ke kabel USB ground.

Agar lebih rapi, Anda bisa menggunakan heat shrink tubing saat melakukan penyambungan. Jika tidak, gunakan pita listrik untuk menghindari celana pendek.

Pastikan Anda tidak mengalami korsleting. Kemudian hubungkan ke pengisi daya USB dan periksa apakah memancarkan cahaya inframerah dengan melihat LED dengan kamera ponsel. (Banyak kamera ponsel sensitif terhadap inframerah.)

Langkah 2: Lampirkan ke TV

Lampirkan ke TV
Lampirkan ke TV
Lampirkan ke TV
Lampirkan ke TV
Lampirkan ke TV
Lampirkan ke TV

Sekarang, pasang dua LED ke bagian bawah TV dan dua ke sisi atas. Jarak horizontal harus sekitar sepuluh inci. Jika terlalu banyak, Anda mungkin memiliki masalah dengan bidang pandang kamera Wii Remote yang menangkap semuanya. Tetapi jika mereka terlalu dekat, maka intuisi geometris saya mengatakan Anda akan memiliki presisi yang lebih rendah.

Untuk pengujian, saya menempelkan LED dengan pita listrik, dan kemudian untuk koneksi permanen, saya merancang dan mencetak empat klip LED kecil yang rapi (file ada di sini) yang saya rekatkan ke TV. Anda harus membuat LED sedekat mungkin dengan bidang tampilan TV, tanpa bezel menghalanginya dari lokasi di mana Anda akan memotret.

Langkah 3: Instal Perangkat Lunak

Saat ini perangkat lunaknya hanya untuk Linux. Pengaturan berikut dirancang untuk Raspberry PI 3 dengan Raspbian Stretch. Sistem Linux lainnya akan memerlukan beberapa perubahan. Pada model sebelumnya, Anda memerlukan dongle Bluetooth dan Anda juga harus menjalankannya dari baris perintah:

sudo get-apt instal bluetooth

Langkah A: udev

Selanjutnya, buat file di /etc/udev/rules.d/wiimote.rules yang berisi satu baris:

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

Anda dapat melakukannya, misalnya, dengan editor teks atau dengan mengetikkan yang berikut di baris perintah:

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

Dan kemudian restart udev:

sudo /etc/init.d/udev restart

Langkah B: cwiid

Selanjutnya, Anda memerlukan paket cwiid saya yang dimodifikasi. Di sini menjadi sedikit berbulu karena idealnya Anda perlu membangunnya di Raspberry PI Anda, tetapi saya harus mengakui bahwa saya telah kehilangan jejak paket apa yang perlu Anda instal untuk membuatnya berfungsi. Ada tiga opsi untuk melakukan ini.

Opsi B1: Bangun dirimu sendiri

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

Sayangnya, ada kemungkinan besar Anda kehilangan banyak hal yang diperlukan untuk membangun ini, dan./configure akan mengeluh. Anda dapat melihat semua hal yang dikeluhkannya dan menjalankan Sudo apt install pada semuanya.

Opsi B2: Gunakan binari saya

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

Langkah C: pustaka python

Akhirnya, dapatkan hal-hal dukungan untuk skrip python lightgun saya:

sudo pip3 install 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

Langkah D: lightgun.py

Akhirnya, dapatkan skrip python lightgun saya:

cd ~

git clone

Jika semuanya berjalan dengan baik, Anda sekarang memiliki ~/lightgun.py yang dapat Anda gunakan untuk mengkalibrasi lightgun.

Langkah 4: Kalibrasi Bagian I: Memusatkan Kamera

Kalibrasi Bagian I: Memusatkan Kamera
Kalibrasi Bagian I: Memusatkan Kamera
Kalibrasi Bagian I: Memusatkan Kamera
Kalibrasi Bagian I: Memusatkan Kamera
Kalibrasi Bagian I: Memusatkan Kamera
Kalibrasi Bagian I: Memusatkan Kamera

Ada dua aspek untuk kalibrasi. Yang pertama adalah mengkalibrasi bagian tengah kamera pada setiap Wiimote. Ini memerlukan penggunaan kamera untuk mengambil dua gambar LED di sekitar layar TV Anda, satu dengan remote sisi kanan menghadap ke atas dan yang lainnya dengan posisi terbalik.

Untuk menghindari menekan tombol saat Anda meletakkan Wii Remote di bagian depannya, dan untuk membuat Wii Remote memiliki ketinggian yang konsisten, Anda dapat mencetak alat kalibrasi 3D yang saya sertakan di sini. Pada dasarnya Anda membutuhkan benda setebal 10.5mm yang dapat Anda letakkan di bawah Wii Remote saat diletakkan di bagian depannya. Saya sebenarnya menggunakan beberapa kayu lapis bekas untuk menghemat plastik.

Nyalakan LED Anda dan pastikan Raspberry PI Anda atau komputer lain ditampilkan di TV. Hubungkan keyboard (ini tidak akan berfungsi melalui ssh) atau gunakan VNC. Lalu lari:

python3 ~/lightgun/lightgun.py -M

Jika semuanya berjalan dengan baik, Anda akan mendapatkan tampilan layar penuh yang meminta Anda untuk menekan 1+2 pada Wii Remote. Lakukan itu. Lampu akan berkedip di Wii Remote, lalu lampu 1 dan 4 akan tetap menyala. Anda juga akan melihat persegi panjang hijau kecil di bagian atas layar, dengan pemandangan dari kamera Wii Remote. Arahkan Wii Remote ke LED dan jika semuanya berjalan dengan baik, Anda akan melihat empat LED, bernomor 1 hingga 4.

Sekarang Anda perlu menemukan permukaan yang kokoh dengan tepi yang tajam, seperti meja kopi, yang dapat Anda arahkan ke layar TV dan yang memungkinkan Wii Remote melihat semua LED dengan Wii Remote sejajar dengan tepi. Mulailah dengan menyelaraskan sisi kanan Wii Remote ke atas, dengan sisi Remote sejajar dengan tepi permukaan, memastikan keempat LED terlihat. Kemudian tekan SPACE pada keyboard Anda (atau pasang Nunchuck dan tekan C jika itu lebih nyaman). Anda kemudian akan diminta untuk memutar Wii Remote. Sekarang, pastikan itu ditinggikan 10,5 mm dari permukaan Anda, menggunakan alat kalibrasi atau sesuatu yang lain, dan sedekat mungkin dengan lokasi yang sama seperti sebelumnya (misalnya, sejajar dengan tepi yang sama dari permukaan Anda). Tekan SPASI lagi.

Jika semuanya berjalan dengan baik, Anda sekarang akan pergi ke langkah kalibrasi LED. Ya, ini rumit! Tapi Anda akan memiliki lightgun yang sangat tepat. Itu saja harganya.

Catatan: Jika seperti saya, Anda memiliki Wii di bawah TV, Wii perlu dimatikan karena dua alasan: pertama, jika Wii aktif, ia akan terhubung ke Wiimote dan, kedua, LED inframerah bilah sensor akan mengganggu proyek ini. Untuk alasan yang sama, saat Anda menggunakan Wii, sebaiknya cabut LED di sekitar TV.

Langkah 5: Kalibrasi Langkah II: LED

Langkah Kalibrasi II: LED
Langkah Kalibrasi II: LED
Langkah Kalibrasi II: LED
Langkah Kalibrasi II: LED

Sekarang Anda perlu memberi tahu perangkat lunak di mana LED berada di sekitar tepi TV. Anda akan melihat layar kalibrasi yang menampilkan empat panah, salah satunya dipilih (terang) dan tiga di antaranya berwarna abu-abu, di sekitar tepi TV. Anda menggunakan +/- untuk beralih untuk mengubah panah mana yang Anda sesuaikan.

Untuk masing-masing dari empat panah di sekitar tepi, lakukan ini:

  1. tekan kiri/kanan pada Wiimote untuk menggerakkan panah hingga mengarah setepat mungkin ke arah LED yang sesuai;
  2. tekan atas/bawah pada Wiimote untuk mengubah panjang panah hingga panjang panah sesuai dengan jarak antara LED dan tepi layar TV; dengan kata lain, panjang panah harus sama dengan jarak dari ujung panah ke LED.

Setelah keempat panah Anda benar (dan mungkin bahkan lebih awal), Anda akan melihat garis bidik merah saat Anda mengarahkan Wiimote ke layar. Anda dapat memeriksa bahwa ini adalah tempat yang seharusnya. (Ingat bahwa Anda harus cukup jauh agar Wiimote dapat melihat semua LED. Penting juga bahwa tidak ada sumber inframerah lain di bidang pandang. Saya pernah mengalami masalah karena sinar matahari yang terpantul dari kepala sekrup pada rak TV.)

Terakhir, ada panah kelima, yang hanya muncul saat Anda menekan + dari panah LED keempat atau - dari panah pertama (dan secara default memiliki panjang nol, jadi itu hanya piksel). Panah ini menyesuaikan seberapa jauh di atas kamera Wii Remote, bidikan akan didaftarkan. Masalahnya adalah ini: Anda akan melihat di sepanjang permukaan atas Wii Remote. Namun kamera sebenarnya terletak agak jauh di bawah permukaan itu, di tengah persegi panjang hitam di depan Wii Remote. Jika kami mendaftarkan bidikan yang diarahkan kamera, bidikan tersebut akan direkam sekitar 8 mm di bawah permukaan atas Wii Remote. Anda dapat memeriksanya dengan mencatat bahwa saat Anda melihat di sepanjang permukaan atas, bagian tengah garis silang disembunyikan oleh kamera.

Anda dapat hidup dengan ini, atau Anda dapat menumbuhkan panah kelima ini ke perangkat lunak menyelaraskan bidikan dengan bagian atas Wii Remote, atau Anda dapat menyesuaikan file cetak 3D untuk pemandangan besi untuk mengimbangi ini (tetapi kompensasi hanya akan berfungsi untuk satu jarak tertentu ke TV). Saya pergi untuk penyelarasan perangkat lunak sendiri.

Tekan HOME pada Wii Remote untuk keluar dari kalibrasi dan menyimpan semua data ke direktori ~/.wiilightgun.

Langkah 6: Uji dan Gunakan

Uji dan Gunakan
Uji dan Gunakan
Uji dan Gunakan
Uji dan Gunakan
Uji dan Gunakan
Uji dan Gunakan

Anda mungkin ingin mencoba senjata ringan Anda sekarang. Jalankan saja di emulator terminal (atau skrip):

python3 ~/lightgun/lightgun.py -t

Anda perlu menekan tombol 1+2 secara bersamaan, dan setelah itu jika semuanya berjalan dengan baik, selama lightgun.py berjalan, lightgun akan meniru mouse absolut dua tombol. Tombol pemicu adalah tombol mouse 1, dan tombol A adalah tombol mouse 2. Tekan ctrl-c untuk keluar.

Anda sekarang hanya perlu mengonfigurasi emulator dan/atau game Anda untuk bekerja dengan mouse absolut. Sayangnya, itu tidak selalu akan semudah itu.

Satu hal menyenangkan yang mungkin Anda coba adalah mod bebek-bebek-menembak iminurnamez saya:

cd ~

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

Untuk game NES, saya menggunakan libretro fceumm core di Retroarch. Buka menu Opsi, dan konfigurasikan Zapper menjadi layar sentuh. (Mengonfigurasinya sebagai mouse sebenarnya tidak berfungsi, karena fceumm mengharapkan gerakan relatif daripada mouse posisi absolut.)

Jika Anda memulai game dengan skrip, Anda dapat mengedit bagian yang memulai game atau emulator untuk mengatakan:

python3 ~/lightgun/lightgun.py -t -B 30 "perintah untuk memulai permainan"

Kemudian selama 30 detik pertama eksekusi game (karenanya opsi -B 30), Anda dapat menghubungkan lightgun Anda dengan menahan 1+2.

Omong-omong, skrip lightgun.py juga dapat digunakan untuk game Wii Remote umum dengan Retroarch. Cukup tambahkan opsi -o dan fungsi lightgun akan dimatikan, dan sebagai gantinya Wii Remote akan bekerja secara horizontal, dengan tiga tombol masing-masing adalah 1, 2 dan B. Ada fungsi terkait Retroarch lainnya dalam pemetaan lightgun.py yang akan Anda temukan dengan membaca kode. Misalnya, tombol minus bertindak sebagai shift, dan bersama-sama dengan dpad mengontrol penyimpanan dan pemuatan (atas/bawah = ubah nomor simpan; kiri=kembalikan; kanan=simpan).

Langkah 7: Pegangan Senjata dan Bidik

Pegangan dan Pembidik Pistol
Pegangan dan Pembidik Pistol
Pegangan dan Pembidik Pistol
Pegangan dan Pembidik Pistol
Pegangan dan Pembidik Pistol
Pegangan dan Pembidik Pistol

Anda dapat menggunakan Wii Remote dengan sendirinya sebagai senjata, terlihat di bagian atas. Anda juga dapat membeli salah satu selongsong senjata komersial untuk itu. Tetapi karena Wii Remote asli tidak dapat digunakan sebagai senjata yang dapat dilihat, casingnya cenderung tidak dilengkapi dengan pelindung besi, dan bidikan besi sangat meningkatkan akurasi.

Saya merancang sistem 3D-printable tiga bagian sederhana: pegangan slide-on yang berada tepat di belakang pelatuk (sehingga terlihat sedikit seperti phaser Star Trek Original Series), dan pemandangan slide-on. File yang dapat dicetak ada di sini. Jika Anda ingin menghemat plastik dengan mengorbankan kayu bekas, Anda juga dapat melakukan apa yang saya lakukan dan alih-alih mencetak seluruh pegangan, cetak hanya bagian yang menahan Wiimote, dan potong sepotong kayu dan kencangkan.

Untuk melihat, fokuskan mata Anda pada pemandangan. Sejajarkan tonjolan pandangan depan di antara tonjolan pandangan belakang sehingga ruang udara di keduanya sama dan ketiga tonjolan menonjol sama tinggi. Kemudian sejajarkan bagian tengah target dengan bagian atas gundukan.

Catatan: Ketinggian tonjolan sedikit tidak seimbang, dengan tonjolan penglihatan depan sedikit lebih rendah, untuk mengimbangi ketinggian tonjolan penglihatan itu sendiri saat Anda melihatnya pada jarak 2,5 meter (jarak saya ke TV). Jika Anda memiliki jarak yang sangat berbeda ke TV, Anda dapat memasukkannya ke dalam file OpenSCAD. Penyesuaian ini mungkin di bawah toleransi printer. Juga, jika Anda tidak melakukan penyesuaian vertikal dalam perangkat lunak, Anda dapat menambahkan beberapa penyesuaian lagi pada pemandangan di perangkat lunak dengan menyetel extraSightAdjust ke sekitar -8 (dalam milimeter).

Langkah 8: Kalibrasi III (Opsional): Penyesuaian Halus

Jika Anda ingin lebih presisi, Anda dapat menjalankan:

python3 ~/lightgun/lightgun.py -d

(untuk demo) dan perhatikan baik-baik apakah pemandangannya sejajar dengan garis silang. Jika tidak, keluar dan edit secara manual ~/.wiilightgun/wiimotecalibration, dan atur koordinat x dan y dari pusat kamera sedikit untuk menyesuaikan penampakan. Misalnya, pistol saya menembak sedikit ke kanan, jadi saya akhirnya mengubah koordinat x dari 529 menjadi 525. Nomor setiap orang mungkin akan berbeda.

Langkah 9: Lampiran: Algoritma

Lampiran: Algoritma
Lampiran: Algoritma

Kode emulasi mouse bekerja kira-kira sebagai berikut.

  • Proses penekanan tombol.
  • Dapatkan data dari kamera dan sesuaikan untuk kalibrasi pemusatan kamera.
  • Jika kurang dari tiga LED terlihat di kamera:

    Pertahankan posisi mouse terakhir

  • Jika tiga atau empat LED terlihat:

    • Gunakan data akselerometer Wiimote untuk mendapatkan orientasi Wiimote dan mengidentifikasi gambar kamera LED mana yang sesuai dengan LED fisik mana.
    • Jika empat LED terlihat:

      • Hitung homografi antara gambar kamera LED dan lokasi LED (dalam koordinat layar).
      • Gunakan homografi untuk menghitung lokasi layar yang sesuai dengan pusat bidang pandang kamera.
      • Lakukan penyesuaian Y untuk menyesuaikan pusat laras senapan virtual di bawah garis pandang. Ini adalah algoritma yang agak kikuk tetapi berhasil.
      • Atur posisi mouse ke lokasi layar yang disesuaikan.
    • Jika tiga LED terlihat:

      • Gunakan OpenCV untuk memecahkan masalah P3P antara gambar kamera LED dan lokasi fisik LED. Ini menghasilkan hingga empat solusi.
      • Jika berhasil:

        • Jika kita memiliki perhitungan lokasi yang berhasil sebelumnya, pilih solusi yang membuat LED yang hilang paling dekat dengan posisi terakhir yang diamati atau dihitung dari LED tersebut.
        • Jika sebelumnya kami tidak memiliki perhitungan lokasi yang berhasil, pilih solusi yang paling baik memprediksi arah akselerometer.
        • Gunakan solusi terbaik untuk menghitung ke mana LED keempat harus pergi.
        • Lakukan sisanya seperti pada empat kotak LED.
      • Jika tidak berhasil:

        Pertahankan posisi mouse terakhir

Direkomendasikan: