A few years ago I scratch built an arcade cabinet that still gets used today.  I’ve been talking about a virtual pinball cabinet for years.   It is time to finally pull the trigger.

Update 1

Even after spending a number of hours browsing vpforums and the HyperPin cabinet forums I still wasn’t totally sure what I wanted to build.  What I did know is that I wanted to get moving on *something* and I’d have some free time around the holidays so I ordered a coin door, legs, and some buttons to get my butt in gear.  I have a spare Core2Duo motherboard, CPU, and RAM and an older nVidia graphics card lying around.  Hopefully they’ll have the juice to push these tables.  In addition, I have a 24″ Samsung monitor that was damaged in a move over 5 years ago for backglass.  The screen is fine but the stand was destroyed.  Newegg had a holiday special on a refurbished 40″ Visio TV with 120hz.  From what I read the 120hz may not be super useful in the cab but the screen is nice none-the-less.

As for design, it seems the most popular cabinets on the forums are widebodies followed by various flavors of mini-pins.  In keeping with the streamlined (relatively) design of my arcade cabinet I decided a standard body was about right for me.  A lot of people suggest building the cabinet to match the dimensions of the TV going inside it however I would like the option of using a legitimate lockdown bar in the future and they are far easier to find for standard width cabinets.  So, cabinet width of 22″,  subtract out 1.5″ for the plywood thickness and the interior dimensions are 20.5″.  Length was a little more tricky.  Starting from the front: lockdown bars seem to be in the 3.5-4″ range, the backglass needs a 5-6″ flat ‘shelf’ to sit on, and 40″ TVs seem to come in around 36″ wide.  4+5+36 = 45.  Add a couple inches breathing room and I went with 47″ overall length.  There is some debate over the ‘best’ angle for the playfield and glass with no real consensus.  I decided to give it about a 7″ rise, a few inches for the playfield and a few more for the glass.  That’s 15″ in the front, 22.5″ in the back.  So here we have the rough sketch to work off of:


Unfortunately I no longer have my table saw.  It was a small folding portable model anyway and using it for this project would have been a challenge.  I do have a miter saw, but anything over 12″ or so would need to be done with a circular saw.  This led to a sore back and less precise cuts than I may have wished for but in the end I have my cabinet sides and bottom:


On my arcade cabinet I drilled and screwed directly into the sides which then took a good bit of filling and sanding to level.  This go-round I decided to use a new (to me) tool.  I used biscuits to join the major panels:


I also went ahead a cut the hole for the coin door up front:

And here’s the first three panels drying:

I then laid a 2×2 frame screwed into the side panels, then screwed the floor panel into those:



The sides appear to be a little warped.  I can tell in these pictures but could not at the time.  The imperfections of my circular saw cuts and the quality of the wood I selected made this a pain in the butt and I had to spend far more time sanding down the corners to make everything smooth and flat that I would have hoped.


Update 2

With the sides and floor together I started on the top pieces which required a bit more care and precision.  As mentioned above, I wanted to stick with standard cab dimensions however I did not purchase a lockdown bar so I built my own from a 1×6 and some 1/4″ MDF I had lying around:


A 1×2 on the bottom aligns with the 1/4″ MDF spanning the width of the cabinet and small 1×2 squares screwed into each side.  When in place it’s a pretty tight fit.

I also added a drop panel from the back box shelf to hide the back of the cabinet.  Again, 1/4″ MDF screwed into either the 3/4″ plywood shelf or some 1×2 squares:


With the outer shell of the cabinet assembled I started drilling buttons.  I had a 1 1/4″ forstner bit from the arcade cabinet build:


The plan was to have 2 flipper, 2 mag save on each side, 3 face for coin/start/options, the launch button (placed low enough to support a plunger later) and an exit underneath.  After looking at the 3 button front layout I decided to stick with 2 for now and leave space to install one or two more if I decide to later.


I also drilled the leg holes.  Since they have to drill at an angle into the corners I created this quick little jig to line ’em up.  I placed the lower screws as low as possible while still being able to get a standard washer over the bolt and above the 2×2 braces inside the cab.



I cut some 45 degree slices to give the leg bolts something to grab on to.  In retrospect the $20 or so for real backing plates would have been worth it:


But at least now she can stand on her own now:
I then put in a couple hooks and a tensioner for the ‘lock’ part of the lockdown bar:



Update 3

