Sommario:

Pistola Wiimote precisa per Raspberry PI: 9 passaggi (con immagini)
Pistola Wiimote precisa per Raspberry PI: 9 passaggi (con immagini)

Video: Pistola Wiimote precisa per Raspberry PI: 9 passaggi (con immagini)

Video: Pistola Wiimote precisa per Raspberry PI: 9 passaggi (con immagini)
Video: Tutorial Arcade Console MAME con Raspberry e RetroPie // How To 2024, Luglio
Anonim
Pistola luminosa Wiimote precisa per Raspberry PI
Pistola luminosa Wiimote precisa per Raspberry PI
Pistola luminosa Wiimote precisa per Raspberry PI
Pistola luminosa Wiimote precisa per Raspberry PI

Normalmente, il telecomando Wii usato come pistola luminosa non è abbastanza preciso per i giochi retrò come NES Duck Hunt, perché il telecomando Wii non seleziona infatti il punto sulla TV a cui è puntato. Non può! Il telecomando Wii ha una fotocamera a infrarossi nella parte anteriore che vede la linea di LED a infrarossi nella barra del sensore, ma non può sapere quanto è lontana (o in quale direzione) la TV dalla barra o quanto è grande la TV. Gli emulatori e i giochi aggirano questo problema mostrando mirini o altri indicatori di targeting, ma non è un'esperienza di tiro al bersaglio accurata.

Per far funzionare il telecomando Wii come una pistola luminosa precisa che puoi puntare lungo per selezionare un bersaglio su un televisore, sono necessari quattro LED a infrarossi disposti in un noto schema quadrilatero (non una linea retta) sullo stesso piano del televisore. Il telecomando Wii vede quindi i quattro LED e l'immagine della telecamera può essere utilizzata per calcolare un'omografia che ci permetta di capire dove sta puntando la telecamera.

L'hardware per questo progetto è semplice. Ci sono quattro LED a infrarossi in semplici alloggiamenti stampati in 3D che possono essere incollati nella parte superiore e inferiore dell'alloggiamento del televisore e collegati a un caricabatterie USB. Inoltre, nel caso in cui non disponi di un alloggiamento per pistola Wii, ho una semplice impugnatura stampata in 3D e mirini che puoi collegare al telecomando Wii (anche se per risparmiare plastica, ho realizzato il mio un ibrido tra legno e plastica stampata in 3D).

Il software basato su Python era più difficile da realizzare rispetto all'hardware ed è attualmente solo Linux. Calibra i LED e il telecomando Wii e quindi utilizza i calcoli dell'omografia per emulare un mouse assoluto che funziona abbastanza bene nell'emulatore NES fceumm di Retroarch (e probabilmente in altri emulatori) sul mio Raspberry PI 3B+.

Forniture

  • Telecomando Wii
  • Quattro LED a infrarossi da 940 nm da 5 mm
  • Vecchio cavo USB con una spina di tipo A funzionante
  • Raspberry PI 3 o altro computer Linux con supporto Bluetooth
  • Stampante 3D e filamento (opzionale)

Passaggio 1: catena LED a infrarossi

Catena LED a infrarossi
Catena LED a infrarossi
Catena LED a infrarossi
Catena LED a infrarossi

