Back in 2011 I was wanting to build a custom PCB for a Arcade Fight Stick. I could have easily ordered a Toodles Cthulhu Multi-Console PCB (or similar), hacked up an old wired Playstation controller, or purchased a commercial fight stick to satisfy my fight stick cravings. Instead, I chose to build my own fight stick; citing my desire to learn more about USB HID classes and design my first PCB as major motivators.
Initial work began on a PICDEM Full Speed USB Demo Board I had on hand. This is a great little board to learn USB on. I began by coding a few buttons at first and making sure things enumerated correctly. After that, I ordered the piece parts for the arcade stick. A crude cardboard mock up allowed me to further test my code and understanding of the wiring.
Once I had a solid understanding of my project on the demo board, I decided to take to implementing a custom PCB using the PIC18F4550. There is an abundance of reference documentation for the PIC18F4550 so the hardware design was relatively easy. My only challenge was the PCB layout. Prior to this project, I had never done CAD work so it was a great learning opportunity. I used Eagle CAD. I chose to use 4.7 kOhm pullup resistors for each input, provisioned for an LED power-on indicator, added a dedicated programming port, and screw type terminal blocks for the wire to board interface.
Once I had the PCB designed, I sent it off to be made at the now defunct BatchPCB. For $22.65, I ended up getting 4 boards. I thought this was a great deal and was much easier than making my etching my own PCB.
With the new PCB in, I had to up the enclosure. Since the end game was a fight stick I decided to go ahead with a crude prototype. I broke out my miter saw, drill, and wood glue to develop a custom case to house the components. I would eventually like to do a better wood working job but my tooling is rather lacking for any more advanced stuff. I found that this was a good enough case for testing and eventually playing on.
The end result is a custom fight stick. It plays very well with old and new games. Some games don't play nicely with the USB Joystick HID. In those instances, you can map the joystick to keyboard keys a 3rd party application such as rejoystick. I also have an alternate program load that enumerates the device as a Keyboard HID instead. This just requires a quick flash of the microcontroller.