Introduction: Arduino Arcade Stick Controller

Hello, my name is Lucas, and this is an arcade stick video game controller I made to use in my dorm. This controller was originally designed for arcade fighting games, like Street Fighter and Guilty Gear, for which this type of controller provides more control, but also functions with most other computer games and theoretically should work with consoles. It also seemed like an interesting project to try out, especially since most commercial models of similar controllers start around $50-$60 and can run into the hundreds, despite being mechanically equivalent to a keyboard with a control stick attached.

Supplies

General Supplies:

  • 3D printer/filament or wood/CNC mill
  • 1/8" acrylic sheet
  • Laser cutter
  • 1/4"-20 screws
  • 1/4"-20 heat inserts
  • M5 screws
  • M5 nuts
  • spray paint (optional)

The wood or 3D printer depends on how you would like to manufacture the body of the stick, for this version I used 3D printing, but I plan to later replace it with a wood frame.

Electronic components:

  • Arduino Uno R3
  • Solderless Breadboard
  • 20 gauge wire
  • electrical tape
  • Soldering Iron
  • Usb-a/Usb-a Female/Female panel mount
  • Usb-b/Usb-a Arduino cable

Arcade-Specific supplies:

  • Seimitsu LS-56 (or your preferred model)
  • 8x 24mm arcade screw buttons
  • 2x 30mm arcade screw buttons

Most of these arcade components are replaceable, and I chose them purely based on personal preference. There are many places online to buy specific arcade components, I typically use Focus Attack.

Step 1: Sizing and Original Concept

The first thing I did for this project was planning out a rough concept of my design. I chose to use dimensions around 8x15x2 without the stick and buttons, which would be big enough to use comfortably but also small enough to store. The generic rectangular shape also is easier to handle and hold. Using a quick CAD model, like the one above, also allowed me to refine some aspects of the visual design, such as the corner fillets and the countersunk faceplate, prior to any actual manufacturing.

Step 2: Component Choice

I decided to go with 24 mm normal buttons (like the ABXY on normal controllers) over 30mm buttons to better fit the size of my hands and the slightly smaller than average arcade stick and 30mm auxilary buttons (start/select buttons) to visually differentiate the two types. I was able to test the buttons using the setup above (left) and some basic aruino code (Button_test) to find my ideal push weight and button type before I settled on a type that I liked. I used screw buttons specifically for this setup because they work better with a flat faceplate like the acrylic I used.

To select a Joystick, I did some research on online forums to find a stick that I would like. Once I had obtained it, I was able to also test it using some arduino code(Test_jig_arduino).

For more info about the wriing for these, check out the "Wiring" section.

Step 3: Designing a Faceplate

With the components chosen, I went to better define and flesh out how the buttons and joystick would be laid out on the controller. By taking some basic hand measurements in different positions, I designed a layout (the autodesk sketch) that would work well for my hands and allow me to use more of my fingers than the tradiitonal button layout of this type of controller. The inner arc of three buttons matches the natural arc on my index, middle, and ring fingers, and the inner bottom button falls just under my thumb. The outer set can then be easily reached by stretching my hand out and a bit forward.

I also consulted the technical drawings and CAD models availible of these components in the assembly to place screwholes and double check dimensions to ensure everthing fit well. I often ended up having to use similar parts in much of the assembly, but It was still valuable for giving a general sense of how the parts were laid out.

The bottom plate was much simpler to design, just a flat piece with screwholes to attach to the enclosure.

With the design finished, I laser cut the designs out of 1/8" acrylic sheet by exporting an empty sketch of the surface as a DXF file. Afterwards, I spray painted them to my desired color scheme and all of the buttons and the joystick were screwed onto the panel.

Step 4: Designing the Enclosure

When designing the enclosure, the most important thing was how it fit with the other pieces of the build. It had to support the edges of the faceplate while still providing enough space for all the internals, placing all the parts in an assembly helped me space everything out. I largely kept the design the same but added a cable port hole and holes to put inserts in.

When producing the enclosure there were 2 possible routes I decided between:

The first was making the enclosure out of wood. To do this I attempted to utilize a CNC mill to cut the parts to their exact dimensions. I did this in the "maunfacture" tab of Fusion 360 (there's something other than design?!), where you can assign the machine properties and tool specifications to then tell the machine the physical instructions of how to mill out your part. Unfortunately, the mill was having issues while I was attempting to machine out the pieces, and I decided to find other alternatives. It's definitely something I will return to when I have the time.

The option I ended up going with was instead 3D printing the enclosure, which I was able to print in one go using the dovetail feature in prusaslicer. I then slotted the components together along the lines. To ensure the screws could screw into the enclosure, I used heat inserts, which can be pressed into the print using a soldering iron to put solid threads that machine screws are then able to screw into without worry about damaging or wearing on the plastic.

Step 5: Wiring

All of the buttons came with small connector tabs, which I soldered to 20 gauge wire and was then able to connect to the breadboard that connects to all the Arduino pins. The buttons all indivdually connect to a port and to ground, which lets the arduino read a signal whenever the button is pushed and the circuit is closed.

Wiring the joystick required a bit of testing as I wasn't sure exactly what wires lined up to what directional input but the diagram above helped, as well as the joystick test code linked in the component step. Functionally, the joystick is four push buttons all pointed at each other in a square, and their wiring is similar, connected to a port and ground.

The particulars of what button and port only really matter for the joystick, as many games will have a way to reassign and remap controller buttons to new inputs. Steam in particular is pretty good at this and will allow you to use custom layouts in all games regardless of what you assign to the ports in the code.

To then connect the arduino to the computer, I use the normal arduino cable, connected to the usb-a/usb-a female cable, connected to my computer, or sometimes just the normal Arduino cable if I'm feeling lazy.

Step 6: Coding

This controller is coded using Unojoy, a software program that allows you to turn an arduino, which typically is more difficult to recognize as a controller, into the equivalent of a ps3 remote. To use it, I uploaded a code into the arduino telling it all of the ports, then ran a program and shorted a couple pins to "flash" the arduino into controller mode. Below is my attached code and the library for the UnoJoy project.

For a more in-depth guide on how to use UnoJoy, I would recommend checking out this video, with instructions and demonstrations of how to convert your Arduino, and this website, which has similar instructions as well as sample files and all of the software you need to code and convert your Arduino.

Step 7: Assemble

With all these individual steps done, the controller is now complete and ready to use! If you would like you can add anything you want from stickers to a whole extra controller set onto the design. One of my favorite things about making an arcade contorller like this is the amount of freedom you have in how you choose to make your parts. If you got this far, thank you for making it to the end and I hope you found this explanation of my process helpful. Happy Gaming!

Arcade Student Design Challenge

Runner Up in the
Arcade Student Design Challenge