Table des matières:

Pistolet lumineux Wiimote précis pour Raspberry PI : 9 étapes (avec photos)
Pistolet lumineux Wiimote précis pour Raspberry PI : 9 étapes (avec photos)

Vidéo: Pistolet lumineux Wiimote précis pour Raspberry PI : 9 étapes (avec photos)

Vidéo: Pistolet lumineux Wiimote précis pour Raspberry PI : 9 étapes (avec photos)
Vidéo: batocera - lightguns - l'envers du décor (french version) 2024, Juillet
Anonim
Pistolet lumineux Wiimote précis pour Raspberry PI
Pistolet lumineux Wiimote précis pour Raspberry PI
Pistolet lumineux Wiimote précis pour Raspberry PI
Pistolet lumineux Wiimote précis pour Raspberry PI

Normalement, la télécommande Wii utilisée comme arme légère n'est pas assez précise pour les jeux rétro comme NES Duck Hunt, car la télécommande Wii ne sélectionne pas en fait le point sur le téléviseur vers lequel elle est pointée. ça ne peut pas ! La télécommande Wii a une caméra infrarouge à l'avant qui voit la ligne de LED infrarouges dans la barre de détection, mais elle ne peut pas savoir à quelle distance (ou dans quelle direction) le téléviseur est de la barre ou quelle est la taille du téléviseur. Les émulateurs et les jeux contournent cela en affichant des réticules ou un autre indicateur de ciblage, mais ce n'est pas une expérience de tir à la cible précise.

Pour que la télécommande Wii fonctionne comme un pistolet lumineux précis que vous pouvez viser pour sélectionner une cible sur un téléviseur, vous devez disposer de quatre LED infrarouges disposées selon un motif quadrilatéral connu (pas une ligne droite) dans le même plan que le téléviseur. La télécommande Wii voit alors les quatre LED et l'image de la caméra peut être utilisée pour calculer une homographie qui nous permet de déterminer où la caméra pointe.

