Abonnement aux commentaires

S'abonner pour recevoir les commentaires suivants par email

まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

IR Light Gun avec Arduino

Certains jeux vidéos d'arcade sont jouables uniquement avec certains accessoires.
Un volant et des pédales, un tapis de danse, des boutons à frapper, etc, tout ce qui fait le charme des bornes dédiées.
Parmi elles, il y a les jeux de flingues qui sont particulièrement amusants, mais les évolutions technologiques ont rendu les pistolets optiques obsolètes, car inopérant par la disparition du téléviseur à tube cathodique.

De plus, aucun émulateur n'est capable de faire fonctionner un pistolet optique, et ce même si on utilise une télé à tube.
En fait les émulateurs simulent le déplacement du réticule de visée soit par les mouvements de la souris, soit par les mouvements d'un joystick analogique. (mame permet les deux)

Pour résumer, la problématique :
- Dans le cas des jeux originaux, sur console ou arcade, le pistolet optique ne fonctionne pas sur une télé LCD.
- Dans le cas des jeux émulés, console ou arcade, le pistolet optique n'est pas supporté par l'émulateur.

Les solutions disponibles :
- Dans le cas des jeux originaux, certains jeux d'arcade utilisent les coordonnées X,Y d'un potentiomètre analogique pour déplacer le réticule de visée.
- Dans le cas des jeux émulés, on peut utiliser la souris ou un joystick analogique pour déplacer le réticule de visée.

  • Par le passé (oui il y a quasi 10 ans…) j’avais expérimenté ici ce pistolet infra-rouge G2N pour un appareil fonctionnel qu’il restait à finaliser, chose que je n’ai pas pris le temps de faire, emporté par d’autres sujets… (j’ai supprimé la série de billets pour plus de clarté)
  • Depuis, une nouvelle version plus simple à mettre en œuvre a fait son apparition, et après avoir réalisé rapidement un module de test fonctionnel, je me suis rendu compte qu’il me faudrait adapter le code et le hardware à mes besoins.

Je vais donc décrire ici toute la documentation utile à la réalisation de ce pistolet Infra-Rouge maison.


Schéma de principe :


Un simple Arduino Pro Micro 5V constitue le cœur du système de traitement de la donnée.
Il est chargé via le bus I²C, de récupérer les informations de positionnement en X et Y d'une caméra infra-rouge disposée dans le pistolet, par rapport à deux références infra-Rouge accrochées au dessus de l'écran.
L’Arduino fait ensuite l'interface avec l’ordinateur de jeux en transposant tout ceci en « HID Device », Joystick et Souris USB (oui, simultanément), afin de déplacer le réticule des jeux de tir.

Dans le pistolet nous retrouvons donc une caméra IR volée dans une Wiimote, à laquelle nous avons joint quelques composants essentiels.
Tout d’abord un LM317 et ses satellites permettant de fabriquer le 3,3V nécessaire au bon fonctionnement de la caméra, à partir du 5V fournit par le port USB.
Un crystal à 24 ou 25 Mhz, un circuit de reset et une conversion de niveaux logiques 3,3V <-> 5V, afin que l’Arduino puisse bien s’entendre avec la caméra sur le bus I²C.
Reste à déporter aussi quelques entrées de l’Arduino pour y raccorder des boutons faisant offices de gâchette et autre choses utiles.
Je pense qu'on pourrait se passer des conversions de tension et de niveaux logiques en 3,3V en utilisant directement un Arduino Pro Micro 3,3V, mais le fait est que je n'en disposais pas lors de la réalisation de ce sujet… À essayer à l'occasion.

Gun PCB :

On doit pouvoir se débrouiller facilement avec l’électronique disponible sous forme de modules (Arduino, Logic level converter…) et une carte perforée à souder pour fabriquer une plaquette sur mesure pour aller dans le flingue.

  • Pour autant on pourrait aussi avoir envie de router une plaquette soit-même, aussi j’ai entrepris de dessiner ce schéma que d’aucun préféreront sans doute au crobar Fritzing précédent.

Liste des composants :

