X2Wii Convertisseur manette N64, NES ou SNES à Gamecube/Wii
Résumé du projet

C'est une merveilleuse idée qu'a eu Nintendo en proposant à nouveau
les jeux de Nes, Snes et N64 sur leur nouvelle console, la Wii. Du moment que j'ai
appris qu'il serait possible d'y jouer avec des manettes de Gamecube, l'idée
de mettre au point un circuit permettant d'utiliser d'authentiques manettes
NES et SNES via les ports pour manettes Gamecube m'est venue.
Mise à jour!: Comme la
Wii U et les Wii plus récentes n'ont
pas de ports gamecube, j'ai
complété un
nouveau projet passant par la télécommande Wii qui permet
de continuer malgré tout d'utilser les manettes originales.
Dès que j'ai eu accès à une Wii (Je n'ai toujours pas la mienne), j'ai commencé
à tester le code que j'avais écris longtemps à l'avance. Peu de temps après,
j'avais en main un adaptateur permettant d'utiliser une manette NES ou SNES sur
une Wii à travers un port de Gamecube. Quelques mois plus tard, je me suis décidé
à faire un adaptateur N64 à Wii parce qu'un ami n'arrêtait pas de me demander
d'en faire un.
Le protocole des manettes de Gamecube étant assez évolué si on
le compare à celui des manettes Nes et Snes, il n'était pas possible
de faire un circuit simple sans utiliser de composantes programmables. J'ai donc
utilisé le microcontrôleur Atmega8 d'Atmel. Cela m'a permis d'utiliser
mon circuit imprimé
Multiuse Tiny1. Étant
donné la petite taille de ce circuit, il est possible de le loger à l'intérieur
d'une même manette.
Voici quelques exemples de ce qu'il est possible de faire avec ce circuit:
(pour plus de photos, visitez la
section photos)
Retour en haut
Équivalence des boutons
Manette SNES
- Snes Start : Gamecube Start
- Snes Select : Gamecube Z
- Snes Haut,Bas,Droit,Gauche: Gamecube Haut,Bas,Droit,Gauche
- Snes Y : Gamecube Y
- Snes X : Gamecube X
- Snes B : Gamecube B
- Snes A : Gamecube A
- Snes L : Gamecube L
- Snes R : Gamecube R
- Snes L+R+Select+left: Gamecube Cstick vers la droite (depuis version 1.1)
Manette NES:
- NES Start : Gamecube Start
- NES Select : Gamecube Z
- NES Haut,Bas,Droit,Gauche: Gamecube Haut,Bas,Droit,Gauche
- NES B : Gamecube B
- NES A : Gamecube A
- NES A+B+Select+left: Gamecube Cstick vers la droite (depuis version 1.1)
- NES A+B+Select+up: Gamecube L+R (depuis version 1.1)
Manette SNES en mode NES:
- Snes Start : Gamecube Start
- Snes Select : Gamecube Select
- Snes Left,Right,Up,Down : Gamecube digital Left,Right,Up,Down
- Snes Y : Gamecube B
- Snes B : Gamecube A
Nintendo 64:
L'adaptateur supporte plusieurs combinaisons qui sont adaptées à
différents jeux. Il y a trop de possibilités pour les mettre sur cette
page. Consultez plutôt ce fichier:
n64_mapping_table1.4.pdf
Retour en haut
Schéma
Voici le schéma. Cliquez pour une plus grande version:
| Version Nes/Snes: | Version N64: |
 |
 |
Commentaires et explications:
Le microcontrôleur est alimenté avec 5 volts pour trois raisons:
- Les manettes de Nes et Snes fonctionnent avec 5 volts. Il est donc
préférable de présenter un voltage de 5 volts pour un 1
logique aux signaux Latch et Clock de la manette. (Puisque je n'ai pas la
spécification exacte de la manette, je ne peux pas savoir de manière
certaine au dela de combien de volts la manette considère qu'un 1
logique est présent sur le fil)
- Le signal Data provenant de la manette est de 5 volts. Pour éviter
que le microcontrôleur soit exposé à un voltage supérieur
à son alimentation, il aurait fallu utiliser un diviseur de tension, ce
qui augmenterait le nombre de composantes.
-
Il ne se fait pas d'Atmega8 supportant à la fois un voltage aussi bas que 3.3 volts
et une horloge supérieure à 8 mhz et j'avais besoin de vitesse pour ce projet.
La signal Data du coté Gamecube/wii est maintenu à 3.43 volts par une
résistance à l'intérieur de la Gamecube. Lorsque quelqu'un
souhaite que le signal data soit à zéro, il doit tirer ce signal
vers le ground. Sinon, il doit le laisser tel quel. J'accompli cela en
alternant la configuration du signal PD2 entre 'Direction sortie transmettant
un 0' et 'Direction entrée sans pull-up'.
Il ne faut jamais activer la résistance de pull-up interne de PD2 ni transmettre
un 1 en mode sortie car cela injecterait du 5 volts dans le signal Data. Comment
savoir si cela ne risque pas d'endommager le port de la Gamecube/Wii? (En fait, j'ai
une manette sans fils ne valant pas grand chose qui fonctionne normalement sans
rien briser, malgré le fait qu'elle réponde avec du 5 volts!).
La version Nintendo 64 de l'adaptateur utilise le même principe que décrit ci-haut pour
contrôler le signal Data. La seule différence est que c'est nous qui devons fournir une
résistance de pull-up à 3.43 volts. (Du point de vu de la manette, notre circuit est la console).
Retour en haut
Circuit imprimé
Comme je mentionne dans l'introduction, j'ai utilisé mon circuit imprimé
Multiuse tiny1. Référez-vous à la page
du Multiuse tiny1 pour plus d'informations. Si vous préférez ne pas le construire
vous-même, j'en vends des pré-assemblés et pré-programmés dans
mon
magasin en ligne.
Voici la liste des composantes nécéssaires pour assembler ce projet sur un circuit Multiuse Tiny1.
Il y a aussi les numéros d'items
Digikey que je suggère d'utiliser.
| Référence | Description | Commentaires | # Digikey |
| C1 | Condensateur 10uf | 1uf est suffisant. Aussi, avec cette valeur,
les condensateurs sont bien plus minces. | 490-1835-1-ND |
| C2,C3 | Condensateur 18pf | Choisir selon le crystal | 311-1102-1-ND |
| Y1 | Crystal 16mhz | Le numéro digikey est pour un
crystal montage en surface. Se soude facilement
sur l'empreinte 'thru-hole'. | 644-1037-1-ND |
| R3,R5,R6 | Résistances 0 ohms | Il est aussi possible de faire un
pont de soudure. | N/A |
| U2 | Microcontrôleur Atmega8 | Il est important d'utiliser
la famille supportant
16mhz. Les Atmega8L-* ne vont
pas plus vite que 8mhz. | ATMEGA8-16AU-ND |
Retour en haut
Logiciel
L'Atmega8 doit être programmé avec l'un des fichiers suivants:
| Type de manettes | Version | Fichier | MCU cible | Commentaires |
| Nes/Snes | 1.3 | snes2wii-1.3.hex | Atmega8 |
Nouveau dans cette version:
- Les boutons NES A et B peuvent être inversés en gardant A et B enfoncés lors de la mise sous tension de l'adaptateur.
|
| Nintendo 64 | 1.6 | n64_to_wii-1.6.hex | Atmega88 |
- Première version pour Atmega88 (remplacement du Atmega8 discontinué)
- Support du "Rumble Pack" (depuis 1.5)
|
| Nes/Snes | 1.1 | snes2wii-1.1.hex | Atmega8 |
Nouveau dans cette version:
- Le mode manette NES peut être activé de force en maintenant la touche Start enfoncée
lorsque le circuit commence à être alimenté. Sans ce mode, il est très difficile de jouer
à un Jeu de NES avec une manette SNES.
- Des combinaisons de touches permettent maintenant d'influencer l'état des boutons et joysticks
non présents sur les manettes NES et SNES. Par exemple, transmettre comme quoi les touches L et
R sont appuyés avec une manette NES, ou encore, pencher le joystick C (C Stick) vers la droite. Tout
cela est très utile pour faire apparaître le menu d'un émulateur.
- Certaines commandes Gamecube n'étaient pas implémentées. Les manettes sont maintenant compatibles
avec GCLinux.
|
| Nes/Snes | 1.0 | snes2wii-1.0.hex | Atmega8 |
Ceci était la première version. Mode NES/Snes sélectionné avec par un cavalier (jumper). |
| Nintendo 64 | 1.4 | n64_to_wii-1.4.hex | Atmega8 |
Nouveau dans la version 1.4:
- Ajout de 4 nouveaux "mappings" (équivalence des boutons), chacun étant accessible
en gardant un des boutons 'C' appuyé lors du branchement. Ces "mappings" sont rapportés
comme étant utiles pour Super Smash Bros Mélée et Brawl.
- Creation d'un fichier PDF résumant les différent"mappings" supportés
.
|
| Nintendo 64 | 1.3 | n64_to_wii-1.3.hex | Atmega8 |
Nouveau dans la version 1.3:
- Il est maintenant possible de désactiver l'inversion des boutons L et Z en gardant le bouton L enfoncé lors du
branchement de l'adaptateur la console.
- Si le bouton R est gardé enfoncé lors du branchement dans la console, les boutons N64 C gauche et C droit correspondent aux
boutons Gamecube Y et X. Ceci permet de jouer au jeu Virtual Console Sin and Punishment.
- La sensibilité du joystick peut être accrue en gardant le bouton de direction droite enfoncé au démarrage.
- La sensibilité du joystick peut être diminuée en gardant le bouton de direction gauche enfoncé au démarrage.
|
| Nintendo 64 | 1.2 | n64_to_wii-1.2.hex | Atmega8 |
La version N64 1.1 n'était pas fiable avec certaines manettes. Le
symptôme était que le joystick analogue semblait se recalibrer
à tout les 2 à 15 secondes. Ce problème est corrigé dans la version 1.2.
|
Les
fuses pour ce projet sont:
- Versions ATMEGA88: high byte = 0xd9, low byte = 0xdf, extended byte = 0x07
- Versions ATMEGA8: high byte = 0xc9, low byte = 0x9f
Pour de l'information sur la programmation d'un AVR,
visitez ma page sur la
programmation
d'AVR
Retour en haut
Code source
Pour ceux que ça intéresse, voici le code source
qui est disponible sous la
license GPL.
Version Nes et Snes 1.3:
snes2wii-1.3.tar.gz
Version Nes et Snes 1.1:
snes2wii-1.1.tar.gz
Version Nes et Snes 1.0:
snes2wii-1.0.tar.gz
Version Nintendo64 1.2:
n64_to_wii-1.2.tar.gz
Version Nintendo64 1.3:
n64_to_wii-1.3.tar.gz
Version Nintendo64 1.4:
n64_to_wii-1.4.tar.gz
Version Nintendo64 1.6:
n64_to_wii-1.6.tar.gz
Le code est en assembleur et est compilé avec avr-as.
Un makefile est fourni. Pourquoi en assembleur? Principalement
pour la vitesse et le contrôle total du timing. La plus petite
unité de temps du protocole de communication de la Gamecube est
d'une microseconde. À 16 mhz, ceci corresponds à 16 cycles
du CPU. En assembleur, il est facile de faire certaines optimisation
intéressantes.
Retour en haut
Photos
Installation à l'intérieur d'une manette
NES: (Attention, méfiez vous des manettes
non officielles qui utilisent des couleurs de fils différentes)
Installation à l'intérieur d'une manette
SNES: (Attention, méfiez vous des manettes
non officielles qui utilisent des couleurs de fils différentes)
Version
Nintendo 64:
Photos prisent pendant le développement et déboguage:
Photos prisent durant les essais, une fois que tout fonctionnait:
Le prototype:
Retour en haut
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.
Andrew Jalics a mis sur
son site web
des photos de la boîte NES à Wii qu'il a fabriqué avec mon circuit:
Declan Williams, d'Autralie, a construit la version Nes/Snes et N64. Il s'est servi
de puces ATmega8 préprogrammés provenant de mon magasin qu'il a installé sur son propre
circuit imprimé. Il a aussi trouvé une bonne façon de créer un connecteur de style Snes
(Des détails sont visibiles sur ces photos du project
4nes4snes):
5 Juin 2009:
Andrew Kay m'a fait parvenir 3 photos de l'adaptateur qu'il a construit:
Retour en haut
Références
Ce document explique clairement comment la communication fonctionne au niveau
matériel:
Nintendo Gamecube Controller Protocol
Le chapitre 9 de ce document contiens de l'information sur la significations
des bits en réponse à certaines commandes:
Yet Another Gamecube Documentation
Cette page contiens de la documentation sur le 'protocole' des manettes Snes:
Sci.Electronics FAQ: Super Nintendo Entertainment System: pinouts & protocol
Retour en haut
Avertissement
Je ne saurais être tenu responsable pour les dommages
que la mise en œuvre des instructions présentées
sur cette page pourraient causer à votre équipement
ou à vous-même. Aussi, je ne donne aucune garantie quant
à l'exactitude des informations et à leur fonctionnement.
Notez toutefois que les procédures ci-haut ont fonctionnées
sans aucun problème pour moi.
Retour en haut