With the main box construction mostly complete I started work on the back box.  I managed to stumble across an old laptop that was dead and pulled the panel from it.  I was able to purchase an HDMI-capable controller for less than $30 on ebay so now I’m at a old beater 24″ monitor for backglass, old beater 15″ raw laptop panel for DMD, and a purchased 40″ TV for playfield.  Given the size of the back box monitors, I wanted to save as much space as possible.  Most back boxes angle toward the player from bottom to top.  I’m using a plain 1×6 for the walls and only shaved about 1″ off of the bottom which leaves me with a smaller ‘lip’ than many back boxes.  The plan is for the laptop panel to rest on the bottom of the box then use the middle shelf to hold it in place as well as support the top monitor.  I notched the shelf enough to fit the panel:



Then with the 24″ monitor installed above it:


This brings me to my first few 3D printed gadgets.  I’m going with the Freescale-based ‘Pinscape’ controller and, of course, the computer motherboard will be mounted on the wood.  I designed and printed a few standoffs for those boards:


I also do not have a hole cutting jig nor did I want to jigsaw all of the holes on the cab however I do have a template bit for my router so I designed and printed 4.5″ (for 120mm fan/intake) and 4″ (for back box speaker) templates:




The rest of the backbox was measured and jig-sawed:

I then used a 1/4″ roundoff bit to finish the edges and dry fitted everything together:



Update 4

Disaster Strikes!

This will be a bad (and expensive) update.  As mentioned above I had purchased a refurbished Vizio TV from Newegg.  When it arrived I noticed a faint but still annoying scratch on the screen.  After some back-and-forth Newegg agreed to a full refund but I still had to package it and cover shipping… and since the TV was no longer on sale at Newegg, find another TV.  I ended up with a 40″ LG from BestBuy that was also on sale at the time.  At first blush it seemed pretty great and I like LG as a brand.  The TV worked just fine and was about 1/2″ too large (width of the cabinet) to fit.  Decasing is a common activity for cabinet builders and rather than route the hell out of my cabinet I opted to decase this LG… and that’s where things went wrong.  Upon breaking the warranty seal and pulling the back cover and trim off it quickly became apparent that this TV was not made to be decased.  The panels themselves are held in place only by the plastic trim.  Two of the VESA mounts are screwed directly into the metal casing but the other two are just snapped into the case molding.  On the outside of the panel there are bare controller chips hanging off like little post-it notes.

Since the thing was such a mess without a case I decided to jigsaw off the bottom 1/2″ of the case (speakers, power button, and empty space) and put the case itself back on then shove the entire thing back in the cabinet.  I built up a 2×4 and 2×2 support structure and test fitting went great:


(notice the lack of 2 bottom VESA mounts)


Bottom chopped off



I even went as far as to mud/sand and start priming and painting:





paint2 paint1

I also designed and printed these little guys to hold the front 2×2 of the TV mount:

2x2 Holder

The back is sitting on a 2×2 shelf so it can angle and slide and then the front locks it in place using these little guys.  I also put a horizontal piece under the middle of the TV supporting the mount from there as well.

And now the disaster.  After getting everything fitted and even some priming and painting, I plugged the TV back in and *something* broke.  The TV will turn on fine and everything looks ok for a few seconds but soon after powering up the screen goes fuzzy and a large yellow streak appears.  Nothing looks damaged or burnt on the boards.  The only thing I can think of is some of those little ‘post-it’ controller chips on the side got damaged during the test fittings or re-casement.  Regardless, this TV is dead and I’m pretty sure Best Buy’s return policy doesn’t cover a sawed off bottom.

I went back to Best Buy.  Most lower priced TVs in this size range feel pretty flimsy and I wasn’t about to roll the dice again and accidentally destroy another TV while decasing so I went the other direction, bought the same TV (since I have a good idea of how it fits) and started routing the cabinet…  Unfortunately I could only find a 1/4″ cutting bit so this took a loooooooong time.  BTW, I now hate my router.


The base of the TV is flat so the left side of the cabinet had to be routed deeper into the cabinet than the right.  In addition, there’s a small power button on the bottom of the TV that needs to be accommodated so the overall routing depth on the left side was more shallow than the right so I didn’t cut a hole under the button.  Since my router has a fairly large base I used a flush cut saw to remove material up to the rear of the playfield area.


Then I manually routed a channel for the power button to slide through.


And a little bit deeper under the button so there’s no risk of accidentally pushing it if the cab is bumped.



And now we’re back on track with a fitted TV that has not been decased – warranty in-tact.  In fact, I ended up leaving the protective plastic on the sides and added some masking tape to prevent scratches.


Update 5

Next is painting.  I hate painting. On my arcade cabinet I painted the sides with an oil-based enamel that set to a glossy sheen.  The black middle was matte latex.  I spoke with the Home Depot paint dude and told him I was trying to match that finish – bright white gloss on the sides, matte black in the middle – and he suggested a latex gloss and matte for each.  It’s been a long time since I painted anything… I thought maybe latex has evolved to be as glossy as enamel.  No…  No it has not.  I even bought a fancy new Wooster Pro brush as people claim better brushes give a better finish.  As nice as the brush was and as easy as this paint went on it is no where near as level nor as shiny as the enamel.  I have 5-6 layers on the white with 320 grit sanding and it’s just not what I wanted.


