Extenmote: NES, SNES, N64 or Gamecube controller on Wii or Wii U via the Wiimote.

Project overview

A few years ago, I completed a similar project that used the Gamecube ports that were at the time built into all Wii consoles. Unfortunately, Nintendo later removed those ports from the Wii (eg: Family edition) and the Wii U also has none.

This new project therefore uses the Wiimote extension like the Classic controller does. And in fact, the microcontroller in this project simply pretends to be one.

Features:
  • Play virtual console games with the original controller.
  • Works on the new Wii U and Wii consoles with or without gamecube ports.
  • Appears to the Wiimote as a Classic controller.
  • Supports N64 controllers[2]
  • Supports SNES controllers
  • Supports Gamecube controllers (Tested with Nintendo official wired controllers[1] and the Wavebird)
  • Supports NES controllers
[1]Nintendo DOL-008 controllers: Original gamecube controller, japanese version with extra long cable and Super Smash Bros. edition controllers.
[2] Reported not to work with the N64 reality quest glove.

Assembled and ready to use versions of this project are available in my online store:



Pictures

SNES Adapter

SNES Adapter

Development setup

Development setup

Development setup

Development setup

Development setup

Development setup

The lost levels

The lost levels

Mario Kart Wii

Mario Kart Wii

NES Classic edition

NES Classic edition



Converting a NES controller:




NES and SNES support

Classic controller button SNES controller SNES controller in NES mode SNES controller in analogic mode NES controller
D-Pad D-Pad D-Pad D-Pad D-Pad
plus Start Start Start Start
minus Select Select Select Select
A A B A A
B B Y B B
X X X
Y Y Y
L L L
R R R
When an SNES controller is used for SNES titles or when a NES controller is used for a NES title, the mapping is simple. But using an SNES controller for NES games is far from perfect if the A and B buttons are mapped to the classic controller A and B buttons.

Enabling NES mode:
Press START+SELECT+L+R+DOWN simultaneously. In this mode, the SNES button placement will be much more adapted to virtual console NES titles.

Enabling analogic mode::
Press START+SELECT+L+R+LEFT simultaneously. In this mode, the SNES D-Pad controls the classic controller left stick. This mode might not be very useful, but beating a friend with such a setup is quite funny.

Restoring standard mode:
Press START+SELECT+L+R+UP simultaneously.

Home button:
Triple-clicking the start button will trigger the home button. (Version 1.9.5 and up)



N64 support

N64Mode 0Mode 1Mode 2Mode 3Mode 4Mode 5Mode 6Mode 7Mode 8
A A A A A A A A A B
B B B B B B B B B Y
Start plus plus plus plus plus plus plus plus plus
L L ZR D-Down D-Down ZR L D-right ZR L
R R R R ZR R R R R R
Z ZR L L L & R L L L X & Y ZR
D-up D-up D-up D-up D-up D-up D-up D-up D-up D-up
D-down D-down D-down D-down D-down D-down D-down D-down D-down D-down
D-left D-left D-left D-left D-left D-left D-left D-left D-left D-left
D-right D-right D-right D-right D-right D-right D-right D-right D-right D-right
C-Up C-Up C-Up C-Up C-Up N/A C-Up N/A C-up C-Up
C-down C-down C-down C-down C-down+X N/A C-down X C-down A
C-left C-left C-left C-left C-left+Y Y C-left Y C-left X
C-right C-right C-right C-right C-right X C-right ZR C-right C-right
MappingActivationRecommended gamesIntroduced
Mapping 0L+R+Z+D-upMario 64, Kirby 64, Mario Tennis 64, Wii64*, Bomberman hero, Mario Golf, Pokemon Puzzle Leaguev1.0
Mapping 1L+R+Z+D-downMario Kart 64, Mario Kart Wii, Mario Party 2, Cruisn' USA, Wave race 64, Custom robo v2v1.0
Mapping 2L+R+Z+D-leftZelda Ocarina of time, Paper Mariov1.0
Mapping 3L+R+Z+D-rightSuper Smash Brosv1.0
Mapping 4L+R+Z+C-upSin and punishmentv1.0
Mapping 5L+R+Z+C-downOgre Battle 64, 1080° Snowboarding, Pokemon Snap, Starfox 64v1.0
Mapping 6L+R+Z+C-leftF-Zero Xv1.6
Mapping 7L+R+Z+C-rightYoshi's Storyv1.6
Mapping 8L+R+Z+(Joystick-down)Mario Odysseyv2.1.1
Please help me implement mappings that might be required for other games by sending me user manual pictures.

