Isi kandungan:

Pistol Ringan Wiimote yang Tepat untuk Raspberry PI: 9 Langkah (dengan Gambar)
Pistol Ringan Wiimote yang Tepat untuk Raspberry PI: 9 Langkah (dengan Gambar)

Video: Pistol Ringan Wiimote yang Tepat untuk Raspberry PI: 9 Langkah (dengan Gambar)

Video: Pistol Ringan Wiimote yang Tepat untuk Raspberry PI: 9 Langkah (dengan Gambar)
Video: MAME Tutorial - How To Set Up Light Gun Controls for the Mouse || MAME Emulator How To 2024, Julai
Anonim
Pistol Ringan Wiimote tepat untuk Raspberry PI
Pistol Ringan Wiimote tepat untuk Raspberry PI
Pistol Ringan Wiimote tepat untuk Raspberry PI
Pistol Ringan Wiimote tepat untuk Raspberry PI

Biasanya, Wii Remote yang digunakan sebagai senjata ringan tidak cukup tepat untuk permainan retro seperti NES Duck Hunt, kerana Wii Remote sebenarnya tidak memilih titik di TV yang ditunjukkannya. Tidak boleh! Wii Remote mempunyai kamera inframerah di depannya yang melihat garis LED inframerah di bar sensor, tetapi tidak dapat mengetahui sejauh mana (atau ke arah mana) TV dari bar atau seberapa besar TV. Emulator dan permainan mengatasi ini dengan menunjukkan rambut silang atau penunjuk sasaran lain, tetapi itu bukan pengalaman menembak sasaran yang tepat.

Untuk menjadikan Wii Remote berfungsi sebagai senapang cahaya tepat yang dapat anda lihat untuk memilih sasaran di TV memerlukan empat LED inframerah yang disusun dalam corak segiempat yang diketahui (bukan garis lurus) dalam satah yang sama dengan TV. Wii Remote kemudian melihat keempat LED dan gambar kamera boleh digunakan untuk mengira homografi yang membolehkan kita mengetahui di mana kamera menunjuk.

Perkakasan untuk projek ini mudah. Terdapat empat LED inframerah di ruang cetakan 3D sederhana yang dapat dilekatkan ke bahagian atas dan bawah perumahan TV dan pasangkan ke pengecas USB. Selain itu, sekiranya anda tidak mempunyai perumahan senjata Wii, saya mempunyai pemegang dan pemandangan dicetak 3D yang mudah yang anda boleh pasangkan pada Wii Remote (walaupun untuk menyimpan plastik, saya menjadikannya kacukan antara kayu dan plastik cetak 3D).

Perisian berasaskan python lebih sukar dibuat daripada perkakasan dan pada masa ini hanya menggunakan Linux. Ia mengkalibrasi LED dan Wii Remote dan kemudian menggunakan pengiraan homografi untuk meniru tetikus mutlak yang berfungsi dengan baik dalam emulator fesumm NES Retroarch (dan mungkin beberapa emulator lain) pada Raspberry PI 3B + saya.

Bekalan

  • Wii Jauh
  • Empat LED inframerah 940nm 5mm
  • Kabel USB lama dengan palam jenis A yang berfungsi
  • Raspberry PI 3 atau komputer Linux lain dengan sokongan Bluetooth
  • Pencetak dan filamen 3D (pilihan)

Langkah 1: Rantai LED Inframerah

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

Dapatkan kabel USB lama dengan soket lelaki jenis A yang berfungsi (biasanya kabel pengecas telefon saya pecah pada hujung USB mikro, jadi saya mempunyai kabel yang tersisa dengan soket lelaki jenis A yang berfungsi). Sebenarnya, tidak mengapa jika kabel data patah selagi talian kuasa berfungsi. Potong hujung yang lain. Secara teori kabel merah harus + 5V dan hitam harus dibumikan, tetapi periksa dengan multimeter (pasangkan ke pengecas, dan kemudian periksa voltan antara wayar merah dan hitam).

Oleh kerana LED inframerah mengalami penurunan voltan 1.2-1.3V, saya hanya menyolder empat daripadanya dalam rangkaian gelung ke kabel USB. Pastikan wayar yang anda solder cukup panjang sehingga anda boleh meletakkan LED di bahagian bawah TV dan dua di bahagian atas, dengan ruang mendatar yang mencukupi antara LED (kira-kira 10 inci atau lebih).

