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:
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
N64
Mode 0
Mode 1
Mode 2
Mode 3
Mode 4
Mode 5
Mode 6
Mode 7
Mode 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
Mapping
Activation
Recommended games
Introduced
Mapping 0
L+R+Z+D-up
Mario 64, Kirby 64, Mario Tennis 64, Wii64*, Bomberman hero, Mario Golf, Pokemon Puzzle League
v1.0
Mapping 1
L+R+Z+D-down
Mario Kart 64, Mario Kart Wii, Mario Party 2, Cruisn' USA, Wave race 64, Custom robo v2
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.
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:
Controller
X axis
Y axis
Stick condition
Standard N64 red
-82 to 79
-85 to 83
As new
Standard N64 aqua
-80 to 80
-80 to 85
As new
Standard N64 gray
-75 to 75
-80 to 77
Worn
Standard N64 transparent purple
-72 to 80
-80 to 80
Described as "Some wear" on eBay. Quite worn actually..
Standard N64 yellow
-68 to 64
-69 to 80
Extremely worn
Hori pad mini
-100 to 100
-100 to 100
As new
Unknown brand
-88 to 87
-90 to 85
As new
Unknown brand
-128 à 127
-128 à 127
New
Gamecube support
Gamecube
Mode 0
Mode 1
Mode 2
Mode 3
Mode 4
Mode 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.
Mapping
Firmware
Activation
Recommended games
Mapping 0
Since 1.3
A+B+X+Y+Dpad-Up
Mario Kart Wii
Mapping 1
Since 1.3
A+B+X+Y+Dpad-Down
SNES virtual console games
Mapping 2
Since 1.4
A+B+X+Y+Dpad-Left
Sonic & All-Stars transformed for the Wii U and others.
Mapping 3
Since 1.4
A+B+X+Y+Dpad-Right
Sonic & All-Stars transformed for the Wii U and others.
Mapping 4
Since 1.7
A+B+X+Y+Z+C-left
For Devolution.
Mapping 5
Depuis 1.9.5
A+B+X+Y+Z+C-right
Super 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
TQFP version
NES and SNES connectors
N64 and GC connectors
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.
Description
Suggestions
R1
1.5K resistor
Digikey S1.5KQCT-ND or equivalent.
C1,C2
18pf ceramic capacitors
Digikey BC1004CT-ND
C3,C4
.1uF ceramic capacitors
Digikey BC2665CT-ND
P1
2x3 .100" pitch standard header
Digikey 609-3218-ND
Y1
Crystal 12 Mhz
Digikey CTX904-ND
U1
Atmega168a (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 manette
1.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 clone
5.5mA typical
Extenmote v1.1, Atmega168, with N64 Horipad mini controller
5.6mA
Wireless Nunchuk receiver (unknown brand)
11.9mA typical
Extenmote v1.1, Atmega168, with N64 standard controller NUS-005
15.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).
Symbol
Parameter
Value
Units
Comments
A
N64/GC poll time
0.4
ms
B
Adapter added latency
2.84
ms
Worst observed case.
C
Wiimote poll to N64/GC poll
2.35
ms
Variable starting point.
D
Wiimote communication time
1.5
ms
E
Wiimote poll interval
5
ms
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.
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.
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)
[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.
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.
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:
References
The folling pages and documents helped make this project possible.
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.