Adaptateur joystick/manette/multi-tap Atari/SMS/Genesis à USB

L'idée

Pour jouer à de bons vieux jeux avec des émulateurs, l'idéal est de le faire avec les manettes d'origine. À une certaine époque, plusieurs consoles utilisaient des prises de type DB9. Ce projet vise à supporter ce type de manettes sur un port USB.

Pendant plusieurs années, plusieurs personnes dont moi construisaient des adaptateurs fonctionnant sur un port port parallèle. Malheureusement, les ports parallèles sont de plus en plus rare car de nos jours, USB est utilisé pour presque tout. Par contre, à cause de la nature d'USB, l'adaptateur est un peu plus complexe.

J'ai donc conçu mon propre adaptateur manette DB9 à USB. Les manettes supportés sont les suivantes:
  • Manettes Atari et compatibles à un bouton
  • Manettes SMS et compatibles à deux boutons
  • Manettes Genesis 3 et 6 boutons (Testées: Sega modèles 1650, mk-1653 et mk-1470, Fighter Stick SG-6)
  • Multi-tap (Team player) pour Sega Genesis. Voir la page d'information sur les multi-tap pour Sega Genesis pour les modèles supportés.
    • Jusqu'à quatres manettes Genesis (3 et/ou 6 boutons) peuvent être utilisées simultanément.
    • Sous Linux, les quatres manettes apparaissent en tant qu'une seule manette de jeu possédant 8 axes et 32 boutons
    • Sous Windows, 4 manettes indépendantes apparaissent.
  • Manette "Sega Paddle controller" HPD-200 (voir fonctions)
Genesis 3 boutons

Genesis 3 boutons

Genesis 6 boutons

Genesis 6 boutons

Sega master system

Sega master system

Multi-tap MK-1654

Multi-tap MK-1654

Sega paddle controller HPD-200

Sega paddle controller HPD-200



Note: La solution sur cette page peut aussi être utilisée pour des manettes de NES et SNES. Ce projet est expliqué en détail sur sa propre page.



Résumé de la solution

À l'origine j'ai construit mon adaptateur en utilisant le microcontrôleur Atmega8 d'Atmel, mais le microcontrôleur équivalent plus récent, le Atmega8a fonctionne également à merveille. Ces microcontrôleurs ne supportent pas USB nativement alors j'ai utilisé le pilote USB logiciel-seulement codé par Objective Development. Ce pilote permet a un microcontrôleur AVR tel que l'ATmega8 de communiquer en USB avec un minimum de composantes externes. Grace à cela, l'adaptateur peut être construit facilement, sans se ruiner.

Selon vos habiletés, vous pouvez construire l'adaptateur sur un 'breadboard' (En français c'est quoi?) en utilisant des composantes standards ou la version 'montage en surface' en utilisant le dessin de circuit-imprimé fourni. Je peux vous vendre des circuits-imprimés pré-assemblés et des micro-controleurs (boitier DIP seulement) pré-programmés. Au besoin, visitez mon magasin en ligne (anglais seulement pour l'instant).

Auncun pilote requis!
Le standard USB définit certaines classes de périphériques. Dans ce project, j'utilise la classe HID (Humain input device) qui permet de communiquer à l'ordinateur de façon générique que le périphérique connecté est un controleur de jeu possédant 2 axes et 2 boutons. Ceci permet au circuit de fonctionner sous plusieurs systèmes d'exploitation automatiquement, en autant que le système en question supporte USB et la classe HID. (J'ai essayé et ça fonctionne sous Win98, Win2K, WinXP et Linux)




Fonctions HPD-200

Le support de cette manette un peu spéciale a été réalisé pour un client. À sa demande, j'ai rendu possible la séparation des deux boutons (normalement, les deux boutons sont équivalents) et j'ai également implémenté quatre modes d'opération pour permettre de modifier le comportement de la manette pour s'adapter à différents scénarios d'utilisation.