Special combos:
* When mapping 0 is active, pressing the four C buttons + Dpad left + Z simultaneously sends X+Y pressed status to the console. This opens the wii64 menu.

ZL + ZR:
Before firmware version 2.1.1, ZL and ZR were tied together. Now only Zr is used. For instance, if using mapping 0, the N64 Z button only controls Zr. The old behavior of tying Zl and Zr together can be toggled with: L+R+Z+Joystick_down. (In other words, press and hold Z, L and R, then point the N64 joystick away from you)

Home button:
Triple-clicking the start button will trigger the home button. (Version 1.9.5 and up)


Joystick values conversion:
The classic controller reports the left stick using 6 bits and the N64 controller reports the stick position using 8 bits. When a simple linear conversion is used, the games feel very wrong. A long succession of tests yielded the following transfer curves which restores the feeling to something much closer to the originals.

It should be noted that values ranging from -32 to +31 can be reported using 6 bits but that in practice the wii classic controller reports values between -24 and 24.


Note: The curve is symmetrically applied to center-to-side stick movements. The output range of value is therefore 0 to 31. Also note that the N64 controllers manufactured by Nintendo never reach the maximum value of 127.

Selecting a curve with firmware v1.5:
In version 1.5, two curves of different sensitivity are offered and configurable using the button combinations below. The adapter stores the setting in non volatile memory so you don't have to reconfigure every time you connect the adapter.

press L+R+Z+A: Default curve (v1.5).
press L+R+Z+B: Alternate curve (v1.4)

Curve selection in previous versions:
Version 1.4.1: Default curve is v1.4, alternate curve v1.1.
Version 1.4 and 1.3: No curve selection possible.

N64 controllers range of values:
The original v1.1 curve did not work well with all controllers. Failure to reach the full game effect (eg: running, performing a tight turn) was the observed symptom. Given the expected range of -24 to +24 on the wiimote side and the actual measured range of values sent by N64 controllers (see below), it makes perfect sense. This was fixed in v1.4.1 and v1.5 and is no longer a problem.

Here is a table exposing the values returned by different controllers:
ControllerX axisY axisStick condition
Standard N64 red-82 to 79-85 to 83As new
Standard N64 aqua-80 to 80-80 to 85As new
Standard N64 gray-75 to 75-80 to 77Worn
Standard N64 transparent purple-72 to 80-80 to 80Described as "Some wear" on eBay. Quite worn actually..
Standard N64 yellow-68 to 64-69 to 80Extremely worn
Hori pad mini-100 to 100-100 to 100As new
Unknown brand-88 to 87-90 to 85As new
Unknown brand-128 à 127-128 à 127New



Gamecube support

GamecubeMode 0Mode 1Mode 2Mode 3Mode 4Mode 5
Start plus plus plus plus plus plus
A A B A ZR B A
B B Y B A Y X
X X A X B A R
Y Y X Y X X B
L L L ZL ZL L ZL
R R R ZR Y R ZR
Z ZL & ZR minus R B Zr minus
D-up D-up D-up D-up D-up D-up D-up
D-down D-down D-down D-down D-down D-down D-down
D-left D-left D-left D-left D-left D-left D-left
D-right D-right D-right D-right D-right D-right D-right
Main stick Left stick Left stick Left stick Left stick Left stick Left stick
C stick Right stick Right stick Right stick Right stick Right stick Right stick
L analog
R analog
Home button:
Triple-clicking the start button will trigger the home button. (Version 1.9.5 and up)
Press the following keys simultaneously to trigger the home button: A+B+Y+X+Z+C-Down. (Version 1.7, 1.8 and 1.9 only)