Le matériel pour ce projet est simple. Il y a quatre LED infrarouges dans de simples boîtiers imprimés en 3D qui peuvent être collés en haut et en bas du boîtier du téléviseur et se brancher sur un chargeur USB. De plus, au cas où vous n'auriez pas de boîtier de pistolet Wii, j'ai une simple poignée imprimée en 3D et des viseurs que vous pouvez attacher à la télécommande Wii (bien que pour économiser du plastique, j'ai fait le mien un hybride entre le bois et le plastique imprimé en 3D).

Le logiciel basé sur python était plus difficile à créer que le matériel et est actuellement uniquement Linux. Il calibre les LED et la télécommande Wii, puis utilise des calculs d'homographie pour émuler une souris absolue qui fonctionne assez bien dans l'émulateur fceumm NES de Retroarch (et probablement dans d'autres émulateurs) sur mon Raspberry PI 3B+.

Fournitures

  • Télécommande Wii
  • Quatre LED infrarouges 940 nm 5 mm
  • Ancien câble USB avec une prise de type A fonctionnelle
  • Raspberry PI 3 ou autre ordinateur Linux avec prise en charge Bluetooth
  • Imprimante 3D et filament (facultatif)

Étape 1: Chaîne LED infrarouge

Chaîne LED infrarouge
Chaîne LED infrarouge
Chaîne LED infrarouge
Chaîne LED infrarouge

Procurez-vous un vieux câble USB avec une prise mâle de type A fonctionnelle (généralement les câbles de charge de mon téléphone se cassent à l'extrémité micro USB, j'ai donc des câbles restants avec une prise mâle de type A fonctionnelle). En fait, c'est même OK si les câbles de données sont cassé tant que les lignes électriques fonctionnent. Coupez l'autre extrémité. En théorie, le câble rouge devrait être à +5V et le noir à la masse, mais vérifiez-le avec un multimètre (branchez-le sur un chargeur, puis vérifiez la tension entre les fils rouge et noir).

Étant donné que les LED infrarouges ont une chute de tension d'environ 1,2 à 1,3 V, je viens d'en souder quatre en boucle en série au câble USB. Assurez-vous que les fils que vous soudez sont suffisamment longs pour que vous puissiez mettre des LED en bas du téléviseur et deux en haut, avec un espace horizontal décent entre les LED (environ 10 pouces environ).

Plus précisément pour réaliser la boucle LED:

  • souder le côté négatif (cathode, patte plus courte, avec bord plat) de la première LED au fil USB +5V
  • joindre le côté positif de la première LED (anode, jambe plus longue, avec bord arrondi) au côté moins de la deuxième LED
  • répéter pour joindre la deuxième LED à la troisième et la troisième à la quatrième
  • puis connectez le côté positif de la quatrième LED avec un fil au fil USB de terre.

Pour rendre les choses plus propres, vous pouvez utiliser une gaine thermorétractable lorsque vous effectuez les connexions. Sinon, utilisez du ruban isolant pour éviter les courts-circuits.

Assurez-vous qu'il n'y a pas de court-circuit. Branchez-le ensuite sur un chargeur USB et vérifiez qu'il émet de la lumière infrarouge en regardant les LED avec une caméra de téléphone. (De nombreuses caméras de téléphone sont sensibles aux infrarouges.)

Étape 2: Connectez-vous au téléviseur

Attacher à la télévision
Attacher à la télévision
Attacher à la télévision
Attacher à la télévision
Attacher à la télévision
Attacher à la télévision

Maintenant, fixez deux des LED sur le dessous du téléviseur et deux sur le dessus. L'espacement horizontal doit être d'environ dix pouces. Si c'est trop, vous pourriez avoir des problèmes avec le champ de vision de la télécommande Wii pour les capturer tous. Mais s'ils sont trop proches, alors mon intuition géométrique dit que vous aurez une précision moindre.

Pour les tests, j'ai scotché les LED avec du ruban isolant, puis pour une connexion permanente, j'ai conçu et imprimé quatre jolis petits clips LED (les fichiers sont ici) que j'ai collés à chaud sur le téléviseur. Vous devez faire en sorte que les LED soient aussi proches que possible du plan de l'écran du téléviseur, sans que le cadre ne les masque de l'emplacement où vous allez filmer.

Étape 3: installer le logiciel

Actuellement, le logiciel est uniquement Linux. La configuration suivante est conçue pour le Raspberry PI 3 avec Raspbian Stretch. D'autres systèmes Linux nécessiteront quelques modifications. Sur les modèles précédents, vous aurez besoin d'un dongle Bluetooth et vous devrez également l'exécuter à partir d'une ligne de commande:

sudo get-apt installer bluetooth

Étape A: udev

Ensuite, créez un fichier dans /etc/udev/rules.d/wiimote.rules qui contient la seule ligne:

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

Vous pouvez le faire, par exemple, avec un éditeur de texte ou en tapant ce qui suit sur la ligne de commande:

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

Et puis redémarrez udev:

sudo /etc/init.d/udev redémarrer

Étape B: cwiid

Ensuite, vous aurez besoin de mon package cwiid modifié. Ici, cela devient un peu poilu car idéalement, vous auriez besoin de le construire sur votre Raspberry PI, mais je dois avouer que j'ai perdu la trace des packages que vous devez installer pour le faire fonctionner. Il y a trois options pour ce faire.

Option B1: Construisez-vous

disque ~

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

Malheureusement, il y a de fortes chances que vous manquiez un tas de choses nécessaires pour construire cela, et./configure se plaindra. Vous pouvez regarder toutes les choses dont il se plaint et exécuter sudo apt install sur chacun d'eux.

Option B2: Utiliser mes binaires

disque ~

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

Étape C: bibliothèques python

Enfin, obtenez du support pour mon script python lightgun:

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

Étape D: lightgun.py

Enfin, récupérez mon script python lightgun:

disque ~

git clone

Si tout s'est bien passé, vous avez maintenant ~/lightgun.py que vous pouvez utiliser pour calibrer le pistolet lumineux.

Étape 4: Étalonnage Partie I: Centrage de la caméra

Calibration Partie I: Centrage de la caméra
Calibration Partie I: Centrage de la caméra
Calibration Partie I: Centrage de la caméra
Calibration Partie I: Centrage de la caméra
Calibration Partie I: Centrage de la caméra
Calibration Partie I: Centrage de la caméra

Il y a deux aspects à l'étalonnage. La première consiste à calibrer le centre de la caméra sur chaque Wiimote. Cela nécessite d'utiliser l'appareil photo pour prendre deux images des LED autour de votre écran de télévision, une avec la télécommande à l'endroit et l'autre à l'envers.

Pour éviter d'appuyer sur les boutons lorsque vous posez la télécommande Wii sur le devant, et afin que la télécommande Wii ait une élévation constante, vous pouvez imprimer en 3D l'outil de calibrage que j'ai inclus ici. Vous avez essentiellement besoin de choses de 10,5 mm d'épaisseur que vous pouvez mettre sous la télécommande Wii lorsqu'elle repose sur sa face avant. En fait, j'ai utilisé des déchets de contreplaqué pour économiser sur le plastique.

Allumez vos LED et assurez-vous que votre Raspberry PI ou un autre ordinateur s'affiche sur le téléviseur. Connectez un clavier (cela ne fonctionnera pas sur ssh) ou utilisez VNC. Exécutez ensuite:

python3 ~/lightgun/lightgun.py -M

Si tout se passe bien, vous obtiendrez un affichage plein écran vous demandant d'appuyer sur 1+2 sur la télécommande Wii. Faites ça. Les lumières clignoteront sur la télécommande Wii, puis les lumières 1 et 4 resteront allumées. Vous verrez également un petit rectangle vert en haut de l'écran, avec la vue de la caméra de la télécommande Wii. Pointez la télécommande Wii sur les LED et si tout se passe bien, vous verrez les quatre LED, numérotées de 1 à 4.

Maintenant, vous devez trouver une surface solide avec un bord tranchant, comme une table basse, que vous pouvez pointer vers l'écran du téléviseur et qui peut permettre à la télécommande Wii de voir toutes les LED avec la télécommande Wii alignée contre le bord. Commencez par aligner la télécommande Wii vers le haut, avec le côté de la télécommande aligné contre le bord de la surface, en vous assurant que les quatre LED sont visibles. Ensuite, appuyez sur ESPACE sur votre clavier (ou attachez un Nunchuck et appuyez sur C si c'est plus pratique). Vous serez alors invité à faire pivoter la télécommande Wii. Maintenant, assurez-vous qu'il est surélevé à 10,5 mm de votre surface, à l'aide de l'outil de calibrage ou autre, et aussi près du même endroit qu'avant (par exemple, aligné contre le même bord de votre surface). Appuyez à nouveau sur ESPACE.

Si tout se passe bien, vous passerez maintenant à l'étape de calibrage des LED. Oui, c'est compliqué ! Mais vous allez avoir un lightgun très précis. C'est juste le prix.

Remarque: si comme moi vous avez une Wii sous le téléviseur, la Wii doit être éteinte pour deux raisons: premièrement, si la Wii est allumée, elle se connectera à la Wiimote et, deuxièmement, les LED infrarouges de la barre de détection interféreront avec ce projet. Pour des raisons similaires, pendant que vous utilisez la Wii, c'est une bonne idée de débrancher les LED autour du téléviseur.

Étape 5: Étalonnage Étape II: LED

Étalonnage Étape II: LED
Étalonnage Étape II: LED
Étalonnage Étape II: LED
Étalonnage Étape II: LED

Vous devez maintenant indiquer au logiciel où se trouvent les LED autour du bord du téléviseur. Vous verrez un écran d'étalonnage affichant quatre flèches, l'une sélectionnée (claire) et trois d'entre elles grisées, autour du bord du téléviseur. Vous utilisez +/- pour changer la flèche que vous ajustez.

Pour chacune des quatre flèches autour du bord, procédez comme suit:

  1. appuyez sur gauche/droite sur la Wiimote pour déplacer les flèches jusqu'à ce qu'elles pointent le plus précisément possible vers la LED correspondante;
  2. appuyez sur haut/bas sur la Wiimote pour modifier la longueur de la flèche jusqu'à ce que la longueur de la flèche corresponde à la distance entre la LED et le bord de l'écran du téléviseur; en d'autres termes, la longueur de la flèche doit être égale à la distance entre la pointe de la flèche et la LED.

Une fois que vos quatre flèches sont correctes (et peut-être même plus tôt), vous verrez un réticule rouge lorsque vous pointez la Wiimote vers l'écran. Vous pouvez vérifier que c'est là qu'il devrait être. (Rappelez-vous que vous devez être suffisamment éloigné pour que la Wiimote puisse voir toutes les LED. Il est également important qu'il n'y ait pas d'autres sources d'infrarouge dans le champ de vision. J'ai déjà eu des problèmes à cause de la lumière du soleil se reflétant sur une tête de vis sur le Meuble télévision.)

