[WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Page 1 sur 2
Page 1 sur 2 • 1, 2
[WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Le week-end dernier, je me suis lancé dans la confection d'un stick arcade deux joueurs.
Il ressemble à ça:
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:
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.
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...
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.
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:
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:
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.
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:
On observe de près les différentes lignes. Ici, on voit super bien l'horloge et l'état des boutons:
Et ici, on voit un cycle complet d'acquisition des 3 registres.
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):
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:
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!
Et voilà la chose. C'est beaucoup plus joli devant que derrière!
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:
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
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:
Elle est vissée élégamment sur le panneau de fond du stick:
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
- 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.
Et on continue, avec le raccordement de tout ça sur un connecteur JAMMA.
Pour commencer, je mets en place une carte qui va se loger entre l'arrivée du câble JAMMA et le PCB d'arcade.
Il me permet:
- de passer le signal directement si je pose un cavalier
- d'intercepter le signal si je colle une carte par-dessus pour le gérer
Ici, la carte en question, branchée, avec tous les cavaliers en place (donc elle ne sert à rien), et ça marche toujours, ouf!
Maintenant qu'on a une base de travail, il va s'agit de mettre en place une carte qui va recevoir les commandes du double stick sur une ligne série, et qui va les éclater sur chacune des lignes du connecteur JAMMA correspondant à du contrôleur: pour chaque joueur, les 4 directions, 6 boutons + Start et Crédit.
Pour ça, on utilise un autre registre, mais qui fait cette fois uane conversion série vers parallèle. On utilise toujours le protocole SPI pour configurer ça.
Chaque registre a une taille de 8 bits. Et comme il nous faut 24 lignes, on en utilise 3 qu'on colle les uns derrière les autres.
Ces registres sortent un signal 0 ou 1, sur un niveau 5V. A priori, toutes les cartes JAMMA attendent également un signal 0 ou 5V. Par contre, toutes les lignes d'entrées sont équipées d'une résistance de pull-up (voir plus haut). Pour être sûr de ne rien casser en envoyant dans la carte une tension de 5V, on va se contenter de forcer la tension à 0V quand un bouton est pressé.
Pour ça, on va utiliser une puce plutôt limitée qui ne sait faire que mettre des lignes à 0V. Il s'agit d'un circuit intégré contenant 8 paires de transistors montés en Darlington, et à drain ouvert (!). En gros: quand on leur donne 0V, ils laissent la ligne comme elle était et ne font rien du tout. Par contre, quand on leur envoie 5V, ils forcent la ligne à 0V. C'est exactement ce qu'il nous faut.
On va donc se retrouver avec 3 registres à décalage de 8 bits, chacun étant couplé à un boîtier Darlington de 8 lignes.
La petite carte prend en entrée un câble à 5 fils pour communiquer avec le stick, et en sortie une rangée de connecteurs pour venir s'enficher sur la carte intermédiaire:
Il ne reste alors plus qu'à connecter les deux cartes ensemble, et à faire un câble assez long pour relier la carte au stick...
Une fois que c'est fait, j'ajoute un connecteur de sortie sur le stick, pour pouvoir brancher le câble dessus, voilà qui est fait:
L'étape suivante est de mettre à jour le firmware de la chose pour gérer la sortie JAMMA.
3 jours plus tard, les bugs sont corrigés, j'ai bricolé une autre petite carte qui se plugge dessus pour ajouter une sortie vidéo/audio.
Tout marche bien, ça me fera une bonne base de travail, et de quoi jouer dans mon salon quand il fait trop chaud ou trop froid dans mon grenier, sans me payer une tresse de 25 fils trop courts entre le stick et le reste du monde.
Je vais continuer à bricoler dans l'ombre, et je me ferai certainement une jolie carte pour mettre ça dans mes bornes et simplifier les branchements et la configuration des boutons.
Je laisse l'option autofire parce que ça a l'air de plaire.
Un peu de bricolage plus loin, réalisation d'une nouvelle carte, mais compatible Atari 2600 cette fois.
Et voici donc une 2600 avec:
- une alim à découpage à la place du régulateur qui chauffe (et son beau filtre monté en l'air)
- un contrôleur de contrôleurs compatible avec mon twin stick (et qui gère aussi les boutons mode et reset)
- un convertisseur RVB sur Péritel
Je ne sais pas encore si je m'arrête à 125% ou si je continue...
Il ressemble à ça:
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:
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.
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...
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.
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:
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:
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.
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:
On observe de près les différentes lignes. Ici, on voit super bien l'horloge et l'état des boutons:
Et ici, on voit un cycle complet d'acquisition des 3 registres.
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):
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:
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!
Et voilà la chose. C'est beaucoup plus joli devant que derrière!
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:
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
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:
Elle est vissée élégamment sur le panneau de fond du stick:
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
- 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.
Et on continue, avec le raccordement de tout ça sur un connecteur JAMMA.
Pour commencer, je mets en place une carte qui va se loger entre l'arrivée du câble JAMMA et le PCB d'arcade.
Il me permet:
- de passer le signal directement si je pose un cavalier
- d'intercepter le signal si je colle une carte par-dessus pour le gérer
Ici, la carte en question, branchée, avec tous les cavaliers en place (donc elle ne sert à rien), et ça marche toujours, ouf!
Maintenant qu'on a une base de travail, il va s'agit de mettre en place une carte qui va recevoir les commandes du double stick sur une ligne série, et qui va les éclater sur chacune des lignes du connecteur JAMMA correspondant à du contrôleur: pour chaque joueur, les 4 directions, 6 boutons + Start et Crédit.
Pour ça, on utilise un autre registre, mais qui fait cette fois uane conversion série vers parallèle. On utilise toujours le protocole SPI pour configurer ça.
Chaque registre a une taille de 8 bits. Et comme il nous faut 24 lignes, on en utilise 3 qu'on colle les uns derrière les autres.
Ces registres sortent un signal 0 ou 1, sur un niveau 5V. A priori, toutes les cartes JAMMA attendent également un signal 0 ou 5V. Par contre, toutes les lignes d'entrées sont équipées d'une résistance de pull-up (voir plus haut). Pour être sûr de ne rien casser en envoyant dans la carte une tension de 5V, on va se contenter de forcer la tension à 0V quand un bouton est pressé.
Pour ça, on va utiliser une puce plutôt limitée qui ne sait faire que mettre des lignes à 0V. Il s'agit d'un circuit intégré contenant 8 paires de transistors montés en Darlington, et à drain ouvert (!). En gros: quand on leur donne 0V, ils laissent la ligne comme elle était et ne font rien du tout. Par contre, quand on leur envoie 5V, ils forcent la ligne à 0V. C'est exactement ce qu'il nous faut.
On va donc se retrouver avec 3 registres à décalage de 8 bits, chacun étant couplé à un boîtier Darlington de 8 lignes.
La petite carte prend en entrée un câble à 5 fils pour communiquer avec le stick, et en sortie une rangée de connecteurs pour venir s'enficher sur la carte intermédiaire:
Il ne reste alors plus qu'à connecter les deux cartes ensemble, et à faire un câble assez long pour relier la carte au stick...
Une fois que c'est fait, j'ajoute un connecteur de sortie sur le stick, pour pouvoir brancher le câble dessus, voilà qui est fait:
L'étape suivante est de mettre à jour le firmware de la chose pour gérer la sortie JAMMA.
3 jours plus tard, les bugs sont corrigés, j'ai bricolé une autre petite carte qui se plugge dessus pour ajouter une sortie vidéo/audio.
Tout marche bien, ça me fera une bonne base de travail, et de quoi jouer dans mon salon quand il fait trop chaud ou trop froid dans mon grenier, sans me payer une tresse de 25 fils trop courts entre le stick et le reste du monde.
Je vais continuer à bricoler dans l'ombre, et je me ferai certainement une jolie carte pour mettre ça dans mes bornes et simplifier les branchements et la configuration des boutons.
Je laisse l'option autofire parce que ça a l'air de plaire.
Un peu de bricolage plus loin, réalisation d'une nouvelle carte, mais compatible Atari 2600 cette fois.
Et voici donc une 2600 avec:
- une alim à découpage à la place du régulateur qui chauffe (et son beau filtre monté en l'air)
- un contrôleur de contrôleurs compatible avec mon twin stick (et qui gère aussi les boutons mode et reset)
- un convertisseur RVB sur Péritel
Je ne sais pas encore si je m'arrête à 125% ou si je continue...
Dernière édition par Bouz le Ven 17 Avr 2020 - 0:42, édité 14 fois (Raison : Progression...)
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Je vais garder cette case au cas où ça déborderait
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
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!
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!
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
je comprends toujours rien mais continue!
cypher- Scellé
- Messages : 4581
Date d'inscription : 25/10/2015
Age : 47
Localisation : 62
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
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- Near-mint
- Messages : 588
Date d'inscription : 03/12/2015
Age : 46
Localisation : 37
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
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.....
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.....
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
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.
Les mappings des deux joueurs sont ceux par défaut de MAME.
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Edit: avant le dodo : une option pour que Start + Coin envoie la touche de clavier ESC.
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
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.
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.
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
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- Near-mint
- Messages : 588
Date d'inscription : 03/12/2015
Age : 46
Localisation : 37
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
poup a écrit: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.
OK, je ferai une capture de signal coupé à l'oscillo et je t'expliquerai ça ci-dessous pour ne pas encombrer encore plus le pâté ci-dessus.
En attendant, ce soir, j'ai attaqué une carte intermédiaire, qui va se placer entre le câble JAMMA et le PCB.
Elle me permettra de faire passer directement les signaux, ou de les intercepter pour les retravailler.
Ca pourra donc me servir pour travailler sur mes signaux de synchro, et sur ce projet de stick magique.
Je pourrai peut-être même y ajouter du support pour la gestion du redémarrage de mon système de sélection de jeux sur la 131in1, ce qui me permettrait d'éviter le bricolage de l'alim et de passer sur une alim d'arcade plutôt qu'une alim ATX.
Bref, si je valide la solution, j'en ferai probablement fabriquer des jolies en Chine.
Parce que pour le moment, c'est pas méga esthétique
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Et ce soir, j'ai fini de souder l'infinité de fils de cette carte.
J'ai changé le connecteur central pour un connecteur mâle.
Ca permet d'y mettre de connecteurs Dupont femelles, c'est plus pratique. Et pour les pins que je ne touche pas, je mets un cavalier dessus pour qu'ils passent direct de l'autre côté.
Avec une photo, vous comprendrez peut-être mieux à quoi ça peit servir...
Je pense avoir battu le record du nombre de cavaliers sur une même carte.
J'ai changé le connecteur central pour un connecteur mâle.
Ca permet d'y mettre de connecteurs Dupont femelles, c'est plus pratique. Et pour les pins que je ne touche pas, je mets un cavalier dessus pour qu'ils passent direct de l'autre côté.
Avec une photo, vous comprendrez peut-être mieux à quoi ça peit servir...
Je pense avoir battu le record du nombre de cavaliers sur une même carte.
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
A quoi elle pourrait servir cette carte intermédiaire ? A mettre des autofires ?
_________________
Sanjuro a écrit:en Special Guest Star, WRC dans le rôle de theWave
ancien directeur du service de renseignements NGS, il a le bras long comme un anaconda sous stéroïdes, si un gros bonnet doit se coucher, c'est qu'il en a donné l'ordre.
theWave- Pièce unique
- Messages : 10164
Date d'inscription : 25/10/2015
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Elle me sert à moi, en fait, pour mon bricolage.
Mais sous une forme plus charmante, oui, pourquoi pas
Elle se pose en intermédiaire et va me servir à travailler sur / exploiter plus tard / plus sérieusement:
- connexion facile de mon système 138in1 (voir autre WIP)
- interception du signal de synchro pour modifier le calage de l'image (voir autre WIP)
- connexion d'une carte de contrôle du panel de commande (WIP actuel) avec remappage des boutons, autofire (eh oui), utilisation de connectique autre que JAMMA, et 5 fils au lieu de 25.
- qui sait quoi d'autre... (contrôleurs sans fil, réglage des niveaux de couleurs, stéréo/mono, ...)
Ce format me permet d'empiler des cartes pour faire mes essais, et c'est déjà très bien!
Mais sous une forme plus charmante, oui, pourquoi pas
Elle se pose en intermédiaire et va me servir à travailler sur / exploiter plus tard / plus sérieusement:
- connexion facile de mon système 138in1 (voir autre WIP)
- interception du signal de synchro pour modifier le calage de l'image (voir autre WIP)
- connexion d'une carte de contrôle du panel de commande (WIP actuel) avec remappage des boutons, autofire (eh oui), utilisation de connectique autre que JAMMA, et 5 fils au lieu de 25.
- qui sait quoi d'autre... (contrôleurs sans fil, réglage des niveaux de couleurs, stéréo/mono, ...)
Ce format me permet d'empiler des cartes pour faire mes essais, et c'est déjà très bien!
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Edit: ça sent la fin.
La carte est faite, le code est fait, reste plus qu'à tester demain.
Je continue le projet avec une carte de sortie Peritel pour brancher tout ça sur ma télé, quand même, parce que c'était le but initial. Mais je ne rentrerai pas dans les détails parce que ça ne passionne pas les foules.
Par contre, je mettrai un petit post en plus pour expliquer le rebond.
Voilà la chose en place:
La carte est faite, le code est fait, reste plus qu'à tester demain.
Je continue le projet avec une carte de sortie Peritel pour brancher tout ça sur ma télé, quand même, parce que c'était le but initial. Mais je ne rentrerai pas dans les détails parce que ça ne passionne pas les foules.
Par contre, je mettrai un petit post en plus pour expliquer le rebond.
Voilà la chose en place:
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Ha ben non mais moi j'aime bien les explications techniques pour avoir le sentiment de comprendre. Je me sens moins con après en plus.
poup- Near-mint
- Messages : 588
Date d'inscription : 03/12/2015
Age : 46
Localisation : 37
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Voilà, une page qui se tourne, je vais pouvoir retourner à ma synthèse de signal de synchro!
J'ai pris des bouts de vidéo des opérations. Je ferai peut-être un petit montage si je le sens.
J'ai pris des bouts de vidéo des opérations. Je ferai peut-être un petit montage si je le sens.
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
En attendant, voilà déjà la preuve que ça marche, avec le PCB des 1000 Miles de @PetiteVieille.
Vu que j'aime bien gratter autour de ce projet, que j'ai essayé dans mon salon, et que les 3 mètres de câbles ne me garantissent pas que ma petite dernière (dans la vidéo) ne va pas se prendre les pieds dedans et tout péter, je crois que je vais essayer d'y ajouter une option Wireless. En plus, c'est un long week-end.
Vu que j'aime bien gratter autour de ce projet, que j'ai essayé dans mon salon, et que les 3 mètres de câbles ne me garantissent pas que ma petite dernière (dans la vidéo) ne va pas se prendre les pieds dedans et tout péter, je crois que je vais essayer d'y ajouter une option Wireless. En plus, c'est un long week-end.
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Bon, ben finalement, j'ai transformé l'Atari 2600 de ma femme en péritel RGB, après des heures pour faire marcher une puce de conversion RGB/Composite qui ne voulait pas synchroniser. Décidément, la synchro et moi...
En attendant, ça fonctionne.
Dommage que les jeux soient tous merdiques
Hop, ça rentre!
En attendant, ça fonctionne.
Dommage que les jeux soient tous merdiques
Hop, ça rentre!
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
et mais c'est super ça !
Bravo
Bravo
_________________
Re: [WIP 125%] Une carte joystick USB et JAMMA (et Atari 2600)
Merci, ouais, bon, visiblement, ces manettes, ça vieillit mal.
J'ai tenté une partie de décathlon et j'ai failli me démettre l'épaule. Cest super rigide, et les boutons sont à moitié morts.
Je crois que je WIP va se prolonger jusqu'à a25% avec le branchement du Twin stick maison sur la 2600!
J'ai tenté une partie de décathlon et j'ai failli me démettre l'épaule. Cest super rigide, et les boutons sont à moitié morts.
Je crois que je WIP va se prolonger jusqu'à a25% avec le branchement du Twin stick maison sur la 2600!
Page 1 sur 2 • 1, 2
Sujets similaires
» Centrage de l'image et changement de carte Jamma
» Atari VCS
» [RECH] plaque de montage type US pour joystick jap
» Une nouvelle console Atari dévoilée
» Toogle - Nouveau jeu sur Atari ST - Edition Côté Gamers
» Atari VCS
» [RECH] plaque de montage type US pour joystick jap
» Une nouvelle console Atari dévoilée
» Toogle - Nouveau jeu sur Atari ST - Edition Côté Gamers
Page 1 sur 2
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum