Introduction: USB SNES Controller

Picture of USB SNES Controller

First instructable. Let me know what it needs and fixes.

I did not make the circuit or program. I am just making a guide that shows step by step assembly of how to make the USB SNES controller. The original page is here:

This guide will convert a regular snes controller into a usb gamepad. It is tested working on XP, Vista, 7, and PS3. It should work on mac and linux but I have not tested them. The device is recognized as a standard HID device.

-You do not need to program anything for this guide. The program is already compiled and ready to be flashed to your chip.
-You do need basic soldering skills.
-Basic schematic reading skills helps, but I will try to explain every step.

Step 1: Parts Needed

Picture of Parts Needed

Parts List:
-Atmega8 DIP microcontroller
-AVR programmer (usb, parallell or serial. I use usb.)
-12MHz Crystal osscilator
-[2] 3.6 volt zener diode
-1.5K Resistor (anywhere from 1.3K to 1.7K should work)
-[2] 68ohm resistor (anywhere from 60 to 75 should work)
-USB male cable
-SNES controller (first party works better. wires colors match guide.)
-Small wire.
-PCB - - $2
-Breadboard. This makes it much easier to test before putting into a controller.
    - $9

-Wire Stripper
-Wire Cutter
-Soldering Iron
-Needle nose pliers (makes it alot easier to place and move wires on breadboard)
-Dremmel or cutting tool. (chip will not fit into unmodified controller.

Step 2: Prepare Wires

Picture of Prepare Wires

-Take a usb cable and cut off the non male end. You only need the cable and male usb.
-Strip the USB cable and all 4 connections inside. (some usb cables have 5 wires. This guide does not need the 5th wire, so it can be cut off.

-Open the SNES controller. Cut the connection wires close to the board, but leave enough wire so they can be solderd to a pcb. Better to leave too much wire and cut it off if you don't need it.

Step 3: Flashing the Hex File to the Atmega8

Picture of Flashing the Hex File to the Atmega8

I used a usb programmer to flash my chip. This means that a compiled hex file is sent from the computer to the chip. No actual programming needs to be done. Serial and parallel will work to, but the programmer software will be a little different from mine.

The HEX file be downloaded here: (right click save target as...)
This is a firmware that will tell the chip how to handle all signals.

All Atmega chips need fuse bytes. Don't worry about what they do, just know that this design needs:
high byte = 0xc9
low byte = 0x9f

Your chip flashing program should have an option to set these fuses. I used ProgISP on my system.

When you have it flashed, you are ready to start bread boarding.

Step 4: Breadboarding

Picture of Breadboarding

I will assume you know the basics of using a breadboard. If not, there are many guides for that.
I will also assume that you know how to solder wires.

If you can not read the picture, go here:

Start by solding each of the 4 usb wires and each of the 5 snes wires. Solder the ends so that they can be plugged into the breadboard.

Attach the programmed microcontroller and start to wire the components.

Step 5: Oscillator + SNES

Picture of Oscillator + SNES

The oscillator connects to pins 9 and 10. It can be rotated either way and work.
SNES Clock connects to pin 28.
SNES Latch connects to pin 27.
SNES Data connects to pin 26.
SNES 5V power connects to both 5V on the chip and usb 5V.
SNES ground connects to both grounds on chip and usb ground.

Step 6: USB Data and Power

Picture of USB Data and Power

This part is very tricky to wire correctly. Pay close attention to the schematic.
USB 5V goes to both 5V pins and SNES 5V
USB Ground goes to both ground pins and SNES ground
USB2 is data - . It goes:
     through a 3.6v zener diode to ground
     through a 68ohm resistor to pin 2 and 3
     to usb 5V through a 1.5k resistor.
USB3 is data +. it goes:
     through a 3.6v zener diode  to ground
     through a 68ohm resistor to pin 4

Step 7: Testing the Controller

Picture of Testing the Controller

With all parts in place, plug in the usb port into your computer and it should come up with found new hardware. You can test all the buttons in the control panel under game controllers.

If it works, you are ready to transfer it to a pcb and put it in the controller.

Step 8: Breadboard to PCB

Picture of Breadboard to PCB

I used the board below to make my design. I put the chip in place and used a dremmel to cut all unneeded areas off the board. You need to make it as small as possible to fit in the controller.

Note that all the solder spots near the pins connect 3 holes. This allows 2 wires per pin to be used on this board.

Note. The solder must be on the bottom of the board. Put it on the wrong side and the pins won't make any connections.

Step 9: Modifying the Controller

Picture of Modifying the Controller

I had to cut the casing a little to fit everything inside. I put my circuit under the abxy buttons. The picture shows what I did. Fit it in anyway you want as long as it closes.

Step 10: Final Testing + Notes

Picture of Final Testing + Notes

Test it and see if it works. If it does, you're done. If not check common errors.

Common Errors:
Check that power and ground are connected properly
Check the direction on the zener diodes. They do not work both ways.
Is the oscillator connected?
Did you program the right program and the fuse bytes?
Are snes data, latch, and clock hooked up to the right pins?
Do you have a solder bridge anywhere?

This controller does work on a PS3, but the buttons do not map very nicely. The start and select buttons do not map to ps3 start and select. This can be usable on some fighter games that allow you to remap the buttons.

Let me know what I can do to improve this Instructable.


Cesar RodrigoB (author)2015-11-13

Hello, on windows 10 I have the message: Unknown USB Device (Device Descriptor Request Failed)

Any idea?

shantic (author)Cesar RodrigoB2016-02-18

Have the same problem :(

gamesngadgets (author)2015-09-14

Version 1.9 of the hex is available now :-)

bananenbär (author)2015-01-07


Everything seems to work fine, but my Windows7 64Bit detects the Controller as "Unknown Device" (Driver installation seems ok, though...) and pushing buttons on the controller has no effect :(

Any idea what's happening here? I'm using the 1.9 version of your code.


bananenbär (author)bananenbär2015-01-07

Got it... swapped D+ and D- ... too easy :->

ferret141 (author)2014-12-19

Hi I'm trying to build this as a christmas present for someone but I've hit a hurdle on two boards.

My Teensy 2.0 shows up as "Virtua Stick High Grade" for a second then becomes "USB Input Device"

My Pololu A-Star 32U4 Micro also shows up as "Virtua Stick High Grade" but constantly disconnects and re-connects.

Can anyone offer a solution to either of these problems?

joshdgatlin (author)2014-11-06

I've tried this and failed. Maybe it's my connections, but everytime i plug it in, all it says is that the device malfunctioned. I'm just gonna go ahead and buy a USB SNES controller because this shouldn't be this hard. it could be because the materials are all cheap as crap and all the wires are flimsy so that could ruin some of my contacts. IDK but it sucks that I couldn't get this to work. I wanted to implement it into my senior design but oh well. Im not gonna spend weeks on a controller.

avery.duncan (author)2014-10-31

Unless you just have the materials lying around, Isn't it just cheaper to get a snes controller to USB adaptor?

joshdgatlin (author)2014-09-25

The coding explanation is BOGUS! How is a person supposed to learn how to program the chip and all you say is "welp, program the chip, NEXT step is everything else" like come on dude! seriously?

timeblade0 (author)joshdgatlin2014-10-05

Sorry I didn't explain better. I did not modify any source code for this project. I should have used the term Flashed in Step 3.
Download the hex file from the link in Step 3. It is the compiled source code that is ready to be transferred to the chip.

This is a usb programmer that can be used for it:

These 3 together make it easier to wire the programmer to the microcontroller:

The 5x2 ribbon wire from the programmer plugs into the AVR Programming Adapter. From there, the 6 pins plug into an open spot on the breadboard.
Then wire each of the 6: GND, 5V, MISO, SCK, RESET, and MOSI to the corresponding pins on the chip. Open your chip flashing program of choice (I used ProISP) and flash the Hex file to the chip. After that, set the high and low fuse bytes. The 12MHz oscillator must be connected to flash and set fuse bytes.

After doing this successfully, the programmer and adapter can be removed from the breadboard.

I can post more pictures if they would help.

joshdgatlin (author)timeblade02014-10-27

Is there another way I can program this chip. like using another arduino instead? buying parts seems extra.

timeblade0 (author)joshdgatlin2014-10-28

I have read that an Arduino can be used to program an atmega8 chip. I have not tried this, but this guide appears to be what your looking for

(note that an atmega8, atmega168, and atmega328 have the same pinout for flashing programs)

timeblade0 (author)timeblade02014-10-28

I don't like how he uses an imitation Arduino.
Found this pic on google that might be easier to follow. Pin1 is at the top right of this picture.

joshdgatlin (author)timeblade02014-10-27

yes please post pictures!

timeblade0 (author)joshdgatlin2014-10-28

The first picture shows how I have the chip wired. The second shows the full usb avr programmer attached.

joshdgatlin (author)timeblade02014-10-06

Oh you're totally fine dude, haha I was being a jerk that day because I was rushing to finish it. But this is a great instructable nonetheless, just be careful of your wording because some people might miss the SMALL details.

jordan.riley.334 (author)2014-10-04

Can you please help i am trying to build this i bread boarded it and when i connect it to my computer i get unknown device please help

XOMR (author)2013-09-02

Here's where I run into a dead end. Only thing that Windows detects in its Devices is a "Prolific USB-to-Serial Comm Port." Any tips on where to start trouble shooting?

timeblade0 (author)XOMR2013-09-02

Prolific USB-to-Serial Comm Port is the usb micro controller programmer, not the controller.

Basic overview of steps:
1. Program microchip with programmer on computer.
2. assemble circuit with programmed microchip on breadboard,
the usb microcontroller can be disconnected and is no longer needed.
3. plug cutoff usb wire into breadboard as illustrated in Step 4.

There should be a driver for Human Interface Device if all is well.
If not, the zenor diodes might be backwards.
Also check that all pins are in the right locations.
Did the programmer program say chip flashed successfully?

GenesisMaster (author)timeblade02013-12-28

Speaking of programs, would it work if I used AVRdude to program the ATmega8? Also, I tried to create a sketch of a NES controller with the USB conversion circuit built in(picture below). Would it work?

timeblade0 (author)GenesisMaster2013-12-28

AVRdude should work. I've had friends use that with no problems.

The NES circuit might work.
The way this adapter works:
Press button on controller.
Command is sent to that controller's microcontroller.
That microcontroller sends out the commands to the console.
This is where the adapter intercepts it and converts it.
If your NES circuitboard still have the NES microcontroller, it should work.
If not, you will need to modify the code a lot.

XOMR (author)timeblade02013-09-08

Went through the circuit again. Then went through it again with a different USB cable and that did the trick. Now to perf board!

timeblade0 (author)XOMR2013-09-08

Glad it's working so far.
The usb part with the zenor diodes is a little tricky on perf board.
Take it slow and do each connection one at a time.

Gompka (author)2013-06-11

Thanks for the reply, i will give it a shot and report back.

Gompka (author)2013-06-07

Any idea if the atmega328P will work with a 12mhz crystal? I have one laying around vs having to buy an atmega 8. I know the operating frequency will have an affect on the timings, but if i clock down the 328P i'm thinking it should work.


timeblade0 (author)Gompka2013-06-07

The 328P can use a 12mhz crystal. The timing should not be a problem if configured right.
I don't know if the same code will work.
I think code from Atmega88, 168, and 328 is directly compatible.
I think from an Atmega8 to an Atmega38 would require you to modify the source code.
I don't understand the code enough to change it.

Source Code:

Baniski (author)2011-07-26

I bought the usb programmer, and made the connections, I downloaded the. .. .hex but what program I use to upload the .hex file to the ATMEGA8?


krauser35 (author)Baniski2011-08-07

The programmer should have a driver disk. The suitable software for programming must be inside that disk.

However I used ISPprog v1.6.7 from :

It seems the latest version is 1.72 :

timeblade0 (author)krauser352013-05-19

I used ISPprog 1.6.7 as well.

webfp46 (author)2012-02-05

Can you also post the C source code. I actually want to know what I am programming. Or is there some way to backcompile the .hex file?


timeblade0 (author)webfp462013-05-19

Source code can be found below. This is what I based this instructable on.

evan.stoddard (author)2013-05-19

Can I use an arduino to program the controller. I know you can use it as isp.

timeblade0 (author)evan.stoddard2013-05-19

I have heard of doing that, but have not done it. You should be able to use the Arduino as an ISP to download this code. I don't see any reason why it wouldn't work.

greensparks75 (author)2012-12-25

you should consider making an instructable for the ATtiny45 version, i can sorta figure out whats going on from andreq's files but i'm not very experienced.

blackowaya (author)2011-07-31

Long time passed, but I'm here to show how i made my adaptor.

I used an ATTINY25. All componentes are inside the DB25 shell. After a lot of optimization (and reseach X_x), i managed how to implement  a calibration routine for the internal oscilator.

Here is the firmware's url.

Thank you Andreq, your information was a huge help.

yahithappens1234 (author)2011-04-16

ummmm can you just make me one? i hate electronics and working with robotics, its too confusing, i could provide a controller and money!

Its OK with me but I know that shipping cost will kill you!
I is really simple and a good experience, you can do it, trust and believe in yourself! This is the cheapest way. I strongly recommend you to do it by yourself then share your experience with us.
There are two other ways :
1. You can ask someone whose job is electronic at your local place, do it for you.
2. Another way is buying one of these from amazon :
a. NES Retro Classic Controller USB
b. NES Controller to Pc USB Adapter
c. Retrolink Nintendo NES USB Adapter for PC

Good Luck!

andreq (author)2010-01-06

I did the same thing some times ago, but I used an ATtiny45 (DIP).

The schematic and source code can be found here :

I did some modification to the source code to include automatic internal OSC calibration. I'll try to find it somewhere on my hard drive.

If my memory is good, it might even fit inside an ATtine25 (that's what I had around...)

Anyway, great job, but you should show us how the finished PCB looked like and use less "marketing" pictures :)

andreq (author)andreq2010-01-06

Here is the full sources.

Include schematic, code and compiled HEX.

It should fit inside an ATtiny25, it compile to 1984 bytes (kinda... funny)

blackowaya (author)andreq2011-03-13


I'm afraid the link to the firmware made by andreq is dead.

I'm trying to make this adaptor, using an ATTINY25, i tried to add internal OSCCAL and optimize the code from hobbyelektronik but my firmware compile to 2138 bytes (it's too fat).

If someone have the source code of the firmware of andreq, please post it. Thank you in advance.

andreq (author)blackowaya2011-03-13

Lucky enought, I found it inside an old backup folder :

You might have to look at the code. I've seen I commented out the autocalibration part (to save space). Also, I changed the usb vendor name to Andre in the usb-config. You could just change that to anything small (<=5 letters) if you care. Make sure to set the lenght accordingly.

You might need to play with the OSCALL value which is read from eeprom 0x00. It should be between 125 and 128.

Have fun! There's nothing like the real feeling of a Snes game-pad when playing classic games.

blackowaya (author)andreq2011-03-14

WOW, thanks a lot andreq ¡n_n¡.

I'll be testing it tonight. Yeah, nothing better to use the original SNES pads to play classic games. I'm a SNES fan and i think is the best pad in terms of weight, confort, response and button layout. I'll be posting photos when finish the project.

andreq (author)blackowaya2011-03-13

I'll try to find that file on my computer again and upload it somwhere else. If your in a hurry, the easiest part to "cut" is the USB device name. It take lots of space.

timeblade0 (author)andreq2010-01-06

I posted 2 pictures of my actual circuit.

Using an ATtiny25 would be a lot easier than the Atmega8 I used. Atmega8 = 28 pins, ATtiny25 = 8 pins, much easier to cram in the case. I will try the one you posted on my next attempt at SNES USB.

andreq (author)timeblade02010-01-06

This is the main reason why I used the ATtiny... you also have less component!

The only problem I had was with the USB data voltage.

I tryed the zener diode method without success.

On the V-USB website (the actual USB "firmware" that is used by this code) you can see other method.

For my circuit I used a 3mm red led on the 5v line... it reduced the voltage close to the 3.6v required by the data line. I also removed the zener.

I think 2 "normal" (not led...) diode on the 5v is also possible.

krauser35 (author)2011-03-10

Works great, thanks!

krauser35 (author)2011-03-06

What about C1? Did you forget it?
C1: 10uf capacitor. Install it near the ATmega8

Or it is just an unnecessary component, just like J1, J2, D1, R4?. But it doesn't seem to be unnecessary like these ones. Please explain about it. Thanks

ertxz18 (author)2010-09-06

Could you please include maybe some links or information as to how you acquired all the parts needed :D THANKS!

timeblade0 (author)ertxz182010-10-20

Atmega 8 can be found on ebay by searching "Atmega8 pu"
AVR programmer can be found on ebay. search "usbasp"
12Mhz crystal -
3.6V zener diode. ebay. search "3.6V zener diode"
Resistors from sparkfun, radioshack,or ebay.
USB male from sparkfun, radioshack, ebay, or thrift stores. Any device with a usb male can work.
SNES controller - sparkfun, ebay, thrift stores, old game stores.
Wire - sparkfun, radioshack. Look for a jumper wire kit such as:
PCB and breadboards can be found at sparkfun, radioshack,or ebay.

Let me know if you have trouble locating the parts.

LordGormyr (author)2010-06-14

was wondering can this be done with a gamecube controller

About This Instructable




More by timeblade0:Gamecube Controller to WiimoteUSB SNES Controller
Add instructable to: