This year we decided to make a horse racing arcade game for Halloween. We were inspired by a mechanical version called Roll-a-Ball Horse Racing. Our goal was to make a game with straight forward controls to appeal to a wide range of players. Based on our experiences last year in building and operating the Chocolate Slot Machines, we knew that we had to accommodate hundreds of players over approximately three hours time. Therefore, our next design required a quick throughput time and had to be durable in order to withstand this intensive usage. We chose to build four stations to promote healthy competition and offer sufficient capacity as well as minimize wait time. Rather than have players roll balls to advance the horses, we agreed on a simpler button set of controls. We also wanted to challenge ourselves by dispensing a new candy. After evaluating numerous types of candy that were packaged in small boxes, we settled on Mike & Ike's and Hot Tamales, which we bought in bulk.
Step 1: Parts List
- Raspberry Pi 3 B+
- Joy stick controller
- 8 large push buttons
- 8 5 volt lamps for push buttons
- 4 Kuman MG996R Digi Hi-Torque servos
- 5.25mm birch plywood
- Cat 5 cable
- Printed vinyl with adhesive backing
- Lots of candy (90mm x 50mm x 12mm)
- Everything mentioned here
- Purchase the Horse Racing assets
Step 2: Configuring Raspberry Pi
For our computer setup, we used a Raspberry Pi 3 B+ with Raspbian Lite to run the game.
First, download our GitHub repository. Our program runs using Pygame and Pillow, so run pip3 install -r requirements.txt in terminal. Then create a copy of ample_config.py and name it config.py. Next, edit it to adjust your minimum number of players (we used 2), the horse names and sizes, and the screen size. We decided to award two candy boxes to each game winner and one box to all other players. Other parameters are also adjustable if desired.
Step 3: Setting Up the Screen
Step 4: Assembling Button Consoles
Our button consoles were made of birch plywood wood with large, round arcade pushbuttons (https://na.suzohapp.com/products/pushbuttons/D54-0004-12?REF=SN and decorated with printed vinyl adhesive. We elected to use these arcade quality buttons for their durability and lights. For each of the four consoles, we used pairs of different colored buttons. The buttons came with 12 volt lamps, but we wanted to control them from the Raspberry Pi which has 5 volt pins, so we switched them out for 5 volt ones (https://na.suzohapp.com/products/lighting/91-10WB-53W?REF=SN). We wanted the consoles to be small, so that we could fit them all side by side on one 8' table. In addition, we wanted to use a consistent color scheme so that we could use the boxes interchangeably.
We first laser cut and assembled our button consoles using 5.25mm birch plywood. (https://github.com/alanswx/HorseArcade/tree/master/hardware) We went through many failed designs until we arrived at one that was sufficiently small and could be assembled properly. We also experimented with the spacing between the buttons to ensure ease of use for players in costume. Next, we designed the vinyl and had it locally printed and cut. We applied the vinyl, then 3D printed the Cat5 brackets, and screwed them onto the back of each console. Lastly, we screwed on and wired up the buttons. In our design, we used solid wires. However, during game play, the constant percussive impact from the buttons gradually disconnected the wires from the buttons. We suggest using stranded wires to avoid this issue.
Each box had one Cat5 cable that has 8 wires in it (4 pairs). We hooked one pair to each switch in the box, and one pair to each led in the box. In the raspberry pi side, 2 pairs from the switch are hooked to the joystick adapter. The other two pairs are hooked to the LED outputs of the custom board that we wired to our pi. In a future version we should change the board to be a raspberry pi hat to make assembly simpler. We wired it to the extra gpio pins on the servo controller board. The LED GPIO pins are controlled in the config.py file.
Step 5: Assembling Candy Dispensers
We wanted to create automatic candy dispensers that were easy to refill. Since we needed them to fit on the table next to each of the button consoles, they needed to be slim to fit within our 8' table restriction. Additionally, they could not be too tall since they would obstruct the player's view of the screen. Lastly, we wanted the players to be able to see the candy inside the dispenser. After a few failed models, we settled on a vertical square tube built of wood, plexiglass, and our dispensing mechanism. Our dispensing mechanism consists of a servo motor with a pinion attached that advances a rack.
In our design, we cut the wood for both the console and the candy dispenser at the same time to be resource efficient. (https://github.com/alanswx/HorseArcade/blob/master/hardware/dispenser.svg)
Then, we laser cut the plexiglass.
We also 3D printed the rack and pinion. (https://github.com/alanswx/ChocolateCoinDispenser/tree/master/Box/stl)
We assembled the dispensers by aligning the wood teeth and used a rubber mallet to connect the wood walls and plexiglass. To make a hinge for the rear wood tube wall (opposite the plexiglass front) that allowed us to refill the candy dispenser throughout game play, we cut two small wood circles that we glued on to the top and bottom of the right side of the rear wall. We glued a post on both the top and bottom of the rear wood wall to insert in each circle. (See image #4). To keep the refill door closed, we used a paperclip.
Finally, we screwed in the servo motor, attached the 3D printed pinion, and aligned its teeth with the rack.
To match the printed vinyl design of the button consoles, we spray painted the candy dispensers green.
Step 6: Putting Everything Together
- Connecting all of the box consoles together and to their candy dispensers
- Connecting candy dispensers and button consoles to the Raspberry Pi
- Connecting Raspberry Pi to sender MCTRL300
- Connecting the sender MCTRL300 box to the screen receivers.
- Make sure the Pi boots into a command prompt and runs the game.