Lebih tepat untuk membuat gelung LED:

  • pateri sisi tolak (katod, kaki lebih pendek, dengan tepi rata) LED pertama ke wayar USB + 5V
  • bergabung dengan sisi positif LED pertama (anod, kaki lebih panjang, dengan tepi bulat) ke sisi minus LED kedua
  • ulang untuk bergabung dengan LED kedua hingga ketiga dan ketiga hingga keempat
  • kemudian sambungkan sisi tambah LED keempat dengan wayar ke wayar USB pembumian.

Untuk menjadikan sesuatu lebih kemas, anda boleh menggunakan tiub pengecutan panas semasa melakukan sambungan. Jika tidak, gunakan pita elektrik untuk mengelakkan seluar pendek.

Pastikan anda tidak mempunyai litar pintas. Kemudian pasangkannya ke pengecas USB dan periksa bahawa ia memancarkan cahaya inframerah dengan melihat LED dengan kamera telefon. (Banyak kamera telefon sensitif inframerah.)

Langkah 2: Pasang ke TV

Pasang ke TV
Pasang ke TV
Pasang ke TV
Pasang ke TV
Pasang ke TV
Pasang ke TV

Sekarang, pasangkan dua LED ke bahagian bawah TV dan dua ke bahagian atas. Jarak mendatar hendaklah lebih kurang sepuluh inci. Sekiranya terlalu banyak, anda mungkin menghadapi masalah dengan bidang pandangan kamera Wii Remote yang menangkap semuanya. Tetapi jika mereka terlalu dekat, maka intuisi geometri saya mengatakan bahawa anda mempunyai ketepatan yang lebih rendah.

Untuk ujian, saya mengetuk LED dengan pita elektrik, dan kemudian untuk sambungan kekal, saya merancang dan mencetak empat klip LED kecil yang kemas (fail ada di sini) yang saya terpaku panas ke TV. Anda harus menjadikan LED sedekat mungkin dengan bidang layar TV, tanpa bezel mengaburkannya dari lokasi di mana anda akan mengambil gambar.

Langkah 3: Pasang Perisian

Pada masa ini perisian hanya Linux. Persediaan berikut dirancang untuk Raspberry PI 3 dengan Raspbian Stretch. Sistem Linux lain akan memerlukan beberapa perubahan. Pada model terdahulu, anda memerlukan dongle Bluetooth dan anda juga perlu menjalankannya dari baris arahan juga:

sudo get-apt pasang bluetooth

Langkah A: udev

Seterusnya, buat fail di /etc/udev/rules.d/wiimote.rules yang mengandungi satu baris:

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

Anda boleh melakukannya, misalnya, dengan penyunting teks atau dengan mengetik yang berikut pada baris perintah:

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

Dan kemudian mulakan semula udev:

sudo /etc/init.d/udev mulakan semula

Langkah B: cwiid

Seterusnya, anda memerlukan pakej cwiid saya yang telah diubah suai. Di sini ia menjadi sedikit berbulu kerana anda perlu membuatnya di Raspberry PI anda, tetapi saya harus mengakui bahawa saya telah kehilangan pakej apa yang perlu anda pasang untuk membuatnya berfungsi. Terdapat tiga pilihan untuk melakukan ini.

Pilihan B1: Bina diri anda

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

Malangnya, ada kemungkinan besar anda kehilangan banyak barang yang diperlukan untuk membina ini, dan./configure akan mengeluh. Anda boleh melihat semua perkara yang diadukan dan menjalankan pemasangan sudo apt pada semua itu.

Pilihan 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 buat pasang

Langkah C: perpustakaan python

Akhirnya, dapatkan bahan sokongan untuk skrip lightgun python saya:

sudo pip3 pasang 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 klon

Sekiranya semuanya berjalan lancar, kini anda mempunyai ~ / lightgun.py yang boleh anda gunakan untuk menentukur senapang cahaya.

Langkah 4: Penentukuran Bahagian I: Memusatkan Kamera

Kalibrasi Bahagian I: Memusatkan Kamera
Kalibrasi Bahagian I: Memusatkan Kamera
Kalibrasi Bahagian I: Memusatkan Kamera
Kalibrasi Bahagian I: Memusatkan Kamera
Kalibrasi Bahagian I: Memusatkan Kamera
Kalibrasi Bahagian I: Memusatkan Kamera

Terdapat dua aspek untuk penentukuran. Yang pertama adalah menentukurkan bahagian tengah kamera pada setiap Wiimote. Ini memerlukan penggunaan kamera untuk mengambil dua gambar LED di sekitar skrin TV anda, satu dengan jarak jauh sebelah kanan dan satu lagi dengan terbalik.

