Le deal à ne pas rater :
Les 10 jeux vidéo indispensables pour bien vivre le confinement
Voir le deal

[WIP 47%] Une carte joystick USB et JAMMA

Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Mar 24 Mar 2020 - 22:19

Le week-end dernier, je me suis lancé dans la confection d'un stick arcade deux joueurs.
Il ressemble à ça:

[WIP 47%] Une carte joystick USB et JAMMA Stick10

Je suis parti sur la base d'un kit Quimat, en promo chez Amazon. Il est fourni avec 2 sticks, 2x8 boutons d'action et 2x2 boutons de commande.
Vu que je ne cours pas après les jeux compliqués et les jeux de baston, je suis parti sur 6 boutons par joueur, c'est déjà beaucoup.

La carte de commande dispose d'une multitude de connecteurs à 2 pins. Un double connecteur par microswitch! Pas daisychain de masse, donc. Ca fait un paquet de fils à la sortie:

[WIP 47%] Une carte joystick USB et JAMMA Sticka10

La carte elle-même est plutôt petite et pratique à intégrer, mis à part peut-être le fait que le marquage est au dos. Pas pratique quand on vient de la monter sur des pieds (non fournis) et qu'on veut commencer à connecter les différents switches.

[WIP 47%] Une carte joystick USB et JAMMA Origin10

J'ai fabriqué ce double stick pour jouer sur la télé de mon salon, dans deux cas d'utilisation:
- Branché sur un Raspberry PI en USB
- Branché sur un supergun JAMMA à venir

Pour l'USB, même si je ne suis actuellement pas satisfait des performances (de Recalbox, a priori), ça fonctionne.
Pour le JAMMA, j'aimerais pouvoir poser le stick sur ma table basse, et le relier par un câble raisonnable. Je souhaite donc faire passer les infos de 24 microswitches dans 5 fils plutôt que dans 25!

Dans les deux cas, il va falloir aller lire l'état des différents boutons, et le transmettre à la machine.
Je compte utiliser, comme pour le guidon de vélo volant, un Arduino Pro Micro, équivalent miniature de l'Arduino Leonardo. Il a la particularité d'être équipé d'un microcontrôleur Atmel 32u4, qui intègre une interface USB programmable. Autrement dit, on peut le faire passer pour une multitude de périphériques USB. Par exemple: un clavier, une souris, un stick analogique, un gamepad, ou même plusieurs gamepads.
Par contre, ce petit appareil ne dispose pas de suffisamment d'entrées pour lire l'état de 24 microswitches. Je vais donc lui adjoindre quelques circuits intégrés supplémentaires...

[WIP 47%] Une carte joystick USB et JAMMA Tiroir10

Pour lire les entrées, je vais utiliser un registre à décalage. C'est une puce qui dispose de 8 entrées pour 1 sortie. En envoyant un signal d'horloge dessus, on peut lire successivement l'état des 8 entrées.
Je désire lire 24 entrées:
- 2x4 directions
- 2x6 boutons d'action
- 2 boutons Start
- 2 boutons Credit / Select

J'utiliserai donc 3 registres à décalage (3x8 entrées).

Une problématique majeure avec ces cartes d'entrées est le temps de réaction. Donc la vitesse d'acquisition de l'état des boutons. Si on ne veut pas de lag, il faut turbiner. Vu que je joue sur des machines avec des frames à 60Hz, ça me donne un peu plus d'un centième de seconde pour faire toute l'acquisition et la transmission de manière transparente.

Histoire de ne pas passer trop de temps à donner des commandes à mes registres en pasasnt à 0 ou 1 l'état des pins du microcontrôleur, je vais utiliser un mécanisme câblé en dur dans la puce: le SPI. C'est un bus série, basé grossièrement sur un fil de données et un fil d'horloge. Ca ressemble quand même pas mal à ce qu'attendent mes registres...
L'inconvénient est que, la fonction étant codée en dur, on ne peut pas choisir quels pins utiliser pour le signal entrant et l'horloge (sortante). Je vais donc devoir câbler mes 3 registres sur les mêmes fils.
Le fait qu'ils reçoivent tous l'horloge en même temps ne me gêne pas. Ce qui m'embête plus, c'est qu'ils répondent tous sur le même fil. En théorie, le protocole SPI est prévu pour: on utilise une ligne par périphérique, et on passe à l'état 0 la ligne du périphérique qui a le droit de parler sur le bus.
Malheureusement, mes registres ne sont pas des périphériques SPI: ils conservent leur état (0 ou 1) quand on ne s'adresse pas à eux. Du coup, il faut trouver un moyen de les déconnecter du bus quand ce n'est pas leur tour de parler.
Et pour ça, il existe un super circuit intégré trop bien: le multiplexeur! Le principe est ici aussi que l'on dispose de 8 entrées et d'une sortie. Mais plutôt que d'envoyer l'état des entrées en séquence, on va pouvoir choisir précisément quelle entrée on souhaite voir aiguillée vers la sortie. On utilise pour ça 3 entrées supplémentaires (donc 3 bits, donc 8 possibilités). Ici, je n'aurai besoin que de 3 fils pour aiguiller la sortie vers l'un des 3 registres.

