Des manettes oubliées
J'avais des manettes N64 originales qui traînaient depuis des années.
La Nintendo 64 date de 1996, et ses manettes utilisent un connecteur propriétaire que rien de moderne ne reconnaît nativement. Résultat : inutilisables sur un setup actuel, et condamnées à rester dans un tiroir.
L'idée était simple : les rendre à nouveau utilisables sur un PC, sans friction. Un petit adaptateur USB plug & play, qui transforme la manette en gamepad standard, sans driver ni logiciel.
Le Raspberry Pi Pico coche toutes les cases : 5€, ultra simple, et largement assez puissant pour ce genre de pont entre deux mondes.
Un protocole qui tient sur un fil
Les manettes N64 utilisent un protocole propriétaire étonnamment minimal : une seule ligne de données, en open-drain, et un timing extrêmement strict.
Le principe est brutal : le Pico envoie une requête, et la manette répond avec un mot de 32 bits représentant l'état des boutons.
Mais tout est encodé dans le temps. Un bit n'est pas une valeur électrique, c'est une durée. Quelques microsecondes d'écart suffisent à casser la communication.
Sur un CPU classique, ce genre de timing fin est fragile. Une interruption, un cache miss, et tout peut partir de travers.
PIO : déléguer le timing à du matériel programmable
Le RP2040 du Raspberry Pi Pico a une particularité rare dans cette gamme de prix : le PIO (Programmable I/O).
Ce sont de petits coprocesseurs spécialisés dans les E/S, capables d'exécuter des instructions ultra simples indépendamment du CPU principal.
Pour le protocole N64, j'ai déplacé toute la logique critique dans un programme PIO en assembleur. Il génère et lit les signaux avec un timing parfaitement déterministe, cycle par cycle.
Le CPU n'intervient plus dans la partie sensible. Il déclenche la communication, puis récupère simplement le résultat.
Chaque manette tourne sur une state machine dédiée. Deux manettes = deux machines PIO en parallèle, sans effort supplémentaire côté CPU.
USB HID : parler le langage universel
Côté USB, j'utilise TinyUSB, une stack USB open source pensée pour les microcontrôleurs.
Le Pico se présente comme un périphérique HID (Human Interface Device), le même standard que les claviers, souris et gamepads.
C'est important parce que HID est supporté nativement par tous les systèmes : Windows, Linux, macOS. Aucun driver, aucune configuration.
Les inputs N64 sont mappés directement sur une manette USB classique : boutons, D-Pad, stick analogique converti en axes X/Y.
Un petit outil de test via la Web Gamepad API permet de vérifier le mapping directement dans un navigateur.
Simple matériel, usage réel
Le système supporte jusqu'à deux manettes N64 simultanément, chacune exposée comme un gamepad USB distinct.
Le hardware est volontairement minimal : un Raspberry Pi Pico, les connecteurs de manettes, et quelques résistances pull-up. Rien d'autre.
Pas de régulation complexe, pas de PCB sophistiqué. Le protocole et le Pico font le travail.
Une LED intégrée donne un état simple : idle, une manette connectée, ou deux manettes actives.
Ce que ça donne en pratique
Une fois branché, ça fonctionne comme une manette USB classique.
La latence est autour de 8 ms (polling USB à 125 Hz), donc parfaitement dans les standards des contrôleurs modernes.
Les défauts viennent surtout des manettes elles-mêmes : sticks usés, dérive analogique, fatigue mécanique accumulée depuis 25 ans.
Le firmware, lui, est stable et déterministe.
Le projet tient en moins de 1000 lignes de C et quelques dizaines de lignes d'assembleur PIO. Rien de spectaculaire en volume — tout est dans la compréhension fine du timing et du protocole.