Overview
Build your own portable arcade machine housed inside of a repurposed record player case. The Attachécade is a Raspberry Pi-based emulation machine with built-in 14" monitor, arcade joystick and buttons, and stereo speakers. You can flip it open and play from the comfort of your couch, even when other people are using your main TV for off-label uses such as "watching television".
This project is based around the very popular (and decidedly mediocre) portable record players that seemed like a good idea a few years ago, but now tend to languish in the backs of closets. You can regularly find them at thrift shops, yard sales, and online auctions for anywhere from $5 to $30.
Once you remove the turntable parts, you're left with a sturdy, stylish enclosure with lots of room for your arcade compenents and they even come with a pair of decent stereo speakers mounted behind a grill that are plug-and-play with the Adafruit Stereo Bonnet.
Donor Portable Turntable
You may already have one, but if not you can pick up a used/broken Crosley Cruiser portable turntable at thrift shops, yard sales, online marketplaces, eBay, and others for anywhere from $5 to $30.
You'll see other brand names on these, such as Victrola. Looking at the markings, most (if not all) of them seem to be made by the Shenzhen Skywin Electronic Company LTD.
Portable 14" Monitor
Ultra-slim USB Powered HDMI monitor (these are essentially laptop screens without the laptop). These are sold under many brand names so it's a bit of a moving target, but this is the one used in the build: Wuawe 14" Ultraslim w 180º stand.
Dimensions are 12.65"W x 7.99"H x 0.36"D.
Can be found on Amazon and other online stores.
Quick Release Joystick Shaft Kit
A removeable joystick shaft is the key to making a briefcase arcade, ontherwise it can never be closed! Get a quick release joystick shaft kit with a Sanwa compatible connection, such as this one.
To simplify button/joystick wiring to the KB2040 you can have a PCB made of the KB2040 Fightstick v2 at your favorite board house, such as OSHPark, JLCPCB, PCB Way, etc.
The Gerber files are linked below.
Page last edited August 17, 2026
Text editor powered by tinymce.
Case Disassembly
Top Screws
Open the case and unscrew the four screws holding the top in place with a Philips screwdriver.
You can also remove the slipmat, volume knob cap, and 45 adapter.
Save these four screws for re-assembly later.
Spindle Clip
This step is optional and I put it here just in case you ever wanted to fix or replace the belt on one of these.
Remove the e-clip from the spindle shaft so you can lift off the platter. You can use a small flat-head screwdriver, needle nose pliers, or specialized e-clip removal tool for this.
Lift off the platter and remove the belt.
Flip the Top
Lift off the entire top of the turntable, including the MDF top plate.
Here you'll see the various connections from the rear panel and speakers to the control board.
Unbind Wiring
Clip the zip tie holding the wires together, then unplug all of the connectors from the board.
Speaker Connector
This four-conductor connector is for the two speakers, and just so happens to fit the JST jack on the Adafruit Stereo Bonnet perfectly! Go ahead and unplug this from the turntable controller.
The turntable and top plate are now free of the case.
Unscrew Turntable Assembly
Use a Philips screwdriver to remove the five short machine screws holding the turntable to the MDF top plate.
Save these screws, as we'll re-use them to fasten the 3D printed replacement.
Remove the turntable assembly and set it aside in case you ever want to raid it for parts.
Remove IO Board
There is just some hot glue holding the IO board in place, wiggle it free. Be free little board!
You can set this board aside for parts scavenging or disposal/recycling if you want, we won't be using it for the Attachécade build.
Remove Back Panel
Unscrew the two screws holding the back panel in place.
Keep these screws for later, we'll use them to screw in the replacement 3D printed back panel.
The case is now ready for the re-build. You should have the case, speakers with wiring, top plate, and three sets of screws.
Page last edited August 17, 2026
Text editor powered by tinymce.
3D Printing
3MF files for 3D printing are oriented and ready to print on FDM machines using PLA filament. Individual STL files may also be downloaded using the links below.
Slice with settings for PLA material
The parts were sliced using BambuStudio using the slice settings below.
- PLA filament 220c extruder
- 0.2 layer height
- 15% grid infill
- 200mm/s print speed
Page last edited August 17, 2026
Text editor powered by tinymce.
Case Prep
Back Panel
The 3D printed replacement back panel will be used to plug in the power supplies for the Raspberry Pi and the monitor.
Unscrew the retention nuts from both USB C panel mount adapters.
Insert the adapters into the 3D printed back panel and push it into the case as shown.
Open the case in screw the back panel in place with the same screws that were used for the original part.
Flip the nuts around so they are "backwards" with the flange facing out (otherwise they won't fit the small space). Screw them on by hand to keep them from moving.
Hinge Stops
The 3D printed hinge stops allow the lid to open to a comfortable angle and then stop. They also act as feet for resting the case on it's bottom surface when carrying through a luxury hotel lobby and then needing to set it down when approached by the mysterious gentleman in the Burberry trench coat.
Gather up the four hinge stops and eight of the M2.9 x 9.5mm sheet screws.
Hold one of the two larger stops next to the hinge as shown and mark the holes with a long pencil or marker.
Use an awl or punch to mark starter guides.
Drill two pilot holes, then screw the hinge stop into place.
Repeat these steps for the second large hinge stop.
Small Stops
Open the lid so it rests against the two large stops.
Place the smaller stops on the other side of each hinge, mark them, drill, and screw them into place.
Joystick Shaft Holder
The removable joystick shaft needs to be secured to the case when it's closed. The small 3D printed nub will connect to one of the handle brackets using an M4 threaded insert and a repurposed screw from the bracket itself.
Nub Prep
Use your soldering iron on a low temperature to press the threaded insert into place as shown.
Screw Switch-eroo
Unscrew the nut from the outer handle screw, then unscrew the screw.
Re-insert the screw from the inside of the case and screw it to it protrudes.
Shaft Storage
This will make it stylish and simple to store the joystick shaft when not in use. Simply pull up the spring-loaded collar, set the shaft on the nub, and release.
Joystick
The joystick will be mounted to the underside of the faceplate using screws and threaded inserts.
The joystick itself needs to be modified with a removable shaft first so that it'll fit with the lid closed.
Inserts
Gather the faceplate and four M4 brass threaded heat-set inserts. Heat up your soldering iron to a low temperature and press them into place.
Shaft Swap
Remove the retention e-clip from the joystick's stock shaft. An e-clip removal tool works best, but you can also accomplish this with a pair of needle-nose pliers, a flat head screwdriver, and lots of cursing.
Slide out the stock shaft, two bushings, and the spring.
Press the hemispherical plastic rotation bushing onto the short shaft.
Place the new shaft into the joystick, replace the bushings and spring.
Then, press the retention e-clip into place to secure it. Again, you can use the insert side of the e-clip tool or some pliers and a lot of good fortune to press it into place without it flying across your workshop or room.
Joystick Attachment
Use four M4x6mm screws to fasten the joystick to the top plate as shown.
Make sure the connector pins are oriented as shown here.
Screw the joystick ball top onto the removable shaft, and set the dust cover over the opening. Connect the shaft to the joystick by pulling up the spring-loaded release collar, fitting it onto the nub, and then releasing the collar.
Page last edited August 17, 2026
Text editor powered by tinymce.
Controller Setup
Small Buttons
Insert the three buttons into their holes.
Add the spring washers and nuts to secure them tightly.
Arcade Buttons
Press the six arcade buttons into their holes. They'll snap into place with a satisfying click.
Ethernet Port
Insert the panel mount Ethernet port and secure it with the supplied hex nut. Note, if it is a tight fit you can screw the port into the hole rather than just pressing it in.
USB Port
Next is adding an external USB A port extension to the Raspberry Pi for plugging in a keyboard or player 2 gamepad. You can even plug in a hub to use mouse and keyboard for system setup and maintenance in case you don't want to SSH into the machine.
Feed it through the rectangular hole and press it into place.
KB2040 Breakout
A KB2040 board with a custom breakout PCB will be used to wire up the buttons and joystick. The KB2040 will run the open source GP2040-CE firmware and connect to the Raspberry Pi over USB.
Solder KB2040 to Breakout PCB
Use the supplied male header pins to solder the KB2040 to the Fightstick v2 PCB.
A length of silicone wire or polyamide tape can be helpful for securing things to the board while soldering.
Configuration Button
Insert the tactile button switch into the board's Web Config position and solder them in from the back side. This is optional but very helpful while setting up GP2040-CE before the full sized buttons have been wired up.
Wiring Header
Use flush cutters to snip off a 10x2 section of the double-row male header pins.
Insert them into the PCB, then secure them with silicone wire or tape before flipping them over to solder from the bottom of the board.
Snip Header Pins
Use diagonal flush cutters to snip off the excess header length from the KB2040 pins. Be sure to wear eye protection while snipping these -- the tend to shoot off like tiny little evil projectiles when snipped!
Optional JST XPH Headers
You can add additional headers to the board for an external reset switch and a power LED. These are super extra and super optional.
The Reset header is soldered to G and Rst.
The LED header is soldered to D1 and G.
Mounting Plate
The Raspberry Pi and KB2040 Fightstick v2 boards will be mounted under the top plate using the mounting plate. This helps prevent too much of a wiring sandwich once everything is connected. Big thanks to a community member for suggesting this during a livestream!
Page last edited August 17, 2026
Text editor powered by tinymce.
Controller Software
Install Firmware and Customize Settings
GP2040-CE is an open source gamepad firmware that's compatible with RetroPie, Mac/PC/Linux, PlayStation 3/4/5, Nintendo Switch/Switch 2, Xbox 360/One/Series, mini consoles, and others. It runs on a number of microcontrollers that use the RP2040/RP2305 chips, such as Pico, KB2040 Kee Boar, and more.
First you'll flash the KB2040 with the drag-and-drop .uf2 file and then customize settings within the web editor.
Download Firmware
From the GP2040-CE Downloads page, click the Download button for the KB2040 firmware.
This will save a file named GP2040-CE_0.7.12_KB2040.uf2 (or later) to your download location.
Firmware Installation
This page gives detailed instructions on installation, but the basic steps are:
- Plug the KB2040 into your computer with a known good data and power USB cable
- While holding the
BOOTSELbutton down, press and release theRESETbutton this puts the board into BOOTSEL/USB drive mode - A new removable drive named
RPI-RP2will appear on your computer - Drag-and-drop the GP2040-CE_0.7.12_KB2040.uf2 (or later) firmware .uf2 file onto the
RPI-RP2drive and wait for it to copy the file and reboot itself
Pin Mapping
The default pin mapping in GP2040-CE for the KB2040 is shown here. This will work well for almost all of the buttons and joystick input, but we want to make a few modifications so we can connect an OLED screen to the STEMMA QT port, NeoPixels to pin 7 (GP07) and a Function button to pin 6 (GP06), as shown below.
To make these changes we'll use the web configurator as shown next.
| GP2040 | Fightstick | Emulation Station |
|---|---|---|
| B1 | K1 | South |
| B2 | K2 | East |
| B3 | P1 | West |
| B4 | P2 | North |
| L1 | P4 | LeftShoulder |
| R1 | P3 | RightShoulder |
| L2 | K4 | LeftTrigger |
| R2 | K3 | RightTrigger |
| S1 | Sel | Select |
| S2 | Start | Start |
| A1 | Home | Hotkey |
Button Test
This is a great time to test the controller to make sure basic button presses are working.
Plug the KB2040 into your computer with a known good USB-C data and power cable. Head to this gamepad tester in your browser to see the button presses.
You can now use a jumper wire to short any mapped GPIO pin to ground -- those button presses will register on the controller tester.
Web Configurator
Use a short wire to jumper KB2040 pin SCK/CLK (GP18) to a GND pin (see attached diagram for physical pin locations) and then press and release the RESET button. This puts the KB2040 into configuration mode. After a moment you can un-jumper the GPIO pin from ground.
This action has also caused the KB2040's GP2040-CE firmware to launch a web server you can access from your computer's web browser by visiting http://192.168.7.1
Reboot
Any time you want to leave Web-config mode and test your changes you can reboot the KB2040 into Controller mode.
Click the Reboot button at the upper right of the config page.
In the pop-up window that shows up, click Controller to restart in controller mode.
Then test out your changes. When you're ready to return to web-config, simply re-jumper the SCK/CLK pin to GND and press RESET button on the KB2040.
Debounce Delay
If you find the menu navigation in Emulation Station to be maddening when using the arcade joystick, try increasing the debounce delay from 5ms to 20 or 30ms.
Status LED
In the GP2040-CE configuration enable:
- Add-Ons > Reactive LEDs
- set LED #0 to LED GPIO Pin1
- Action: UP
- Default Mode: Static On
- Active Mode: Static On
Status LED
In the GP2040-CE configuration enable:
- Add-Ons > Reactive LEDs
- set LED #0 to LED GPIO Pin1
- Action: UP
- Default Mode: Static On
- Active Mode: Static On
Page last edited August 17, 2026
Text editor powered by tinymce.
Raspberry Pi Setup
Cooling Fan
Peel the protective backing off of the cooling plate then press it into place on the Raspberry Pi. Then, plug in the fan connector as shown.
Riser
Place the 40x2 header pin riser onto the Raspberry Pi header. This will give the Stereo Bonnet clearance.
Optional Standoffs
To keep the Speaker Bonnet from wiggling around you can optionally add a couple of nylon M2.5 standoffs and screws to hold it steady.
Install OS on SD Card
There are lots of ways to Retro game on Raspberry Pi -- for this we'll use Batocera Linux, but there are other popular gaming distros that will work, such as RetroPie, Recalbox, and Lakka to name a few.
To follow the same methods as this guide, head to the Batocera install page and follow those instructions for downloading, prepping your SD card (32GB or 64GB are a good size to include a nice collection of games as well as the OS), and getting up and running.
You can set up a temporary keyboard, mouse, and monitor or SSH into the Pi to adjust settings.
Pi Settings
The Adafruit Stereo Bonnet uses two MAX98357A I2S amplifier chips (one per channel). The Linux kernel includes the max98357a device tree overlay, and Batocera's kernel image includes the max98357a.dtbo file, so no driver compilation is needed.
Step 1: SSH
From a terminal, ssh into the Raspberry Pi:
Default password is linux. If the hostname doesn't resolve, use the Pi's IP address.
Step 2: Remount /boot as Writeable
By default /boot is read-only. Remount it writable for this session:
mount -o remount,rw /boot
Verify it worked:
echo $?
Should return 0. Note: /boot returns to read-only after each reboot, but file edits written to the vfat partition persist permanently.
Step 3: Confirm Overlay
ls /boot/overlays/ | grep max
You should see max98357a.dtbo in the output.
Step 4: Add the Device Tree Overlay to config.txt
echo "" >> /boot/config.txtecho "# Adafruit Stereo Bonnet" >> /boot/config.txtecho "dtparam=i2s=on" >> /boot/config.txtecho "dtoverlay=max98357a" >> /boot/config.txt
Verify the lines were appended correctly:
tail -5 /boot/config.txt
You should see:
Adafruit Stereo Bonnetdtparam=i2s=ondtoverlay=max98357a
Step 5: Set the Audio Device in batocera.conf
echo "audio.device=hw:MAX98357A" >> /userdata/system/batocera.conf
Step 6: Reboot the Pi
reboot
Step 7: Verify the Card is Detected
After the Pi restarts, ssh back in and run:
aplay -l
You should see output like:
card 0: MAX98357A [MAX98357A], device 0: 1f000a0000.i2s-HiFi HiFi-0 [...]
HDMI audio cards (vc4hdmi0, vc4hdmi1) will also appear — that's normal.
Step 8: Test Audio Output
Plug in your speakers, then play white noise to confirm the speakers are working:
aplay -D hw:MAX98357A -r 44100 -f S16_LE -c 2 /dev/urandom
You should hear static from both speakers. Press ctrl+c to stop.
Step 9: Set Audio Output in Batocera UI
(We'll do this step later when the full machine is built, but I put it here just for completeness or in case you have temporary controls and monitor hooked up)
- In EmulationStation press the START button to open the main menu
- Go to System Settings > Audio Output > Built-In Audio Stereo
- Got to System Settings > Audio Profile > MAX98357A Stereo Output
This ensures EmulationStation and all emulators route audio to the Stereo Speaker Bonnet.
Troubleshooting Audio
aplay -l doesn't show MAX98357A after reboot
- Confirm the overlay lines are at the bottom of
/boot/config.txtwithtail -5/boot/config.txt - Confirm max98357a.dtbo exists in /boot/overlays/
- Make sure the bonnet is fully seated on the GPIO header
No sound from speakers
- Confirm
audio.device=hw:MAX98357Ais in /userdata/system/batocera.conf - Check the EmulationStation audio settings and confirm MAX98357A is selected
- Check ALSA volume:
amixer -c MAX98357A— if Master is at 0, set it withamixer -c MAX98357A sset Master 90%
/boot is read-only when trying to edit
- Run
mount -o remount,rw /bootbefore editing — this is required after every reboot
Additional Notes
- /boot remounts read-only after every reboot but file changes persist on the vfat partition
- batocera.conf and all files under /userdata survive Batocera system updates
- The MAX98357A has no hardware volume register — volume is controlled via ALSA software mixing
Mounting Plate
Add three M2.5 x 6mm threaded standoffs and screws from the underside of the mounting plate as shown.
Fasten to Lid
Fasten the mounting plate to the underside of the lid using the remaining two original short flanged sheet metal screws as shown here.
Pi Mount
Fasten the Raspberry Pi to the mounting plate with three M2.5 x 4mm nylon screws ash shown.
Insert the prepared MicroSD card.
Ethernet Pass-Through
Connect the short Ethernet cable to the panel mount adapter and the Raspberry Pi's Ethernet port.
USB C Power
Plug in the USB C power cable into the USB C power port on the Rasbperry Pi. Later it will be plugged into one of the two USB C panel mount adapters on the back panel of the case.
Controller USB Connection
Plug in a short USB C to USB A cable from the KB2040 to a USB A port on the Raspberry Pi.
Page last edited August 17, 2026
Text editor powered by tinymce.
Wiring Harness
The wiring harness makes plugging in the buttons and joystick nice and straightforward. The harness is segmented into five sections: joystick wires, four bottom (K) row wires (we're only using three in this build), four upper row (P) wires, four special button (Start, Home, Select), and the ground line.
Notice the daisy chain of black ground wires in the photo below, these help keep the bundle under control.
This is what the wiring looks like directly connected to the KB2040, but you won't need to wire directly if you use the Fightstick v2 breakout board and the Brook wiring harness as shown in the diagram above.
Header
Plug the arcade wiring harness into the header on the KB2040 Fightstick v2 breakout as shown. Be sure to orient it properly.
Joystick Plug
Plug in the joystick socket as shown.
You can also neaten up the wiring sections as you go with a zip tie.
Ground Control to Major Buttons
Connect one leg of each button to ground using the ground wire daisy chain. Press the terminal connectors into place firmly.
Small Buttons
Connect the three small buttons as shown. These are, from left to right in the photo, Start, Home, and Select.
Status LED Side Quest
This is a totally optional side quest, but if you'd like to go all out and add a power on LED, follow me... Remember that volume knob/headphone jack/power LED board we yanked out of the original record player?
It's a nice little 3mm red LED. Snip it off and wire it to a 1kΩ resistor and an arcade button wiring cable (or other JST 0.1" connector) to plug into the D1/GND jack that was added to the KB2040 Fightstick v2 board.
Bend the legs a bit if needed and press fit the LED back into its original spot in the MDF top plate.
Then plug the connector into the KB2040 breakout board.
Page last edited August 17, 2026
Text editor powered by tinymce.
Testing
Ribbon Cables
Assemble the two DIY cables that will be used to connect the monitor to data and power.
For the USB cable, connect a straight USB C plug to each end.
For the HDMI cable, connect the angled micro HDMI plug on one end and the mini HDMI plug on the other.
Testing
Before assembling everyting into the case, it's a good idea to test the setup. Plug your monitor into USB power. Connect the Raspberry Pi HDMI out to the monitor with your micro HDMI to mini HDMI cable.
Power up the Raspberry Pi with a good USB C power supply (5.1V 3A at a minimum).
If everything is wired up properly, you should see the Batocera boot screen. Test out the buttons and joystick as well before moving on.
Page last edited August 17, 2026
Text editor powered by tinymce.
Full Assembly
Cable Feed
Feed the ribbon cables through the top plate as shown here.
Plug the micro HDMI cable into the Raspberry Pi HDMI port closest to the USB power port.
Then, plug the USB C ribbon cable into the panel mount adapter.
Speaker Connection
If the connector fits, plug the speakers into the JST connector on the Stereo Bonnet. If not, clip, strip, and screw the wires into the terminal blocks as shown.
Small Panel Switches
There are two holes left in the top panel from the original turntable control board -- you can optionally add two more switches there to finish things off.
You can bore out the holes a bit and use these 16mm buttons, or even better, grab some 7mm pushbuttons like these which will fit the holes as-is.
Screw them into place with the provided nuts and attach arcade button quick-connect wire pairs.
Plug one into the KB2040 reset button breakout on the Fightstick v2 -- this is totally optional but pretty convenient if you ever need to put the board into config mode without opening the case.
The other can remain disconnected for future upgrades. It also makes for a handy place to store the joystick dust-cover disc!
Weighted Plate
This is highly optional -- if you want to add a bit of heft to the base to counterbalance the lid/monitor, add a 16 gauge 12" x 8" steel plate to the base. You can get a sheet at the hardware store, or online. Adhere it to the base.
Page last edited August 17, 2026
Text editor powered by tinymce.
Play Some Games!
Power the Attachécade
Plug in the USB C power plugs and get ready for fun! You can use optional right-angle USB C adapters to help wrangle the cords, and pass the wires through the hinge stops for strain relief.
Deploy the Joystick Shaft!
Open up the case and put the joystick dust cover over the shaft nub, then place the shaft onto the nub.
Console Selection
Move the joystick L/R to select the console/machine emulator, then press A to pick.
Pick a game in the emulator's game list and play.
Interface Essentials
Raise or lower game volume by pressing HOME + JOYSTICK UP / JOYSTICK DOWN
To quit a game back to the main system menu, press and hold HOME + START
When you're done playing, press START from the main system menu and go to the Quit menu. Pick your shutdown option from there.
Transport and Storage
When you're done playing, you can close up the Attachécade for safe transport or storage. First, remove the joystick shaft and attach it to the nub.
The joystick dust cover can be set over one of the small panel mount buttons.
You can wrap your two power supplies around the hinge stop feet.
Page last edited August 17, 2026
Text editor powered by tinymce.