[WIP 47%] Une carte joystick USB et JAMMA Regist11

Je dispose maintenant d'une chaîne allant des microswitches jusqu'au microcontrôleur, qui saura convertir les signaux en commandes de fouble gamepad.

Dernier petit détail, il faut que j'arrive à transformer la position des interrupteurs en état logique 0 ou 1, donc en tension 0V ou 5V. Pour ça, je raccorde un côté de chaque interrupteur à la masse. Comme ça, quand j'appuie dessus, ça me met ma ligne à 0V. Et pour qu'elle soit à 5V quand je n'appuie pas, je relie l'autre côté au 5V à travers une résistance de 10kOhm.
=> Si je n'appuie pas, la résistance tire la ligne vers 5V. Si j'appuie, la ligne est mise à 0V et la résistance n'arrive pas à lutter contre le court-circuit (la vie est dure). On appelle ça une résistance de pull-up. En général, les microcontrôleurs intègrent une telle résistance sur chaque entrée. Sur le coup-là, les interrupteurs sont raccordés à des circuits intégrés, pas à des microcontrôleurs. Je vais donc devoir ajouter à mon circuit 24 résistances de pull-up!

Je prototype tout ça sur des plaques de proto. Histoire de valider le concept sans câbler une infitité de boutons, je me contente de brancher mes 3 registres, mais avec seulement 2 boutons par registre. Les 18 autres lignes seront mises à la masse (et donc les boutons considérés comme appuyés, fausse bonne idée)...

Ca ressemble à ça:

[WIP 47%] Une carte joystick USB et JAMMA Protob10

Une fois tout ça en place, il est temps de tester!

En passant le signal d'horloge et le signal de sortie à l'oscillo, je peux observer la lecture de l'état de mes 3 registres:

[WIP 47%] Une carte joystick USB et JAMMA Oscill10

Pour le premier, le bouton 1 est enfoncé. Pour le deuxième, les deux boutons sont enfoncés. Pour le troisième, le bouton 2 est enfoncé. Ca semble fonctionner!

Un bricolage dans l'environnement de développement pour afficher l'état des boutons:

Je parviens à lire les boutons sans aucun problème. Ouf.

[WIP 47%] Une carte joystick USB et JAMMA Arduin10

Maintenant, je configure le taux de transfert du bus à SPI à fond les ballons (je passe à une fréquence de 16MHz) et on regarde ce qui se passe de plus près:

[WIP 47%] Une carte joystick USB et JAMMA Sondel10

On observe de près les différentes lignes. Ici, on voit super bien l'horloge et l'état des boutons:

[WIP 47%] Une carte joystick USB et JAMMA Logiqu11

Et ici, on voit un cycle complet d'acquisition des 3 registres.

[WIP 47%] Une carte joystick USB et JAMMA Logiqu12

Il se passe 20 microsecondes entre deux registres. L'acquisition complète dure donc 40 microsecondes. Et on en fait une toutes les 60 microsecondes. On peut observer que la partie lecture du registre via SPI dure une fraction de microseconde. Pour le reste, je n'ai pas trop forcé, on doit facilement pouvoir le rendre au moins deux fois plus rapide. Mais en restant sur ce temps, on arrive quand même à une fréquence d'échantillonnage de 17kHz (donc quand même pas mal au-dessus de la fréquence de frame de 60Hz (c'est environ 280 fois plus rapide).
=> Il reste de la marge pour gérer le transfert vers le connecteur JAMMA ou la conversion USB!

Le code du programme de test est modifié pour simuler deux gamepads 8 boutons. Au passage, je bascule tout ce bazar sur la plaquette de micro-contrôleur, l'Arduino Pro Micro (équivalent en bien plus petit du Leonardo):

[WIP 47%] Une carte joystick USB et JAMMA Finipr10

Je branche tout ça, le double contrôleur apparaît sous Windows. En appuyant sur mes 6 boutons, je déclenche des actions sur les deux contrôleurs: haut/bas du premier, et A/B sur les deux contrôleurs:

[WIP 47%] Une carte joystick USB et JAMMA Ecran210

C'est une bonne étape de franchie. Maintenant, je prépare la carte finale. Ca aura toujours une tête de proto, mais ça rentrera plus facilement dans le boîtier du stick!

[WIP 47%] Une carte joystick USB et JAMMA Debutp10