Procurati un vecchio cavo USB con una presa maschio di tipo A funzionante (di solito i cavi di ricarica del mio telefono si rompono all'estremità micro USB, quindi ho cavi avanzati con una presa maschio di tipo A funzionante). In realtà, va bene anche se i cavi dati sono rotto finché le linee elettriche funzionano. Taglia l'altra estremità. In teoria il cavo rosso dovrebbe essere +5V e il nero dovrebbe essere a massa, ma controllalo con un multimetro (collegalo a un caricabatterie, quindi controlla la tensione tra i fili rosso e nero).

Poiché i LED a infrarossi hanno una caduta di tensione di circa 1,2-1,3 V, ne ho appena saldati quattro in serie al cavo USB. Assicurati che i fili che hai saldato siano abbastanza lunghi da poter posizionare i LED nella parte inferiore della TV e due nella parte superiore, con una discreta quantità di spazio orizzontale tra i LED (circa 10 pollici o giù di lì).

Più precisamente per fare il loop di LED:

  • saldare il lato negativo (catodo, gamba più corta, con bordo piatto) del primo LED al cavo USB +5V
  • unire il lato positivo del primo LED (anodo, gamba più lunga, con bordo tondo) al lato negativo del secondo LED
  • ripetere per unire il secondo LED al terzo e il terzo al quarto
  • quindi collegare il lato positivo del quarto LED con un filo al filo USB di terra.

Per rendere le cose più ordinate, puoi usare un tubo termoretraibile quando fai i collegamenti. Altrimenti, usa del nastro isolante per evitare cortocircuiti.

Assicurati di non avere cortocircuiti. Quindi collegalo a un caricabatterie USB e verifica che emetta luce a infrarossi guardando i LED con la fotocamera del telefono. (Molte fotocamere dei telefoni sono sensibili agli infrarossi.)

Passaggio 2: collega alla TV

Collega alla TV
Collega alla TV
Collega alla TV
Collega alla TV
Collega alla TV
Collega alla TV

Ora, collega due dei LED alla parte inferiore della TV e due alla parte superiore. La spaziatura orizzontale dovrebbe essere di circa dieci pollici. Se è troppo, potresti avere problemi con il campo visivo della videocamera del telecomando Wii che li cattura tutti. Ma se sono troppo vicini, la mia intuizione geometrica dice che avrai una precisione inferiore.

Per i test, ho fissato i LED con nastro isolante e poi, per una connessione permanente, ho progettato e stampato quattro graziose clip LED (i file sono qui) che ho incollato a caldo sulla TV. Dovresti fare in modo che i LED siano il più vicino possibile al piano del display della TV, senza che la cornice li oscuri dalla posizione in cui eseguirai le riprese.

Passaggio 3: installa il software

Attualmente il software è solo per Linux. La seguente configurazione è progettata per Raspberry PI 3 con Raspbian Stretch. Altri sistemi Linux richiederanno alcune modifiche. Sui modelli precedenti avrai bisogno di un dongle Bluetooth e dovrai eseguirlo anche da una riga di comando:

sudo get-apt install bluetooth

Passaggio A: udev

Quindi, crea un file in /etc/udev/rules.d/wiimote.rules che contenga la singola riga:

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

Puoi farlo, ad esempio, con un editor di testo o digitando quanto segue sulla riga di comando:

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

E poi riavvia udev:

sudo /etc/init.d/udev restart

Passaggio B: cwiid

Successivamente, avrai bisogno del mio pacchetto cwiid modificato. Qui diventa un po' complicato poiché idealmente avresti bisogno di costruirlo sul tuo Raspberry PI, ma devo confessare che ho perso traccia di quali pacchetti devi installare per farlo funzionare. Ci sono tre opzioni per farlo.

Opzione B1: costruisci te stesso

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

Sfortunatamente, c'è una buona possibilità che ti manchi un sacco di cose necessarie per costruirlo e./configure si lamenterà. Puoi guardare tutte le cose di cui si lamenta ed eseguire sudo apt install su tutte.

Opzione B2: usa i miei binari

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

Passaggio C: librerie Python

Infine, ottieni materiale di supporto per il mio script python lightgun:

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

Passaggio D: lightgun.py

Infine, prendi il mio script python lightgun:

cd ~

git clone

Se tutto è andato bene, ora hai ~/lightgun.py che puoi usare per calibrare il lightgun.

Passaggio 4: calibrazione Parte I: centratura della fotocamera

Calibrazione Parte I: centratura della fotocamera
Calibrazione Parte I: centratura della fotocamera
Calibrazione Parte I: centratura della fotocamera
Calibrazione Parte I: centratura della fotocamera
Calibrazione Parte I: centratura della fotocamera
Calibrazione Parte I: centratura della fotocamera

Ci sono due aspetti della calibrazione. Il primo è calibrare il centro della fotocamera su ciascun Wiimote. Ciò richiede l'utilizzo della fotocamera per scattare due immagini dei LED attorno allo schermo della TV, una con il telecomando rivolto verso l'alto e l'altra capovolta.

Per evitare di premere i pulsanti quando posi il telecomando Wii sulla parte anteriore e per fare in modo che il telecomando Wii abbia un'elevazione coerente, puoi stampare in 3D lo strumento di calibrazione che ho incluso qui. Fondamentalmente hai bisogno di cose spesse 10,5 mm che puoi mettere sotto il telecomando Wii quando si trova sulla parte anteriore. In realtà ho usato del compensato di scarto per risparmiare sulla plastica.

Accendi i LED e assicurati che il tuo Raspberry PI o un altro computer sia visualizzato sulla TV. Collega una tastiera (non funzionerà su ssh) o usa VNC. Quindi eseguire:

python3 ~/lightgun/lightgun.py -M

Se tutto va bene, otterrai un display a schermo intero che ti chiede di premere 1 + 2 sul telecomando Wii. Fai quello. Le luci lampeggeranno sul telecomando Wii, quindi le luci 1 e 4 rimarranno accese. Vedrai anche un piccolo rettangolo verde nella parte superiore dello schermo, con la vista dalla fotocamera del telecomando Wii. Punta il telecomando Wii verso i LED e, se tutto va bene, vedrai i quattro LED, numerati da 1 a 4.

Ora devi trovare una superficie solida con un bordo tagliente, come un tavolino da caffè, che puoi puntare verso lo schermo della TV e che può consentire al telecomando Wii di vedere tutti i LED con il telecomando Wii allineato contro il bordo. Inizia allineando il telecomando Wii con il lato destro rivolto verso l'alto, con il lato del telecomando allineato contro il bordo della superficie, assicurandoti che tutti e quattro i LED siano visibili. Quindi premi SPAZIO sulla tastiera (o collega un Nunchuck e premi C se è più conveniente). Ti verrà quindi richiesto di ruotare il telecomando Wii. Ora, assicurati che sia elevato di 10,5 mm dalla superficie, utilizzando lo strumento di calibrazione o qualcos'altro, e il più vicino possibile alla stessa posizione di prima (ad esempio, allineato contro lo stesso bordo della superficie). Premi di nuovo SPAZIO.

Se tutto va bene, passerai ora alla fase di calibrazione del LED. Sì, questo è complicato! Ma avrai una pistola molto precisa. Questo è solo il prezzo.

Nota: se come me hai una Wii sotto la TV, la Wii deve essere spenta per due motivi: primo, se la Wii è accesa, si collegherà al Wiimote e, in secondo luogo, i LED a infrarossi della barra del sensore interferiranno con questo progetto. Per ragioni simili, mentre usi la Wii è una buona idea scollegare i LED intorno alla TV.

Fase 5: Calibrazione Fase II: LED

Fase II della calibrazione: LED
Fase II della calibrazione: LED
Fase II della calibrazione: LED
Fase II della calibrazione: LED

Ora devi dire al software dove si trovano i LED attorno al bordo della TV. Vedrai una schermata di calibrazione che mostra quattro frecce, una selezionata (luminosa) e tre disattivate, attorno al bordo del televisore. Si usa +/- per cambiare la freccia che si sta regolando.

Per ciascuna delle quattro frecce attorno al bordo, fai questo:

  1. premi sinistra/destra sul Wiimote per spostare le frecce finché non puntano il più precisamente possibile verso il LED corrispondente;
  2. premere su/giù sul Wiimote per modificare la lunghezza della freccia finché la lunghezza della freccia non corrisponda alla distanza tra il LED e il bordo del display TV; in altre parole, la lunghezza della freccia deve essere uguale alla distanza dalla punta della freccia al LED.

Una volta che le tue quattro frecce sono corrette (e forse anche prima) vedrai un mirino rosso quando punti il Wiimote verso lo schermo. Puoi verificare che questo sia dove dovrebbe essere. (Ricorda che devi essere abbastanza lontano perché il Wiimote possa vedere tutti i LED. È anche importante che non ci siano altre fonti di infrarossi nel campo visivo. Una volta ho avuto problemi a causa della luce solare che si rifletteva sulla testa di una vite sul Supporto della televisione.)

Infine, c'è una quinta freccia, che appare solo quando premi + dalla quarta freccia LED o - dalla prima (e per impostazione predefinita ha lunghezza zero, quindi è solo un pixel). Questa freccia regola la distanza dalla fotocamera del telecomando Wii in cui verrà registrato lo scatto. Il problema è questo: guarderai lungo la superficie superiore del telecomando Wii. Ma in realtà la fotocamera si trova a una certa distanza sotto quella superficie, al centro del rettangolo nero nella parte anteriore del telecomando Wii. Se registrassimo gli scatti in cui è puntata la fotocamera, verrebbero registrati a circa 8 mm sotto la superficie superiore del telecomando Wii. Puoi verificarlo notando che mentre osservi lungo la superficie superiore, il centro del mirino è nascosto dalla telecamera.

Puoi convivere con questo, oppure puoi far crescere questa quinta freccia per software allineare gli scatti con la parte superiore del telecomando Wii, oppure puoi regolare i file stampabili 3D per i mirini di ferro per compensare questo (ma la compensazione funzionerà solo per una particolare distanza dal televisore). Sono andato per l'allineamento del software da solo.

Premi HOME sul telecomando Wii per uscire dalla calibrazione e salvare tutti i dati nella directory ~/.wiilightgun.

Passaggio 6: test e utilizzo

Prova e utilizzo
Prova e utilizzo
Prova e utilizzo
Prova e utilizzo
Prova e utilizzo
Prova e utilizzo

Probabilmente vorrai provare la tua pistola leggera ora. Basta eseguire un emulatore di terminale (o uno script):

python3 ~/lightgun/lightgun.py -t

Dovrai premere i pulsanti 1+2 contemporaneamente, e dopodiché, se tutto va bene, finché lightgun.py è in esecuzione, il lightgun emulerà un mouse assoluto a due pulsanti. Il pulsante di attivazione è il pulsante 1 del mouse e il pulsante A è il pulsante 2. Premi ctrl-c per uscire.

Ora devi solo configurare i tuoi emulatori e/o giochi per lavorare con un mouse assoluto. Sfortunatamente, non sarà sempre così facile.

Una cosa divertente che potresti provare è la mia mod di duck-duck-shoot di iminurnamez:

cd ~

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

Per i giochi NES, utilizzo il core libretro fceumm in Retroarch. Vai al menu Opzioni e configura lo Zapper in modo che sia un touchscreen. (Configurarlo come mouse in realtà non funziona, poiché fceumm si aspetta un movimento relativo piuttosto che un mouse con posizione assoluta.)

Se inizi i tuoi giochi con uno script, puoi modificare la parte che avvia il gioco o l'emulatore per dire:

python3 ~/lightgun/lightgun.py -t -B 30 "comando per avviare il gioco"

Quindi, durante i primi 30 secondi di esecuzione del gioco (da cui l'opzione -B 30), puoi collegare la tua pistola luminosa tenendo premuto 1+2.

A proposito, lo script lightgun.py può essere utilizzato anche per i giochi Wii Remote generici con Retroarch. Basta aggiungere l'opzione -o e le funzioni della pistola luminosa verranno disattivate, e invece il telecomando Wii funzionerà in orizzontale, con i tre pulsanti rispettivamente 1, 2 e B. Ci sono altre funzioni relative a Retroarch nelle mappature di lightgun.py che scoprirai leggendo il codice. Ad esempio, il tasto meno funge da shift, e insieme al dpad controlla il salvataggio e il caricamento (su/giù = cambia numero di salvataggio; sinistra=ripristina; destra=salva).

Passaggio 7: impugnatura e mira della pistola

Impugnatura e mira della pistola
Impugnatura e mira della pistola
Impugnatura e mira della pistola
Impugnatura e mira della pistola
Impugnatura e mira della pistola
Impugnatura e mira della pistola

Puoi usare il telecomando Wii da solo come una pistola, puntando sulla parte superiore. Puoi anche acquistare uno dei bossoli commerciali per questo. Ma poiché il telecomando Wii originale non era in grado di essere utilizzato come pistola a mirino, i bossoli tendono a non essere dotati di mirini in ferro e i mirini in ferro migliorano notevolmente la precisione.

Ho progettato un semplice sistema stampabile in 3D in tre parti: una maniglia scorrevole che si trova proprio dietro il grilletto (quindi assomiglia un po' a un phaser della serie originale di Star Trek) e mirini scorrevoli. I file stampabili sono qui. Se vuoi risparmiare sulla plastica a scapito del legno di scarto, puoi anche fare come ho fatto io e invece di stampare l'intero manico, stampa solo la parte che tiene il Wiimote, ritaglia un pezzo di legno e avvitalo.

Per vedere, concentra i tuoi occhi sui luoghi. Allineare la protuberanza del mirino tra le protuberanze della tacca di mira in modo che lo spazio aereo su una delle due sia uguale e tutte e tre le protuberanze sporgano in modo uguale. Quindi allineare il centro del bersaglio con la parte superiore dei dossi.

Nota: l'altezza delle protuberanze è leggermente disuguale, con la protuberanza del mirino leggermente più bassa, al fine di compensare l'altezza delle protuberanze stesse quando si osserva lungo di esse a una distanza di 2,5 metri (la mia distanza dalla TV). Se hai una distanza significativamente diversa dalla TV, puoi inserirla nei file OpenSCAD. Tuttavia, questa regolazione potrebbe essere inferiore alle tolleranze della stampante. Inoltre, se non hai eseguito la regolazione verticale nel software, puoi aggiungere ulteriori regolazioni ai mirini nel software impostando extraSightAdjust su qualcosa intorno a -8 (in millimetri).

Passaggio 8: calibrazione III (opzionale): regolazione fine

Se vuoi ancora più precisione, puoi eseguire:

python3 ~/lightgun/lightgun.py -d

(per demo) e osserva attentamente se le mire si allineano con il mirino. In caso contrario, esci e modifica manualmente ~/.wiilightgun/wiimotecalibration e modifica leggermente le coordinate x e y del centro della fotocamera per regolare la mira. Ad esempio, la mia pistola sparava leggermente a destra, quindi ho finito per cambiare la coordinata x da 529 a 525. I numeri di ognuno saranno probabilmente diversi.

Passaggio 9: Appendice: l'algoritmo

Appendice: l'algoritmo
Appendice: l'algoritmo

Il codice di emulazione del mouse funziona più o meno come segue.

  • Il pulsante di processo viene premuto.
  • Ottieni dati dalla fotocamera e regola per la calibrazione del centraggio della fotocamera.
  • Se nella telecamera sono visibili meno di tre LED:

    Mantieni l'ultima posizione del mouse

  • Se sono visibili tre o quattro LED:

    • Usa i dati dell'accelerometro Wiimote per ottenere l'orientamento del Wiimote e identificare quale immagine LED della fotocamera corrisponde a quale LED fisico.
    • Se sono visibili quattro LED:

      • Calcola l'omografia tra le immagini della telecamera LED e le posizioni dei LED (nelle coordinate dello schermo).
      • Utilizzare l'omografia per calcolare quale posizione dello schermo corrisponde al centro del campo visivo della telecamera.
      • Effettua la regolazione Y per regolare il centro della canna virtuale della pistola sotto la linea di mira. Questo è un algoritmo un po' goffo ma funziona.
      • Imposta la posizione del mouse sulla posizione dello schermo regolata.
    • Se sono visibili tre LED:

      • Usa OpenCV per risolvere il problema P3P tra le immagini della telecamera LED e le posizioni fisiche dei LED. Questo genera fino a quattro soluzioni.
      • In caso di successo:

        • Se abbiamo un precedente calcolo della posizione riuscito, scegli la soluzione che renda il LED mancante più vicino all'ultima posizione osservata o calcolata di quel LED.
        • Se non disponiamo di un precedente calcolo della posizione riuscito, scegli la soluzione che meglio prevede la direzione dell'accelerometro.
        • Usa la soluzione migliore per calcolare dove dovrebbe andare il quarto LED.
        • Fai il resto come nel caso dei quattro LED.
      • Se non ha successo:

        Mantieni l'ultima posizione del mouse

Consigliato: