Gamoover

[move]Vous aimez la série Ricky la belle vie, Julio Iglésias ou l'émission Kohlanta ? Alors soyez les bienvenus sur Gamoover ! [/move]

[WIP] Un panel 1 joueur en 5 fils (A.K.A. SNES+)

Démarré par KodeIn, Mardi 26 Juillet 2011, 19:54:31 PM

KodeIn

Bonjour tout le monde!

J'avais besoin d'un projet tangible pour me motiver à continuer la rédaction des tutos sur le MSP430.
Comme j'ai tout un tas de documentation sur le protocole des manettes NES & SNES, un panel de borne à recâbler, un contrôleur arcade à créer pour ma SNES et de l'exploration de MSP430 à faire, je me suis dit que j'allais combiner le tout. ;D


Table des matières
 •Comment fonctionnent les joypads NES et SNES?
       •Le CMOS 4021
             •Ses 5 fils de connexions
             •Son fonctionnement
             •Usage dans le cas de la SNES

 •Le projet
       •Panel Board
       •Main Board


Comment fonctionnent les joypads NES et SNES?
J'aime beaucoup le système que Nintendo a utilisé pour la communication entre les joypad NES, SNES et la console.
Ce système simple, efficace, peu cher à implémenter et facile à faire évoluer repose entièrement sur un composant, le CMOS 4021.


Le CMOS 4021
Pour comprendre le fonctionnement de ce composant, on va d'abord regarder quelle sont les connections entre le joypad et la console.

Ses 5 fils de connexions
5 fils sont nécessaires pour piloter un 4021, les voici:
• Vdd - alimentation électrique.
• Masse - alimentation électrique.
• DATA - la sortie série.
• P/S ou LATCH - le signal qui va déclencher la "traduction" et la transmission.
• CLOCK - nécessaire pour que le 4021 sache quand envoyer le bit suivant.

Son fonctionnement

Le signal d'horloge est continuellement envoyé au composant.
Si le signal est haut sur CLOCK et P/S, alors la transmission commence. Le huitième "bloc" transmet l'état de l'entrée P8 jusqu'à ce que le signal d'horloge retombe.
Le bloc est alors inactif, il laisse passer les valeurs du bloc suivant.
Au signal d'horloge suivant, le septième bloc transmet l'état de P7 et ainsi de suite jusqu'à P1.

Usage dans le cas de la SNES
Le 4021 permet donc de "sérialiser" 8 entrées parallèles, ça ne suffit pas pour la manette SNES :
• 4 directions
• 4 boutons (ABXY)
• 2 gâchettes
• Start
• Select
=> 12 entrées.
Heureusement, le 4021 possède une entrée série, on peut donc "chainer" deux 4021, ce qui permet de passer de 8 à 16 signaux.
Il faudra simplement connecter la sortie Q8 du second 4021 à l'entre Serial In du premier et faire durer le signal P/S 16 cycles d'horloge au lieu de 8.
Et voici ce qu'on obtient à la sortie de ce montage :

Les 4 derniers bits sont utilisés pour décrire le périphérique connecté à la SNES. Dans notre cas, si on a besoin de plus de boutons, ils sont disponibles.


Conclusions
Ce système me semble particulièrement élégant et très bien pensé, tout est dans la simplicité.
Comme je le disais, les ingénieurs de chez Nintendo ont bien travaillés, ils ont utilisés un composant très courant et peu cher de manière intelligente.
(La solution des ingénieurs Sega me parait beaucoup moins élégante.)

Bien entendu, il doit certainement exister des puces plus récentes nécessitant moins de connections (1-Wire et autres joyeusetés) que je pourrais utiliser pour réduire les fils entre le panel et le JAMMA. Mais ça va à l'encontre d'un de mes buts : pouvoir faire un contrôleur arcade pour ma SNES.



Le projet
Donc, on sait comment fonctionne la manette SNES, on peut donc fabriquer son circuit pour une manette.
Mais il n'y a pas de MSP430 et ça ne sert à rien dans une borne…
L'idée, c'est de faire un second PCB qui servira d'interface entre le JAMMA et le panel, dont le cerveau sera un MSP430.


Panel Board
A l'heure actuelle, je n'ai pas encore le matos (breadboard, puces, leds, …), mais ça ne m'a pas empêché de commencer à plancher sur les PCB qui seront nécessaires.

Pour le PCB qui se fixera sous le panel, c'était facile, j'ai pioché sur le net ce schéma reprenant le circuit d'une manette :