Et voilà la chose. C'est beaucoup plus joli devant que derrière!

[WIP 47%] Une carte joystick USB et JAMMA Cartef10

Vient ensuite la longue expérience du coupage de fils, du soudage des masses (parce que la plaque originale d'avait pas de daisy chain de masse), et du sertissage de tous les fils pour les brancher sur des prises Dupont et les raccorder à la nouvelle carte. Après ça, il reste à ranger un peu les fils, et c'est prêt à refermer:

[WIP 47%] Une carte joystick USB et JAMMA Cartem10

Je branche tout ça sur mon PC, pour m'apercevoir que j'ai interverti les microswitches bas et droite. Je les échange, je teste, c'est bon, je remonte le fond, et me voilà revenu au même point que 3 jours en arrière, mais avec ma propre carte USB double stick  yesss

J'ai profité du fait que c'était ma propre carte et que j'avais encore un sacré paquet d'entrées/sorties dispo sur le microcontrôleur pour ajouter une prise pour raccorder un bloc de 4 DIP switches.
J'ai profité du fait que j'ai un multiplexeur sous la main pour ajouter y=une prise pour raccorder une carte fille qui comporte un nouveau registre et un bloc de 8 DIP switches. Comme ça, si j'ai des idées plus tard...

J'ai pensé aux réglages suivants par DIP:
- Mode USB/JAMMA
- Pour le mode USB: mode Joystick / Clavier
- Inversion des joueurs gauche et droite
- Les boutons 4,5,6 font du tir automatique sur les boutons 1,2,3
- Remappage des boutons pour NeoGeo
- Start + Credit = clavier ESC
- Mode 4 directions intelligent pour les jeux à la Pacman
- Peut-être autre chose, n'importe quoi.....

La carte ressemble à ça une fois branchée. Les DIP sont au dos:
[WIP 47%] Une carte joystick USB et JAMMA Diprec10

Elle est vissée élégamment sur le panneau de fond du stick:
[WIP 47%] Une carte joystick USB et JAMMA Dipver10

J'ai pu faire quelques essais, et j'ai quand même relevé les problèmes suivants avec les microswitches des joysticks:
- Un rebond de folie, jamais vu ça (uniquement sur les sticks. Sur les boutons, RAS). Il va falloir que je code du debouncing, ça fait bien suer.
- Des mauvais contacts dans un microswitch, j'ai une direction qui saute par intermittence => impossible d'aller à droite stick 2. Edit: ça, c'était un bug logiciel Wink
- Une résistance fantôme intermittente dans un autre microswitch: on passe de 0 à 340 ohms au lieu de 0 à circuit ouvert =>bloqué à gauche stick 1.
Conclusion: il ne faut pas acheter du matériel de pourri pas cher sur Amazon.

Le rebond est un peu casse bonbons, parce que chaque direction est du coup envoyée au moins 2 fois. Pas génant quand on jour à Metal Slug, mais nettement plus quand on essaie de naviguer dans les menus d'Emulation Station! Je règle le problème de rebond en ajoutant une temporisation dans l'acquisition de l'état des boutons. Et pour trouver la bonne temporisation, j'utilise le théorème de Shannon sur l'échantillonnage...
Pour ne pas perdre d'information, il faut échantillonner à deux fois la fréquence de référence. Je me cale sur une fréquence d'écran de 60Hz. Je dois donc échantillonner à 120Hz pour que la temporisation soit invisible. Pour faire bonne mesure, j'échantillonne à 240Hz, soit une temporisation d'environ 4 millisecondes par cycle d'acquisition.
Et comme ça, le rebond disparait.

Et quand je me serai bien amusé, j'attaquerai le raccordement au peigne JAMMA pour pouvoir utiliser ça sur des PCB (et sur mon slot MVS, du coup!).

Premiers tests avec le Raspberry PI. Je me retrouve avec un seul stick détecté au lieu de deux. Problème a priori réglé par le point suivant...

Codage du mode clavier: quand le DIP clavier est configuré, la double interface Joystick est désactivée et le stick se comporte comme un clavier. Le mapping des touches est celui par défaut de MAME, avec ajout des boutons 5 et 6 du joueur 2, qui ne sont pas configurés par défaut.

Et un autre dip fait que Start + Coin fait Escape sur le clavier.

Encore un autre dip passe en mode 3 boutons et active le tir automatique:
Avec le layout de boutons suivant:
4 5 6
1 2 3
=> Quand on appuie sur 4, ça déclenche le tir automatique sur 1. Quand on appuie sur 5, tir auto sur 2. Et quand on appuie sur 6, tir auto sur 3.

Prochaines étapes, donc:
- ajout d'autres fonctions sympa
- suite du projet pour le transfert vers le connecteur JAMMA


Dernière édition par Bouz le Mar 31 Mar 2020 - 22:59, édité 9 fois (Raison : Progression...)
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Mar 24 Mar 2020 - 22:20

Je vais garder cette case au cas où ça déborderait Wink
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Mer 25 Mar 2020 - 23:03

Update: le code a été modifié pour que le microcontrôleur gère 2 gamepads USB 8 boutons.
Si tout va bien, demain soir, je teste le modèle de laboratoire (sur plaquettes lab, et avec en tout et pour tout 6 boutons).
Il me tarde!
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Jeu 26 Mar 2020 - 23:18

Edit: j'ai branché ça en USB sur mon PC => ça me détecte bien deux pads, et en plus les quelques boutons que j'ai câblés fonctionnent.
J'attaque les soudures pour péréniser ce truc!

[WIP 47%] Une carte joystick USB et JAMMA Debutp10
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par cypher le Ven 27 Mar 2020 - 6:55

Shocked je comprends toujours rien mais continue! yesss

_________________
"amoureux des vieilles fentes" I love you

[WIP 47%] Une carte joystick USB et JAMMA 943190OD9MGVj [WIP 47%] Une carte joystick USB et JAMMA 514500kof94photo32 [WIP 47%] Une carte joystick USB et JAMMA Sign_a10
cypher
cypher
Scellé
Scellé

Messages : 3360
Date d'inscription : 25/10/2015
Age : 43
Localisation : 62

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Sam 28 Mar 2020 - 16:50

Je continue, alors!
Après moult soudures, j'ai un PCB qui fonctionne.
Me voilà avec une carte à 2 sticks toute belle...
[WIP 47%] Une carte joystick USB et JAMMA 20200324
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Sam 28 Mar 2020 - 21:43

Et la partie USB du projet est faite, la carte est intégrée dans mon dual stick à la place de la carte du kit de joysticks/boutons:
[WIP 47%] Une carte joystick USB et JAMMA Cartem10
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Lun 30 Mar 2020 - 0:08

Edit: ajout d'une carte fille au dos du stick pour gérer 8 DIP switches pour activer plein de trucs cools.
[WIP 47%] Une carte joystick USB et JAMMA 20200325
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par poup le Lun 30 Mar 2020 - 11:11

@Bouz a écrit:Edit: ajout d'une carte fille au dos du stick pour gérer 8 DIP switches pour activer plein de trucs cools.

Des trucs cool genre agencement des boutons sans tout débrancher ?
poup
poup
Used
Used

Messages : 410
Date d'inscription : 03/12/2015
Age : 42
Localisation : 37

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Lun 30 Mar 2020 - 13:26

Oui, je recopie ce que j'ai mis ci-dessus... on peut aussi envisager de brancher autre chose que du Jamma, des kick harness et compagnie. C'est une base de travail intéressante à mon avis.
Je cite donc:


J'ai pensé aux réglages suivants par DIP:
- Mode USB/JAMMA
- Pour le mode USB: mode Joystick / Clavier
- Inversion des joueurs gauche et droite
- Les boutons 4,5,6 font du tir automatique sur les boutons 1,2,3
- Remappage des boutons pour NeoGeo
- Start + Credit = clavier ESC
- Mode 4 directions intelligent pour les jeux à la Pacman
- Peut-être autre chose, n'importe quoi.....
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz le Lun 30 Mar 2020 - 22:54

Edit: ajout d'un mode clavier. Un dip me permet de basculer du mode double joystick au mode clavier.
Les mappings des deux joueurs sont ceux par défaut de MAME.
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz Hier à 0:12

Edit: avant le dodo : une option pour que Start + Coin envoie la touche de clavier ESC.
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Bouz Hier à 22:06

Ce soir, correction d'un bug logiciel avec la direction droite du 2ème joueur, et suppression du rebond avec un coup de pouce du théorème de Shannon.
J'ai aussi ajouté le tir automatique.
Si quelqu'un lit ceci et s'intéresse à ce qu'est le rebond quand on lit l'état d'un microswitch, je peux expliquer.
Bouz
Bouz
Near-mint
Near-mint

Messages : 736
Date d'inscription : 11/06/2019
Age : 42
Localisation : Saint Bauzille de Putois

https://www.youtube.com/user/openio

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par poup Hier à 23:41

Vas-y fait péter l'explication du rebond car on en a plein des switchs au boulot. Je vais peut être comprendre des trucs.
poup
poup
Used
Used

Messages : 410
Date d'inscription : 03/12/2015
Age : 42
Localisation : 37

Revenir en haut Aller en bas

[WIP 47%] Une carte joystick USB et JAMMA Empty Re: [WIP 47%] Une carte joystick USB et JAMMA

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum