Simulation Steering Wheel Controller
by prawnsoup in Workshop > 3D Printing
1315 Views, 20 Favorites, 0 Comments
Simulation Steering Wheel Controller
I grew up playing Mario Kart Wii and fell in love with racing games when I was a kid. When I graduated to playing the arcade version I wanted a steering wheel to use at home that included all the improvements and functionality that I could ever want. So, I decided why not build one myself! This steering wheel works with any racing game because you can rebind the controls to whatever you want, even emulating keyboard and mouse inputs.
My name is Pranshu Agnihotri, and I'm a senior at Irvington High School. I built this project with the help of Ms. Berbawy of Berbawy Makers as my SIDE Project in Principles of Engineering. I hope you enjoy the process, and maybe even build your own!
Supplies
Materials:
- Arduino Leonardo
- Micro-USB to USB-A Cable
- 50K Ohm Potentiometer
- Limit Switches (I harvested small ones off an old Ender 3)
- M8x1.25 150mm Threaded Rod
- M5x0.8 35mm Screws (x6)
- M5x0.8 Nuts (x6)
- Epoxy / Glue
- Assorted Jumper Wires
- Neodymium Magnets (any size will work, these are the ones I used)
- Any generic 608 Ball Bearings (x2)
Tools:
- 3D Printer
- Laser Cutter
- Soldering Iron + Solder
- Tip Tinner, Sponge (Recommended)
Design the Wheel
First, I brainstormed some ideas in my engineering notebook. My Engineering Notebook was incredibly helpful for this project, keeping me organized. It was essential for my success, and helped me brainstorm ideas and troubleshoot while documenting the whole process!
For modeling the wheel, everything was done in Autodesk Fusion (360), with Adobe Illustrator being pretty helpful for laser-cutting the main base for the wheel.
Steering Wheel Parts (That I Modeled and Printed):
Steering Wheel Grips
Steering Wheel Body (I laser cut this from 1/4" acrylic for rigidity and stability, but you could 3D print it if that's all you have on hand)
Paddle shifters*
Paddle shifter "hub"*
Threaded Rod Stands
Potentiometer stand
Potentiometer to Threaded Rod Adapter
Base + Clips to attach to table
Arduino Leonardo Case (modified this amazing design to make it mount easier onto the back stand, as well as adding some text)
*For the Paddle Shifters (SEE LAST IMAGE) cross-section, one side shown:
- The magnets go into the two circular slots (one in the paddle, one in the hub)
- The limit switch goes into the L-shaped gap on the left
- There's a hinge modeled into the parts, so that when the paddle swivels on the hinge, it activates the limit switch, and the attraction of the magnets pull it back into place, deactivating the limit switch.
- For the purposes of this project, we will only be using the "Common" (C) and "Normally Open" (NO) pins, so we can use it like a button (see a limit switch pinout if you're confused)
Printing and Assembling
Printing
I printed most of the parts out of Prusament PLA. The grips were printed out of Flexible 80A Formlabs SLA Resin on a Formlabs Form 3 (you can use TPU for a more squishy feel or just regular PLA on an FDM printer works just fine if you don't have it or just want rigid handles).
The body of the steering wheel is laser cut from 1/4" smoky black acrylic, and the table clips* and paddle shifter hubs were printed out of Onyx (on a Markforged Onyx Pro) just for strength and rigidity, but PETG or even PLA would likely work just as well with tuned parts for a high-enough strength.
The paddle shifter hub itself is friction-fit together, with the screws for rigidity and modularity, and the handles are epoxied onto the main body.
*You can design the table clips to fit any table you want, or even 3D print / use a c-clamp so it fits any width of table!
Assembly
- Put the magnets and limit switches into their slots in the hub, and put the hub together with the paddles, completing the paddle shifters assembly.
- Glue the handles onto the wheel body, completing the wheel body.
- Attach the assembled wheel to the assembled hub, which screws into the threaded rod.
- Put the threaded rod through the bearings and stands, and the stands into the base.
- Glue the clips onto the base, and the potentiometer into its mount, attaching the potentiometer assembly to the rest with the adapter.
- Put the Arduino into the case, and epoxy the case to the back of the potentiometer mount.
- Done!
Wiring and Soldering
Using the attached wiring diagram**, solder and wire the limit switches and potentiometer to the right pins:
- Potentiometer to power (3.3V), GND, and any analog input pin
- One terminal of each limit switch to a unique digital input pin
- The common terminal of each limit switch both connected to the same digital input pin
Make sure the wires for the limit switches are long enough to reach the Arduino and still have sufficient room for the wheel to turn without the wires snagging on anything.
**The software used to make this diagram didn't have an Arduino Leonardo or limit switches, so substitute each accordingly :)
Programming
To program the Arduino to recognize our inputs and bind them as a USB controller, I used a personal DIY software called MMJoy2. There are many alternatives, like FreeJoy or Arduino Joystick Library, but I decided to use MMJoy2 for simplicity and compatibility with my project.
Using the incredibly helpful wiki and pinout diagram (see pics), you can program the potentiometer and limit switches to exactly what you want!
Connect the Arduino to your computer using a USB cable, and install the firmware following the wiki's instructions.
The wiki makes all of this relatively easy to follow, but a couple of tips that may help:
- Use IntSensor (Internal Sensor), and set the MCU port as the port the potentiometer's analog input is plugged into.
- If you're having an issue with the potentiometer giving strange, inverted inputs, change the precision (bit) to 10 (apparently a bug with the software).
- Auto w/ center calibration is the easiest to use, just make sure you turn the wheel all the way to either side to calibrate it on startup.
- DZ stands for deadzone, not necessary for our project
- For the buttons, either shift register works, and create a button matrix using whichever pins your buttons are plugged into
- We have two rows and one column, which makes a 1x2 matrix!
- The "Mode" makes it so that you can use the button as a switch or toggle, and "Timer" is for delays.
- "Save sets to device" when you're done :)
The last two images are the exact setup I used, so if you've wired everything in the same ports I have and assembled everything in the same way, you should have a similar setup on MMJoy!
Done!
If you've set everything up correctly and bounded the button inputs correctly in whatever game software you choose (your computer will now recognize the Arduino as a USB game controller of whatever name you set it to).
For Mario Kart Wii, I use Dolphin Emulator on my laptop, which makes it incredibly easy to bind each button to an input that the game can recognize!
Have fun racing!