Analog L/R sliders:
The analog sliders are implemented only since version 1.7. In earlier versions, only the digital L/R buttons were functional.
MappingFirmwareActivationRecommended games
Mapping 0Since 1.3A+B+X+Y+Dpad-UpMario Kart Wii
Mapping 1Since 1.3A+B+X+Y+Dpad-DownSNES virtual console games
Mapping 2Since 1.4A+B+X+Y+Dpad-LeftSonic & All-Stars transformed for the Wii U and others.
Mapping 3Since 1.4A+B+X+Y+Dpad-RightSonic & All-Stars transformed for the Wii U and others.
Mapping 4Since 1.7A+B+X+Y+Z+C-leftFor Devolution.
Mapping 5Depuis 1.9.5A+B+X+Y+Z+C-rightSuper Mario 3D World.

Help me to do better by letting me know the mappings you need.

Special combos:
  • A+B+X+Y+L: Toggles an option where pressing the L/R triggers just a little triggers the L/R buttons (early/easy trigger) - Since version 2.2.1


Schematics

Here are two schematics, one for the DIP (through hole) version of the MCU, one for the TQFP (smaller, surface mount) version.
DIP version

DIP version

TQFP version

TQFP version

NES and SNES connectors

NES and SNES connectors

N64 and GC connectors

N64 and GC connectors

Wiimote connector

Wiimote connector

Wiimote connector

Wiimote connector


Power supply:
The project uses the 3.3v supply coming from the Wiimote. Standard NES and SNES controllers, even though they were meant to be used at 5 volt seem to work fine. Some controllers built by third parties or otherwise special controllers might not work properly (eg: NES Advantage). N64 controllers are meant to be run at 3.3v so no problem here. Gamecube controllers are normally supplied with 5 volt and 3.3 volt, but on Nintendo hardware at least, it seems the 5 volt supply is only used for the vibration function. Leaving the 5 volt input unconnected seems to work fine.

Battery life:
According to the data exposed in the next section, using an SNES controller, battery life is similar to the classic controller. Battery life however is much shorter if using a N64 controller, but still better than what a wii motion plus gives you.

Here are suggested components for building the DIP version.
Ref.DescriptionSuggestions
R11.5K resistorDigikey S1.5KQCT-ND or equivalent.
C1,C218pf ceramic capacitorsDigikey BC1004CT-ND
C3,C4.1uF ceramic capacitorsDigikey BC2665CT-ND
P12x3 .100" pitch standard headerDigikey 609-3218-ND
Y1Crystal 12 MhzDigikey CTX904-ND
U1Atmega168a (ou Atmega168)Digikey ATMEGA168A-PU-ND

Here is an example built using the above suggested components:




Power consumption

Battery life is inversely proportional to the adapter's power consumption. As shown in the table below, while the adapter uses only 1.6mA, but the current drawn by the connected controller also has to be taken into account. I have included measurements of different Wiimote accessories as a comparison basis.

Note: All measurements were taken at 3.3v between the wiimote and the accessory under test using a modified wiimote extension cable and a multimeter.

Accessory Consumption
Extenmote v1.1, Atmega168, sans manette1.6mA
Classic controller RVL-005 1.7mA typical, approx. 3mA all buttons down
Classic controller RVL-005(-02) 1.36mA typical, approx. 3mA all buttons down
Extenmote v1.1, Atmega168, with standard US SNES controller (SNS-005)2mA
Nunchuk RVL-004 2.3mA typical
Extenmote v1.1, Atmega168, with white Gamecube DOL-003 controller (Japanese)4.4mA
Classic controller clone5.5mA typical
Extenmote v1.1, Atmega168, with N64 Horipad mini controller5.6mA
Wireless Nunchuk receiver (unknown brand)11.9mA typical
Extenmote v1.1, Atmega168, with N64 standard controller NUS-00515.4mA
Wii motion plus 22.5mA (Drops to approx. 1.5mA when another accessory is connected)
Conclusions:
  • Extenmote with a N64 controller draws less current than the wii motion plus. Battery life should be shorter than with the classic controller but still better than with the wii motion plus.
  • Nintendo did a pretty good of keeping the classic controller and nunchuk power low.
  • The wii motion plus uses as much as 22.5mA, but the current appears to drop to approx. 1.5mA as soon as an accessory (classic controller, nunchuk or extenmote) gets connected. The impact on battery life the wii motion plus presence has is therefore limited, but it would still be recommended to remove the wii motion plus when it is not required.
  • Interesting fact: The N64 Horipad mini controller draws less power than the N64 standard controller.
  • The adapter uses the AVR MCU 'Extended Standby' sleep mode. This lowers the adapter power consumption from 4mA to 1.6mA.