Enfin, il y a une cinquième flèche, qui n'apparaît que lorsque vous appuyez sur + à partir de la quatrième flèche LED ou sur - à partir de la première (et elle a par défaut une longueur nulle, ce n'est donc qu'un pixel). Cette flèche ajuste à quelle distance au-dessus de la caméra de la télécommande Wii la prise de vue sera enregistrée. Le problème est le suivant: vous allez viser le long de la surface supérieure de la télécommande Wii. Mais la caméra est en fait située à une certaine distance en dessous de cette surface, au milieu du rectangle noir à l'avant de la télécommande Wii. Si nous enregistrions les prises de vue vers lesquelles la caméra pointe, elles seraient enregistrées à environ 8 mm sous la surface supérieure de la télécommande Wii. Vous pouvez le vérifier en notant que lorsque vous regardez le long de la surface supérieure, le centre du réticule est masqué par la caméra.

Vous pouvez vivre avec cela, ou vous pouvez développer cette cinquième flèche pour aligner les prises de vue par logiciel avec le haut de la télécommande Wii, ou vous pouvez ajuster les fichiers imprimables en 3D pour les viseurs en fer pour compenser cela (mais la compensation ne fonctionnera que pour une distance particulière au téléviseur). Je suis allé pour l'alignement du logiciel moi-même.

