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
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.
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.
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:
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.
Voici le code de couleur pour la manette 2, extrait du schéma:
Broche
Couleur
Fonction
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:
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.
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.
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...
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.
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...)
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...)
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
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.
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.
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.
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...
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.
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...)
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...)
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'
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é:
É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).
É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.
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é:
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.