A standard pinball machine consists of 5 main components that need to be controlled/monitored by some sort of central processor:
- Switches: Activated by a ball rollover or hitting a target.
- Lights: Computer controlled for game play and for general illumination
- Sound: Music and sound effects – a pinball machine without sound is not worth playing.
- Display: Some sort of display showing the current score. Possibly showing animations and other game play information periodically.
- Solenoids (Coils): These control the higher voltage game play mechanisms such as pop bumpers, drop targets, ball ejectors, and flippers.
I guess there is one other big essential hardware component: the power! But the power supply (supplies) are not computer controlled so I am separating them out from the list above.
My original design was to use a single central processing board to control everything from the game play logic, to controlling and monitoring all the electronic components.
My first selection was to use the Raspberry PI board. This board is cheap, has IO ports that can send and receive signals to various external electronic component boards, and it has a powerful GPU chip that could drive an HDMI monitor (something I want to use in place of a static back glass / translite).
My original intention was to use a Raspberry PI board as the one and only controller/processor for the game. Unfortunately, I am not a Linux person (I am a life long Windows programmer) so just configuring a PI was more than I really wanted to do just to get started. When I did start getting some PI code working with its Arduino compatible IO ports, I quickly found that the board was quite slow and I was convinced that it would not be able to keep up with everything I was going to ask it to do.
So for the time being I have replaced the Raspberry PI board with a standard PC. I have also decided to separate the control of some of the major components to their own individual controllers. Each sub component will communicate with the PC through a dedicated serial port connection. The PC’s main job is to simply handle serial port interrupt requests, update the game play state, and send serial port signals back to the other components to control the lights, coils, displays, etc. Because the management of the serial port signals is quite light for a powerful modern PC, I am going to use the PC to also handle playing sound (music and effects) and well as sending video to an external video monitor to play video segments during game play.
My current hardware configuration is as follows:
1. An Arudino UNO that holds a 64 button shield to handle up to 64 individual switches.
What’s great about this shield is that it is interrupt driven. The hardware handles the scanning of all the switches and only when a switch is depressed is an interrupt request sent to the UNO. So the UNO processor is not bogged down continuously scanning for inputs. Also, the shield works in both SPI and Serial modes. Therefore, I can take advantage of the SPI mode to receive inputs from the shield, and still have the UNO’s serial port freed up to send and receive serial port data back and forth to the main PC.
2. The same UNO will also handle controlling the LED lighting. The button shield only needs to send serial port data to the PC. The LED lighting board only needs to receive serial port data from the PC. So it makes sense to use the same UNO to handle both the switches and the lights. The lighting board I will be using only needs to receive data when the state of the lights change. Once the board receives the 8 bytes of data needed to turn on/off up to 64 lights, the board will maintain the current state of the lights until a change is needed. So just like with the 64 button shield, the lighting control is very light on the UNO’s processor.
3. I will be using a 2nd Arduino (this time an Arduino Mega 2560 Rev3) to control an array of 4 LED matrix panels (each panel is a 16 x 24 led matrix). This will be used to to display the score and various animations during game play. I am planning on having a video monitor in place of the backglass, so I could display scores and such on the monitor, but I think it is kind of cool and retro to still use the old dot matrix panels. Plus I can have a constant score display on the dot matrix panels while simultaneously playing video sequences on the backbox monitor. I decided on using a separate Arudino for the dot matrix panels because the sending of the display bits (16 x 24 x 4 = 1536 bits) is fairly taxing on the Arduino processor. Plus my simple method of storing the animation patterns in code takes up quite a bit of memory, so the UNO was just not quite up to the task (my UNO ran out of memory pretty quickly).
4. For the solenoid (coil) control, I am following the recommendations from Brian at his website:
From www.PinballControllers.com I purchased their Power Driver 16 board:
and from www.futurlec.com I purchased the Mini RS-485 Master which is needed to convert the RS232 serial signals from the PC to RS-485 needed for the Power Driver 16 board.
5. The master controller of all of the hardware and the game play software will be handled on a PC motherboard. It is an AMD dual core processor with 8GB of RAM and it’s own dedicated power supply. I plan on installing Windows 7 onto a bootable flash drive and for now the game code will be in C#.
And finally, the power! Being a computer programmer, not a hardware guy, the power is a big unknown for me. Again falling back onto the recommendations from Brian at HowToBuildAPinballMachine.Com I went ahead and purchased two power supplies: one 5V supply for the LED lighting, Arduinos, Mini Master controller, and the Power Driver 16 Board. And a 36V power supply for all of the solenoids (pop bumpers and flippers). I ended up with a 3rd standard PC ATX power supply for the PC. His recommendations are on the following page:
I am running a single 12 ft power strip into the cabinet into which I will plug in the 5v, 36v and PC ATX power supplies as well as the video monitor. Once I get everything wired up together I expect to plug in the machine and watch the world explode.