Appuyez sur HOME sur la télécommande Wii pour quitter l'étalonnage et enregistrer toutes les données dans le répertoire ~/.wiilightgun.

Étape 6: Tester et utiliser

Tester et utiliser
Tester et utiliser
Tester et utiliser
Tester et utiliser
Tester et utiliser
Tester et utiliser

Vous voulez probablement essayer votre pistolet léger maintenant. Exécutez simplement dans un émulateur de terminal (ou un script):

python3 ~/lightgun/lightgun.py -t

Vous devrez appuyer sur les boutons 1+2 en même temps, et après cela, si tout se passe bien, tant que lightgun.py est en cours d'exécution, le lightgun émulera une souris absolue à deux boutons. Le bouton de déclenchement est le bouton de la souris 1 et le bouton A est le bouton de la souris 2. Appuyez sur ctrl-c pour quitter.

Il ne vous reste plus qu'à configurer vos émulateurs et/ou jeux pour qu'ils fonctionnent avec une souris absolue. Malheureusement, ce ne sera pas toujours aussi facile.

Une chose amusante que vous pourriez essayer est mon mod de canard-duck-shoot d'iminurnamez:

disque ~

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

Pour les jeux NES, j'utilise le noyau libretro fceumm dans Retroarch. Allez dans le menu Options et configurez le Zapper pour qu'il soit un écran tactile. (Le configurer en tant que souris ne fonctionne pas réellement, car fceumm s'attend à un mouvement relatif plutôt qu'à une souris en position absolue.)

Si vous démarrez vos jeux avec un script, vous pouvez éditer la partie qui démarre le jeu ou l'émulateur pour dire:

python3 ~/lightgun/lightgun.py -t -B 30 "commande pour démarrer le jeu"

Puis pendant les 30 premières secondes d'exécution du jeu (d'où l'option -B 30), vous pouvez connecter votre lightgun en maintenant 1+2 enfoncé.

Soit dit en passant, le script lightgun.py peut également être utilisé pour les jeux à distance Wii généraux avec Retroarch. Ajoutez simplement l'option -o et les fonctions du pistolet lumineux seront désactivées, et à la place, la télécommande Wii fonctionnera horizontalement, les trois boutons étant respectivement 1, 2 et B. Il existe d'autres fonctions liées à Retroarch dans les mappages de lightgun.py que vous découvrirez en lisant le code. Par exemple, la touche moins agit comme un décalage et, avec le dpad, contrôle la sauvegarde et le chargement (haut/bas = changer le numéro de sauvegarde; gauche=restaurer; droite=sauvegarder).

Étape 7: poignée du pistolet et visée

Poignée de pistolet et visée
Poignée de pistolet et visée
Poignée de pistolet et visée
Poignée de pistolet et visée
Poignée de pistolet et visée
Poignée de pistolet et visée