Le mode d'opération est sélectionné en gardant certains boutons enfoncés pendant le branchement tel qu'expliqué dans le tableau suivant.
ModeDescription
0Le mode par défaut. Les deux boutons ne font qu'un et c'est l'axe droite-gauche qui est contrôlé.
1Activé si le bouton rond est maintenu enfoncé lors du branchement. Les deux boutons ne font qu'un mais cette fois c'est l'axe haut-bas qui est contrôlé.
2Activé si le bouton latéral est maintenu enfoncé lors du branchement. Dans ce mode, chaque bouton fonctionne indépendamment et c'est l'axe droite-gauche qui est contrôlé.
3Activé si les deux boutons sont maintenus enfoncés lors du branchement. Dans ce mode, les deux boutons sont indépendants et c'est l'axa haut-bas qui est contrôlé.

Pour que les deux boutons fonctionnent séparément, il faut câbler le bouton latéral directement au circuit, de sorte que lorsqu'appuyé, il fasse contact entre la masse (GND) et le signal PB4 du MCU. Voici, à titre d'exemple, deux photos d'une manette convertie à USB.





Schéma

Voici la version moderne du shéma (pour firmware 1.5 et plus):

Voici l'ancienne version du shéma (pour les firmware jusqu'a version 1.4):
revE-atari.png
sch-revE-atari.pdf

Liste de pièces:
  • U2: Un microcontroleur ATmega8 ou Atmega8a. ATMEGA8-16PC, ATMEGA8-16PI, ATMEGA8-16PJ ou ATMEGA8-16PU. Ne pas utiliser un ATMEGA8L-*, car l'horloge de 12Mhz dépasserait la limite.
  • R1: Résistance de 1.5k. Ordinaire au carbone 1/4 watt.
  • R2, R3: Résistance de 68 ohms. Ordinaire au carbone 1/4 watt.
  • D2, D3: 3.6 volts zener diodes.
  • Y1: Crystal 12 Mhz.
  • C2, C3: Condensateurs de 27 pf. Si votre cristal recommande une autre valeur, utilisez la.
  • C1: Condensateur de 10 uf. Installer près du ATmega8.
  • JP1, JP2: Cavaliers. Vous pouvez aussi utiliser des interrupteurs DIP, des interrupteurs ordinaires ou des ponts de soudure.
  • J2: Connecteur 2x3 (6 broches), espacement 2.54mm. Pour la programmation du ATmega8.
  • P1: Connecteur DB9 male

Pour la connection USB, vous pouvez simplement dénuder un cable USB et souder les fils directement sur le circuit. USB utilise des couleurs de fils standardisés:
Couleur Description
  Rouge +5 volts
  Noir 0 volts (GND)
  Vert D+
  Blanc D-



Programmation du microcontrôleur

Les microcontroleurs sont des composantes qui doivent être programmés pour qu'elles fassent quelque chose d'utile. Voici donc le fichier .hex qu'il faut programmer dans le microcontroleur:
FichierCommentaires
nes_snes_db9_usb-1.9.hex
  • La manette Famicom avec microphone est maintenant supportée. En mode NES, relier PC1 et PC0 pour activer ce mode spécial. Le signal du micro en provenance de la manette doit être soudé à PC2.
  • Mise en place de 3 configurations de boutons pour le mode Famicom.
  • Correction d'un bug prévenant l'affichage correct du nom du périphérique.
nes_snes_db9_usb-1.8.hex
  • Le mode TGFX possède maintenant un nom spécifique et sa propre paire VID/PID USB.
  • La manette "Sega Paddle" HPD-200 est maintenant supportée. Auto-détectée en mode DB9. Support des deux boutons en mode indépendant si le circuit peut être installé dans la manette.
  • L'interrogation des manettes est maintenant synchronisée avec la communication USB. Ceci aide à maintenir la stabilité du rythme des impulsions lors de l'interrogation des manettes.
nes_snes_db9_usb-1.7.hex
  • Amélioration de l'auto-détection des manettes Genesis à 6 boutons
  • Le bouton 'MODE' des manettes Genesis à 6 boutons est maintenant utilisable.
  • Support du multi-tap Sega (testé avec le modèle MK-1654 seulement!)(informations techniques)
  • Support des manettes TGFX
nes_snes_db9_usb-1.6.hex
  • L'ordre des boutons pour les manettes Atari et SMS a été révisé car les boutons 2 et 3 était utilisés. Ceci ne fonctionnait pas bien avec certains émulateurs supportant le bouton 1 seulement.
  • Il est maintenant possible de forcer l'adaptateur à utiliser le mode Genesis 6 boutons en gardant le bouton 'start' enfoncé lors du branchement de l'adaptateur au port USB. Au cas où l'auto-détection ne fonctionne pas...