Nom             Type et valeur
R1              Résistance  300Ω
R2              Résistance  100Ω
R3              Résistance  240Ω
R4, R5, R6, R7  Résistances  10kΩ
R8, R9          Résistances 2,2kΩ
R10             Résistance  220Ω
C1              Condensateur électrochimique polarisé 0,1µF 10V
C2              Condensateur électrochimique polarisé 1µF 10V
C3              Condensateur MKT 100nF
Q1, Q2          Transistor BSS138
U1              Régulateur LM317T
XTAL1           Oscillateur HCMOS/TTL  25MHz 3V (ACHL1225 25.0-EK)
SW1, SW2        Interrupteurs momentanés
K2, K3          Borniers doubles
K1              Camera Pixart Infra-Rouge, d’une Wiimote
  • La plaquette est en lieu et place de la plaquette optique d’origine du pistolet Virtua Gun que je m'étais procuré à l'époque. La caméra Infra-rouge Pixart est dé-soudée depuis une véritable Wiimote, sans Motion Plus intégré, modèle RVL-003.

dsc09362.jpg dsc09433.jpg
ATTENTION, Il faut obligatoirement une camera provenant d'une Wiimote officielle Nintendo !
La caméra d'une copie, telle que celle-ci ne sera en rien compatible avec notre montage :
dsc09240.jpg dsc09228.jpg dsc09229.jpg dsc09233.jpg dsc09231.jpg dsc09238.jpg dsc09234.jpg

  • Une nappe de fils avec un connecteur HE10 Femelle à son bout est raccordée à la caméra qu’on va faire tenir en exploitant une des fentes d'1 mm de large disposées dans le canon, là où se trouvait la lentille du Virtua Gun.

dsc09439.jpg dsc09616.jpg

Dans de la carte plastique d'1 mm d'épaisseur a donc été découpé un disque percé d'un carré pour y loger la caméra.
Le filtre UV de la Wiimote a été sculpté pour s'adapter a la forme du canon, et le disque est formé grâce à des rajouts en carte plastique de 2 mm.
Un cordon de colle tout autour de la caméra est utilisé pour fixer ce montage.
dsc09609.jpg dsc09608.jpg dsc09614.jpg dsc09615.jpg

  • Reste à mettre en place la caméra connectée à la Gun PCB dans le pistolet, et souder les composants manquant à mon prototype daté de 9 ans…


dsc09618.jpg
Attention, si la WiiSensorBar (barre d’émission infra-rouge) est disposée au dessous de l’écran, la caméra IR doit être placée dans le canon avec les pins vers le haut; Pins vers le bas si la caméra est au dessus de l'écran.

J’ai utilisé un câble RJ45 d’1,95 m pour raccorder le circuit à l’Arduino.
C’est déjà bien long pour une liaison I²C et il sera difficile de faire plus long sans créer des problèmes de communication entre l’Arduino et la caméra IR. Les couleurs (le brochage de 1 à 8) sont réparties sur les borniers comme ceci :

Blanc-Orange : 5V | Orange : SDA | Blanc-Vert : SCL | Bleu : GND | Blanc-Bleu : Gâchette | Vert : NC | Blanc-Marron : NC | Marron : Start



Partie USB PCB :

  • On va câbler l’Arduino dans un petit boiter qui permettra un branchement fiable au pistolet et à l’ordinateur.

Donc il nous faut aussi y loger un connecteur RJ45 femelle, et un connecteur Mini-USB.
Je préfère en effet déporter le connecteur Micro-USB de l’Arduino Pro Micro sur un Mini-USB, étant donné le problème récurent d’arrachement de l’embase USB de ce type de plaquette Arduino.

  • Pour ce faire il suffit avec de souder des petits fils sur ces points et une masse :

  • Après que les découpes nécessaires eurent été faites, les connecteurs sont soudés à l’Arduino puis collé au fond du boîtier à la cyanoacrylate.


  • Un des deux commutateur modal a été câblé également puis collé à la paroi (dans un trou préexistant, vu que le boîtier est ici recyclé à cet usage).


  • Arrivé ici on peut légitimement se demander pourquoi séparer le circuit en deux de la sorte, et ne pas avoir disposé lArduino directement dans le pistolet ?

Très bonne question… Hum, alors… Bien. Je n'ai simplement pas réfléchis, et pris le recul nécessaire au moment de la fabrication, car j'étais resté dans l'optique du vieux prototype qui nécessitait une carte de traitement avec un écran et donc un bloc à part.
Et aussi, lors du développement j'ai travaillé avec un Arduino Leonardo, grand frère du Pro Micro et avec sa taille conséquente je n'ai pas réalisé qu'au final ça passait dans le flingue.
Détail important finalement, ayant besoin d'ajouter deux switchs de sélection, je n'ai pas voulu faire de trous dans le plastique du pistolet, car je voudrais pouvoir revenir en arrière et remettre le circuit optique d'origine, un jour peut-être.