Latency

Using an adapter like this one inevitably increases delays (lag) but the good news is that it is quite short (less than 3ms).
SymbolParameterValueUnitsComments
AN64/GC poll time0.4ms
BAdapter added latency2.84msWorst observed case.
CWiimote poll to N64/GC poll2.35msVariable starting point.
DWiimote communication time1.5ms
EWiimote poll interval5ms
Note: I define the latency increase caused by the adapter as being the interval between the moment fresh controller data has been completely received and the moment said data has been completely transmitted to the wiimote.

Note 2: Many other elements of the complete system (controller>adapter>wiimote>bluetooth>wii>game>TV) are likely contributors to the total latency. This adapter can only minimise its own contribution to the total latency.


Compatibility

From the console point of view, the adapter acts like (and therefore is) a classic controller. So it should just work with any game supporting the classic controller. To this day, I know of no incompatible games.

But I'm regardless receiving a lot of questions like: "Can I use this adapter with game X?". Well here's a list of known working game software:
  • Wii and Wii U system menus
  • Mario Kart 8 (Wii U)
  • Super Smash Bros Brawl (Wii)
  • Sonic & All Stars Racing transformed (Wii U)
  • Super Mario 3D World
  • Virtual Console SNES and NES games
  • Virtual Console N64 games: Mario 64, Kirby 64, Mario Tennis 64, Wii64, Bomberman hero, Mario Golf, Pokemon Puzzle League, Mario Kart 64, Mario Party 2, Cruisn' USA, Wave race 64, Custom robo v2, Zelda Ocarina of time, Paper Mario, Super Smash Bros, Sin and punishment, Ogre Battle 64, 1080° Snowboarding, Pokemon Snap, Starfox 64, F-Zero X, Yoshi's Story
This list is absolutely incomplete. If a game is not listed, it still probably works very well. If you do test an unlisted game, let me know and I will be happy to add it to the list.


PCB

This project does not have a specific PCB because it was not necessary. I am simply using my Multiuse PCB2 again, which is perfect for this project.



Circuit available in the online shop:



Software

Version 2.2.1
July 14, 2022 (Thursday)
  • Add an option for Gamecube controllers where the L/R buttons are triggered early using the analog reading from the L/R sliders. This option is toggled with A+B+X+Y+L and is remembered between power cycles.
File(s):
extenmote-2.2.1.tar.gz (92.1 KB)
extenmote-2.2.1.hex (38.5 KB)
Show previous releases...
Version 2.1.1
February 1, 2019 (Friday)
  • Add a new button mapping. (Enabled with L+R+Z+Joystick_down)
  • Improve joystick analog range in 'high resolution' mode.
  • N64: ZL and ZR are not longer tied. By default, only Zr is used now. The old combined behavior can be toggled with L+R+Z+Joystick_up.
File(s):
extenmote-2.1.1.tar.gz (91.5 KB)
extenmote-2.1.1.hex (38.3 KB)
Version 2.1.0
November 30, 2016 (Wednesday)
NES Classic Edition support
File(s):
extenmote-2.1.0.tar.gz (90.2 KB)
extenmote-2.1.0.hex (38 KB)
Version 2.0
July 6, 2016 (Wednesday)
  • Add support for Megadrive and SMS controllers
  • Compilation fix for new AVR LIBC (Atmega168a vs. Atmega168 sleep registers)
File(s):
extenmote-2.0.tar.gz (88.2 KB)
extenmote-2.0.hex (37.2 KB)
Version 1.9.7
May 19, 2014 (Monday)
L/R analogic sliders fix and improvements:
  • N64/SNES: Simulate full L/R analogic deflection when L/R are pressed.
  • Gamecube: Fix L/R analog sliders support (broken since 1.9!)
File(s):
extenmote-1.9.7.tar.gz (84.7 KB)
extenmote-1.9.7.hex (32.5 KB)
Version 1.9.6
April 29, 2014 (Tuesday)
Fix NES/SNES controller support (was broken in v1.9.5)
File(s):
extenmote-1.9.6.tar.gz (84.5 KB)
extenmote-1.9.6.hex (32.4 KB)
Version 1.9.5
April 26, 2014 (Saturday)
New Gamecube mapping and bugfixes:
  • New Gamecube button mapping
  • Triple click on START button now triggers the HOME button (SNES/NES/GC/N64)
  • Prevent a 8 bit overflow from occuring with some cheap controller clones. Fixes the 'joystick left/down direction does not work' problem, but keep in mind the overall quality of the controller won't increase. It will work as badly as it does on a real N64.
  • Fix N64/Gamecube communication timing (note: No effect on 'lag' or lantency)
  • Fix eeprom init bug (Last mapping not saved)
  • Improved controller auto-detection
File(s):
extenmote-1.9.5.tar.gz (84.5 KB)
extenmote-1.9.5.hex (32.4 KB)
Version 1.9
August 24, 2013
Improved controller raw data access:
  • Added raw data for SNES and NES controllers
  • Implemented a special mode where the extension ID changes with the connected controller.
  • Modified GC/N64 raw data feature to includes the button data too and to be exactly in the format received from the controller.
Technical details here: http://www.raphnet.net/programmation/extenmote_raw/index_en.php.
File(s):
extenmote-1.9.tar.gz (83.1 KB)
extenmote-1.9.hex (33.6 KB)
Version 1.8
July 24, 2013
  • [GC/N64] Raw analog data and a signature is now appended to the standard classic controller report structure. Software that is aware of this will be able to use the full resolution of the original joysticks.
File(s):
extenmote-1.8.tar.gz (82.4 KB)
extenmote-1.8.hex (31.3 KB)
Version 1.7
July 17, 2013
Gamecube features:
  • [GC] Added a gamecube mapping for Devolution
  • Added a gamecube button combination to trigger the home button (A+B+Y+X+Z+C-Down)
  • [GC] Implemented the gamecube L and R sliders
  • [GC/N64] Holding start when connecting the controller (or powering up) disables the button mapping combos for the session.
File(s):
extenmote-1.7.tar.gz (81.4 KB)
extenmote-1.7.hex (30.8 KB)
Version 1.6
July 13, 2013
New N64 mappings and bugfixes:
  • Add two N64 mappings for F-Zero X and Yoshi's Story.
  • Fix calibartion data for libOGC (Fixes wii64 and probably others)
  • N64: When mapping 0 is active, pressing the four C buttons + Dpad left + Z sends X+Y pressed status (for wii64 menu)
  • The N64 Default curve (1.5) was not really active by default. L+R+Z+A had to be explicitely pressed. (now fixed)
  • Add a tool I use for QA (Requires Linux and a wusbmote adapter)
File(s):
extenmote-1.6.tar.gz (80.5 KB)
extenmote-1.6.hex (29.8 KB)
Version 1.5
January 30, 2013
New version with important fixes!
  • New v1.5 default curve (much better in Zelda)
  • Fix: When switching from the Wii menu to a game, the adapter does not have to be reconnected anymore.
  • Fix: The 'always scrolling' bug that occured only in the Wii U main menu has been corrected.
  • Removed the old v1.1 curve.
File(s):
extenmote-1.5.tar.gz (77.2 KB)
extenmote-1.5.hex (29.1 KB)
Version 1.4.1
January 23, 2013
New:
  • Added a pair of experimental Gamecube mappings.
  • Updated the N64 joystick transfer curve to support controllers with wear. (The original curve can be recalled using a button combination)
  • The adapter settings (eg: Button mappings, transfer curves) are now stored in non-volatile memory. No need to reconfigure after each reconnection.
Known issues:
  • Some NES controllers won't work due to the 3.3v supply (ex: NES Advantage)
  • Gamecube L/R analog is still not implemented. (Does not seem to be a problem for most games)
  • When switching from the Wii menu to a game, the adapter has to be reconnected.
File(s):
extenmote-1.4.1.tar.gz (61.6 KB)
extenmote-1.4.1.hex (28.2 KB)
Version 1.3
January 6, 2013
Progress on the Gamecube version:
  • Implemented a new gamecube mapping to help SNES VC games.
  • Implemented gamecube C stick.
  • Note: Gamecube L/R analog is still not implemented. I need a game that uses this feature to test. Suggestions anyone?
Known issues:
  • Some NES controllers won't work due to the 3.3v supply (ex: NES Advantage)
  • Gamecube support is incomplete
  • When switching from the Wii menu to a game, the adapter has to be reconnected.
  • The N64 transfer does not work optimally with worn controllers.
File(s):
extenmote-1.3.tar.gz (35.3 KB)
extenmote-1.3.hex (26.8 KB)
Version 1.2
January 1, 2013
Fix specific to the multiuse PCB2 board to lower power consumption.
File(s):
extenmote-1.2.tar.gz (34.6 KB)
extenmote-1.2.hex (26.3 KB)
Version 1.1
December 25, 2012
Initial release.

Supported:
  • N64 support with 6 mappings
  • SNES support with 3 mappings: Tested SNS-005
  • NES controller support: Tested Standard controllers (NES-004), NES MAX (NES-027)
  • Tested with several NES, SNES and N64 virtual console titles and Mario Kart Wii.

Known issues:
  • Some NES controllers won't work due to the 3.3v supply (ex: NES Advantage)
  • Gamecube support is incomplete
File(s):
extenmote-1.1.tar.gz (34.5 KB)
extenmote-1.1.hex (26.3 KB)
Using the .hex files
The Atmega168a has to be programmed using the .hex file. The "fuse bytes" for this project are extended_byte=0x01, high_byte=0xdf, low_byte=0xdf.

For more information about the tools required to program an AVR microcontroller, please visit my AVR programming page.

Source Code (.tar.gz files):
Unless indicated otherwise, the source code is published under the GPL license version 3. Please consult the included gpl.txt file for more information. The project compiles using the included makefiles using avr-gcc under Linux.

This project is also available on GitHub!
To request features, report issues or contribute, you may send me an email or use the GitHub repository:
https://github.com/raphnet/extenmote


Raw values

For compatiblity, my extenmote adapters must convert the joystick values to match those of a classic controller. Unfortunately, resolution is lost in the process meaning that the controllers are not working at their full potential.

Starting with version 1.8, the adapter appends raw values to the standard classic controller. Software unaware of this feature will continue working normally, but the data will be available and usable by applications were it is useful.

This feature is documented in details on its own page. An example using a modified libOGC is also available.


User pictures

Seeing how others build my projects is always a pleasure. Send me your pictures and I'll add them here. Also let me know if you have a name/alias and country I can mention. By default, I will use your first name.

I received the following pictures on January 12, 2013. This user built everything right into his N64 controller. Note the skillful soldering of the surface mount MCU:



2013-02: Alexandre installed the circuit inside a N64 controller:



2013-02-13: Samuel sent me the following pictures of the circuit installed inside a NES controller:



2013-08-12: Santiago built his adapter by modifying a Gameboy. Game controllers are connected using a selection of modified game cartridges!



2015-05-04: Jonathan from Canada built a pair of SNES/Gamecube to Wiimote adapters:


March 2016: Jonathan added two more adapters to his collection: N64/Gamecube to Wiimote:






Disclaimer

I cannot be held responsible for any damages that could occur to you or your equipment while following the procedures present on this page. Also, I GIVE ABSOLUTELY NO WARRANTY on the correctness and usability of the informations on this page. Please note, however, that the procedures above have worked in my case without any damages or problems.

Now you cannot say that I did not warn you :)