paint5 I’m sick of painting so it’s going to stay shiny-but-not-quite-shiny-enough for now.

Update 6

With everything painted (sufficiently) I moved the project inside and started working on the wiring.  Here’s the backbox with the speakers, both monitors, and the LCD controller in place.


This is my handy-dandy mini reference for crimping and button wiring.


Here’s primary wiring.  I use wire pairs from ethernet cable for low power (aka button) wiring.  I soldered pin headers on the freescale and dupont connectors and spades for button wiring.  The three terminal blocks are buses for 12v, 6v, and ground.  The little red box is a cheap audio amp to drive the Pyle speakers in the back box.  No sub woofer (yet).


Here’s the long view of the cabinet with the 2x 120mm fans installed.  After this picture was taken I also installed 20.5″ 2x2s next to the mid-monitor shelf to push out the bowed sides and give a little bit more sturdiness to the side walls.wire4

For mains power, I picked up a tool wiring kit from Home Depot and a rubber plug end.  Then hung the power strip on the wall:



The XT/JST connectors you see in the image above are for the rear fans.  I also placed a fan on one of the 2×2 cross beams to help circulate air across the video card.  I have another 3d printed gadget; a vertical mount for my HDD:



Update 7

With the cabinet far-enough along to theoretically play some pinball I spent some time on the software.  I’m using Windows 8.1 – I happened to have a spare license sitting around.  I gotta say, Visual Pinball setup and config is a bit opaque.  VPForums.org has a number of tutorials and a ‘do a lot but not everything’ installed but it’s still hard to go from no knowledge to a fully set up cabinet – not like MAME where a front end and some button mappings is pretty much all you need.   Here are some lessons I learned along the way:

  1. Visual Pinball and PinMAME work in concert.  Visual Pinball draws the table elements, manages table resources (art, music, design), and handles the physics.  PinMAME emulates the processing behind the table; score keeping, ball and score counts, controlling when things happen on the table.
  2. Visual Pinball is script heavy.  You will need to edit scripts.  The ROM the table is looking for is stored in the script.  The format and position of the DMD is in the script.  If you’re using a front end you may need to add some exit logic to the script.  You aren’t going to need to know how to write VB script but you will need to get good at identifying key sections and knowing what some commands mean.
  3. Windows 8.1 is a pain.  To get things running correctly I’ve had to:
    1. Disable windows update.  Even when it’s not doing anything it seems to hog the CPU when Visual Pinball starts
    2. Disable windows defender’s real time AV scan.  Again, it freaks out sometimes when VP is running
    3. Set PinballX and VP exes to run as administrator – otherwise they will not save ‘First boot’ status and high scores
    4. Disable compatibility mode for all exes.  If you run in compatibility mode the tables will slow to a crawl after a few minutes of play.
  4. Getting tables to run the first time is a little confusing.  The process goes something like this:
    1. Find the table you want to play on vpforums.org or vpuniverse.com
    2. Place the ‘vpt’ or ‘vpx’ file for the table in your visual pinball\tables directory
    3. Open the table in Visual Pinball and edit the Script.  There will be a ‘cGameName’ variable set to a short string.
    4. Go back to vpforums or vpuniverse and search for the cGameName string + .zip – This is the table’s ROM
    5. Download the ROM and place the ZIP file in the VisualPinMAME folder — leave it zipped!
    6. Some tables include additional scripts or music… those go in Visual Pinball’s script or music folders

At this point the table should load in visual pinball and play.  After that you’ll want to adjust the position of the DMD (you can drag it around to position, right click->Show borders to resize).  You do not get backglass running the table in Visual Pinball with default settings.  From there you can customize to your liking.  Download a media pack and add it to your front end.  Download backglass or turn on a backglass server for a more impressive experience.  Some of the more common tweaks are:


Set Controller = CreateObject(“VPinMAME.Controller”)


Set Controller = CreateObject(“B2S.Server”)

to enable the B2S Backglass server.  You will need to install and configure the server and have a ‘directb2s’ file with the tablename for everything to work.


.Games(cGameName).Settings.Value(“rol”) = 1

to rotatae the DMD left and

.Games(cGameName).Settings.Value(“ror”) = 1

to rotate it to the right.

If your front end is crashing when exiting a table then you may need to add the following sub to the script file:

sub Table1_Exit
end sub

Where ‘Table1’ matches the _Init call near the top of the script.

Finally, beware the Visual Pinball versions.  I’ve not had to much trouble within the vanilla 9.9x versions.  9.93 seems to play everything I’ve tried.  If something is labelled PhysMod then it needs to be played using the PhysMod version otherwise it will run very poorly.

Update 8

With the tables working I decided to try some haptics.  I ordered a SainSmart USB 8x relay board, a couple tractor solenoids, and a couple push solenoids.  The board itself was pretty easy to set up.  It’s USB, the drivers and test app are readily available, the wiring isn’t bad (run +12in to center posts, out to the NC (left) posts, place a diode (I used 1N4004) near the solenoid facing the +12.  Getting these little guys working was a bit of a chore.  There is a B2S plugin called ‘DirectOutput Framework’ (DOF).  The installer and instructions are here: https://directoutput.github.io/DirectOutput/cabinetconfig.html.  The installation itself is pretty straightforward.  You need to install the plugin and unblock the DLLs, enable B2S on the tables your want force feedback on, then enable the DOF Plugin.  Configuration, on the other hand, is a chore.  First, there is an online config tool that is used to define which controllers you have and what devices are on what ports.  The tool works well enough.  I’m not especially fond of having to create an account to configure these devices but they don’t require anything but a User/Pass and I get why they did it – there are table-unique configurations so always having the latest and greatest version is very handy.  Where things got a bit wonky is the installation and configuration of the ‘Cabinet.xml’ file that is referenced in the instructions.   As far as I can tell there is no way to get that from the config tool.  I cannot find one on the DOF site itself and had to resort to a vpuniverse user’s drop box.  As for table configuration, the DOF config tool contains profiles for most tables so everything just kinda works out of the box as long as you have your output configuration  correct and are happy with default behaviors.

I originally placed the tractor solenoids on the cabinet walls under the flipper buttons.  That wasn’t ideal.  The solenoids were WAY too loud and the sound and feel WAY to far to the outside.


I decided to move them in a bit and figure out where I’d put a full 7-8 solenoid setup and come up with a contraption to adjust the impact of the solenoid.  I took a 1×2 cut to 4.5″ and attached the solenoid directly to that with some short 1/2″ wood screws.  I then drilled some larger holes on the sides of the solenoids, oversized for the 1 1/2″ wood screws that will be going through them.  The idea is I can firmly attach the solenoid directly to the 1×2 and then place materials between the 1×2 and cabinet floor to change the intensity.  For instance, I’m using two layers of felt for the flippers.  I plan on using weather stripping for bumpers as they are a bit quieter.  Looks something like this:



Since my desired solenoid placement interfered with where I had placed some components and routed some wires I stripped all of the electronics out and re-wired everything.  Much cleaner now:


I did struggle a bit with flyback on these solenoids.  I could get a few clicks out of them even with the diodes attached a couple inches from the terminals but the board would quickly lock up.  I grabbed a power supply from one of my printers and moved the Sainsmart board and solenoids over to that which helped but still would lock up every once in a while.  I tried moving diodes everywhere from on-the-solenoid-terminals to at-the-SainSmart-board but no big change in stability.  I then moved the board power back to the ATX PSU while keeping the solenoids on the separate 12V PSU which seemed to help greatly.  The board will still lock up every once in a while so I still have some work to do but it’s few and far between now.

I designed and printed these little diode protector boxes.  I didn’t like the idea of naked solder joints just sitting in the bottom of my cabinet.  You can screw them down close to the solenoids to help keep tension off of the joints.

While I’m using two tractor starter solenoids for the flippers, I picked up a bunch of push solenoids for the bumpers and slingshots.  These push solenoids only had a couple holes in the body for mounting screws – the recommended ones on the pinball forums have tabs for flush mounting on a surface.  Once again, 3D Printer to the rescue:


These little mounts give a plastic-y ‘clack’ this is alright for bumpers.  I’m going to print an open-faced version that can strike something more rubbery for the slingshots but for now, they’ll do.  My current setup is 2 starter solenoids for the flippers, two slingshots, then an array of three under the far side of the table for 7 in total.  I then mapped both the center and back outputs to that one center solenoid.


Update 9

With the solenoids installed the internals are just about complete. Time to add some finish.  I wanted top glass.  A local Jacksonville shop Discount Glass JAX was able to turn around a 1/4″ tempered pane in about 3 days and for less than $35.  Couldn’t be happier with that!  Now, how to attach it to the table?  I opted for 3/4″ aluminum L-channel from HomeDepot.  It’s thin enough to cut very easily and just the right size to attach to the cabinet sides.  I know most pinball tables have a routed channel and plastic retainer with the aluminum sides just taped on ‘for show’ but I’m pleased with this approach.  Here they are initially cut to size:

I knew I wouldn’t be able to put regular nuts on the bolts as they would be under the glass so I opted for some T-nuts:


I then cut an angle on the bottom of the rails t to keep it out of the way of your hand (and ’cause it looks cooler).  I was also intending to plasti-dip the rails in black so I took an orbital sander to them to rough up the service.  After seeing the brushed aluminum look, I decided to stick with that.  I really like the way these turned out:


With glass and rails it was now time to do something with the interior trim around the monitor.  I don’t like a gap between the screen and the walls and I’m hoping to leave the masking tape around the TV so I don’t scratch anything up when I’m installing or removing it.  Once again, 3D Printer to the rescue.  I printed three types of trim pieces.  One for the ‘short side’ where the TV is only about 1/8″ from the side wall and one for the long side where the TV was about 3/16″ from the side wall.  Both follow the same general pattern:

And the one for the back where the TV is about 1″ from the back plate:


For you 3D printing geeks these were designed as solids then printed as spiralized vases for the smoothest finish possible.  The thin parts were so thin that if I printed them much higher than 200mm at one time quality would start to suffer.  I printed in 150mm sections.  Here’s how they look in the cabinet:

I had to make a cutout for the TV button.  It is also the IR receiver:

Update 10

So software has been an issue for me.  I originally tackled this project with Windows 8.1 and got everything running well.  This PC was a rather under-powered Core2Due 6230 with 2GB RAM.  I found an e8600 (almost twice as fast) and 4GB RAM compatible with this old-ass system for ~$20 each on Amazon so jumped at that.  Unfortunately this MB maxes out at 4GB so I couldn’t retain the 2GB that was already in it.  Also, oddly, once the e8600 was installed everything ran too fast… as in the ball would move at almost twice the speed.   Looks like I needed a MB BIOS upgrade to properly support this CPU.   After performing said upgrade Windows 8.1 would no longer boot.  Windows 8.1 installation media would no longer boot.  Windows 7 repair tools would not find anything wrong with the partition.  So, back to Windows 7.

After getting everything set up in Windows 7, a random GFX driver upgrade seemed to freak out my monitor ordering and no matter what was selected I could never get backglasses to appear on the 2nd monitor… start again from scratch.  Now I’m on my 3rd software installation from the ground up.  The process goes something like:

  1. Install OS and Updates
  2. Install graphics drivers
    • Ideally monitor 1 would be your playfield, 2 would be backglass, and 3 would be DMD
  3. Install Visual Pinball via 3x installers
    • Set all vpx exes to run as administrator
    • Turn off UAC to stop annoy popups
    • If you’re in windows 8 unsure no exes are set to Windows 7 compatibility mode
  4. Install latest VPinMame (2.8 Currently)
  5. From here you should be able to download tables, rom, backglasses, etc and configure key options in the Visual Pinball(s)
    • Remember… Roms go in vpinmame\roms folder.  You can get the zip name from cGameName in the scripts and the BIN name from the initialization error
    • DirectB2S files reside alongside the tables, need to change the controller name to ‘B2S.Server’ in the script
    • VP9.x and VP10 have different sets of settings – set them both up
    • If you’re using the Pinscape controller I’ve found x/y gains of 800 work for me
    • Even though I’m using a souped-up video card I had to crank down settings in VPX for most tables to play well.  VP9 was pretty good at defaults
  6. Install DirectOuput Framework
    • Use extra files (including Cabinet.xml) from this nice fella’s DropBox
    • Don’t forget to replace SainSmart serial # in cabinet.xml
    • If you’re in Windows 8 get real good at unblocking DLLs or use the ‘Streams‘ program to unblock en-masse
  7. Install and Configure PinballX
    • Follow this link for setting up VPX alongside VP9
    • Use mklink command to use shared Media folder eg:
      delete PinballX\Media\Visual Pinball X
      mklink /D “PinballX\Media\Visual Pinball X” “PinballX\Media\Visual Pinball”
    • Use import media to import the initial table – it should recognize it is Visual Pinball media then move xml from visual pinball to visual pinball x if vp x table
  8. Set up auto-login so your user logs upon boot.  PinballX has an option to automatically launch upon login.

I’ve also been doing some minor clean-ups.  I didn’t like the way the lockdown bar looked.  Even with a few coats of primer and a few more of metallic paint it still had some wood grain showing though.  I Bondoed it up and painted it gloss black.  Now it looks real smooth.  I also found that while setting up the SainSmart  board to be powered by the ATX PSU and the solenoids powered by the dedicated 12v PSU greatly reduced the occurrences of lock-ups, the board would still lock every once in a while.  I pulled the more heavy duty started solenoids and the problem appears to have gone away.  I’m up to  8 of the little push solenoids above.   I also designed another little bracket to allow some of them to directly strike the cabinet instead of the plastic:

I have two of these vertical brackets and solenoids in place of the tractor starters above, striking the wood padded by felt.  It gives a very unique and satisfying ‘thud’.  I’m not sure if it’s realistic but it definitely feels good.

I also went back and painted the side rails black to match the lock down bar and lifted the back of the screen ~1/2″.  With that, everything feels and looks just about right:

Unfortunately I haven’t installed a lot of backglasses but here’s a video of some AFM and Tron with the default static backglass:


3D Printed Parts Index

The following is a list of 3D printed parts either designed by me for this project or designed by others and utilized for this project:

My Designs

Vertical HDD Bracket
Motherboard Standoffs
Solenoid Strikers/Mounts
Flyback Diode Box
Router Hole Templates
2×2 Board Mounts
Harbor Freight Trim Router Base

Other’s Designs

Cable Hanger
Below Desk Cable Tidy Clips


Update 11

This update is all about upgrades.  I decided to upgrade my main machine to a hot new Ryzen 7 1700 and put my previous i5 into the pinball cabinet.  I had to completely reinstall – Windows 10 this time.  So now I’ve done a full install in Windows 8.1, two installs in Windows 7, and now a Windows 10 install.  It gets quicker an easier each time.  I have no pics to go with the upgrade.  It would just be one unimpressive motherboard pic followed by another unimpressive motherboard pic any way.

The other upgrade was to the feedback circuits.  The SainSmart board was ok.  It was easy to set up, responsive, and the relay flick was practically unnoticeable.  Unfortunately the thing would hang every couple days and the only thing that would fix it would be to unplug and replug the USB cable.  Since I was already using the Freescale board as a Pinscape controller I took it to the next step and built some booster circuits so I can drive the solenoids from the Pinscape board.

If you’re looking for the circuit it’s in the Pinscape Manual.  Here’s an excerpt:

The creator of the software and circuit built all of his circuits onto a single bread board.  I went a different route and built on small cheap breadboards from Amazon.  Here’s the Fritzing:

You’ll notice the left side is the Darlington array stepping up the 3.3v out of the Freescale to 5v.  The right side is a set of two amplifier circuits.  I went through a few iterations on this board and tried to fit more in but things started to get cramped and since the solenoids are in pairs anyway, two seemed right.

Here’s what they look like:


You may noticed I doubled up on the 220ohm resistors; one on the Darlinton board and one on the amp board for each circuit… basically negating the Darlington array altogether.  It works with the mosfets I’m using however they were designed for arduino so might be more sensitive to lower trigger loads.  I could not always match my parts 1:1 with the suggestions in the doc and ended up with the following, all from Amazon:

Uxcell 4×6 Prototyping Board
PCB Terminal Blocks
PC817C Optocouplers
ULN2803A Darlington Arrays
470 and 220 ohm Resistors
60V 30A Mosfets

And I already had a bunch of dupont connectors, hookup wire, and pin headers left over.

I also designed and printed PCB holders to mount to the cabinet.  They can be downloaded here.


I hit a few snags when building them.  As far as I know Fritzing doesn’t have an easy way of ‘flipping’ the board over and I ended up switching the positive and negative output poles on a bunch of the amp boards.  That resulted in 1/2 of my mosfets tripping and about as many flyback diodes melting as it’s pretty much just shorting the circuit.  After getting everything built correctly all of my solenoids are firing as expected and no hangs or freezes yet.  It was a bit of challenge getting DOF set up.  There was an easy to understand sample cabinet.xml for the SainSmart board.  I had to guess-and-check a bit to get the Pinscape controller working.  Even though Pinscape setup has the board assigned as LEDWiz 1 and Pinscape 1 I needed to set LEDWizNumber to 51 to get it to work.  The ‘guess’ was that the DOF config tool spit out a ’51’ suffixed file.  Apparently that setting has nothing to do with the LEDWiz number assignment as the OutputController section indicates the board is LEDWiz  Number 1.

I wired my solenoids up to the digital output pins.  That leaves me with a handful of PWM pins to play with.  It would be fairly trivial to add 8 LEDs to the board.  Not sure where I’d put them though as the ‘standard’ setup now-days appears to be either 5x RBG LEDs across the back of the playfield (15 total outputs) or addressable LED strips which would not be directly usable with the Pinscape controller.

9 comments on “Virtual Pinball Cabinet

  • Very nice! As a pinhead who has built my own custom machine (years ago) I’ve been considering doing a vpin. (The prices and space requirements make buying any more actual pinballs impossible). The idea of a vpin appeals as there are so many machines I want to play (briefly) but not actually own.

    I keep waiting for Visual Pinball to mature enough to be easier to set up (yah, not gonna happen)

    How does your machine compare to a real one during play? Do you ‘forget’ you’re looking at a screen or does the lack of depth perception and fixed view angle make it feel like a screen and not a physical machine?

    I was pondering 3D glasses option….would the effect would enhance the realism, or just be in the way? The view angle is odd, which may confound the 3d effect. (although adding head tracking would be sweet!)

    I also considered installing a bunch of speakers in the lower cabinet for 3D positional audio of the mechanical parts sound effects (solenoids, etc) — although with a real pin you don’t get that much sense of where the mechanical sounds are coming from, because of the glass, thick cabinet sides bouncing sound, etc. I suspect it would be more trouble than it’s worth.

    Anyway, keep up the good work and I’ll be watching to see what updates come

  • Hey Lars, thanks for taking the time to read and reply!

    I’m not really a ‘pinhead’. I’ve known a few people who owned pinball cabinets and I’ve always enjoyed it but never really got in to a table enough to consider purchasing one. It was the practically-unlimited Visual Pinball library that made this a viable option for me.

    The Visual Pinball physics are good enough on many tables that my brain will forget it’s a video game and it starts ticking the same neurological boxes as a real pinball machine. I’m lining up shots, struggling through a multiball assault, and nudging to miss a gutter. There are frequent conversations on table remakes about ease of shots and frequency of events vs real tables. The fact that they can have those conversations is a testament to the quality of the simulation. I will say that the haptics and the Visual Pinball X physics really help a LOT. That said, it is different. It’s still a flat plane with flat animations. I don’t know that I ever really forget that it’s not a real pinball table but the flatness kind of fades and I’m just ‘playing pinball’. The issue that breaks the immersion for me is that the computer I have driving it is pretty dated and I’ll get occasional slow down. That’s like a bucket of cold water. My relay board will also cut out once in a while but that’s pretty rare.

    I think the angle would be a show stopper for regular 3D glasses and you’ll probably lose something in the DMD and backglass monitors unless they are somehow all synced up. I’ve seen a project that uses an Oculus or Vive headset. While cool, that seems like a step further away from a ‘real’ cabinet experience. I’ve also seen a VP plugin that uses a Kinect to track your head and will update the table in real time as you lean to look around objects. That seems cool (for the person playing) and is on my list of future upgrades.

    As for the feedback, I’ve heard of people adding a beefy sound system inside the cabinet and playing cabinet sounds through that. That seems to add to the realism but the gold standard is still a 10 solenoid setup (I’m running 8). I don’t think there currently is a way to place speakers in different positions in the cabinet and pipe unique sounds to them but I may be mistaken.

    As of last night my backglass monitor has died. I’m working on a replacement for that and then I have a custom backbox topper I’ve been working on. After that I think I’m going to move from the SainSmart relay board to an LED Wiz and add RGB LEDs to the back of the table. Finally, in March I’m upgrading my main rig and will use the parts in this pinball cabinet which should really eliminate all stutter. There is no shortage of upgrades in the pipeline!

  • The head tracker sounds like it has potential, possibly adding more realism than 3d glasses would. It’s been years since I looked at VP. Haptics support and physics were not there…

    You mentioned it responds to nudging — did you add an accelerometer?

    What resolution is your playfield display running at? I’m considering 4K, with a hefty graphics card (limited to what fits in my cabinet). Do you think your stutters are from CPU or graphics bottlenecks? What hardware are you currently running? Are two separate backglass / DMD monitors necessary, or was that because of the square shape of the head and the rectangular display?

    I would think solenoids are more realistic than an audio system (although a subsonic rumbler would be useful for some games, like Earthquake). Why are 10 solenoids better than 8? I assume since every pinball playfield layout is different, the solenoids are not placed in exact locations to a specific playfield, but arranged in some sort of mix of an average layout (flippers and slingshots) with added solenoids placed strategically for generic coverage. Seems like you could arrange them such that there wouldn’t be much difference? How well can you differentiate discreet solenoid thumps at the far end of the playfield?

    I like the adjustable impact control you’ve added. Other than your flipper solenoids, are the rest of the solenoids the same, or is there any sort of assignment of big/strong vs smaller or mechanisms (ie: a pop bumper feels differently than a ball lock). I’ve got some of the same push solenoids and they aren’t real powerful… Have you considered a higher voltage solenoid power — pinball solenoids are typically 25-50V and hence ‘snappier’ than 12V solenoids. Do you get noticeable delay or distracting extraneous clacking using a relay instead of mosfets to trigger them ? (although that may increase the realism of an EM pin!)

    You can try adding a non-polarized 2.2uF capacitor in addition to the diode to suppress flyback and arcing within the relays (probably more important if you increase the voltage)

    What about recreating the shooter plunger? Many machines have a skill-shot which you can’t recreate with a push button.

    Sorry for asking questions I could research, but I’m curious to hear from someone who’s gone down this road and discovered what works and what doesn’t. Last time I looked at VP, there was very little practical info about this sort of construction (plus I couldn’t get to the config tool without registering to explore it…)

    I’ll have to finish restoring and assembling my BlackKnight2000 before I can consider this project tho. ;D

  • OK, I just read the pinscape controller pages — plunger sensing is available, but you did not install that? Or just not in these photos?

    Also, I see the accelerometer is part of the controller.

  • Yep, accelerometer is part of the controller. I opted to skip the plunger initially but left enough room that I can add it later. I frequently read that a real plunger is cool and authentic but generally doesn’t add *that* much to the experience. Not to mention it can have its own calibration issues. The launch button draws the virtual plunger back fairly slowly so the skill shot is a matter of timing instead of power. So far, not missing it.

    My playfield is only 1080p. Would love to have a 4k in there but you’d need some serious hardware to push 60fps at 4k and I’m on a budget. There are folks doing that though. Personally, I’d prefer a real 120fps at 1080p than 4k at 60fps but there are also challenges getting non-‘smoothed’ lag-free 120fps at 1080p.

    My original flipper solenoids were tractor starter solenoids. If you put them directly on the wood it was a serious pop. WAY overboard. Closer to a knocker. I’m switching back to the starters on the muted base. I liked the sound more and switching them out only seemed to help with board stability a little. I don’t have any issue with the volume or the ‘pop’ from the slingshots or the bumpers. They might be a little lighter than real but it feels good to me. I’m pretty confident that all starter solenoids directly screwed into the wood would be WAY to loud.

    I don’t really perceive much delay with the relays. I’m sure mosfets would be quicker but not sure that I’d notice. My 8 solenoid setup as 2 flipper, 2 slingshots, a right and left up the table, one center, and one back. No difference in most beside position. It would be nice to have different striking profiles but DOF only sends signals for positions an a few specific devices (eg: knocker, gear, fan). I can definitely tell the outside solenoids. The middle ones are more difficult however one is mounted to the cabinet base and one it to a cross member so they definitely feel different even if they are harder to distinguish location.

    I believe the 10 setup has 3 across the back, 3 across the middle, 2 slingshot and 2 flipper. I like the 8 setup – just wish the SainSmart board was less flaky. I’ll have to try the capacitor thing. I don’t hear delays in the relays releasing and I can really hammer repeatedly on the relays without issue so I don’t think it’s flyback. It almost seems like some sort of USB problem. Maybe just a lemon.

    If you can restore a real pinball cabinet I’m sure this project would be simple in comparison!

  • I did not know the plunger button simulates the draw — that gets you halfway there and probably good enough for most games. I’ve seen a few skill shots that required both careful timing and careful draw.

    I know what you mean about 120Hz — I put in some LED bulbs in one of my pins for GI, which is 6.3VAC @60Hz, and so there’s some barely perceptible flicker. But when the ball moves quickly in areas that are lit by the LEDs, it makes a strobe effect and it looks like reality is dropping frames. It’s a very weird sensation.

    I guess some (most?) displays aren’t ready to take 120Hz update rate, so they interpolate every other frame from a 60Hz source?

    I did a quick google of your relay board, and I did see a couple mentions of problems with that controller chip become unresponsive. Sounds like it would be easiest to replace that.

    The capacitor is more for absorbing energy to prevent contact arcing when the relays disengage. Not an issue if using mosfets (but the flyback diodes become very important!). But you can get arcing even at 12V, which will eat away the contacts. I don’t think it would really alter the problem you’re having with the SainSmart relay board.

    I built a MAME machine and a custom pinball years ago, and am currently restoring a pin, so I don’t think I’ll have any issues with most of it. I’ve even got a couple pinball cabinets ready for when I start on the virtual pin. But it’s still great to hear what you’ve discovered and how to wrangle all the various software components. So thanks for the info, it’s been helpful in planning.

    • You’re exactly right on the 120hz feedback. Most of them cannot take a true 120hz signal from a PC and end up interpolating 60hz. I also hear complaints about input lag and ghosting. It sounds like there are people out there with decent 120hz and/or 4k TVs but you’ll need the right TV, serious hardware to push it, and in the case of 4k, a table designed to take advantage.

      Now that I’ve got the mosfets in place of the SainSmart the haptics are running pretty well and I have the started solenoids back in for the flippers. Really feels good to me now. I might use the SainSmart for a knocker or rumble or something that doesn’t get switched as aggressively as the flippers and bumpers. My next ‘upgrade’ is a pretty awesome Attack from Mars themed backbox topper. Will probably be another week or two before it’s ready to show.

Leave a Reply

Your email address will not be published. Required fields are marked *