This project completed in Feb of 2017. Overall construction should still be valid however much of the software has evolved since publishing.
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.
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.
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.
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:
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:
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
Boittom chopped off
I event went as far as to mud/sand and start priming and painting:
I also designed and printed these little guys to hold the front 2×2 of the TV mount:
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.
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.
I’m sick of painting so it’s going to stay shiny-but-not-quite-shiny-enough for now.
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.
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:
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:
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:
Replace:
Set Controller = CreateObject(“VPinMAME.Controller”)
with
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.
Use:
.Games(cGameName).Settings.Value(“rol”) = 1
to rotate 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
controller.stop()
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.
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: instructions. 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.
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:
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:
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:
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 4x6 Prototyping BoardAnd 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.