Le problème des joysticks pour N64 qui s'usent pour devenir inutilisables
est très répandu. Les manettes pour Gamecube, elles, semblent être beaucoup
plus durables et sont relativement similaires à celles du N64.
À bien des reprises, on m'a donc demandé si je pourrais réaliser un
adaptateur permettant d'utiliser des manettes de Gamecube sur une N64. Ce
project en est le résultat.
Caractéristiques:
Support des manettes Gamecube officielles (Manette blanche Japonaise avec long câble incluse).
Support des manettes sans fil Wavebird de Nintendo et d'Intec.
Devrait fonctionner avec tout périphérique équivalent à une manette (clones, tapis, etc).
Mapping des boutons programmable permettant pour une expérience de jeu la meilleure possible.
Algorithme d'interrogation à faible délai de transit (environ 5ms, soit moins qu'une trame)
Firmware pouvant être mis à jour par l'utilisateur.
Support d'un LED ou buzzer facilitant la programmation de mappings.
Versions partiellement assemblées et adaptateurs complets disponibles dans le magasin! Circuit pré-assemblé (soudez vos fils) Adaptateur complet (prêt à jouer)
Photos
Voici quelques photos. Envoyez-moi les vôtres que je puisse les ajouter ici!
N64 et manette GC (Adaptateur V1)
Circuit imprimé (V1)
Version 2
Version 2 avec LED
Équivalance des boutons (mappings)
Afin d'améliorer l'expérience de jeu ou simplement la rendre possible, j'ai conçu cet
adaptateur pour qu'il soit possible de créer des nouveaux 'mappings' relativement
facilement. Comme la saisie peut être une fastidieuse opération en raison du nombre
élevé de combinaisons possibles, quatre emplacement de sauvegarde correspondant aux quatres
directions du pavé numérique sont offerts.
L'outil ci-bas vous permet d'associer les boutons, axes ou états des axes à différentes actions
possibles du côté N64. Faites votre sélection et appuyez sur Générer pour afficher
le code correspondant. Les instructions sont dans la colonne de droite.
Saisie d'un code
1) Entrer en mode gestion des mappings
Il faut d'abord entrer dans ce mode.
Pendant le jeu: Enfoncer et maintenir le bouton 'start' pendant environ 8
secondes. Relâcher après les 5 bips rapides.
Au démarrage: Maintenir le bouton 'start' de la manette enfoncé au moment
où l'adaptateur est mis sous tension. (Donc appuyer et maintenir 'start', allumer la
N64 ou y brancher l'adaptateur, relâcher après les 5 bips rapides.
2) Effectuer la saisie du code
Une fois en mode gestion des mappings, il suffit de procéder directement à la
saisie du code en appuyant simplement sur les boutons correspondants au code. Après chaque
groupe de lettres se terminant par 'L', l'adaptateur emettra un bip de confirmation.
À la fin, lorsque le bouton 'start' aura été appuyé, l'adaptateur emettra 3 bips pour confirmer
l'entrée en vigueur du nouveau mapping et retournera en mode jeu.
Sauvegarde et rappel des codes favoris
1) Entrer en mode gestion des mappings
Entrez dans ce mode en maintenant le bouton 'start' enfoncé tel que décrit plus haut.
2A) Pour sauvegarder le mapping actuel
Une fois en mode gestion des mappings, appuyez d'abord sur R. Ensuite, appuyez sur
une des directions du pavé numérique. À chaque direction pourra correspondre un
mapping de votre choix. L'adaptateur émettra 3 bips pour confirmer l'enregistrement
et retournera en mode jeu.
2B) Effectuer le rappel d'un mapping
Une fois en mode gestion des mappings, appuyez immédiatement sur la direcion
du pavé numérique correspondant au mapping que vous désirez. L'adaptateur emettrra alors
3 bips pour confirmer l'entrée en vigueur du nouveau mapping et retournera en mode jeu.
2C) Rappel du mapping par défaut standard 1 pour 1
Une fois en mode de configuration, appuyez d'abord sur R, et ensuite sur START.
3) Activer/déactiver la zone morte (depuis 1.3)
Entrez en mode gestion des mappings, enfoncez et relâchez R, appuyez et relâchez Z puis attendez l'émission du signal sonore final.
La fonction sera activée si elle ne l'était pas, ou déactivée si elle l'était. Comme la configuration de l'option de zone morte est sauvegardée dans l'adaptateur, il n'est pas besoin de refaire l'opération à chaque utilisation.
4) Activation automatique d'un mapping sauvegardé au démarrage (depuis 1.5)
Entrez en mode gestion des mappings, appuyez et relâchez R, puis L. Appuyez ensuite sur la direction
du pavé numérique correspondant au mapping que vous souhaitez être rappelé automatiquement au démarrage.
Sinon, pour que le mapping standard soit actif par défaut, appuyez plutôt sur START.
5) Modes de conversion des valeurs de stick (depuis 2.0)
Les valeurs d'axes Gamecube doivent être traduites avant d'être retransmises vers la N64. Plusieurs versions
sont disponibles et il est possible de passer d'une à l'autre dans cet ordre:
Mode v2.0 (standard, par défaut)
Mode étendu (depuis le firmware 2.1, très sensible)
Mode v1.5 (ancienne formule, diagonales peu sensibles)
Pour passer d'un mode au suivant, entrez d'abord en mode de configuration. Appuyez ensuite sur R, puis sur B.
Après quelques secondes l'adaptateur confirmera le changement en clignotant deux fois et retournera au mode jeu.
Pour en apprendre davantage sur ces différents modes, consultez la section Valeurs d'axes.
6) Réinitialisation (depuis 2.0)
Pour effacer les mappings sauvegardés et remettre les options (ex: Zone morte) aux valeurs d'usine, entrez d'abord en mode de configuration. Appuyez sur R et ensuite sur X.
Après quelques secondes, l'adaptateur clignotera pour confirmer et retournera au mode jeu.
7) Activer ou déactiver le "Controller Pak" (carte mémoire intégrée) (depuis 2.3)
Pour activer la fonction de carte mémoire, ou pour la déactiver si elle est active, entrez d'abord en mode de configuration. Appuyer sur R et ensuite sur Y.
Après quelques secondes, l'adaptateur clignotera pour confirmer et retournera au mode jeu.
Erreurs
À tout moment, si une erreur se produit (Tentative de rappel d'un emplacement vide, erreur de saisie, etc),
l'adaptateur produira 4 bips (3 court 1 long) et retournera au mode jeu.
PROBLÈMES CONNUS:
Avant la version 1.3.1, lorsqu'on configurait le joystick principal pour contrôler des boutons, les directions up[18]/down[19] et left[20]/right[21] étaient inversées.
Avant la version 1.3.1, il y avait un bug faisant en sorte que lorsqu'un nouveau code de mapping était saisi, certains éléments du mapping en cours
pouvaient rester actifs. Pour éviter ce problème, il suffit de redémarrer l'adaptateur avant de saisir un nouveau code. (Notez que la sauvegarde et le rappel des
mappings fonctionnait bien)
Avant la version 1.2.2, les leviers analogiques L et R contrôlaient les boutons N64 L et R même s'ils étaient configurés à [20] None ci-dessus. Pour les déactiver réellement, utilisez le code BBXZBBAL ZBBAL. (Pour le combiner avec votre propre mapping, ajoutez le code avant le START final de votre mapping existant.)
Carte des menus
Voici un organigramme permettant d'avoir une vue d'ensemble du mode de gestion de l'adaptateur décrit dans la section précédente.
Organigramme de la version 2.3
Collection de mappings
Voici une table de mapping qui je l'espère grandira. N'hésitez pas
à me contacter pour partager les mappings qui vous seront utiles
pour certains jeux. Si possible, avec des détails sur les jeux avec
lesquels vous les utilisez ainsi que des commentaires sur votre choix.
Mapping
Jeu(x)
Commentaires
R START
Générique
Mapping de base. Les boutons du même nom sont équivalents.
XZBBL BAAZXL ZXL START
Mario Kart 64
Bouton Z pour dérapper, boutons X et Y pour item. Le bouton Z est
plus agréable car il se déplace moins que le bouton 'R'.
BAAZBXL ZXAL START
Starwars - Shadow of the empire
Boutons Y et X a C-Haut et C-Gauche respectivement. Utilisez l'un où l'autre pour lançer le harpon.
[...] BBXZBBAL ZBBAL START
*
Pour la version 1.2.1 (et précédentes). Déactive réellement les leviers analogiques. Ils étaient liés aux boutons N64 L et R même si "[20] None" était sélectionné. Si vous utilisez un mapping sur mesure, ajoutez simplement ces deux mots avant la fin (bouton START)
Lorsque les contrôles du jeu sont configurés en mode 1.2 Solitaire, permet de jouer à Goldeneye avec des contrôles de style « Call of Duty » / « Halo ».
X/Y pour sauter, Z pour saisir, R et L pour parer, et D-Pad vers le haut pour provoquer. (Correspond au mapping pour manette Gamecube de melee/brawl/smash4.)
XZBBL BAZBBL BXZAL ZAL ZAL ZAL ZBAL ZBAL ZBAL ZBAL BAAZBYL BAAZBYL ZBYL BBXZXLZXL START
Super Smash Bros 64
Je me suis efforcé de reproduire la configuration des version ultérieures de Super Smash Bros tout en améliorant un peu.
Enfoncés partiellement, L et R pour bloquer (shield) et lorsque enfoncés complètement, permet de saisir (grab) l'adversaire.
Y et X sont pour sauter.
A pour «hit» et B pour «special».
Toutes les directions du stick C correspondent au bouton A, donc « hit ».
Z pour saisir l'adversaire (Grab).
(Fourni par Benjamin Wilkinson)
XZBBL BAZXL ZXL ZAL ZAL ZAL ZAL ZBAL BAAZXBL ZBXL ZBAAL ZBABL ZBAXL ZBAYL ZXL ZXL ZYXL ZYYL START
Super Smash Bros
Ce mapping fonctionne exactement comme dans Melee et Brawl.
Y/X pour sauter
C-stick pour les attaque smash et aériennes
Z pour saisir (grab)
R/L pour bloquer (le bouclier apparaît à mis chemin comme dans Melee)
J'ai créé cette configuration afin que les commandes ne soient ni difficiles à apprendre, ni à utiliser.
Inversion des directions gauche/droite du C stick.
Y est 'boos't, X est 'slow'
B et A et a sont 'shoot'
Z est le mode FPS
D-Pad: Bombe (toutes directions)
Les gâchettes L et R ne nécéssites qu'un enfoncement partiel pour s'activer. Plus rapide et facilite l'exécution de ce que le jeu nomme « barrel roll ».
Vous devrez d'abord brancher l'adaptateur et saisir le code de configuration. Appuyez ensuite sur le bouton RESET du N64 pour que la manette soit reconnue au démarrage. J'ai configuré les commandes pour qu'elles
soit très près de celles de F Zero GX.
Faible pression sur L: Se pencher vers la gauche.
Faible pression sur R: Se pencher vers la droite.
Z: Distance caméra
X: Caméra arrière
Y: boost
Le D-Pad peut être utilisé
comme stick pour ceux qui préfèrent.
J'ai eu l'idée de combiner les fonctions bouclier et cible sur les gâchettes. Plusieurs options pour l'utilisation des items sont également possibles.
L enfoncé partiellement: Bouclier
L à fond: Cible
R enfoncé partiellement: Cible
R à fond: Bouclier
A: Rouler
B: Coup d'épée
C stick gauche/droite: Cible (z)
C stick haut/bas: Mode première personne.
Z: Item de gauche (j'utilise le «slingshot»)
Y: Item de droite (j'utilise le «deku nut»
X: Item du bas (j'utilise la bombe)
D pad: Pour les items, ou pour le mode FPS selon votre préférence.
(Fourni par Benjamin Wilkinson)
Utilisation de cartes mémoire
On me demande de temps à autre comment peut-on utiliser une carte mémoire avec cet adaptateur pour sauvegarde
sa partie. Il suffit simplement d'installer la carte mémoire dans une manette N64 normale et de brancher cette
dernière dans un port différent.
Cela fonctionne sans problèmes avec certains jeux, par exemple « Turok 2 : Seeds of evil », mais dans d'autres cas,
comme avec « Mario Kart 64 », le jeu exige que la carte mémoire soit dans la manette du port 1. Il faut alors
mettre l'adaptateur dans le port 2, mais cela empêche de jouer seul. Mario Kart 64 n'utilise toutefois la carte
mémoire que pour sauvegarder les « ghosts » en « time trial ». C'est dommage, mais on peut s'en passer.
Aussi, bien des jeux comportent de la mémoire à même la cartouche, cas dans lequel il n'y a pas de problème.
Partie électronique
Voici tout de suite le schéma:
Attention: Pour utiliser le firmware 2 avec bootloader, remplacer le Atmega8 par un Atmega168 ou Atmega168a.
Choix du MCU
J'ai décidé que j'utiliserais un MCU AVR d'Atmel, de préférence le
ATmega8 (ou le nouveau Atmega8a). Pourquoi?
D'abord car il s'agit de l'architecture sur laquelle j'ai le plus d'expérience.
Ensuite, cela me permet de réutiliser une bonne partie du code de d'autrse
projets tels que l'adaptateur gc/n64 à USB et
l'adaptateur N64 à Gamecube/Wii. Surtout que la communication
N64 et Gamecube est faite en assembleur où le temps d'exécution de chaque
instruction compte, le port à une autre architecture serait en fait une
réécriture.
Finalement, comme j'utilise beaucoup le ATMega8, j'économise en achetant
seulement celui là en plus grande quantité.
Attention: Pour la version 2 de l'adaptateur, j'ai changé pour un Atmega168a qui a plus d'espace et m'a permit d'ajouter la possibilité de faire des mises à jour (bootloader)
Stratégie d'alimentation
Je suis d'avis que l'idéal est de s'alimenter directement depuis la N64. Malheureusement,
la N64 ne fournit que 3.3 volt et les manettes de Gamecube s'attendent à recevoir du 5
volt et du 3.3 volt. En plus, le choix d'utiliser un Atmega8 me force à alimenter
le MCU à 5 volt pour qu'il puisse être cadencé à 16 MHz.
Il était donc nécesaire d'obtenir du 5 volt à partir du 3.3 volt fourni par la N64. J'ai opté
pour un
Convertisseur à pompe de charge à sortie régulée 5 volt
LTC3200ES6-5 de Linear
Technology pour sa petit taille, son nombre réduit de pièces externes requises et
sa sortie régulée à 5v (il ne fait pas que doubler le voltage d'entrée comme d'autres).
Le LTC3200ES6-5 est difficile à utiliser s'il n'est pas monté sur un PCB. Une alternative
qui me semble adéquate serait le module VBSD1-S3.3-S5-SIP de Cui. Le datasheet recommande
un condensateur de 4.7uF électrolytique à résistance équivalente basse (Low ESR) à l'entrée.
Une charge minimale de 20mA est requise alors l'installation d'une résistance de 220 ohm
entre le GND et la sortie 5V est recommandée. Lire le
datasheet pour plus de détails.
Vous êtes également libre de modifier le circuit pour utiliser une alimentation 5v externe
provenant d'un port USB ou d'un adaptateur mural.
Un mot sur la fonction Vibration
Pour le moment, la fonction vibration n'est pas supportée. Mon raisonnement pour ne pas
la supporter est le suivant: Quand Nintendo ont mis le 'rumble pack' sur le marché, ce
dernier utilisait des piles. Il n'alimentait pas son moteur avec le 3.3 volt reçu de la
console, ce qui me porte à croire que les ports de manettes ne sont probablement pas
conçus (voir capable) de fournir un courant suffisamment élevé pour un moteur.
Il se peut toutefois que les besoins énergitiques du moteur du 'rumble pack' pour N64 et
celui dans les manette Gamecube soient différents. Je prévois faire une analyse complète
de la question en prenant des mesures, en regardant quelles sont les fusibles dans une N64
(s'il y en a), etc.
Donc pour le moment, je n'ai pas encore écrit le code pour contrôler le moteur car
mon adaptateur s'alimente seulement depuis le 3.3 volt de la N64. Mais avec une alimentation
externe (ou une manette sans fils ayant ses propres piles), il serait parfaitement
valide d'active la fonction vibration.
Je me souviens d'avoir lu à plusieurs endroits que le 5 volt fourni à la manette est
destiné à la fonction vibration. Mais il y aussi des manettes qui l'utilise simplement
pour fonctionner. Je crois donc qu'il est bon de fournir du 5 volt à la manette puisque nous
en avons pour le MCU bien que la fonction vibration ne soit pas, pour l'instant du moins, utilisable.
Mise à jour
Option 1: ROM spécial
Les adaptateurs V2 (Atmega168 et LED) peuvent être mis à jour via un ROM spécial tournant sur N64, mais cela
requiert une cartouche reprogrammable. Sans cela, il est nécessaire d'utiliser les mêmes outils que pour la programmation initale...
N.B.: Les fichiers ci-dessous sont destinés aux nouveaux adaptateurs fabriqués avec un Atmegai168 utilisant un LED comme indicateur.
Ce projet est distribué sous forme de code source et de fichier .hex prêt à utiliser.
Important!
Pour que le microcontrôleur fonctionne à la bonne vitesse,
il est essentiel de configurer les 'fuses' correctement. Les valeurs
pour ce projet sont: high_byte=0xdc, low_byte=0xd7, extended_byte=0x01.
De plus, afin de protéger le bootloader contre les modifications accidentelles, il importe
de bien configurer les "lock bits": lock: 0x2F
Pour de l'information sur la programmation d'un AVR,
visitez ma page sur la programmation
d'AVR
Ajout d'un nouveau mode de conversion valeurs d'axe: Mode étendu (où les valeurs reçues de la manette Gamecube sont retransmises telles-quelles à la console N64).
Corrige un problème avec la régularité du tir rapide (manuel) dans Shadows of the empire
Ajout de lock bits pour éviter que le bootloader puisse être effacé.
N.B.: Les fichiers ci-dessous sont destinés aux anciens adaptateurs fabriqués avec un Atmega8 utilisant un haut parleur comme indicateur.
Ce projet est distribué sous forme de code source et de fichier .hex prêt à utiliser.
Important!
Pour que le microcontrôleur fonctionne à la bonne vitesse,
il est essentiel de configurer les 'fuses' correctement. Les valeurs
pour ce projet sont: high_byte=0xc9 low_byte=0x1f.
Pour de l'information sur la programmation d'un AVR,
visitez ma page sur la programmation
d'AVR
Voici sans plus tarder les fichiers:
Version v1.5.1 15 mars 2015 (Dimanche)
Nouvelle values de « fuses » pour activer le détecteur de basse tension. Corrige un problème occasionnel de perte de mappings au démarrage.
Amélioration de la position neutre de la Wavebird.
Temps de réponse plus court dans l'interruption N64. Cela semble corriger F-Zero X. (Je n'ai jamais vu un jeu aussi capricieux et bogué*).
* Débranchez votre manette, même standard, et dites adieu à votre partie car la rebrancher ne fonctionnera pas. Il suffit de ne pas le faire dites-vous? Exact, mais si la manette ne répond pas à ne serait-ce qu'une seule interrogation d'état, eh bien, Game Over..
Ajout d'une option zone morte (inactive par défaut).
Pour activer la fonciton zone morte, enfoncez le bouton START jusqu'à ce que les 5 impulsions sonores soient produites, enfoncez et relâchez R, appuyez et relâchez Z puis attendez l'émission du signal sonore final. Comme la configuration de l'option de zone morte est sauvegardée dans l'adaptateur, il n'est pas besoin de refaire l'opération à chaque utilisation.
La calibration automatique est maintenant effectuée à chaque branchement de manette en plus d'au démarrage. Il est donc possible de changer de manette sans devoir éteindre la console pour un résultat optimum.
Le point mentionné ci-dessus permet également à la Wavebird de fonctionner à nouveau (Dysfonctionel depuis la version 1.1)
Au démarrage, l'adaptateur attend qu'une manette soit présente.
Renouvellement du code de communication gamecube (portage du code de mon projet manette N64/Gamecube à USB)
Détection automatique de l'origine du joystick Gamecube lors de la mise sous tension. Permet d'utiliser les joysticks n'étant pas parfaitement centré au repos.
Conversion des coordonées d'axes Gamecube vers N64 améliorée pour résoudre les problèmes encourrus avec certaines manettes/jeux où, notamment, le personnage ne courait pas à pleine vitesse.
Pour fabriquer des adaptateurs facilement, j'ai créé un
petit circuit imprimé. Ce circuit imprimé est en vente,
pré-programmé dans mon magain. Idéal pour fabriquer
des adaptateurs sur mesures dans une boîte de votre choix,
ou encore qui sait, l'intégrer à une N64? (J'ignore si l'espace
nécessaire est disponible).
Pour le (re)programmer il suffit de souder les fils du programmeur
ou un connecteur adéquat à l'arrière.
Valeurs d'axes
Quelques faits à propos des manettes N64 standard:
Le joystick N64 génère deux valeurs d'axes numériques: Une pour l'axe de X, un pour l'axe des Y.
Les valeurs d'axe sont retransmises à la console sous 8 bits avec signe, ce qui implique des valeurs
maximales théoriques d'environ -128 à +127.
Les valeurs retournées en pratique varient entre -80 et +80.
Cette plage de valeur se ressert lorsque la manette est usée.
Le stick se déplace physiquement à l'intérieur d'un octogone étiré. Au contraire des manettes Gamecube, cet octogone n'est pas régulier.
Courbes manette standard
Voici une représentation graphique des valeurs extrêmes obtenues sur deux manettes en bon état (comme neuves).
La grille en arrière plan couvre les valeurs -80 à +80.
Manette officielle 1
Manette officielle 2
Quelques remarques:
Les deux manettes dépassent légèrement la plage -80 à +80 sur l'axe vertical.
Les diagonales n'atteignent pas des valeurs aussi élevées que la verticale et l'horizontal. Ceci
est normal en raison de la restriction de mouvement au sein d'un octogone.
Courbe Hori mini N64
La manette Hori mini N64 (stick genre Gamecube)
Quelques faits à propos de la Hori Mini:
Le joystick gènère des valeurs de -100 à +100
Le stick se déplace à l'intérieur d'un octogone presque régulier.
L'image ci-contre représente les valeurs extrêmes obtenues sur une manette Hori. Ceci permet
de faire les observations et constatations suivantes:
La manette Hori couvre une plus large plage que la manette N64 originale.
Le concepteur a manifestement ajusté l'échelle de sorte que les diagonales
tombent pile sur ±80.
Cela dépasse les valeurs diagonales typiques des manettes originales.
À la verticale et à l'horizontal, les valeurs sont au delà du maximum
de ±80 observé sur un manette N64 originale.
Ces différences peuvent avoir un impact sur le jeu. Par exemple, la vitesse de course
maximale atteinte peut être plus élevée avec ce genre de manette.
Adaptateur Gamecube à N64
L'adaptateur Gamecube à N64 reçoit des valeurs provenant de la manette Gamecube et les
transforme pour le N64. Voici le profil actif par défaut dans différentes version de
l'adaptateur:
Version 1.5
Version 2.0
Plusieurs utilisateurs rapportaient que le personnage en jeu n'atteignait pas sa vitesse
maximale en diagonale. C'est pourquoi les coins du profil ont étés étirés dans la version 2.0. Mais
il demeure possible d'activer le profile de la version 1.5. (Voir la section mappings).
Voici le profil si l'adaptateur passe les donnés directement de la manette
Gamecube au N64 sans transformation. Ce mode est disponible depuis la version 2.1 du firmware est
est nommé « Mode étendu »:
Gamecube (Depuis v2.1, « Mode étendu »)
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.