La barre infrarouge :

  • Une barre infrarouge type Wii Sensor Bar fera très bien l'affaire, cependant, il faut pouvoir l'alimenter, idéalement en 5V depuis un port USB par exemple.

Il sera alors nécessaire de la modifier, il existe pleins de tuto pour le faire, démerdez-vous :)

  • Sinon on peut bien sûr en fabriquer une, en calculant le câblage à l'aide de cet outil en ligne très pratique.

C'est ce que j'ai fait ici :
dsc00435.jpg dsc00437.jpg
L'écartement entre les deux trains de LED importe peu.
Il est d'environ 18 cm pour une bar officielle Nintendo, et sur mon proto la largeur est réglable jusqu'à 25 cm.
Il est judicieux d'avoir deux LED inclinées à 45° sur chaque train, afin d'augmenter l'angle d'émission du faisceau Infra Rouge.

Réglages du Pistolet IR et Mise au point :

  • Dans le code Arduino disponible ici, il faudra ajuster quelques réglages à la disposition de votre écran, comme son ratio, sa taille, les mesures de la barre infra-rouge et la compensation de son positionnement :
// Définition et réglages Camera IR
#define	Ratio	 	 1  // Ratio de l'ecran 1 = 4/3 et 0 = 16/9
[…]
unsigned int Screen_wide = 55;  // largeur de l'écran en centimètres
signed int Y_Correction =  26;  // Décalage en Hauteur par rapport à la barre IR
signed int X_Correction = 0;    // Décalage en Largeur (ou déplacer un tipeu la barre ;))
unsigned int Wiibar_size = 20;  // Distance entre les 2 emetteurs Infra-Rouges
  • À la distance suffisante de l’écran d’environ 1,70 mètres le curseur de la souris devrait se positionner correctement en visant les 4 coins de l’écran.

En effet, impossible de jouer collé à l’écran comme avec un pistolet optique, car il faut que le pistolet puisse toujours « voir » la barre infra-rouge.

Après avoir programmé l’Arduino,

  • Sur GNU/Linux, une commande dmesg devrait montrer les « HID devices » montés :


La souris devrait pouvoir être pilotée par le pistolet.
La commande jstest devrait afficher le testeur de Joystick :

jstest /dev/input/js0


  • Sur Windows, la souris devrait pouvoir être pilotée par le pistolet.

Un joystick doit aussi apparaître dans le panneau de test, avec ses 3 boutons et sa croix de direction actionnable par le pistolet :

On peut alors tester tous les boutons du pistolet…

- Le premier bouton du Joystick et le click droit de la Souris s’activent, si le pistolet sort de l’écran (ne voit pas la barre infra-rouge), sauf si le switch Reload Off est basculé.
- Si la Souris ne fonctionne pas, actionner le switch Souris Off.


Les réglages informatiques :

  • L’émulateur Sega Model2 (House of the Dead, VirtuaCop 1 et 2) est jouable à la souris, avec par défaut le click gauche pour le tir et le cick droit pour le reload. Autrement dit, il n’y a rien à configurer, le pistolet fonctionne de suite. On peut si on le souhaite assigner un bouton disponible sur le pistolet à la fonction « start » de l’émulateur, c’est toujours plus simple pour repartir rapidement après la fin d’un crédit !

Pour lancer une rom de jeu, il faut cliquer via le menu de l'émulateur et double-cliquer sur le jeu pour le lancer… C'est là que le switch Souris Off est super utile donc. Une fois que le jeu démarre, on l'actionne et le pistolet prend le relais sans problème.

  • Sur Mame on a la possibilité d'émuler le pistolet en tant que joystick analogique, ou en tant que une souris.

Pour assigner les boutons en accédant aux menus des émulateurs sans difficultés, n’hésitez-pas à utiliser le salutaire switch Reload Off.

  • Petite démo vidéo :



Prochaines étapes :

- Étudier l’ajout d’un « Solenoid » pour simuler le recul dans le pistolet.
- Fabriquer un second pistolet pour le jeu avec partenaire…
- Un modèle avec l'Arduino intégré cette fois !
- Un Arduino 3,3V ?

 À suivre…

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet