How to Build the PinSim Virtual Reality Pinball Machine

By Jeremy Williams

Jeremy Williams' build guide for his PinSim VR pinball cabinet!

The PinSim cabinet is essentially the first eight inches of a real pinball table. I designed it to play VR pinball games, but it works just as well as an interface for traditional flat screen pinball games. The following instructions will help you make one of your own. I'll cover the most basic build first and then look at a few optional upgrades.

The electronics are based on Teensy LC and employ the incredible MSF-XINPUT library by Zachery Littell. This new library fools the computer into thinking the Teensy LC is an Xbox 360 gamepad, thus minimizing latency and maximizing compatibility. It even supports force feedback rumble! Zack spent time improving his library to assist with this project, so major thanks to him.

There are many possibilities for cabinet material. My original cabinet was cut from foam core but wood will provide a more lasting frame. Just make sure to consider the material thickness before cutting the sides of the cabinet. The graphics below illustrate the exterior dimensions and hole placements, but the diameter of the drill holes will depend on the buttons you choose to use.

Let's start with the parts you'll need.


Parts Notes

PCB: You can use a Large Breadboard but I strongly recommend picking up the PCB I designed from OSH Park to simplify the wiring. They come in sets of three, so you can share a set with friends or just keep the spares.

Teensy LC: While Teensy LC is pin-compatible with the more expensive Teensy 3.2, I recommend using Teensy LC due to the support for 20mA current on a few pins that I use for lighting optional LEDs. You can buy a pre-flashed Teensy LC from me at the link above.

Joystick: This is used to conveniently navigate game menus, but you could use a gamepad instead. If you do include a joystick, just mount it according to its mounting plate wherever you think it fits best.

Accelerometer: The accelerometer is used to simulate nudging the table. Make sure to mount the PCB in the precise orientation and position indicated below for the most accurate readings.

Cabinet Build Instructions

Cut your cabinet sides based on the dimensions below and drill holes for your buttons, joystick, and legs, centering where indicated. The holes for the leg bolts can be a little tricky, especially with wood, because they enter at the corners at 45 degree angles. I recommend drilling these from the inside out.

Cabinet Dimensions
Front of the Cabinet
Sides of the Cabinet
Back of the Cabinet

Wiring Up the Controls

Mount the PCB/Breadboard on the underside of the top panel so that the accelerometer is horizontally center and the text "ADXL 345 Digital Accelerometer" is facing the player. This probably means that the PinSim PCB is mounted between the joystick and the front edge of the cabinet like in the photo below.

Wire everything up according to this image if you're using a breadboard or just use the labeled terminals if you're using my PCB. Note that all components can share a common ground wire. The joystick pinout can be found here.

IMPORTANT: If you're not installing a plunger, connect the "PLUNGE" terminal on the PCB (Teensy pin 15) to GND. This will disable the plunger. Failing to do so will leave the pin "floating," causing the virtual analog stick to move unintentionally.

If you didn't buy a Teensy LC from me, which comes with firmware already installed, download the compiled firmware and flash your board using the Teensyloader application. You're welcome to compile the firmware yourself but the XInput library does require some Teensyduino files to be overwritten. You can find instructions on GitHub.

You're done! Plug in the Teensy LC using a USB micro cable and it will power up. You can test the PinSim by launching the Windows USB Game Controllers app from the Control Panel.

PinSim Cabinet compared to a Pinball Cabinet

PinSim Upgrades

LED Light

Let's put the light inside the Start button on the front of the cabinet to use. If you connect it to the LED-1 terminal on my PCB (or pin 16 on a Teensy LC), it will blink when powered up. It actually flashes between 1-4 times, mirroring the 4 LEDs around the Xbox logo on a real gamepad. This is a useful indicator since game software often requires controller #1.

Replace the 555 light bulb inside the Start button with a white LED and wire it up (just make sure to run it through a 22 Ohm resistor like it does on my PCB). If you have a 3D printer, you can print my 555 bulb holder.

You can do the same for the bulb inside the Launch Ball button and connect that to LED-2. It will remain steady on.

Rumble Feedback

You want force feedback, right? You'll need to buy some spare Xbox rumble motors from eBay but they usually run less than $10/pair shipped. If you have a 3D printer, you can also print a couple of my handy mounts.

Wiring the previous two upgrades is pretty straight forwarding using my PinSim PCB, but here is the breadboard wiring if you need it.

Arcade Buttons

You don't have to stop at flippers. Especially if you have the joystick installed, why not add more buttons and use PinSim as a potential upright arcade controller too? Just drill more holes beside the joystick and connect them to the labeled terminals on the PinSim PCB. For the breadboard crowd, the Teensy LC pinout is as follows.


What about a real pinball shooter? I have to warn you, this is a lot of extra work for minimal payoff. The plunge is important for hitting skill shots, but not much else. That said, it does complete the look of the cabinet and you need a plunger for certain Pinball Arcade tables (flat screen, not VR… yet!). For simplicity I'm going to assume you have access to a 3D printer for mounting the sensor hardware.

Here are the additional parts required:

The cabinet hole for a plunger is huge and triangular shaped. And while we can place the plunger at the proper height, we need to fudge authenticity a little and move it an inch to the left in order to leave room for our digital sensor gear later on. Use the following pictures to cut your cabinet hole.

Fire up your 3D printer and print the mount for the distance holder.

Then print the plunger disc that attaches to the shooter rod and reflects the IR signal back to the sensor. Just remove the rubber tip from the plunger, slide on the disc, and replace the rubber tip.

Connect the JST cable to the sensor jack and assemble the mount. Attach the assembled sensor just above the plunger with the wires facing up. The thin, angled plastic mount component should go between the mount and the cabinet, tilting the sensor slightly downward so it points toward the plastic disc. Finally, connect the wires as follows:

  • Black to Ground

  • Red to 5 Volt terminal on PinSim PCB

  • White to Plunge terminal on PinSim PCB

Finally you need to configure the plunger. With the Teensy LC USB cable unplugged, hold down the Start button (Teensy Pin 12) and plug in the USB cable. After a moment the LED-1 should flash rapidly. Slowly pull the plunger all the way out and then slowly allow it to retract all the way back in. The LED should flash rapidly again, and then blink normally. You can repeat this process as necessary, but the settings are permanently stored between power cycles.

While you're at it, you'll probably want to re-wire the cabinet Start button to the "A" button and add a second cabinet button to act as the 360 Start button. And as long as you're adding a plunger, I'm going to assume you're deep enough into this that you understand why.

See? I told you it was a lot of extra work! If you're up to the challenge, it's definitely gratifying.

I just completed assembling my second PinSim, thanks to the great help of my friend and carpenter Christopher Mann. It includes all of the above upgrades plus real flipper buttons and leaf switches (if you do this, make sure to sand down the tungsten contacts). Next up, tidying the cabling and a third cabinet with more precise measurements and a nice exterior finish. Fun!

All photos and images by Jeremy Williams