Vous pouvez utiliser la télécommande Wii seule comme une arme à feu, en observant le haut. Vous pouvez également acheter l'un des boîtiers d'armes à feu commerciaux pour cela. Mais parce que la télécommande Wii d'origine n'était pas capable d'être utilisée comme arme à vue, les boîtiers ont tendance à ne pas être équipés de viseurs en fer, et les viseurs en fer améliorent considérablement la précision.

J'ai conçu un simple système imprimable en 3D en trois parties: une poignée coulissante qui se trouve juste derrière la gâchette (elle ressemble donc un peu à un phaser de la série originale Star Trek) et des viseurs coulissants. Les fichiers imprimables sont ici. Si vous voulez économiser du plastique au détriment du bois de rebut, vous pouvez aussi faire ce que j'ai fait et au lieu d'imprimer tout le manche, imprimez juste la partie qui tient la Wiimote, et découpez un morceau de bois et vissez-le.

Pour voir, concentrez vos yeux sur les sites. Alignez la bosse de la mire avant entre les bosses de la mire arrière de sorte que l'espace d'air sur l'un ou l'autre soit égal et que les trois bosses dépassent de la même hauteur. Alignez ensuite le milieu de la cible avec le haut des bosses.

Remarque: la hauteur des bosses est légèrement inégale, la bosse du guidon étant légèrement plus basse, afin de compenser la hauteur des bosses elles-mêmes lorsque vous les observez à une distance de 2,5 mètres (ma distance par rapport à la télévision). Si vous avez une distance significativement différente par rapport au téléviseur, vous pouvez la mettre dans les fichiers OpenSCAD. Cependant, cet ajustement peut être inférieur aux tolérances de l'imprimante. De plus, si vous n'avez pas effectué le réglage vertical dans le logiciel, vous pouvez ajouter un peu plus de réglage aux viseurs dans le logiciel en réglant extraSightAdjust sur quelque chose d'environ -8 (en millimètres).

Étape 8: Calibrage III (facultatif): Réglage fin

Si vous voulez encore plus de précision, vous pouvez exécuter:

python3 ~/lightgun/lightgun.py -d

(pour la démo) et regardez attentivement si les viseurs s'alignent avec le réticule. Si ce n'est pas le cas, quittez et modifiez manuellement ~/.wiilightgun/wiimotecalibration, et modifiez légèrement les coordonnées x et y du centre de la caméra pour ajuster la visée. Par exemple, mon arme tirait légèrement vers la droite, j'ai donc fini par changer la coordonnée x de 529 à 525. Les chiffres de chacun seront probablement différents.

Étape 9: Annexe: l'algorithme

Annexe: l'algorithme
Annexe: l'algorithme

Le code d'émulation de souris fonctionne à peu près comme suit.

  • Traiter les pressions sur le bouton.
  • Obtenez les données de la caméra et ajustez le calibrage du centrage de la caméra.
  • Si moins de trois LED sont visibles dans la caméra:

    Conserver la dernière position de la souris

  • Si trois ou quatre LED sont visibles:

    • Utilisez les données de l'accéléromètre Wiimote pour obtenir l'orientation de la Wiimote et identifier quelle image de caméra LED correspond à quelle LED physique.
    • Si quatre LED sont visibles:

      • Calculez l'homographie entre les images de la caméra LED et les emplacements LED (en coordonnées d'écran).
      • Utilisez l'homographie pour calculer l'emplacement de l'écran qui correspond au centre du champ de vision de la caméra.
      • Effectuez un ajustement en Y pour ajuster le centre du canon du pistolet virtuel en dessous de la ligne de visée. C'est un algorithme un peu fastidieux mais il fonctionne.
      • Réglez la position de la souris sur l'emplacement de l'écran ajusté.
    • Si trois LED sont visibles:

      • Utilisez OpenCV pour résoudre le problème P3P entre les images de la caméra LED et les emplacements physiques des LED. Cela génère jusqu'à quatre solutions.
      • En cas de succès:

        • Si nous avons un précédent calcul de localisation réussi, choisissez la solution qui rend la LED manquante la plus proche de la dernière position observée ou calculée de cette LED.
        • Si nous n'avons pas de calcul de localisation réussi, choisissez la solution qui prédit le mieux le cap de l'accéléromètre.
        • Utilisez la meilleure solution pour calculer où la quatrième LED doit aller.
        • Faites le reste comme dans le boîtier à quatre LED.
      • En cas d'échec:

        Conserve la dernière position de la souris

Conseillé: