USB Compatible Wii Nunchuk Conversion

by dgouws123 in Circuits > USB

95 Views, 0 Favorites, 0 Comments

USB Compatible Wii Nunchuk Conversion

WhatsApp Image 2025-08-03 at 19.41.06_219a5fa0.jpg

This Instructable describes the process used to convert a generic Wii Nunchuk controller from its proprietary connector and I2C interface to a simple Arduino Serial over USB type A interface. The output produced by the unit can easily be demoed graphically (Arduino IDE 2.0 Serial Plotter) or parsed using a Python script running on a PC or SBC for use in an arbitrary robotics or electronics project requiring remote control.

I needed a remote controller for a legged robotics project. I happened to have access to several unused Nunchuk controllers in storage. The controls available on the Nunchuk (2-axis joystick, 2 buttons, 3-axis accelerometer) fit my needs well.

Unfortunately, the Nunchuk uses a proprietary connector carrying an I2C protocol. My project uses an SBC (Single Board Computer), and any added peripherals should preferably be accessed through USB ports. While it is possible to buy a Nunchuk to USB adapter, it seemed awkward to have the extra block hanging on my robot with the risk of going missing, etc.

Instead, I realised it may be possible to handle the I2C to USB conversion using an Arduino Pro Mini and Serial FTDI programmer. I keep several Pro Minis available for the convenience of rapid prototyping. Serial output is an acceptable interface form because several other peripherals connected to my SBC already use similar communication.

Arguably, it would probably have been cheaper to buy a generic Xbox controller with a USB cable and just figure out how to decode the incoming data. However, I was interested in the Accelerometer function for driving the pitch and roll angles of my robot, and I felt that it would be an informative experience to go through the USB conversion process. Additionally, I need to burn through those Nunchuks eventually.

Plenty of similar projects have been undertaken, but I couldn't find an identical one:

  1. https://www.instructables.com/USB-Mouse-Made-Out-Of-A-Wii-Nunchuck/
  2. https://www.decarpentier.nl/making-a-wireless-joystick

In the past, I commanded my legged robot purely using hardcoded programs and terminal command line inputs. The converted nunchuk is eligible for the Build-A-Tool contest since adding a remote control makes it far easier and more satisfying to control the system, and much easier to demo. Additionally, the general simplicity of the design and implemented communication protocol makes it a useful tool for many future projects.

Supplies

IMG-20250803-WA0017.jpg
IMG-20250803-WA0014.jpg
IMG-20250803-WA0013.jpg

One requires the following components or equivalent:

  1. Standard Wii Nunchuk controller
  2. Arduino Pro Mini (Preferably 3.3V version)
  3. FTDI programmer (with cable for programming the Pro Mini)
  4. Long USB 2.0 cable with a USB Type A connector on one end.
  5. Nunchuk connector breakout board (Optional)

It's preferable to use a 3.3V Pro Mini as the Nunchuk is a 3.3V device. However, it seems to work without issues with a 5V Pro Mini. Ensure the FTDI programmer provides a matching voltage output to the Pro Mini. The voltage can usually be configured by cutting a strip of copper on the back of the Programmer.

The Nunchuk connector breakout board is optional, but it makes interfacing with the controller much simpler. Take note that both female Nunchuk connectors (here, but could be cheaper elsewhere) and the PCB-type breakout board (here) are available online.

There's a Lot of Space in Here...

WhatsApp Image 2025-08-04 at 15.31.46_50469b17.jpg

If one opens a Nunchuk, one might be surprised by the scarcity of electronics and the excess free space inside the plastic casing. While somewhat depressing, this suits our nefarious purposes perfectly. One bright idea later, and we can confirm (not shown here unfortunately) that a Pro Mini and FTDI programmer can comfortably fit in the remaining space. Try to ensure your components can do the same. Now we just have to wire the pieces together.

Prove Everything Works

IMG-20250803-WA0012.jpg
Example.png
images.jpg

We need to verify that all our components function as expected before we start soldering everything together. Ideally, use a different Arduino board for this, as it requires some additional pins soldered in to interface with the FTDI programmer, which we will leave out in the final product.

Assemble the components using a breadboard and Dupont cables or any other valid method of connecting the required signals.

You will either need to use a Nunchuk connector breakout board or cut the connector and connect the bare wires. In that case, check which signal matches which wire colour. The colours tend to be illogical. Use either the attached connector pinout (pulled from here) or the printed labels on the Nunchuk PCB.

The signal connections should be very straightforward. It should just be your PC to USB cable to FTDI programmer to Pro Mini to Nunchuk over the I2C bus.

Upload the example sketch shown below to the Pro Mini. The example makes use of the WiiChuck library v0.3.2. Note that later versions break the example. Additionally, the library barely fits in the 2048 bytes of RAM available on the Pro Mini (ATmega328P) and is likely to go unstable if you add many local variables.

