The Beginning: Prototyping the Controller HW and SW

A project log for DIY Bluetooth SNES Classic Controller

Exactly as the title says, I built a bluetooth controller out of a SNES controller and dongle for use with Nintendo's mini classic consoles.

sjm4306sjm4306 10/08/2018 at 13:480 Comments

So to start this project off thank you bbtinkerer for your original classic joystick project which inspired and started off this project by providing base code for the protocol (

I also made a quick video demoing the prototype controller here and some talk about the prototype board and latency

So a little info, I am using the HC-5/6, as the bluetooth serial communication link which connects the receiver (dongle that plugs into the classic console) and transmitter (controller). Here you can see I hardwired the HC-05 module (after setting up the AT mode to allow master mode and autoconnecting to any other slave module).

Next up, the software runs on an ATMEGA328P with each the transmitter and receiver having their own controller on tiny little general purpose boards I designed and ordered through my sponsor JLCPCB (thanks a bunch!!!). Check them out here: $2 PCBs (in 48hours):

The transmitter connects to the original SNES controller board's SPI serial shift register and polls it just like the console would. Once the button states are captured, then they encoded into a 2 byte packet to be sent over the bluetooth UART serial. Here's the transmitter circuit. The HC-05 bluetooth module is on the front and the discrete RGB leds right above the up button.
The battery (a 330mAh 3.7V cell) and charging circuit with micro usb are on the back left hand side. The atmega328p and 3.3V LDO regulator are on the right here.

On the receiver side I use the same board I designed and attach it to the bluetooth module over serial and also to the classic console plug over i2c (see bbtinkerer's page for info about the protocol and connections for i2c). The software just receives packets, picks out the button states, and finally send it to bbtinkerer's function which assembles the i2c packet and sends it over i2c to the classic console.

I'll have to take pics of the receiver once I have finished designing a 3d printed case for it. As of right now, it is fully functional but a mess of wires and boards just dangling in free air.

As a final note, latency was a concern as I am limited by how fast I poll button states and the overhead of the bluetooth stack implemented in the HC-05 modules I am using, so I toggled some I/O on both the transmitter and the receiver so I can see when a packet is sent, and when it is received. I used my pocket oscilloscope to then capture this timing.

We can see that delta T is just under 30mS which equates to:

Less than 2 frames of latency assuming NTSC 60 frames a second (or equivalently 1 frame for 30 fps). So definitely good enough for me and the majority of the types of games I play (although this might pose problems for games like punchout that require frame perfect button inputs).

In the next part I will add some finishing touches to the controller and button it all up. Then I will finish the receiver and maybe make versions that are compatible with original consoles and usb.