nes_snes_db9_usb-1.5.hex
  • Les manettes Genesis 3 et 6 boutons sont maintenant supportés
  • Tout les manettes ayant un connecteur DB9 (Genesis 3/6 boutons, SMS, Atari 1/2 boutons et compatibles) sont reconnues automatiquement.
  • Le câblage du connecteur DB9 a changé pour être plus facile à effectuer sur le circuit imprimé multiuse.
  • Les manettes NES sont maintenant détectées en mode SNES. Fiable avec les manettes de marque Nintendo. Si des clones ne sont pas détectés, utilisez le mode NES.
  • Le projet est maintenant sous License GPL 2
snes_nes_atari_usb-1.4.hex
  • Les manettes de style Atari sont maintenant supportés (Atari, Commodore, etc.). Les variations à deux boutons le sont aussi. (Par exemple, Sega Master System).
  • Ajout de 'padding' au 'report descriptor' en mode NES. Ceci permet au mode NES de fonctionner correctement sous Windows. (Ce n'était pas nécéssaire avec Linux...)
snes_nes_usb-1.3.hex
  • Correction d'une erreur de code qui causait des événements de boutons aléatoires lorsqu'il n'y avait pas de manette connectée au circuit.
  • Le mode NES a maintenant son propre numéro de produit USB
  • La pin PD1 est maintenant laissée en entrée (sans pull-up) car elle est soudée avec PD0 sur la révision C du circuit imprimé. (Je préfère faire cela au lieu de jeter un lot de 50 circuits à la poubelle ou faire des corrections en coupant une trace et en soudant un fil...)
snes_nes_usb-1.2.hex La souris SNES est maintenant supportée.
snes_nes_usb-1.1.hex Ajustement du 'report descriptor' pour un meilleur fonctionnement sous Windows et MacOS X.
snes_nes_usb-1.0.hex Version initiale. Support des manette NES et SNES.

Plusieurs micro-contrôleurs possèdent ce qu'on appelle 'Fuse bytes'. Dans le cas du ATmega8, il y en a deux: Le 'high byte' et le 'low byte'. Ces deux octets servent à configurer certains paramètres du microcontroleur. Quel type d'horloge? Crystal? Résonateur? Oscillateur RC interne? Permettre la programmation par ISP? Il est très important de configurer les fuse bytes avec les bonnes valeurs. L'utilisation de mauvaises valeurs peut rendre le microcontroleur inutilisable.

Pour ce projet, voici les bonnes valeurs:
high byte = 0xc9, low byte = 0x9f

Pour de l'information sur la programmation d'un AVR, visitez ma page sur la programmation d'AVR




Code source

Pour ceux qui aimeraient modifier le comportement de l'adaptateur ou supporter d'autres types de manettes, voici le code source. Depuis la version 1.5, le code est publié sous la license GPLv2. Les version antérieures était sous la license d'Objective Development, qui est en fait GPL avec quelques extensions pour couvrir le matériel (le circuit). Voir le fichier License.txt pour plus d'information.
FichierCommentaires
nes_snes_db9_usb-1.9.tar.gz
  • La manette Famicom avec microphone est maintenant supportée. En mode NES, relier PC1 et PC0 pour activer ce mode spécial. Le signal du micro en provenance de la manette doit être soudé à PC2.
  • Correction d'un bug prévenant l'affichage correct du nom du périphérique.
nes_snes_db9_usb-1.8.tar.gz
  • Le mode TGFX possède maintenant un nom spécifique et sa propre paire VID/PID USB.
  • La manette "Sega Paddle" HPD-200 est maintenant supportée. Auto-détectée en mode DB9. Support des deux boutons en mode indépendant si le circuit peut être installé dans la manette.
  • L'interrogation des manettes est maintenant synchronisée avec la communication USB. Ceci aide à maintenir la stabilité du rythme des impulsions lors de l'interrogation des manettes.
nes_snes_db9_usb-1.7.tar.gz
  • Amélioration de l'auto-détection des manettes Genesis à 6 boutons
  • Le bouton 'MODE' des manettes Genesis à 6 boutons est maintenant utilisable.
  • Support du multi-tap Sega (testé avec le modèle MK-1654 seulement!)(informations techniques)
  • Support des manettes TGFX
nes_snes_db9_usb-1.6.tar.gz
  • L'ordre des boutons pour les manettes Atari et SMS a été révisé car les boutons 2 et 3 était utilisés. Ceci ne fonctionnait pas bien avec certains émulateurs supportant le bouton 1 seulement.
  • Il est maintenant possible de forcer l'adaptateur à utiliser le mode Genesis 6 boutons en gardant le bouton 'start' enfoncé lors du branchement de l'adaptateur au port USB. Au cas où l'auto-détection ne fonctionne pas...
nes_snes_db9_usb-1.5.tar.gz
  • Les manettes Genesis 3 et 6 boutons sont maintenant supportées
  • Tout les manettes ayant un connecteur DB9 (Genesis 3/6 boutons, SMS, Atari 1/2 boutons et compatibles) sont reconnues automatiquement.
  • Le câblage du connecteur DB9 a changé pour être plus facile à effectuer sur le circuit imprimé multiuse.
  • Les manettes NES sont maintenant détectées en mode SNES. Fiable avec les manettes de marque Nintendo. Si des clones ne sont pas détectés, utilisez le mode NES.
  • Le projet est maintenant sous License GPL 2
nes_snes_usb-1.4.tar.gz
  • Les manettes de style Atari sont maintenant supportés (Atari, Commodore, etc). Les variations à deux boutons le sont aussi. (eg: Sega Master System).
  • Ajout de 'padding' au 'report descriptor' en mode NES. Ceci permet au mode NES de fonctionner correctement sous Windows. (Ce n'était pas nécéssaire avec Linux...)
nes_snes_usb-1.3.tar.gz
  • Correction d'une erreur de code qui causait des événements de boutons aléatoires lorsqu'il n'y avait pas de manette connectée au circuit.
  • Le mode NES a maintenant son propre numéro de produit USB
  • La pin PD1 est maintenant laissée en entrée (sans pull-up) car elle est soudée avec PD0 sur la révision C du circuit imprimé. (Je préfère faire cela au lieu de jeter un lot de 50 circuits à la poubelle ou faire des corrections en coupant une trace et en soudant un fil...)
nes_snes_usb-1.2.tar.gz La souris SNES est maintenant supportée.
nes_snes_usb-1.1.tar.gz Ajustement du 'report descriptor' pour un meilleur fonctionnement sous Windows et MacOS X.
nes_snes_usb-1.0.tar.gz Version initiale. Support des manette NES et SNES.

Contactez moi à l'addresse raph@raphnet.net si vous faites des modifications intéressantes.

Modifications apportés au pilote USB d'Objective Development:
Le cavalier de sélection de mode SNES/NES affecte le contenu du 'report descriptor'. Pour que ça soit possible, j'ai modifié le pilote USB d'Objective Development. Voici un 'diff' généré à partir du pilote USB contenu dans HIDKeys.2006-03-14:
usbdrv-diff

Combinaison Vendor ID/Product ID USB:
Veuillez ne pas réutiliser ma combinaison VID/PID pour des projets dérivés ou autres. Obtenez-en un vous-même. J'ai acheté les miens chez mecanique, et ça coute beaucoup moins cher que de devenir membre du forum des implémenteurs USB (2000$ US)...


Circuit imprimé pour la version 'montage en surface'

revC pcb La version montage en surface comporte plusieurs avantages:
  • Très petite. (environ 1"1/4 x 3/4" ou 32mm x 20mm).
  • Rentre dans un tuyau de PVC de 3/4". Parfait pour mettre en-ligne avec un connecteur USB.
  • Peut être installé directement à l'intérieur d'une manette ou joystick.
  • Moins de fils à souder que sur un 'breadboard'. En quelque sorte, c'est plus facile à assembler.
  • Apparance plus professionelle.
  • Vous pouvez utiliser le circuit à d'autres fins. (Après tout, vous avez un microcontroleur reprogrammable avec USB et quelques signaux d'entrée/sortie...)
D'un autre coté, souder des composantes en montage en surface peut être plus difficile si vous n'avez pas un équipement approprié ou si vous êtes débutant.

Voici une vue composée de la révision C du circuit-imprimé:
vue composee rev.C
Voici comme référence la vue composé de la révision B: snes_nes_usb_pcb_revB.png
Voici les fichiers gerber à utiliser pour contruire vos propres circuits imprimés:
Révision C: snesusb_revC.zip
Révision B: snes_nes_usb_PCB-revB.zip




Assemblage de la version 'montage en surface'

Étape 1: Utilisez la vue composée, la liste des composantes et le schéma pour trouver l'endroit ou mettre chaque composantes. Après avoir tout soudé, inspectez le tout soigneusement pour éviter les ponts de soudures et les soudures froides. IMPORTANT: Faire un pont de soudure entre PD1 et PD0 (voir schéma).

cablage SNES Étape 2: Utilisez le schéma de gauche approprié pour savoir ou souder les fils USB, ISP et ceux de la manette. Le cable ISP peut être construit avec un connecteur 2x3 et un morceau de cable plat. Le 'pinout' du schéma suit le standard d'atmel pour l'ISP des AVR via 6 fils.

Étape 3: Si vous voulez utiliser une manette de NES, fermez JP1 en faisant un pont de soudure ou en soudant un petit bout de fil. Si vous utilisez une manette à connecteur DB9 (ex: Atari), fermez JP1 et JP2. Regardez les images à droite pour des exemples.

Étape 4: Branchez le cable ISP et le cable USB. Utilisez un programmeur pour programmer le fichier hex dans l'ATmega8. Ensuite, configurez les 'fuses bytes' (High byte=0xc9, low byte=0x9f) correctement.

Étape 5: Essayez l'adaptateur avec un jeu. Si tout fonctionne bien, enlevez le cable ISP si vous ne prévoyez pas mettre à jour le code. Maintenant pour protéger le circuit, utilisez une petite boite ou mettez le à l'intérieur d'une gaine thermo-rétractable. Je vous recommande aussi de mettre un peu de colle chaude par dessus les soudures des fils, pour empêcher les fils de se briser en cet endroit.

Étape 6: Amusez-vous!



Images et saisies d'écran

Voici certains joysticks de style Atari que j'utilise avec cet adaptateur.
Voici la première version de mon adaptateur. Il est construit avec le circuit imprimé revision C, un DB9 male et quelques fils.
Voici à quoi ressemblait mon installation lorsque je cherchais à comprendre le fonctionnement du multi-tap. J'ai par la suite écris ce document expliquant son fonctionnement.
Le multi-tap apparaissant comme 4 manettes indépendantes et distinctes sous Windows XP.



Photos provenant des utilisateurs

J'aime bien voir comment les autres s'y prennent pour assembler mes projets. Vous pouvez me faire parvenir des photos de vos montages et je les afficherai ici.

25 septembre 2016 (Dimanche)
Filippo d'Italie a converti un joystick Alberici pour PC (DB15) à USB. Les joystick Alberici, en particuler la version avec branchement DB9 pour Commodore 64, furent très populaires en Italie à la fin des annés 80 pour leur solidité et fiabilité...



17 février 2016 (Mercredi)
Filippo d'Italie a construit son projet dans une boite de tictac pour pouvoir utiliser ses manettes C=64 avec l'émulateur VICE. J'aime la petite trappe d'accès pour le connecteur ISP!



6 janvier 2015 (Mardi)
Roman Sysoev de Russie a fabriqué cet adaptateur en logeant dans un boîtier de souris HP un circuit imprimé ARCAdaptor - http://adapto.rs (Russe)



24 décembre 2013 (Mardi)
Slawomir Krysztowiak de Pologne m'a envoyé ces photos de l'adaptateur qu'il a fabriqué en cadeau de Noël pour son frère.



Quelqu'un de France m'a fait parvenir ces photos qui sont un bon exemple de comment monter ce circuit à l'intérieur même d'une manette de Sega Master System:



Laurent Quesnel a installé le circuit à l'intérieur d'une cartouche SMS:



JP des Pays-Bas s'est construit une manette Genesis USB::





Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.