Adaptateur manette (et souris) SNES/NES à USB

L'idée

Lorsqu'on joue à des jeux NES et SNES avec un émulateur, l'idéal est bien sur d'utiliser les manettes (et souris) d'origine.

Adaptateur SNES

Adaptateur SNES

Pendant plusieurs annés, plusieurs personnes dont moi l'ont fait en contruisant un adaptateur pour port parallèle. Malheureusement, les ports parallèles sont de plus en plus rare car de nos jours, ce genre de Périphérique utiliserait USB. C'est donc pour cette raison que j'ai décidé de contruire un convertiseur manette NES/SNES à USB. Cependant, à cause de la nature d'USB, l'adaptateur est un peu plus complexe.

Note: Il existe maintenant une version supportant jusqu'à quatres manettes de NES et/ou SNES.




Nouvelles

  • 17 Novembre 2011:
    Nouveau logiciel version 1.9 supportant la manette Famicom avec microphone.
  • 3 Décembre 2006:
    Nouveau logiciel version 1.4:
    • Correction d'un problème en mode NES qui empêchait Windows de détecter le circuit. Voila ce qui arrive quand on teste seulement sous Linux. Leçon apprise...
    • Ajout du support pour les manette de style Atari. Plus de détails sur une autre page.
  • 29 Octobre 2006:
    • Version 1.3 du logiciel: Correction d'un problème survenant lorsqu'il n'y avait pas de manette branchée au circuit, meilleur support des manettes NES et support du circuit imprimé révision C.
    • Révision C du circuit imprimé maintenant disponible. Il y a maintenant un endroit pour souder les diodes et le circuit est un peu plus petit.
  • 2 Octobre 2006: Version 1.2 du logiciel. La souris SNES est maintenant supportée et detectée automatiquement. Il est possible de choisir entre les 3 niveaux de sensibilité de la souris en gardant l'un ou l'autre ou les deux boutons enfoncés lorsqu'on branche le cable USB.
  • 12 Juillet 2006: Création d'une section destinée à reçevoir des photos des montages des autres utilisateurs. Aucune photo pour l'instant...
  • 11 Juillet 2006: Ajout de quelques saisies d'écran et nouvelle version du logiciel (1.1), lequel fonctionne mieux sous Windows et MacOS X.



Résumé de la solution

J'ai construit mon adaptateur en utilisant le microcontrôleur ATmega8 d'Atmel. Ce microcontrôleur ne supporte 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 aussi vous vendre des circuits-imprimés seuls pré-asemblés et des microcontroleurs (boitier DIP seulement) pré-programmés. Au besoin, visitez mon magasin en ligne (anglais seulement pour l'instant).

Pas besoin de pilotes!
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 4 ou 8 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)




Schéma

Voici le schéma:

Une version pdf est aussi disponible (plus beau à voir et s'imprime mieux):
sch-revD.pdf

Liste de pièces:
  • U2: Un microcontroleur ATmega8. 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.
  • D1: Ne pas installer, ne sert plus.
  • R4: Ne pas installer, ne sert plus.
  • 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.

Pour la connection USB, 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-


Versions précédentes:
schematic-revA.png
schematic-revA.pdf
sch-revB.png
sch-revB.pdf

Support Famicom II

Famicom II à USB

Famicom II à USB

Depuis la version 1.9, les manettes famicom sont supportées. En fait, aucun changement n'était requis pour la manette 1 du système car celle-ci est identique à celles de la NES. Par contre, la manette 2 est différente. Elle est dotée d'un micro et n'a pas les boutons start et select! À la demande d'un client, j'ai modifié mon firmware pour permettre d'utiliser le micro comme un bouton.

L'absense de boutons Start et Select n'entraînait pas de complications (autre que le nombre restreint de boutons), le fonction micro, elle, demandait une entrée supplémentaire car elle utilise son propre fil.

Les signaux clock, latch et data sont câblés normalement et le circuit est mis en mode NES via les cavaliers ou soudures. Ensuite, le signal micro est câblé à l'entrée PC2 du micro-contrôleur. Finalement, il faut relier PC1 et PC0 pour activer le mode famicom avec entrée micro.

Voici un exemple de conversion de manette 2 Famicom à USB. L'espace dans le boîtier est très restreint. Il a fallu retirer un peu de plastique pour pouvoir y installer le circuit.
L'intérieur

L'intérieur

L'intérieur

L'intérieur

L'intérieur

L'intérieur

Développement

Développement

Ne rentre pas

Ne rentre pas

Rentre.

Rentre.

Câblé

Câblé




J'ai trouvé un schéma de la Famicom sur ce site japonais. Les manettes sont en page 1, partie inférieure gauche.
http://green.ap.teacup.com/junker/116.html

Voici le code de couleur pour la manette 2, extrait du schéma:
BrocheCouleurFonction
1 Brun Sortie micro
2 Rouge Gnd
3 Orange Data
4 Jaune Latch
5 Blanc Clock
6 Bleu Alim. 5volt




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

Mon premier prototype, construit sur un 'breadboard' avec des grosses composantes standard:


Photos de la version montage en surface:


Saisie d'écran de la manette fonctionnant sous Linux (jstest):


Saisie d'écran de la manette fonctionnant sous Windows XP (Control panel):


Saisie d'écran de la manette fonctionnant sous MacOS X (USB Prober):


Souris SNES sur USB:




Photos provenant des utilisateurs

Faites moi parvenir des photo de vos montages, j'aimerais bien en mettre plus ici.

29 Janvier 2014
Josafá Siqueira du Brésil m'a envoyé ces photos d'un adaptateur qu'il a fabriqué:



Tjerk Kuperus a construit ce circuit et mon circuit manette d'arcade pour snes sur une seule plaque:



Andreas Kronawetter, d'Autriche, a construit le circuit dans une manette de NES:



JP des Pays bas s'est construit une manette SNES USB:



Michael Herzog a converti une manette de NES à USB:



Philip Buchegger a construit un ordinateur dans un boîtier NES et s'est servi de ce circuit pour convertir les deux ports NES intégrés à USB:



Tobias Schulte, d'Allemagne, m'a fait parvenir ces photos:






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.