A bartop arcade build with the unique feature that the LED matrix marquee changes to match the selected game. The character art on the cabinet sides are laser cut inlays and not stickers.
A big thanks to Tobias for posting the original laser cut CAD design for this project. This project leverages the design from Tobias with the following modifications:
- An integrated PIXEL LED Matrix marquee that changes based on the selected game
- Laser cut design modified for a vertical mount monitor instead of horizontal (many classic arcade games are optimized for a vertically mounted monitor)
- Laser cut side art inlays
- Laser etched button labels
- Audio amp with volume control knob
- Shutdown/Restart Button
- Material is Acrylic vs. Wood
All laser cut .SVG files, software scripts, LED GIF images and animations, wiring table, and artwork for this project are open source and here in GitHub.
1x PIXEL Maker's Kit Arcade Bundle (includes PIXEL LED driver board, 64x32 P3 LED Matrix, and (7) 12mm dome pushbuttons) - $149
1x Arcade Joystick - $24
4x 30mm Arcade Buttons ($15, with Cherry D44X 75g .187" Microswitch)
1x 2.1mm Panel Mount DC Jack (.33" mounting hole)
1x Rocker On/Off Panel Mount Switches (you'll need 2 but the PIXEL:Maker's Kit comes with 1) - $1.17
1x Raspberry Pi 3+ - $38
1x microSD card (128 GB is a good size for this project) - $20
1x Official Raspberry Pi Monitor - $74
1x 5V, 10A Power Brick - $21
1x Audio Amplifier - $14
2x Mini Oval Speakers 35mm x 20mm - $10
1x Stereo audio cable (right angle is better but normal will fit and is ok too) - $3
2x USB Panel Mount Cable A-A - $16
1x Right angle DC power jack - $2.50
1x microUSB jack (use an old microUSB cable and chop off the large USB side)
1x Bottle of India Ink - $5
Screws, Nuts, Stand-Offs
8x 4/40 x 3/16" pan head screws (for maintenance ports)
2x 4/40 x 7/16" pan head screws ?
4x M3 screws x 5mm (for joystick mounts)
4x M3 square hex nuts (for joystick mounts)
8x 2/56 x 1/2" pan head screws black (for speakers)
8x 2/25 nuts (for speakers)
4x rubber bumper pads for the bottom
Acrylic & Glue
Misc colored sheets depending on desired arcade character inlays (optional)
Acrylic Cement Glue
Kaptop tape (for securing the cables to the Pi header)
1x USB Audio Adapter (this is not really needed, while the Pi audio is known to be poor, I can't really tell the difference with this one)
Dupont Female Pin Crimp Terminals 2.54mm Pitch (for making your own cables with DuPont connectors that plug into the Raspberry Pi GPIO 40-pin header but you can also just use off the shelf cables and splice them which is cheaper
Laser Cutter (I used a Glowforge with a 19.5" x 11 cutting area)
4/40 Tap Tool (for tapping eight 4/40 holes for the maintenance ports)
Step 1: Laser Cutting & Cardboard Assembly First
VERY IMPORTANT: Before you laser cut the acrylic for this project, be sure and have all parts on hands first and measure to ensure they fit the mounting holes in the laser .SVG files. Here are items in particular to check and adjust.
1. 64x32 P3 HUB75 LED Matrix - The one used in this project I bought direct from China, not from Adafruit and different LED panel manufacturers have different mounting hole locations.
2. Speakers - I did not use the speakers in the link and instead had some lying around my shop. The ones in the link I think are close but am not sure the mounting holes will line up exactly.
I used a Glowforge laser cutter and all the .SVG laser cut files are sized for the cut size of the Glowforge at 19.5" x 11".
Also, there are lot of ways the laser cutting and assembling can go wrong resulting in scrap due to the complexity of the assembly & specific orientation steps so it's highly recommend to first laser cut and assemble in cardboard and then cut in acrylic after you've got it dialed in.
Step 2: Back Maintenance Port
The maintenance port allows you to get to the electronics in the back if you ever need to in the future. This part is tricky, it's recommended to first assemble this in cardboard. Follow the steps in the video.
Step 3: Bottom Maintenance Port
The bottom maintenance port allows you to get to the bottom of the arcade buttons and joystick to in the future. This part is tricky, it's recommended to first assemble this in cardboard. Follow the steps in the video.
Step 4: Pi Monitor Mount
Attach the Pi monitor and Raspberry Pi. Be sure and fit the Pi monitor on the frame without the slot.
While waiting for the first layer to dry, add screws in the speaker holes to ensure alignment.
Now is a good time to install RetroPie, the pre-built image you'll install on your Pi microSD card. At the end of the RetroPie install, you'll be prompted to configure inputs. Hook up a generic USB keyboard and use these keys:
D-PAD UP - Up Arrow
D-PAD DOWN - Down Arrow
D-PAD LEFT - Left Arrow
D-PAD RIGH - Right Arrow
Start - A
Select - S
A Button - Z
B Button - X
X Button - C
Y Button - V
Hold down any key to skip the rest of the keys until you get to Hotkey Enable
HOTKEY - SPACE
When you get to OK press the button you have configured as the A Button which in this case is "Z"
Step 5: Control Panel - Joystick and Buttons
Screw in the joystick to the bottom layer with the screws and square nuts. Do a test and place the top layer on top of the bottom layer and ensure you've engraved deep enough such that the two layers are flush. Then use acrylic cement to glue the two layers together and clamp.
The Sanwa joystick I got was default configured for 8-way. My interest is 80s arcade games which are mostly played with a 4-way joystick. So this is a good time to change from 8-way to 4-way which is easily done by moving a template piece on the bottom of the joystick, this video explains how to switch from 8-way to 4-way and vice-versa. Using the bottom maintenance port of the arcade machine, you can change back and forth later after everything is installed but space is limited and it'll be much easier to do that now.
Use your the continuity tester on your multimeter and then label each wire on the Joystick (up, down, left, right).
Step 6: Front Panels Buttons and Inking Black Text
Leave the acrylic masking tape on and brush paint India ink generously. Let the India ink dry for a couple of hours or longer.
Once dry, remove the acrylic masking tape and you'll be left with some residue to be removed. Take some strong duct tape like Gorilla duct tape and press it hard on the engraved text and then tear off. Repeat this a few times and most of the ink residue will be removed. Then use either a wet soft sponge or a Mr. Clean magic eraser sponge to take off the rest.
Step 7: Wiring
Refer to the wiring diagram schematics and make the power cable which will consist of a female DC jack which will then 4 way split to the Pi (microUSB connector), PIXEL:LED ART Board (right angle DC barrel jack connector), audio mini amp (hook-up wire), and LED light bar (hook-up wire). Find an old microUSB cable and cut off the large USB connector end and splice and solder to this power cable for the connection to the Pi.
Put together a wiring table that maps each joystick direction and button to the corresponding pin on the Pi and assigned keyboard key. If you map to the same keys I did, then you can use the config files in the next steps out of the box.
You'll need female DuPont cables to connect to the 40-pin GPIO header on the Pi. I ended up making my own cables which was pretty fun but also a lot of work and you'll also need a crimper and the female DuPont terminals. It'll be faster and cheaper to just use stock female to female DuPont cables that you probably already having lying around and splice/solder them. If you do end up making your own DuPont cables, it turns out they are not easy to make, I found this YouTube video tutorial very helpful and was able to make them with ease after that.
Make the cables for the buttons and joystick and don't connect to the Pi yet. You'll connect to the Pi in the next step. In general, each cable should be ~13 inches long, that will be long enough to reach the Pi when mounted. If you can, use a different color for each cable (use black for all GND) or label each cable which will make things easier in the next step.
Step 8: LED Matrix Panel Mounting
Go ahead and remove the acrylic masking tape on both sides now.
First mount the PIXEL PCB board and then mount the LED panel on the other side. Pay attention to the orientation & make sure the LED panel is facing up matching the label on the acrylic mount.
Next mount the screw in the lower right hand of the PIXEL board to the panel.
Mount the LED panel using (6) M3 x 8mm screws. Note the LED panels are threaded for M3 screws, 4/40 will not work.
Note this LED panel is 7.5 inches wide and 3.8 inches tall and works great for this mini bartop form factor. If you have a larger build however, you will have more room for a larger LED marquee. Daisy chaining is supported for a 128x32 display like this https://youtu.be/H36Bk9wCgns . Or alternatively, you can also look into larger panel sizes https://youtu.be/DODSonCaz2w
Step 9: Putting It All Together
Now comes the fun part where you put everything together! But first mount all 6 buttons on the front red panel, the 4 arcade button and the joystick on the black control panel, and the power jack, toggle switches, and audio amp on the back panel. You won't be able to mount the buttons and joystick after the case is together due to lack of elbow room.
Follow the pictures to assemble things together but do not glue anything yet and instead use some blue painter's tape to keep things together for now. Once you get to the picture labelled "After you get here, connect wires to the GPIO Pi Header", then start to connect the wires to the pins on the Pi header.
Follow the table you put together in the previous step to connect each wire to the Pi header. It will be very cramped and not so easy to connect the pins to the Pi header so have patience.
Once you have everything connected, power the system up and do a full test that includes testing the joystick and every button. To test, we'll need to install a utility from Adafruit called Retrogame which converts the joystick and button inputs from the Pi's GPIO into keyboard inputs. By using Retrogame, you won't need a separate USB arcade keyboard emulator which is nice.
Follow these instructions from Adafruit to install Retrogame. After you've installed Retrogame, then copy this retrogame.cfg file to the /boot directory on your Pi. The retrogame.cfg file here assumes you have followed the same keyboard mappings and pin connections in the wiring table from Step 8 - Wiring. If you have used different pins or keyboard mappings, no worries, just make the corresponding changes in retrogame.cfg. Chances are you've connected a pin or two wrong so just test every input and correct.
This tutorial guides you through how to setup the combined shutdown and restart button.
Once everything is working, now you're ready to make things permanent. If you happen to have some Kapton tape, that's a nice way to secure the Pi pins ensuring they won't come loose later. Wrap some Kapton tape around the pins and Pi header. But no worries if you don't, it should still be fine.
Now turn the arcade on its side. At this point, you only have the left side installed, the right side is still open. Use your capillary action acrylic solvent applicator to glue the acrylic. Acrylic solvent works very quickly and will be sturdy in less than 5 minutes and does not need to be clamped. Here's a good primer on using acrylic solvent.
Attach the pieces for the marquee (make sure to do this before adding the right side).
Now attach the right side and glue that using the acrylic solvent.
Lastly, use a grinder or Dremel tool to grind down the left and right sides such that they are flush (the black notches may be sticking out a little bit). You'll want to do this so the outside pieces when attached will be nice and flush.
Step 10: Left and Right Outside Panels & Arcade Character Inlays
The arcade character inlays are optional but a pretty nice effect if you've got the time. If not using the inlays, then you could also use a service like this to print some side art stickers or just leave the sides solid red which would still be nice.
If not using the inlays, then modify the left and right outside panels and delete the inlay outlines. If you want personalize with your own favorite arcade characters, here's a great resource for arcade sprites. Then it's a matter of isolating each color of the sprite and then tracing in a vector program like Illustrator or Inkscape. Warning, this is a good amount of work. If you want to stick with the characters I used, use this file to laser cut each color of each character.
As you laser cut each color of each character, lay them out on a table and only glue to the arcade side once you know everything fits together right. Chances are there will be some mistakes (I made a bunch) so if you glue too soon, you'll be in trouble as the acrylic solvent is permanent.
Also VERY IMPORTANT, you don't want to use yellow color for any of the inlay characters as the side panel is already yellow. So if your desired arcade sprite has yellow, then substitute another color.
Step 11: Software Scripts for the The PIXEL: LED ART Matrix Integration
Almost done! The last step is to add some scripts such that the PIXEL: LED ART display will change artwork automatically based on the selected game from RetroPie. Fortunately, RetroPie includes a hook called runcommand which is a user supplied bash shell script that runs prior to each game launching. So we'll add our own runcommand script that passes the current game to a command line Java program that the PIXEL: LED ART board uses (pixelc.jar) that writes an LED still image or animation GIF we specify per game. As your install may include many games, you can just pick the games you want to do a special LED design for and then write a generic LED design for all the other games. I've made custom GIFs for ~35 games so you can use this to start too. And if you make your own and are open to share, please do let me know (comment here or github pull request) and I'll add to the repo for others.
Check if Java 8 is installed on your Pi.
If Java 8 is not installed:
sudo apt-get update
sudo apt-get install oracle-java8-jdk
Copy the Java command line PIXEL: LED ART program called pixelc.jar to your Pi, download here. First create a directory on your pi called pixel.
Transfer pixelc.jar from your PC or Mac to your Pi
scp /local-path-on-your-pc/pixelc.jar pi@your_raspberrypi_IP_address:/home/pi/pixel
You must have the Android only firmware installed on your PIXEL:LED ART board which is the default, the iOS/Android firmwares will not work. Double check that the PIXEL:LED ART board is USB connected to the Pi. Also ensure that the toggle switch on the PIXEL:LED ART board is facing the USB direction and not facing the BT direction. Check that your Pi detects the PIXEL:LED ART board.
And you should get back
Download runcommand-onstart.sh to your local PC. You'll modify this script for your needs and then copy over to your Pi. Let's first understand what this script is doing. The logic is the following:
1. Sets the path where pixelc.jar is located. If you copied pixelc.jar in /home/pi/pixel, then leave this line as is
2. Checks that the PIXEL:LED ART board is connected. If yes, we keep going and if no, the script terminates.
if $pixelexists | grep -q '/dev/ttyACM0';
3. RetroPie passes to this script in the form of a variable called $3 the path of the selected game rom which includes the rom name. So then we just use a long if statement to check for the games we're interested in and if there is a match, we tell the script what GIF file we want to write before launching the rom. In the example script below, if the rom path contains "galaga", then we'll write galaga.gif. If the rom path contains "pacman", then we'll write pacman.gif. You will need to have copied galaga.gif and pacman.gif to the same directory as pixelc.jar, so copy them to /home/pi/pixel . Since this particular installation uses a 64x32 LED display, your GIFs for galaga.gif and pacman.gif should both be 64x32. pixelc.jar will automatically resize your GIFs if they are not 64x32. They can be either single image GIFs or multi-frame GIF animations. Keep in mind that the longer the GIF animation, the longer it will take to write meaning you'll want to make your animations fairly short or it will take longer to load your game. Here is a sample of the contents of your /home/pi/pixel folder which works with all the sample scripts shown here and also here are some more GIFs you can use and please do a pull request if you do your own to share with others.
if [[ $ROMPATH == *"galaga"* ]];
then echo "galaga match" >&2
elif [[ $ROMPATH == *"pacman"* ]];
then echo "pacman match" >&2
4. Then we end the if statement with this which means if the game launched didn't match any of the roms we were looking for, then just write a default GIF, in this case cherry.gif
else echo "no game match" >&2
5. This last command in the script does the actual write to the LED display where the GAMEIMAGE variable was set within the if statement.
java -jar pixelc.jar --gif=$GAMEIMAGE --adafruit64x32 --write
So go ahead and modify per your needs and also copy your corresponding GIFs to /home/pi/pixel and then copy your version of runcommand-onstart.sh to /opt/retropie/all/
scp /local-path-on-your-pc/runcommand-onstart.sh pi@your_raspberrypi_IP_address:/opt/retropie/all/
Make the script executable
sudo chmod +x runcommand-onstart.sh
Here is the script for the combined shutdown / restart button.
Since this installation is for a vertical orientated monitor, you'll want to get a vertical theme for RetroPie which is a theme available from RetroPie, info here.