Hello and welcome to the thread!
Why build a custom controller?Because it's awesome. But besides that totally valid point, it could be because you need a very specific set of buttons, axes, pedals or joysticks for your poison of choice. Maybe you want a new screen for more info while Sim Racing? Maybe you need extra buttons to deliver the pain and manage shields in your space ship? Maybe you just want to kick ass with an arcade stick that reminds you of the arcade by your house back in the 80's.
If you give it a go, you can end up with something awesome.
How do you build such a thing?
Well, there's two parts to this story: the electronics (the insides) and the box/hardware (the outsides.)
The electronics can vary a lot depending on what you want to achieve. If you're leaning towards only PC functionality, Arduino and Arduino-Compatibles are popular and rather cheap options if you select them appropriately. There's plenty of libraries for USB input devices, the Adafruit add-on shields, and plenty of cool sensors to toy around with to make some interesting controls (maybe an entirely proximity-sensing based controller?)
Examples of Arduino projects:
Another choice (though rather overpowered as a controller) could be the RaspberryPi. As I said, this could be rather too much power for a simple controller, but there are other projects that work, such as
an actual (mini) arcade.
Padhacking
Padhacking is (almost) the only option if you want to go the console route. This basically means taking a gamepad for your favorite console, opening it up, and rewiring the insides with whatever you happen to have in mind (most likely: a fighting stick.) This is not the only way, though. Several vendors in well known sites (that also sell the buttons and joysticks for fightsticks) carry some PCBs which can do console gaming, sometimes even multiple kinds of consoles with the flip of a switch. Another advantage is that such PCBs tend to be more "user friendly" and don't require soldering.
Slagcoin is pretty much the de-facto guide when it comes to fight sticks. We also had
our very own thread on the subject, by Daedalus, at one point.
The outsides
If you're aiming for a fight stick, chances are you've already eyes some parts for it: names like Sanwa and Seimitsu thrown around, button sizes, ball-tops or bat-tops, it starts to boil down to personal preferences. In this case I turn again to
Slagcoin for more experienced descriptions of their attributes.
If you're looking something less fighty, normal electronic buttons, switches, potentiometers and hat-switches are for you. Chances are you're going to need to solder some stuff, but even then
there's ways out of that. :P
Once you've decided on your buttons and what not, you'll need somewhere to place them. Now here is where you can get all creative building your box out of wood or lexan, maybe 3D printing a custom fit design of your choosing, or just outright ordering the box itself (chances are you can find all sort of made to order boxes for your fight sticks.) For smaller projects, maybe you'll do with a small plastic project box (which are rather cheap) to house all of your work.
What's next, then?
I created this thread because I just (almost) finished my very own project. I learned a lot while making it, including making a custom USB Report Descriptor (which is a bit of a headache, but unless you want everything to line up perfectly, you don't need this one and can find and use a generic one in a guide.) to report the proper amount of buttons/axes and name of my device. I wanted to share it in more detail (maybe it'll help someone have an easier time figuring it all out,) but I also wanted a place to get together and help each-other in possible projects like this, but not just limited to fight sticks because there are some awesome stuff and ideas out there.
Also because I kinda liked this first button-box I built, and I think I want to build my very own fight stick, so this place could work for getting some input in that project.
Posts
I got heavily into sim-racing these past couple of years and it's been a blast so far. Studying the cars, the racing skillset and learning tracks. Now, as you progress through series, you'll find that you can tune more and more things in your car, and sometimes you'll have the option to do so in the middle of a race.
I'm currently using a Logitech G29, which is a nice wheel with a set of buttons and a shifter. Now, the thing is, after a while you'll start running out of buttons :P Look left, right, brake balance forward/backward, overtake button, DRS, voice-chat, wipers, flash lights, selection of pit options... you get the idea.
So I needed a small button box to keep of the less needed but still important buttons. (That, and I wanted a small, quick project because yeah.)
Materials
Plastic Project Box (191mm*110mm*57mm):
Found a good and cheap Hammond brand one, not hard to work with. Good enough size, too.
Arduino:
At first I wanted to do this with an Arduino Leonardo because it already comes with the required USB libraries loaded making life much easier for that. Then I learned about Teensy, which is an Arduino-Compatible board that is both tiny and cheaper than a full fledged Arduino. For just reading inputs and sending packets through USB it's more than enough. Since this was a simple design, I opted for the Teensy-LC version (LC as in Low-Cost.)
Buttons and stuff:
The Plan:
The idea at this point was to have the masked toggle switch for things handled with care, like the starter of the car or the tow function (when you crash, hold for tow back to the pits.) The normal switches for more normal things like lights and wipers and the buttons for chat warning messages, pit-stop options and the like. The potentiometers would work as dials for brake balance, differential settings, etc.
The Process:
Now if you're smart, you'll first plan out the layout of your buttons and switches, draw them over your box (or print a drawing and paste it) and then use a drill or dremel to cut those holes easily.
I'm not that smart.
More precisely, I lacked a dremel or a proper drill that could do those holes, so I went with the brutish approach of cutting with an Xacto and filing down until it was round-ish and the component fit through. This worked, but I'm not doing that ever again and will invest in a proper dremel once I'm able. :P
Next came using the vinyl wrap on the faceplate of the box. This was much easier than I ever expected and ended up looking rather nicely. After that was done, I installed the components properly in the faceplate. These only required the nuts they come with to fix them in their final position.
The Programming Interlude:
Now was the perfect time to get the Teensy working before the final soldering step. I based my final solution on this guide, though it required some modifications including the Report Descriptor bit mentioned earlier. That one's a bit of a pain because even the official tools provided suck a bit.
My personal recommendation is this: take a report descriptor that has more or less the things you want, edit it to fit your needs and use that. Just make sure everything is byte-aligned (read: multiples of 8) because USB packets are sent that way. For example, if you have 6 buttons, only enable button 1 through 6, but make sure the report is of size 8, otherwise it won't work and you won't have any idea why it doesn't work. This is a rather good guide on the subject.
The actual program that checks for the buttons being pressed is absurdly easy in comparison.
It took me a couple of days to get everything going right here mostly due to the USB things, but in the end it worked perfectly: 8 buttons and 2 axes being reported to windows perfectly.
The Return of the Soldering:
Once the Teensy was working, it was time to solder the wires. Since it's all common ground, that's what I did first: chain all the switches and buttons' grounds together. Once that was done, it was a simple (read: "simple" -- damn, did I burn myself stupidly,) matter of soldering the other end of the switches to the corresponding input in the Teensy. Once everything was in place, I did a hole for the USB cable on the back side (I did borrow a dremel for this one... holy shit, it's awesome.)
Trials:
These are just test runs of it working. You can see the LED light up when the masked switch is activated, and you can't quite see it, but both iRacing and Assetto Corsa had no trouble identifying the device and letting me assign functions to it.
Final Steps:
I'm trying to find a way to install a table clamp on it because I can't just drill it down to my normal desk. I would appreciate any input on the matter, too. Right now I'm leaning towards adapting a couple of these for it.
So that's it so far with my Button Box. If any of you brave people want to give it a go on an Arduino-based project, I'd be happy to help if you get stuck.