Full credit for the general idea goes to this howto for a similar project with an NES controller. My brother inherited my NES from me, so all I had to work with was an SNES controller... and since it lets me play a wider variety of games it seemed like a perfect thing to do. The project ended up being a bit more difficult than I expected, and I tried to document as much of the process as I could.
Soldering/desoldering work is required for this, and I'm assuming you have some general knowledge of working with a soldering iron and continuity tester. I'm a software/networking person, though, and not an expert with a soldering iron by any means. A steady hand and a lot of patience can be a big help.
This is my first instructable, suggestions are definitely welcome. I apologize in advance for some horribly bland photography.
Step 1: Collecting Parts
I'd suggest taking a look at the next step (with the controller apart) before getting any parts.
Once you have parts that you know will work, considering getting a backup set in case you mangle something. Naturally, the only part I did not get a spare for (the keyboard) was the only one I ended up breaking in the process.
1 x SNES controller - I used an old one lying around from my younger years.
1 x USB hub - I found a tiny four-port hub that even had a clear casing so I could see the shape/size of the board inside. Roughly $12.
1 x USB keyboard - I used an "Alaska" keyboard. $12 from the local computer store. This is a bit harder than the hub, since there's no way to tell what the inside components look like. The cheaper the better, since you may end up needing to try a different model.
1 x thumb drive - a 4G Sandisk Cruzer I had lying around since I upgraded to an 8G drive recently
soldering iron - a cheap one from Radio Shack worked for me. Check the wattage, you want the cooler ones for electronics work... but you can make do with a hotter one if you're careful.
solder - basic rosin-core electronics solder
multimeter - A simple continuity tester will work, I just used it to check for shorts.
dremel - I did need to modify some of the circuit boards. There's a lot of possible substitutes for this, but you'll need something you can make precise cuts with.
A note about SNES controllers: when I started this project I had only one old controller that I got with my original console, so I ordered two online to use as spares. When they arrived, I noticed that the area around the buttons was greenish (almost a pale lime green) and the "Super Nintendo" logo was different, so I set them aside as last-ditch spares. Towards the end of the project I pulled one of these spares apart to test something and found out that they were a completely different design, with the controller board pushed almost flush with the backside of the controller rather than close to the front (among other changes). This would have made it impossible to use the layout method I used, so be sure to check the controller insides and plan your parts accordingly!
Step 2: Initial Controller Work
Take a while to get a good look at how the controller fits together, and where the empty space is. This is all you have to work with (unless you drastically modify the controller board), so get familiar with the spaces that form when you put the controller board in place against the back or front of the controller. If you'll be using different parts, this is where you get an idea of how large they can be and how you might fit them in.
In my case, the controller board sits fairly flush with the buttons on the front, and there are plastic posts and platforms on the back that push the board up and form the space I'll work with. Aside from a few posts in the center there is a nice rectangular space between the two round platforms that support the d-pad and buttons.
Once I had my parts and had figured out a possible layout for them, I removed several of those posts in the middle of the controller with my dremel and flattened out the rounded bump in the center.
Step 3: USB Hub
Taking the hub apart:
The case of the hub I used was held together with a single screw, the case lifted apart to reveal a single board.
I then carefully removed the USB connectors. They're hard to remove because of the soldered tabs on either side, when I tried to heat those tabs up while lifting up on the connector the whole pad underneath the tab delaminated from the board and broke off. After that, it was just a matter of either desoldering the connector's pins from the board or snapping them off, I recommend keeping the pins on at least one connector so you can use it in later steps to map the pinout of your usb cables.
If you snap pins off, you can clean the remaining bit off the board by lightly dragging the soldering iron tip with a small blob of solder along the length of the pad, the pin should come off on the iron. It's a good idea to do this on the rest of the pads as well to clean them up and make a nice, shiny pad for later soldering.
In order to make the hub fit into the controller I opted for a diagonal placement, but this put one end into the bottom of the controller with much less empty space. To deal with this I carefully desoldered the two capacitors on that end and soldered them to short lengths of wire so they could be repositioned (taking care to keep the pins connected the same way they were on the board). I also desoldered the LED and connected it to a length of wire since it stood much higher than the other components. The capacitors had very small leads on them, I had to be extremely careful when soldering the wire on to make sure it had a good connection and that stray strands of wire wouldn't cause a short.
Finally, to fit the board in diagonally on the controller I had to trim off one corner of the board (being very careful not to cut through circuitry on the reverse side). I could have taken off a good portion of the end of the board, but this was actually my first attempt at using a dremel so I kept modifications simple.
Step 4: Keyboard Controller
Taking the keyboard apart:
The keyboard was held together with a lot of tiny screws in the back, including one hidden behind a quality control sticker. Once all the screws are removed the back lifts easily off.
Inside the keyboard is a little circuit board, and a sandwich of two transparent plastic sheets with printed circuitry on them. The pressure from the buttons in front completes a circuit between the two sheets, and the pair of contacts that this connects together on the circuit board tells the controller which button was pushed.
You'll want to map out the circuitry for the buttons you want to use and make notes of the contacts on the circuit board that they match up to. Alternatively you can get a keyboard mapping software and see what keys are pressed as you short each of the contacts that connect to one of the plastic sheets to each of the contacts that connects to the other sheet, but that can sometimes give confusing results.
I labeled the contacts on my controller as A through Z because there were 27 of them, and mapped out the contacts I wanted. Once I was sure of the contacts, I carefully scraped the black coating off the (nice, thick, easy-to-solder) contacts and put beads of solder on each contact.
I desoldered the LEDs from the controller and removed them completely. In order to fit this into the controller case I cut off the end of the board with the last two contacts (y and z) and angled the corner at the top of the controller, this let it fit in perfectly on top of the hub. The side at the top of the case just barely fit flush with the support platform on the right-hand side of the case, inside the space allowed by the SNES controller board. I had to carefully push the capacitors on the top of the keyboard controller to angle them outwards and clear the USB hub.
Finally, I connected one of the USB hub's connectors to the keyboard controller's usb cable, and using the multimeter mapped out which pins of the keyboard controller connected to which pins on the connector. I then removed the cable and soldered a short piece of ribbon cable between the keyboard controller and the first port on the hub, matching with the pins that the usb connector would have been connected to.
The key mapping I used was:
arrowu = h + v
arrowl = h + x
arrowd = k + x
arrowr = j + x
enter (start) = h + u
'/' (select) = b + v
'z' (B) = a + w
'x' (A) = b + w
'a' (Y) = a + u
's' (X) = b + u
'c' (R) = c + w
'd' (L) = c + u
There's a small problem with the "select" mapping. On Windows systems, this shows up as a '/', but on Linux it shows up as '<'... and on a Mac it showed up as ' §' (a section symbol). I may have mis-mapped this one. It doesn't seem to cause any problems on Windows, at least.
Step 5: Connecting the Buttons
Modifying the SNES controller:
I tried to keep the controller board as unmodified as possible, so this is just a matter of cleaning off traces that you want to solder to and cutting traces that you do not want connected together. Make a map of the traces, and try to find points close to the outside edges that can be used to connect the buttons to the correct keyboard connectors. Make sure you have everything laid out before you cut any traces, once you cut these it's possible to repair but not easy.
When you start cutting traces, make sure to cut any connection between the buttons and the chip at the top of the board. Otherwise you'll end up with weird issues where one button press can fire off multiple buttons because a circuit gets completed through the chip. It would be a good idea to remove the chip altogether but I didn't have a soldering tip for this and couldn't find another good way to do it.
I removed the socket for the original controller cable in order to give some additional room for everything else.
I used a short piece of ribbon cable to make the final connections. The idea is for it to be just long enough for the controller board to go in the front of the controller while the hub and keyboard controller are put in place in the back, and then the whole thing is carefully clamshelled together with the connecting cable short enough to curve and not get in the way.
While making connections I stopped at several points (after connecting pairs of wires) to test the buttons that should be enabled. This will prevent you from getting everything connected up before realizing there is a problem. One of the rubber button pieces from the shoulder buttons worked to complete the button connections for testing.
If you get this all together and all the buttons work, you could stop there and have a working USB controller. This would have been a MUCH simpler instructable if I'd left out the hub and stopped here. But since we went through the trouble of putting the hub in there, we may as well add a drive..
Step 6: Flash Drive
Opening the drive:
The drive I used was a simple plastic casing with a row of tabs along the sides on one half of the case, and a long segmented slot for the tabs on the other half. I got a small screwdriver between the halves and carefully levered them open. Since I wasn't going to do anything with the case afterwards I wasn't concerned when I broke a bit of the slot while opening it.
Modifying the drive:
With the drive naked, the first thing to do is plug it into one of the hub's connectors and map out the pins. On mine, the pins went straight through, which made the connection very easy.. since I was putting the drive on the opposite side of the hub from where the connectors normally would be I had to put it upside down, but otherwise the connection was straightforward.
Removing the USB connector from the drive was rather more difficult. After several unsuccessful attempts to desolder the tabs on the sides, I finally went for a brute force method. With a dremel I very carefully cut away the metal tab right at the board, and then snapped off the connector pins. After cleaning the solder pads, I then connected this to the hub with a short piece of ribbon cable.
Step 7: Final Steps
The cable on the hub was silver, which doesn't look at all like the SNES cable. To fix this, I used the nice black cable from the keyboard controller. I mapped out the wires on both cables using one of the connectors from the hub, and then removed the hub's cable and soldered the keyboard's cable in its place.
Since I already had the hub's LED fed to a long piece of wire, I decided to put it on the front of the controller. I don't have a drill press or anything similar I could use as a replacement, so I ended up very carefully using the dremel to drill out progressively larger holes until the LED fit. I ended up stopping at a size smaller than the LED and carefully pulling the bit around in a circle to widen the hole, so I wouldn't be left trying to prevent a larger bit from making an even larger and misshapen hole.
I put a drop of hot glue on the repositioned capacitors for the USB hub to prevent them from shorting out, and some clear nail polish in the cut traces on the controller board to guard against anything causing them to short together.
Putting it all together:
It may help to grow an extra hand to finish this last step, please check other instructables for that howto. Every time I thought I had everything held together, something else slipped out of place. You have hopefully been doing test-fits up to this point, so you know everything fits into place with no wires pinched and no squeezing.
The buttons and power LED all need to go into the front of the controller, followed by the controller board. You need to keep this part of the controller as flat as possible, as the shoulder buttons are prone to slipping out of place and falling out at the worst possible moments.
The hub goes into place in the back, and the keyboard controller and flash drive follow. You will probably need to hold the two pieces in a 'V' shape to put the keyboard controller in place. Make sure to also route the USB cable around the shoulder button hinge and out the top of the controller.
Once everything looks like it is in place, you can bring the back of the controller parallel to the front and slowly fit them together. The hinges for the shoulder buttons and the posts that sit behind the small shoulder button circuit boards were the biggest source of trouble for me, getting them lined up while keeping the hub and keyboard controller pressed against the back was a challenge. Make sure not to force it, if you feel hard resistance back off and try to figure out where it is coming from before proceeding.
Whatever you do, don't rush it. It took about an hour of fiddling with this before it all came together for me.
I apologize that I don't have more explanatory pictures of this part, but this would probably have required growing a fourth hand as well.
Step 8: Possible Improvements
It would have been nice to find a smaller USB hub board, although it might be tricky to find one with the right dimensions. I also could have cut more off the end of the board I had, though it wouldn't have made much difference in the final assembly.
I've also seen mention of being able to wire two usb devices together as a "passive hub", but haven't found any information on doing it. If it's possible, it would allow the hub to be left out altogether and a lot of space would be saved.
Ditto on finding a smaller one. It would also be possible to cut off a strip from the bottom of the connectors to shrink it, and depending on how brave one is with the soldering iron it could be cut all the way down to the white line leaving only the thin traces to connect to. There might be a danger of connections snapping off from tension when putting the controller together if you went to the extreme with that, however.
It would definitely be possible to make more changes to the controller board. Removing the chip from the upper part of the board would be a big start, and could even be used to give a connection point (albeit a small, tough-to-solder one) for each button and cut down on the need to spiderweb connections across the board.
Going a little more extreme, it's easy to imagine cutting an entire rectangle out of the top of the board, removing the chip area completely and giving a lot more vertical breathing room for parts to fit in. This would make for a lot more smaller traces to solder, however, and you would need to be careful how much of the board was removed above the select and start buttons.
It's interesting to consider putting the drive access LED for the flash drive in the front of the controller rather than just the hub's power indicator. This would probably be rather tricky to do, however.