Untuk mengelakkan menekan butang semasa meletakkan Wii Remote di bahagian depannya, dan untuk memastikan Wii Remote mempunyai ketinggian yang konsisten, anda boleh mencetak 3D alat penentukuran yang saya sertakan di sini. Anda pada dasarnya memerlukan barang setebal 10.5mm yang boleh anda letakkan di bawah Wii Remote apabila terletak di bahagian depannya. Saya sebenarnya menggunakan sebilangan papan lapis sekerap untuk menjimatkan plastik.

Hidupkan LED anda dan pastikan Raspberry PI atau komputer lain anda dipaparkan di TV. Sambungkan papan kekunci (ini tidak akan berfungsi melebihi ssh) atau gunakan VNC. Kemudian jalankan:

python3 ~ / lightgun / lightgun.py -M

Sekiranya semuanya berjalan lancar, anda akan mendapat paparan skrin penuh yang meminta anda menekan 1 + 2 pada Wii Remote. Berbuat demikian. Lampu akan menyala di Wii Remote, dan kemudian lampu 1 dan 4 akan menyala. Anda juga akan melihat persegi panjang hijau kecil di bahagian atas skrin, dengan pemandangan dari kamera Wii Remote. Arahkan Wii Remote ke LED dan jika semuanya berjalan lancar, anda akan melihat keempat LED, bernombor 1 hingga 4.

Sekarang anda perlu mencari permukaan yang padat dengan tepi yang tajam, seperti meja kopi, yang anda boleh tunjuk pada skrin TV dan yang membolehkan Wii Remote melihat semua LED dengan Jarak Jauh Wii sejajar dengan tepi. Mulailah dengan menjajarkan Wii Remote sebelah kanan ke atas, dengan sisi Remote sejajar dengan tepi permukaan, memastikan keempat-empat LED dilihat. Kemudian tekan SPACE pada papan kekunci anda (atau pasangkan Nunchuck dan tekan C jika itu lebih mudah). Anda kemudian akan diminta untuk memutar Wii Remote. Sekarang, pastikan ketinggiannya 10.5 mm dari permukaan anda, menggunakan alat penentukuran atau yang lain, dan berada di lokasi yang hampir sama dengan sebelumnya (mis., Sejajar dengan tepi permukaan anda yang sama). Tekan SPACE sekali lagi.

Sekiranya semuanya berjalan lancar, anda kini akan menuju ke langkah penentukuran LED. Yup, ini rumit! Tetapi anda akan mempunyai senapang cahaya yang sangat tepat. Itu sahaja harganya.

Catatan: Sekiranya seperti saya, anda mempunyai Wii di bawah TV, Wii perlu dimatikan kerana dua sebab: pertama, jika Wii dihidupkan, ia akan menyambung ke Wiimote dan, kedua, LED inframerah bar sensor akan mengganggu projek ini. Atas sebab yang sama, semasa anda menggunakan Wii, adalah idea yang baik untuk mencabut LED di TV.

Langkah 5: Penentukuran Langkah II: LED

Langkah Penentukuran II: LED
Langkah Penentukuran II: LED
Langkah Penentukuran II: LED
Langkah Penentukuran II: LED

Sekarang anda perlu memberitahu perisian di mana LED berada di sekitar tepi TV. Anda akan melihat skrin penentukuran yang menunjukkan empat anak panah, salah satunya dipilih (terang) dan tiga daripadanya berwarna kelabu, di sekitar tepi TV. Anda menggunakan +/- untuk beralih untuk menukar anak panah mana yang anda sesuaikan.

Untuk setiap empat anak panah di sekitar tepi, lakukan ini:

  1. tekan kiri / kanan di Wiimote untuk menggerakkan anak panah sehingga mereka menunjuk dengan tepat ke arah LED yang sesuai;
  2. tekan atas / bawah pada Wiimote untuk mengubah panjang anak panah sehingga panjang anak panah sepadan dengan jarak antara LED dan tepi paparan TV; dengan kata lain, panjang anak panah perlu sama dengan jarak dari hujung anak panah ke LED.

Setelah empat anak panah anda betul (dan mungkin lebih awal) anda akan melihat rambut merah ketika anda menunjuk Wiimote di skrin. Anda boleh memastikan bahawa ini adalah tempat yang sepatutnya. (Ingat bahawa anda perlu berada cukup jauh sehingga Wiimote dapat melihat semua LED. Juga penting bahawa tidak ada sumber inframerah lain di bidang pandangan. Saya pernah menghadapi masalah kerana cahaya matahari memantulkan kepala skru pada Pendirian TV.)

Akhirnya, ada anak panah kelima, yang hanya muncul apabila anda menekan + dari anak panah LED keempat atau - dari yang pertama (dan secara lalai ia mempunyai panjang sifar, jadi hanya piksel). Anak panah ini menyesuaikan sejauh mana di atas kamera Wii Remote, gambar akan didaftarkan. Masalahnya ialah: anda akan melihat sepanjang permukaan atas Wii Remote. Tetapi kamera sebenarnya terletak beberapa jarak di bawah permukaan itu, di tengah-tengah segi empat tepat hitam di bahagian depan Wii Remote. Sekiranya kita mendaftarkan gambar di mana kamera menunjuk, gambar tersebut akan didaftarkan sekitar 8 mm di bawah permukaan atas Wii Remote. Anda boleh memeriksanya dengan melihat bahawa ketika anda melihat di permukaan atas, bahagian tengah rambut disembunyikan oleh kamera.

Anda boleh hidup dengan ini, atau anda dapat mengembangkan anak panah kelima ini untuk perisian menyelaraskan tangkapan dengan bahagian atas Wii Remote, atau anda boleh menyesuaikan fail cetak 3D untuk pemandangan besi untuk mengimbangi ini (tetapi pampasan hanya akan berfungsi untuk satu jarak tertentu ke TV). Saya sendiri mencari penjajaran perisian.

Tekan HOME pada Wii Remote untuk keluar dari penentukuran 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 mahu mencuba senapang ringan anda sekarang. Hanya jalankan dalam emulator terminal (atau skrip):

python3 ~ / lightgun / lightgun.py -t

Anda perlu menekan butang 1 + 2 pada masa yang sama, dan selepas itu jika semuanya berjalan lancar, selagi lightgun.py berjalan, lightgun akan meniru tetikus mutlak dua butang. Butang pemicu adalah butang tetikus 1, dan butang A adalah butang tetikus 2. Tekan ctrl-c untuk keluar.

Anda sekarang hanya perlu mengkonfigurasi emulator dan / atau permainan anda untuk berfungsi dengan tetikus mutlak. Malangnya, itu tidak semudah itu.

Satu perkara yang menyeronokkan yang anda boleh cuba ialah mod pemotretan bebek iminurnamez saya:

cd ~

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

Untuk permainan NES, saya menggunakan inti libretro fceumm di Retroarch. Pergi ke menu Pilihan, dan konfigurasikan Zapper untuk menjadi skrin sentuh. (Mengonfigurasikannya sebagai tetikus sebenarnya tidak berfungsi, kerana fceumm mengharapkan pergerakan relatif daripada tetikus kedudukan mutlak.)

Sekiranya anda memulakan permainan anda dengan skrip, anda boleh mengedit bahagian yang memulakan permainan atau emulator dengan mengatakan:

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

Kemudian selama 30 saat pertama pelaksanaan permainan (maka pilihan -B 30), anda boleh menyambungkan senapang cahaya anda dengan menahan 1 + 2.

By the way, skrip lightgun.py juga dapat digunakan untuk permainan Wii Remote umum dengan Retroarch. Cukup tambahkan pilihan -o dan fungsi lightgun akan dimatikan, dan sebaliknya Wii Remote akan berfungsi secara mendatar, dengan tiga butang masing-masing 1, 2 dan B. Terdapat fungsi lain yang berkaitan dengan Retroarch dalam pemetaan lightgun.py yang akan anda temui dengan membaca kodnya. Sebagai contoh, kunci tolak bertindak sebagai shift, dan bersama-sama dengan dpad mengawal simpanan dan pemuatan (atas / bawah = ubah nombor simpan; kiri = pulihkan; kanan = simpan).

Langkah 7: Pegangan dan Tujuan Gun

Pegangan dan Tujuan Gun
Pegangan dan Tujuan Gun
Pegangan dan Tujuan Gun
Pegangan dan Tujuan Gun
Pegangan dan Tujuan Gun
Pegangan dan Tujuan Gun

Anda boleh menggunakan Wii Remote dengan sendirinya sebagai pistol, melihat di bahagian atas. Anda juga boleh membeli salah satu selongsong senjata komersial untuknya. Tetapi kerana Wii Remote yang asli tidak dapat digunakan sebagai pistol yang dapat dilihat, selongsong cenderung tidak dilengkapi dengan pemandangan besi, dan pemandangan besi sangat meningkatkan ketepatan.

Saya merancang sistem tiga bahagian 3D yang mudah dicetak: pemegang slaid on yang terletak tepat di belakang pencetus (jadi ia kelihatan seperti phaser Star Trek Original Series), dan pemandangan slaid-on. Fail yang boleh dicetak ada di sini. Sekiranya anda ingin menjimatkan plastik dengan mengorbankan kayu sekerap, anda juga boleh melakukan apa yang saya lakukan dan bukannya mencetak keseluruhan pemegangnya, cetak hanya bahagian yang memegang Wiimote, dan potong sekeping kayu dan pasangkannya.

Untuk melihat, fokuskan mata anda ke pemandangan. Sejajarkan lebam penglihatan depan antara lebam penglihatan belakang sehingga ruang udara pada kedua-duanya sama dan ketiga-tiga lebam melekat sama tinggi. Kemudian sejajarkan bahagian tengah sasaran dengan bahagian atas lebam.

Catatan: Ketinggian lebam sedikit tidak sama, dengan lebam penglihatan depan sedikit lebih rendah, untuk mengimbangi ketinggian penglihatan yang membongkok sendiri ketika anda melihat sepanjang jarak 2.5 meter (jarak saya ke TV). Sekiranya anda mempunyai jarak yang jauh dari TV, anda boleh memasukkannya ke dalam fail OpenSCAD. Bagaimanapun, penyesuaian ini mungkin di bawah toleransi pencetak. Juga, jika anda tidak melakukan penyesuaian menegak dalam perisian, anda dapat menambahkan lagi penyesuaian pada pemandangan dalam perisian dengan menetapkan extraSightAdjust pada sesuatu sekitar -8 (dalam milimeter).

Langkah 8: Penentukuran III (Pilihan): Penyesuaian Halus

Sekiranya anda mahukan lebih banyak ketepatan, anda boleh menjalankan:

python3 ~ / lightgun / lightgun.py -d

(untuk demo) dan perhatikan dengan teliti sama ada pemandangan sesuai dengan rambut bersilang. Sekiranya tidak, keluar dan edit secara manual ~ /.wiilightgun / wiimotecalibration, dan ubah koordinat x dan y dari pusat kamera sedikit untuk menyesuaikan penglihatan. Contohnya, pistol saya menembak sedikit ke kanan, jadi saya akhirnya menukar koordinat x dari 529 hingga 525. Nombor setiap orang mungkin akan berbeza.

Langkah 9: Lampiran: Algoritma

Lampiran: Algoritma
Lampiran: Algoritma

Kod emulasi tetikus berfungsi lebih kurang seperti berikut.

  • Tekan butang proses.
  • Dapatkan data dari kamera dan sesuaikan untuk penentukuran pusat kamera.
  • Sekiranya kurang dari tiga LED dapat dilihat dalam kamera:

    Simpan kedudukan tetikus terakhir

  • Sekiranya tiga atau empat LED kelihatan:

    • Gunakan data akselerometer Wiimote untuk mendapatkan orientasi Wiimote dan kenal pasti gambar kamera LED mana yang sesuai dengan LED fizikal mana.
    • Sekiranya empat LED kelihatan:

      • Hitung homografi antara gambar kamera LED dan lokasi LED (dalam koordinat skrin).
      • Gunakan homografi untuk mengira lokasi skrin yang sesuai dengan pusat bidang pandangan kamera.
      • Lakukan penyesuaian Y untuk menyesuaikan pusat tong senjata maya di bawah garis penglihatan. Ini adalah algoritma yang agak kludgy tetapi berfungsi.
      • Tetapkan kedudukan tetikus ke lokasi skrin yang disesuaikan.
    • Sekiranya tiga LED kelihatan:

      • Gunakan OpenCV untuk menyelesaikan masalah P3P antara gambar kamera LED dan lokasi LED fizikal. Ini menghasilkan sehingga empat penyelesaian.
      • Sekiranya berjaya:

        • Sekiranya kita mempunyai pengiraan lokasi yang berjaya sebelumnya, pilih penyelesaian yang menjadikan LED yang hilang paling dekat dengan kedudukan LED yang diperhatikan atau dikira terakhir.
        • Sekiranya kita tidak mempunyai pengiraan lokasi yang berjaya sebelumnya, pilih penyelesaian yang paling baik meramalkan arah pecutan.
        • Gunakan penyelesaian terbaik untuk mengira ke mana LED keempat harus pergi.
        • Lakukan selebihnya seperti dalam kes empat LED.
      • Sekiranya tidak berjaya:

        Simpan kedudukan tetikus terakhir

Disyorkan: