The original Pinball 2000 system is composed of a traditional pinball playfield, a driver board, a PC and a video monitor at its core. The driver board, which controls all of the solenoids, lights and switches in the game is controlled by the PC via a parallel port. Back in 1999 this was pretty cutting edge, however parallel ports are becoming less and less common in the constant fight to reduce space in laptops and PC motherboards.
Originally I had decided to use the parallel port on an older motherboard I had around and utilize RTLinux (thats basically linux with a real time kernel) to control the board in real time. This presented several issues:
- I would have to find other motherboards with parallel ports in order to manufacture the game
- RTLinux is not entirely trivial to set up as it is distributed as a set of kernel packages for very specific versions of the linux kernel.
- There would constantly be a fight for hardware execution priority unless the hardware control was implemented as a kernel module that preempted most other tasks in the CPU queue.
- The form factor of the controlling computer would be larger than most other PCs available today.
Had this been an entirely custom game in its own cabinet, and had I not already had the Pinball 2000 platform and driver system at my disposal, I would’ve just dropped in a P-ROC and their PDB driver boards to control my coils, switches and lamps and called it a day. I have developed a few games on their platform and it is a great system. You can program in .NET or Python using NetProcGame or PyProcGame frameworks respectively. Lots of great games created by individuals and companies exist on that platform such as Cactus Canyon Continued, the P3 and Pirates of the Silver Ball (a redemption pin I developed for OBX Amusements). I highly recommend the platform.
However, I have the Pinball 2000 driver board already at my disposal, and should we produce the game as a kit, our customers will also have it, so we’re going to use it. So I decided to develop a small hardware interface board that really achieves two core things. First, it controls the driver board on its own via a DB25 connector and the board receives simple commands from the computer over a USB line. Since everything now has USB ports on it (and it seems to be sticking around for a while), this seems like a decent design decision. The processor on the board can interpret simplified commands and handle the rest of the “pinbally” stuff at the hardware level. So if we just tell the board to “fire coil #2 for 32 milliseconds”, it translates that into which registers to send the command to and how long to pulse the coil.
First, we mocked the board up in Fritzing. I haven’t done much electronics design, so Fritzing is great since you just need to drag and drop components and connect the dots… literally.
My friend Scott Danesi of Pinball Life and Dutch Pinball fame had given me some invaluable tips on how to route my traces. Needless to say that I have lots of work to do, but he really helped out in getting this design out the door. The idea was to use an Arduino to control the board. The processor should be fast enough to service the lamp and switch matrices on the machine at microsecond resolution times and it also includes a USB serial interface to receive commands from our host PC! So the board is designed to mate with the Arduino Mega underneath.
Printing the Board
So now that I had the board designed, it was time to find where to print it. I had figured that I could use OSH Park. Their service and quality are top notch, but shipping can take a bit of time, and the price per square inch is a bit high. I could not afford to really reduce the size of the board since I had a minimum size requirement of the Arduino Mega, and the parallel port isn’t exactly small. Damn, the parallel port form factor bites us again.
So, Scott had mentioned that he was trying out a new board fab company called PCBWay. PCBWay ships from China, so naturally I was worried about the shipping times and, never having been a customer, I was worried about board quality. I submitted my gerber files to PCBWay and found that each order is required to be reviewed by an actual person to verify design feasibility and production costs. Once I uploaded the gerber files, the system gave me a quote based on the size of the board automatically. The cost of producing the board at PCBWay was half of what OSH Park was going to charge, AND I could choose what colors I wanted the solder mask to be. I decided to do the board in red to simulate the old prototype boards that Williams would use on games during the design and prototype phases. A PCBWay representative by the name of Julia got back to me within hours of me submitting my order saying that my boards were ready to be produced. Once I confirmed that there were no changes, their system informed me at each and every step where my boards were in production. All in all, it took about 5 days for the boards to arrive to my door. That is amazing for anything coming out of China.
The boards are surprisingly great quality. The solder mask and silk screen are very crisp and clear with very little, if any, defects. I got 5 boards in this shipment, so plenty of backups if I screw up, or plenty for other whitewoods!
So now it was time to populate these boards!
The board has a few add-ons that you don’t get with the typical Pinball 2000 configuration. It has 4 separately controlled RGB LED chain connectors so that the game can be outfitted with RGB LEDs. It has two regulated 5V outputs that are digitally controlled for the spinning flasher lamps on the game. The spinning flashers on the game were originally all controlled by a single DC motor and a very complex cable drive system. Yay for technology! Now we control these with tiny DC gear motors and a couple transistors. The board also contains 5 servo outputs for controlling various devices on the game. The Arduino Mega is mated underneath in the picture above. The interface board just sits on top of the Arduino. The green terminal at the front is for an unregulated 12V supply which powers everything downstream.
All in all, there are a few things that I want to change in this design. Driving RGB chains with any sort of length with these 5V 1.5A regulators can be pushing it, so I’m going to add terminals for an externally regulated 5V source which will supply those chains. I will also need to add mounting holes as this doesn’t quite mount like the traditional WPC opto interface boards.
All in all, the design works wonderfully and allows us to control everything on the driver board from our host PC. Our PC code only has to wait for switch events that are sent upstream from the board via USB and react by sending a simplified command back to the board, playing a sound, or playing a video routine. It really simplifies things and it works on any ATMega chip!
Now to get some lights and coils going!