Ensure that the Pro Mini prints text and numbers which change when you move the remote and manipulate the controls. If that's the case, the system works as expected.


Pro Mini to Nunchuk schematic:

VCC-VCC

GND-GND

A4-SDA

A5-SCL


Nunchuk Example sketch pulled from this Adafruit tutorial:

#include <WiiChuck.h>

Accessory nunchuck;

void setup() {
Serial.begin(115200);
nunchuck.begin();
if (nunchuck.type == Unknown) {
nunchuck.type = NUNCHUCK;
}
}

void loop() {
nunchuck.readData(); // Read inputs and update maps

Serial.print("X: "); Serial.print(nunchuck.getAccelX());
Serial.print(" \tY: "); Serial.print(nunchuck.getAccelY());
Serial.print(" \tZ: "); Serial.println(nunchuck.getAccelZ());

Serial.print("Joy: (");
Serial.print(nunchuck.getJoyX());
Serial.print(", ");
Serial.print(nunchuck.getJoyY());
Serial.println(")");

Serial.print("Button: ");
if (nunchuck.getButtonZ()) Serial.print(" Z ");
if (nunchuck.getButtonC()) Serial.print(" C ");

Serial.println();
delay(100);
}

Solder FTDI Programmer to USB Type a Cable

WhatsApp Image 2025-08-04 at 17.12.38_4734d570.jpg
USB_mini_pinout.jpg
usb-type-a-pin-out.jpg

The time has come. Cut one end off the USB cable. You should be left with a reasonably long cable with a USB Type A connector on one end.

Connect this cable directly to your FTDI programmer after removing the original connector. The procedure will probably require some SMD soldering, but it should be possible. A hot air gun may be advantageous. Try to find open, connected pads for the GND and VCC pins to avoid putting all the SMD soldered wires next to each other.

The attached diagrams may be helpful for determining which signal is which:

  1. USB mini pinout.
  2. USB type A pinout.

Check all connections and ensure there are no short-circuits using a multimeter.

While it is possible to simply use your Programmer cable and original plug without any soldering, it may be tricky to fit everything into the controller without cutting the plastic ribs.

Test the modified programmer by flashing a Pro Mini. Note that there is a risk of damaging your PC's USB port if GND and 5V are shorted and pull large currents. If the test is successful, cover the soldering and thin wires in hot glue for stability.

Connect FTDI Programmer to Pro Mini

Check whether the FTDI programmer attached to the Pro Mini in the standard programming configuration, but with your soldered USB cable, will fit in the casing as is. If not, remove soldered pins on the Programmer to save space and replace them with either directly soldered pins between the Pro Mini and the Programmer or short wires. Be dead certain about making the correct connections. It can be a nightmare if de-soldering multiple pins is necessary.

Test the system by uploading a sketch again.

Connect Pro Mini to Nunchuk PCB

Remove the Nunchuk PCB from the casing.

Desolder the wires currently connecting the Nunchuk PCB to its original cable. Then, resolder two pairs of short wires, GND, VCC and SCL, SDA between the Pro Mini and the PCB. All connections are identical to Step 2. However, try to do it quickly, as the solder pads on low-quality PCBs tend to break off if repeatedly soldered and desoldered. Hot glue can be used afterwards if you feel the connections are flimsy.

Test Full Assembly

IMG-20250803-WA0010.jpg
IMG-20250803-WA0011.jpg

Once all wires are connected, connect the assembly to your PC and verify that you can still flash the Pro Mini and pull data from the Nunchuk PCB using the example sketch. Hot glue can be used again if you are concerned about wire strain.

Repackage

IMG-20250803-WA0009.jpg
IMG-20250803-WA0007.jpg
IMG-20250803-WA0008.jpg

Gently fit the assembly back into the casing. Ensure the Nunchuk PCB lines up with the casing buttons and that all screw holes are uncovered.

Cut the cable choke lengthwise and remove the original cable. Place the choke over your USB cable to remove strain on internal components.

Close the case and lightly re-insert the two screws on the bottom.

Test and Finalize Product

IMG-20250803-WA0006.jpg
CSV_stream.png
Picture9.png

Attached is an Arduino sketch implementing a full serial interface written mostly by ChatGPT based on the above example. The serial interface allows a CSV or binary stream mode, which sends 11 bytes per packet and single-sample binary and CSV packets.

Screenshots showing the printout from the CSV stream mode (at 50 Hz) and the graphical demo are included. These are taken while shaking the Nunchuk in all directions (Accelerometer XYZ readings at the top of the plot), and moving the joystick in a circle (middle two lines).

Note the F macros in the sketch to keep the static literal text in flash memory and save RAM. The interface sketch uses 1793 of the available 2048 bytes of RAM. When modifying the program, care should be taken to avoid flooding the serial port immediately after program start, as this may interfere with the upload procedure.

Good luck with integrating this with your next project. Hopefully, the controller lasts for many future robots, and the interface remains clear and easy to parse.