Quelque jours de combat entre Eagle et moi (ENOOOORME merci à Iro pour avoir supporté mes MP  ^-) ont donné ce résultat:

Plus un ptit coup de toshop pour le logo de ce que je voudrais appeler mon site web. Le logo gamoo sera aussi ajouté par la suite ^^


Voici le typon, il est fourni sans aucune garantie! Si vous l'utilisez, c'est à vos risques et périls. Les dimensions du PCB sont de 50*37,5mm, l'image est en 600dpi.
J'attends les fonds pour faire un proto sur breadboard. Et si le test est convaincant, faudra que je trouve un bonne âme équipée de ce qu'il faut pour produire des PCB  ;)


Le fonctionnement intrinsèque du circuit a été expliqué plus haut, je vais donc me contenter d'expliquer 2-3 détails au sujet de ce PCB.
Avant toutes choses, j'ai souhaité éviter d'utiliser des composants montés en surface. Mon but était de permettre à tout le monde réaliser cette carte, il fallait donc que les composants soient faciles à souder.
Comme on peut le remarquer, malgré tous mes efforts, je n'ai pas réussit à router toutes les pistes sur une seule face, il faudra donc utiliser des petits bout de fil ici représentés en rouge.
PULLUP1 et PULLUP2 sont des réseaux de 8 résistances avec une broche commune (pour un total de 9 broches), j'ai préféré utiliser un réseau, c'est bien plus compact sur le PCB que 16 résistances distinctes. La raison de la présence de ces résistances est qu'on travaille avec du CMOS et que tous les input ne seront pas forcément utilisés. Il fallait donc équiper toutes ces entrées de résistances pull up, qui vont maintenir l'entrée à un niveau logique haut (1). Dans ce cas, le bouton poussoir est connecté à la masse, quand on l'actionnera, il fera passer l'entrée à un niveau bas (0).
La LED bicolore sert à la fois de témoin d'alimentation et de témoin d'activité de transmission de données. Elle est totalement facultative, mais c'est toujours utile d'avoir une preuve visuelle. Merci à Iro qui m'a conseillé de mettre un témoin d'alim, j'ai un peu élargi le concept par la suite ;)
Le connecteur 5 broche (qui semble énorme) est un Molex avec détrompeur. Il me semblait essentiel de "sécuriser" cette connexion, c'est pour cette raison que j'ai choisi ce connecteur.
Le connecteur type "pin header" des 17 broches (16 input + masse) m'a semblé la solution la plus facile à implémenter. Etant donné qu'il n'y a pas de risque à le connecter à l'envers, je n'ai pas jugé nécessaire de prévoir de détrompeur physique. Un simple point de couleur sur le connecteur femelle pour repérer la broche 1 ou la masse suffira. (la masse se trouve, depuis la version 0.4, sur la broche centrale)



Main Board
Petit souci, dans une borne le panel fonctionne en 5V, hors les MSP430 acceptent maximum 3,3V.
Pas d'inquiétude! On va se faire un petit circuit d'alim pour abaisser un voltage déjà dispo dans la borne (5V ou 12V) à 3,3V.
Pour ça, il me semble qu'un LM3940 ou similaire, avec ses condos, ça serait parfait.

Oui, mais les sorties du MSP430 vers le JAMMA seront aussi 3,3V, du coup… c'est là qu'interviennent les sn74lvc4245a.
Le sn74lvc4245a est un bus de 8 bits prenant 3,3V d'un côté et 5V de l'autre, nickel!

Du point de vue du MSP430, on a besoin d'un grand nombre d'I/O, potentiellement 16 pour les sorties et 3 pour le panel.
Donc, le format DIP, avec ses 20 broches, sera un peu short niveau des I/O…
Il va falloir employer le format TSSOP qui met à disposition 28 broches, mais moins facile à souder, puisque c'est du CMS.




EDIT : mise à jour du typon, version 0.4 maintenant au format paysage plutôt que portrait.  <:)
Atari 2600 | Spectravideo SV-328 :'( | Amiga 500 | NES - SNES - N64 - NGC - Wii - GBA - GBAsp - DSi | PS1 - PS2 - PS3 - PSP 2000 | MD - DC | XBox - 360 | MacBook | OpenPandora GHZ edition \o/
WIP [pause] : Borne Euro générique de chez Jeux COURTET
Tutos LaunchPad MSP430 001 - 002 - 003 - 004 en attente

KodeIn

Petit up pour cause de révision majeure du texte... :D
Atari 2600 | Spectravideo SV-328 :'( | Amiga 500 | NES - SNES - N64 - NGC - Wii - GBA - GBAsp - DSi | PS1 - PS2 - PS3 - PSP 2000 | MD - DC | XBox - 360 | MacBook | OpenPandora GHZ edition \o/
WIP [pause] : Borne Euro générique de chez Jeux COURTET
Tutos LaunchPad MSP430 001 - 002 - 003 - 004 en attente

HerosSuperMan

Joli et bien documenté
encore du travail de pro ça  ^-
Mes Wip, mes RT... la vie quoi ^^
Mes recherches\échanges (bornes, PCB, pièces ...)
Recherche .. non..rien rien rien..le problème c'est que l'on fini toujours par trouver... >:D

Iro

Nickel !!!!
Tu n'aurais pas une image échelle 1 du montage pour voir sa taille ?
Mais rendons à César ce qui est à César : Merci à Liodel pour les astuces Eagles et Aganyte pour les astuces de montage.
<:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

ɐɹqoƆ‾ɥƃᴉH

C'est cool ce petit projet et la carte est pas mal ^-

Par contre, je comprends la finalité de la chose avec le MSP, j'ai du rater quelque chose au passage sans doute...

Iro

Pour décoder et ensuite brancher sur un jamma ou un hack quelconque.

"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

ɐɹqoƆ‾ɥƃᴉH

#6
Encoder le panel "style SNES" puis décoder de l'autre coté, c'est ça ?

Edit : j'avais pas lu le titre du topic ^^

Maitre_Poulpi

J'ai pas encore tout saisi non plus mais étant padawan du MSP430, je supporte  :D
May the Gamooforce be with you !
À partir du moment où un fou sait qu'il l'est, peut-on toujours le nommer ainsi ?
Boulot, rétro, dodo... et un peu (beaucoup) de TATC© (Touche A Tout Compulsif)...
Le WIP en slip et le hack Sega en Pijama !

KodeIn

#8
Citation de: High_Cobra le Jeudi 28 Juillet 2011, 15:25:10 PM
Encoder le panel "style SNES" puis décoder de l'autre coté, c'est ça ?

Edit : j'avais pas lu le titre du topic ^^
C'est bien ça, "C'est totalement inutile et donc rigoureusement indispensable!" Jérômes Bonaldi, mon héros.  :D


Niveau de la taille du PCB, c'est un peu encombrant, il fait approx 5 par 5,5cm.
Avec des CMS, j'aurais fait du BEAUCOUP plus compact, mais BEAUCOUP moins faisable avec du matos de hobbyiste.
Atari 2600 | Spectravideo SV-328 :'( | Amiga 500 | NES - SNES - N64 - NGC - Wii - GBA - GBAsp - DSi | PS1 - PS2 - PS3 - PSP 2000 | MD - DC | XBox - 360 | MacBook | OpenPandora GHZ edition \o/
WIP [pause] : Borne Euro générique de chez Jeux COURTET
Tutos LaunchPad MSP430 001 - 002 - 003 - 004 en attente

ɐɹqoƆ‾ɥƃᴉH

Alors en fait, c'est ça oui... Donc ok, ça peut être marrant à faire mais quitte à faire joujou avec des MSP, pourquoi ne pas en mettre un de chaque coté et les faire dialoguer par un BUS ? Ca pourrait être fun aussi... Et si tu fais un bus, ça te permet de mettre autant de "MSP Panel" que tu veux sur le bus et un MSP qui décode tout ça de l'autre coté.

Plus intéressant, application réel possible, moins couteux et sans doute plus simple à faire les cartes aussi...

Bien que je soutienne tout à fait ton initiative ^-^

KodeIn

#10
Tsé quoi? C'est pas con, ce que tu dis!  =:))

Juste, l'avantage du montage SNES, c'était que j'avais déjà le schéma tout fait.
Et comme c'était pour un premier contact avec Eagle, c'était plus simple de partir là-dessus, que de partir en freestyle complet.

Excuse de grosse baltringue : Puis, tu vois, je respecte beaucoup le travail des ingénieurs de chez Nintendo et c'est une manière de leur rendre hommage.
Atari 2600 | Spectravideo SV-328 :'( | Amiga 500 | NES - SNES - N64 - NGC - Wii - GBA - GBAsp - DSi | PS1 - PS2 - PS3 - PSP 2000 | MD - DC | XBox - 360 | MacBook | OpenPandora GHZ edition \o/
WIP [pause] : Borne Euro générique de chez Jeux COURTET
Tutos LaunchPad MSP430 001 - 002 - 003 - 004 en attente

Little_Rabbit

