I attended the Oculus event at GDC this year, where I first heard Pinball FX2 VR was in the works. I tried the game and after 5 minutes I knew I wanted to build a VR interface for it!
VR solves my biggest gripe with traditional “virtual” pinball games — you can’t move your head around to get a better read on shots or the ball. Well, now you can. And with my PinSim cabinet you can actually feel the game in your hands too. I’m sharing the SketchUp files, dimension renders, wiring diagram, and Arduino code so that anyone can make one. You can order my custom PCB or just use an ordinary breadboard. The latest sketch can always be found on GitHub.
The VR pinball cabinet is essentially the first 8 inches of a real pinball table. My original cabinet was made from foamcore but wood will provide a more lasting frame. Just make sure to consider the width of your material in cutting the sides of the cabinet. My drawings show the exterior dimensions and button hole placements, but the diameter of the drill holes will depend on the buttons you choose to use.
The joystick is used to conveniently navigate the game menus. And an accelerometer is used to simulate nudging the table, which can help you guide the ball or can backfire (“Tilt!”) just like the real game, if you overdo it.
My First Build
One week before the Oculus release date I made a trip to Walgreens and picked up two sheets of foamcore. I already had everything else (I’ve collected real pinball games for years, and I’m a compulsive Adafruit buyer).
I started by measuring the front body dimensions of a real pinball game and then cut a 1:1 replica from the foamcore. Then I measured for button placement, cut those, and glued the whole thing together overnight. Then I measured accurate body height and attached legs using off-the-shelf leg bolts and brackets. The buttons and joystick are pretty generic (Figure A). It was important that the flipper buttons don’t “click,” so it would feel realistic. I thought I’d have to install real pinball leaf switches, but these silent 30mm translucent buttons from Adafruit work great.
Everything ties into a Teensy LC microcontroller connected via USB to the computer. The Teensy has a mode that conveniently fools a computer into thinking it’s a generic gamepad, so the code simply turns grounded pins into emulated gamepad button presses. There’s also an accelerometer that converts X/Y movement into an analog gamepad stick for nudging the table. The Start and Launch Ball buttons have lights pre-installed, so I just connected these to the USB 5V line.
The biggest hurdle was getting the game to recognize the gamepad. Unfortunately the Teensy doesn’t support Xinput, and the Pinball FX2 VR game only supports Xbox gamepads. I found a wonderful open source program called x360ce that converts gamepad signals to Xinput, and later I upgraded to the incredible MSF-XINPUT library by Zachery Littell. It 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.
Building Your PinSim
PinSim Cabinet Build Notes
From Anthony Lam, Make: Labs
» To cut the plywood, a table saw is ideal. You can also use a band saw or handsaw; it’s safest to measure exact dimensions and cut at a 1/8″ offset, then sand the excess down to the marked dimensions so everything fits precisely.
» Test-fit the corners together using the cabinet leg protector. This not only helps you plan a butt joint for the boards, it also lets you trace the drill points for the leg bolts.
» The front panel’s top edge is cut at a 14˚ angle to match the rake of the top. And the top panel’s front and rear edges are cut similarly to fit flush with the other panels.
» We left our top panel free floating for now, resting on short wood screws as stops, in case we want to make upgrades. You can also screw it directly to the other panels and then touch up the paint.
Here’s how to make the upgraded version of the PinSim controller (Figure B). (Portions of this guide appeared previously on Tested.)