Salut,

Je viens mettre mon petit grain de sel :).

J'avais lu la première version du topic, et j'avoue que je n'avais pas bien compris le but de tout ça. J'ai ensuite relu 2 ou 3 fois la seconde version qui est déjà plus claire :D. Je pensais mieux cerner le projet. Mais en y réfléchissant bien, je ne suis toujours pas bien sûr d'avoir saisi la finalité du projet  =:)).

KodeIn, je pense qu'il manque un schéma synoptique à ton exposé pour que tout le monde comprenne d'emblée ce qu'est le projet ;).

Voici ce que j'ai compris :
- tu veux faire un panel avec joystick et bouton type arcade, et que ce panel puisse être branché sur une SNES, d'où le montage d'encodage série des boutons et d-pad
- mais le même panel pourra ensuite être relié à une borne en Jamma, et alors on redécode le flux série au standard SNES vers des broches discrètes pour du Jamma

J'ai bon ??  :D C'est ça ton projet ?

Vu qu'il est orienté MSP430, pourquoi ne pas avoir fait cette première partie avec un MSP430 ? Alors certes il y a le problème du 5V/3,3V, et la puissance du MSP est complètement sur-dimensionnée, mais cela pourrait être la première étape et petit à petit, on ajouterait de nouvelles fonctionnalités, en faisant évoluer le projet de base. L'idée du bus de High_Cobra est également très séduisante !

Ton projet me rappelle un petit développement que j'avais fait il y a des années chez Delphine Soft. On démarrait le développement de Fade to Black et Shaq Fu et on mettait en place un environnement de développement complètement nouveau. On passait d'Amiga 2000/3000 à des stations Silicon Graphics sous Unix (hé oui, le succès de Flashback avait été tel que cela apportait des moyens tout autre !...).

En gros, avant de faire tourner un jeu sur telle ou telle plateforme (SNES, Megadrive, etc.), il était développé dans un genre de framework maison, avec toutes sortes de possibilités d'édition et de création. Pour tester le jeu sur ce framework, il fallait néanmoins des manettes de jeu, hors cela n'existait pas sur Silicon Graphics ! Du coup, j'avais démonté une manette compatible SNES pour en comprendre le fonctionnement, et cherché une solution pour interfacer cela sur les Silicon. Hors cest stations sont assez fermées comme bestiole, il n'y a même pas de port parallèle si je me souviens bien, seulement un port série, sans documentation pour accéder à d'éventuelles couches bas niveau. La solution que j'avais trouvée était la suivante :
- je prenais un Amiga 500 et branchais la manette SNES sur son port parallèle
- un petit programme sur l'A500 générait sur une broche programmée en sortie le signal d'horloge pour le registre à décalage de la manette, et lisait successivement sur une autre broche l'état de chaque bouton.
- on composait un mot de 2 x 8 bits résultant, et on l'envoyait sur le port série RS-232 de l'A500
- sur Silicon, un petit bout de soft tournait en tâche de fond et récupérait les valeurs du port série pour les mettre dans une zone de mémoire partagée
- notre Framework récupérait cette valeur et alimentait le moteur de jeu

Ça marchait super bien, sans aucune latence :D. On a utilisé ce système durant des années. Alors certes, réduire un Amiga 500 à cet usage, c'est un peu insultant pour la bécane, mais on a fait avec ce qu'on avait sous la main, et opté pour une solution simple ne nécessitant pas de développement matériel (à part le câble manette -> port parallèle).

Fin de l'anecdote ;), j'espère ne pas avoir pollué ton post !

A+
Recherche bornes dédiées ou PCB originaux: Miss Pacman, Dig Dug, Galaga, Mappy, Asteroids, Battlezone, Missile Command, Tempest, Star Wars, Donkey Kong (+ Jr), Mario Bros, Moon Patrol, Defender, Joust, Frogger, Gyruss, Pooyan, Space Tactics, Zaxxon, etc. Flip : Gottlieb des années 80 (Spirit, Amazon Hunt, ...), Baby Pac Man. Divers :  Ice Cold Beer => Trois fois rien quoi ! :D
Ma séance sur le divan : c'est grave Docteur ? :-\
Ma gaming room, ma storage room

Maitre_Poulpi

J'ai des frissons à chaque fois que tu racontes tes anecdotes chez Delphine Software. Et les frissons c'est pour rester poli  =:))

Donc le but, c'est de créer un panel directement compatible avec la snes mais également Jamma ?
C'est-à-dire, tu te pointes avec ton panel devant ta tv où il y a ta snes et tu joues avec.
Ou alors, tu mets ce panel sur une borne ou autre directement sur jamma et tu joues. ?
May the Gamooforce be with you !
À partir du moment où un fou sait qu'il l'est, peut-on toujours le nommer ainsi ?
Boulot, rétro, dodo... et un peu (beaucoup) de TATC© (Touche A Tout Compulsif)...
Le WIP en slip et le hack Sega en Pijama !

Iro

#13
Le but est tous simple : Réduire le nombre de fils entre le panel et le jamma ou autre.
Comme le JVS par exemple. Ou comme toutes manettes à XXX boutons de maintenant.
Et en profiter pour rendre le panel compatible SNES.
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

Maitre_Poulpi

Citation de: Iro le Jeudi 28 Juillet 2011, 19:16:58 PM
Le but est tous simple : Réduire le nombre de fils entre le panel et le jamma ou autre.
Comme le JVS par exemple. Ou comme toutes manettes à XXX boutons de maintenant.
Et en profiter pour rendre le panel compatible SNES.

D'accord, on fait une grosse manette avec un petit fil que l'on branche facilement.
Un peu comme l'upcb mais compatible snes et jamma ? Et tout ça en utilisant notre fameux MSP.
On peut envisager par la suite d'étendre à d'autres machines ?
May the Gamooforce be with you !
À partir du moment où un fou sait qu'il l'est, peut-on toujours le nommer ainsi ?
Boulot, rétro, dodo... et un peu (beaucoup) de TATC© (Touche A Tout Compulsif)...
Le WIP en slip et le hack Sega en Pijama !

KodeIn

#15
Citation de: Little_Rabbit le Jeudi 28 Juillet 2011, 18:04:22 PM
[…]
J'avais lu la première version du topic, et j'avoue que je n'avais pas bien compris le but de tout ça. J'ai ensuite relu 2 ou 3 fois la seconde version qui est déjà plus claire :D.
[…]
Ouais, je dois reconnaitre que la première version était d'une clarté que je qualifierais de boueuse…  :-[

J'avais écrit comme ça me venait et comme j'étais un peu fatigué, ça a donné une bouillie à la limite de l'illisibilité. (et même au-delà de la limite)
En me relisant, j'ai eu un peu honte, ce qui a mené à une réécriture bien mieux structurée.
Ça n'est toujours pas merveilleusement bien foutu, mais ça va s'améliorer. (je suis meilleur pour remanier un texte que pour l'écrire ;) )

Et on aime énormément tes anecdotes, les jeux Delphine ont un peu bercé mon enfance. Donc avoir un aperçu de ce qui se passait "de l'autre coté du miroir" est un très grand plaisir.




Le but principal, c'était de proposer un PCB pas cher et facile à fabriquer avec du matos de Hobbyiste. Ceci dans le but d'éviter les hackpads de manettes SNES quand je voudrai faire deux manettes arcade pour ma SNES. (je l'ai déjà dit ailleurs, je suis pour la sauvegarde des vieux joypads)

Puis, comme je suis une GROSSE FEIGNASSE, je me suis dit que j'avais déjà un encodeur pour manettes, pourquoi perdre mon temps à en faire un autre à base de MSP430?
Donc, j'ai préféré repartir de ce PCB pour faire ce petit projet. Il est plus inutile qu'autre chose, mais ça m'amuse : permettre de brancher ce PCB/un joypad SNES sur une borne en JAMMA par le biais d'un PCB traducteur. Traducteur qui pourrait éventuellement rajouter des trucs sympa comme l'autofire, par exemple.

Puis ça fait une manière facile de swapper entre un panel 1 joueur et un panel 2 joueur, ça fait un cablage plus propre sous le panel, toussah…



Citation de: Maitre_Poulpi le Jeudi 28 Juillet 2011, 19:28:03 PM
[…]
On peut envisager par la suite d'étendre à d'autres machines ?
Facilement, puisque c'est le MSP430 qui se charge de faire la traduction.
C'est sa programmation qu'il faudra altérer pour changer la manière dont il transmettra l'état des boutons.
Atari 2600 | Spectravideo SV-328 :'( | Amiga 500 | NES - SNES - N64 - NGC - Wii - GBA - GBAsp - DSi | PS1 - PS2 - PS3 - PSP 2000 | MD - DC | XBox - 360 | MacBook | OpenPandora GHZ edition \o/
WIP [pause] : Borne Euro générique de chez Jeux COURTET
Tutos LaunchPad MSP430 001 - 002 - 003 - 004 en attente