AMPi4 – Custom Amiga Inspired Pi4 Case with Mechanical Keyboard

3d Files are here: https://github.com/Markeno76/AMPi4

Some may ask why make a Wedge case with Mechanical Keyboard with Full Size Ports for the Pi4b when there is the Pi400. I do like the Pi400 it certainly has it’s place. The AMPi4 was made for a bit different use case. I wanted a complete case with a mechanical keyboard, robust full size ports, a bit of weight to it, as well as SSD/NVME for storage and the OS.

If you look at my other posts here, you will see I like working with many of the 80s era computers. I never had an Amiga, and they are quite expensive these days. I also don’t want to dedicate more space for the storage of Retro Computers. I found after I started to get more and more Retro Computers around, that I am less and less likely to go to the effort of connecting one up and using it.

First I looked at the Pi400, which I thought may be a good option for Amiga emulation, and possibly more of the retro computers. The keyboard didn’t feel right, it was to small and too light so it easily to slides around the desk. The power adapter and other connectors are easy to accidentally pull out playing games etc. I also don’t like SD Cards for the OS as I have lost a few over the years in Pis. In many cases a Pi SD Card can quickly and easily be recreated or restore from a backup copy. For this setup, it takes a bit of work to get the OS just right, also it is to be a Living OS. I want to use it for Retro Computer Emulation, but I also want to use it for Linux with the GUI as a more modern option for basic usage and possibly some development work for various Microcontrollers and such.

I did also try Amiga Forever on my Windows pc, but it just doesn’t feel right on a wide screen LCD and Tower pc.

There are a number of Keyboard Wedge cases people have created for emulation systems. There are some for the Mister, which also I believe had a Pi option. I had seen some cases that take the Pi400 and wrap it into a larger case. I just did not find a case that was exactly what I was looking for. They were generally missing something I wanted in the system. They generally were a bit complex in design, with many parts and well they did have some style to them.

I expected I could come up with something that had all the features I wanted and be simple to print and build. It is a rather basic design. Mostly made to be easy to print, but certainly I am not that creative or very experienced in 3d modeling.


With that I looked at what I want in this setup:
1. Amiga Wedge inspired case. The initial case looked more like the Ti99/4a in profile until I narrowed the electronics compartment at the back.

2. Mechanical Keyboard

3. Full size HDMI Ports

4. Ethernet Port

5. USB Ports accessible, and more of them.

6. SATA SSD or NVME Drive

7. Internal Power Supply. This adds to it being simple to connect and adds weight to the system.

8. DB9 Ports for Joysticks (This doesn’t work quite right, I may yet get that sorted.. For now I have let that alone.)

Below is a view of the Second Revision of the case design that I printed. Some photos may be of the First Revision. There is a newer revision of the case with mostly small modification to adjust for some “mostly workable” but inconvenient items. I do plan to print that newest version of the case at some point. This part of the case is 300mm wide, so not every printer can print it. My S8 printer is 310×310, it seems that it is not possible to get the full 310mm though I got about 307mm with a correction to the alignment. That alignment issue had caused a mess with the First Revision print on the left side as it was trying to push the bed further than it actually could be moved.

Looking at the back panel, the far left hole is for the momentary Safe Shutdown Button that I put standard on just about any Pi project. It is the same type of setup as my Bartop Arcade machine. Next is the IEC AC Power port. After that is the Fuse. There is No Power Switch, I kind of would like one, but it was getting crowded. Then the 2 full size HDMI ports with the 30mm Fan beside them. RCA ports for the Composite Video and Audio output. Then a place for a standard Keystone jack, which I installed a RJ45 jack into for ethernet. Then a single USB Port. The far right side there just the place for the DB9 Joystick ports and the USB3 Hub ports and mounting posts for the screws. The Pi4 standoff screw points there in the middle of the case and holes for mounting the Meanwell 5Volt power supply.

To design the case I had to work out the parts I was going to use inside. I needed to make it big enough and get placement for all the parts. I created placeholders by measuring various components and making simple placeholders for them. Yes it would have been better to build the case in something other than Tinkercad. I would rather use something else, but that is all I had enough experience with at the time. The Keyboard Tray was started in Designspark Mechanical. I found I just wasn’t familiar enough with it, and it was slowing me down making it likely I would give up before finishing the project. I then went over to Tinkercad to design most of the case.

I already had two of the type of keyboard I chose, so I knew the how it was built. I was thinking initially to only design the electronics enclosure and attach the whole keyboard to the top of it. I decided to recreate the keyboard case “tray” instead. The keyboard tray/case is tapered a bit, making it problematic, the “feet” and “cord” openings were not optimal either.

Below is the original tray and my test print of the recreated tray. The Keyboard tray is two parts as it is well over 300mm wide maximum my largest printer can print. You can see I am at that point using the black keyboard instead of the white one. They are physically identical, just different plastic and paint colors.

Keyboard Parts

My first print print of the keyboard tray showed me the post positions were off and unusable. I adjusted for that and ended up with something closer. Even at being closer, the far left two posts are too far left by a little bit. Two others there are more slightly off. The smaller right side part was just about perfect for all posts, it was a second print as well. The posts were positioned based off of measurements, which wasn’t the easiest to get perfect. I think I did measure starting at the right side, so any variance was likely to get worse going further to the left side of the keyboard. I have since revised the position of those posts.

There is an issue in that the holes are to small and the posts tend to sheer off at the base. I carefully drilled the screw holes a bit larger after printing. I would revise the hole side on the 3d model, except it is in Tinkercad, and that’s really not practical in Tinkercad. That is why I wanted to use something else to make these models. If I had worked out using DesignSpark Mechanical or some other 3d design package it would have been an option to resize thoses holes after the fact. There is also variation in 3d printers, so you may find hole sizes are a bit different anyway, but likely not going to be large enough When it is together it is very solid. Not all of the posts are screw posts, some are just supports that don’t need holes at all.

Mounting Studs

The keyboard is mounted with brass inserts. These inserts are actually in the Top not bottom, but the screws come up from the bottom. They are very unlikely to ever pull out as they are pulled in tighter by the screws from the other side. Those are the four in the top of the keyboard that rest on those posts/pillars. The inserts in the keyboard tray here are actually salvaged out of old broken laptop cases. The 4 here in the upper area where the posts are did take longer screws I believe. I have a selection of Metric m2.5 screws of different length. There are also 4 more along the bottom edge of the keyboard as can be seen as holes without the inserts in them in the first keyboard photo. Those four lower ones are short screws.

Above is the original black keyboard when it was being installed.

Above you can see the various internal components test fit into the chassis. The USB Cable was modified already. The first revision the DB9 ports didn’t fit, the fan had an integrated grill that printed awfully and blocked to much of the fan.

Internals

Above most of the internal wiring is completed. The DB9 Joysticks ports are not yet wired to the GPIO and the Fan isn’t wired in yet. It is quite tight in there. The wires on the GPIO are going to the two LEDs on the top cover. Power and Activity lights.

Custom USB Cables and revised “corner”

Above is the second test print of the corner of the case as the DB9 ports didn’t fit and the USB Hub wasn’t properly positioned. The little black cable is the cable I made up for connecting the USB Hub. Due to the limited space those cables are made up with usb connectors without the shell covering them. The bottom cable there is the short keyboard usb cable, it plugs into the bottom of the keyboard where that square opening is in the keyboard tray.

More Internals

The 5V case fan is powered that little buck converter there between the power supply and HDMI port. The fan was louder than I liked, so I used the buck converter to lower the voltage a bit to make it quieter. You can see the 2.5″ SSD Drive is in the case. It also still has the 2gb Pi4 in it in this picture.

The DB9 Joystick ports were very problematic. The first option for using them didn’t work at all, well it made my Power and Activity LEDs not work. The other options I tired required rewiring them to other GPIO pins. They were unreliable. It would have incorrect button presses as the timing must have been off for some reason. I was initially only going with Atari 2600 or the Commodore 64 3 button hybrid, but when those didn’t work I went with another option that was to have supported the Sega Genesis 6 Button controllers. I am not sure if the issues can be sorted. I have went to building and using a USB DaemonBite Retro Controller adapter setup for the Sega Genesis 6 button controllers. It even seemed to have faulty timing issues with the Genesis Controllers. I found a fix for that which seems to be working properly now. The DeamonBite adapter can be seen in the picture below. It is the more or less triangle shaped blue box to the right side with two DB9 ports on it. It is actually a simple build with an Arduino board controlling it. The case was available on Thingiverse. I want to go back to get those DB9 ports working off the GPIO. I have thought of putting an internally connected DeamonBite controller and wiring it to the case’s ports. That would loose me my USB2 port in the back though.

The system runs Raspbian and Retropie. I have it setup to boot into Retropie, but I can exit that and go into the GUI and use Raspbian. The main intention of this system is to run Retro Computer games. I worked to set it up primarily for Commodore 64, Atari 8bit, Ti 99/4a and Amiga emulation.

It was setup with at 2.5″ SSD Drive, and I ended up switching to an NVME drive later on. The keyboard was the cheapest version of the Redragon K552 87 key keyboard which was the Black version with Red Switches. I don’t like Red Switches. Once I was confident that the project was going to work out, I purchased the more expensive White version with the Brown Switches that I prefer.

The newest Revision 3 main case has various changes. Mostly small alignment changes. The Pi is moved to the left because the 3.5mm jack couldn’t fit without the outer plastic cover on it. I may not have moved it enough, I am not sure as the space is very limited and I have not reprinted it yet. Some other small adjustments to the back ports. I also changed the “vents” below the keyboard in the main frame as with the current shape they didn’t print very well.

I later found out that the key switches on the keyboard are removable. They aren’t quite “standard”, the contact pins on the bottom are smaller than standard switches. They probably won’t make contact in another keyboard. Standard switches won’t fit into the keyboard without filing the contacts down to be narrower like the ones that come in it. It is possible to do, I replaced several of the switches in my son’s keyboard as W A S D etc were worn and not working well. I will see if the Key Switches that Adafruit sells hold up better than the factory switches did.

STL 3D Model Files are here:

https://github.com/Markeno76/AMPi4

Main Parts List:

There were various other supplies, M3 Brass Inserts for the top cover, some M2.5 Brass Inserts for the keyboard mounting. Various M3 and M2.5 screws of different lengths.

Another Bartop Arcade Build

I ended up building a second Bartop Arcade. This one has a few changes compared to the first one. The cabinet is made with grey Melamine coated fiberboard. So it didn’t need painted. I also didn’t do the cutout of cabinet or the main assembly. The marquee top issue was addressed and cut to the proper angle. The Door was properly sized. The cabinet is assembled with Kreg Jig pocket screws and not corner blocks. For the fan the larger “speaker” pattern was used at the bottom of the door. Edge banding was used on the back of the cabinet instead of tmolding. The edge banding was used on the edges of the door and door opening, any of the board ends that weren’t covered with the Melamine coating. It makes it look very clean.

With the VESA Mounted monitor, it is cleaner inside, with more room. This build is a better fit to put a small or “Tiny” form factor PC into with Ubuntu and Retropie instead of using a RaspberryPi with Retropie. The Pi5 is out now, which is even more powerful than the Pi4 used on this build, but as of 3/24 does not yet have a Retropie Image made for it, although it is possible to do a manual install just as I did with the Pi4 on this build back when it didn’t have a build for it then. I don’t know the limits of a Pi4 or Pi5 and what it can’t run, but I expect there are plenty of (even used) Tiny PCs out there that are even more capable. It is good though that the Pi4 prices have come back to proper retail pricing, and the Pi5 is having some availability, so they are again at least viable options. With the Pi4 I don’t think ventilation is an issue, with the Pi5 it does run warmer, and with a PC you may want more ventilation that was put into this build.

here you can see the lock placement was a bit different. I also used one of the spare 30mm buttons for the safe shutdown.

The monitor was specifically purchased for this build. It is a BenQ 24″ IPS Monitor Model GW2480. This monitor supports using a VESA mount, so this time it is mounted with the VESA bracket. That made it much cleaner inside as far as not having that big block in the way in the middle. This monitor is larger than the one in the first cabinet. It “just” fits. Some 24″ monitors do not fit, this one does as it is virtually bezel-less on the sides and top. I used the same techniques for the plexiglass bezel on the monitor, there was very little black on the sides with this one though.

The back of the control panel has a piece on it that the plexiglass panel slots into so it doesn’t flex there. You can just see part of that piece of white textured material there below the edge of the monitor, that is the part the plexiglass rests into the front and it is attached to the control panel board. For the Marquee I went with the same design, as well as the same speakers. I am also using the same type of Meanwell dual voltage power supply.

There are other changes on the inside, for this build I am using a Raspberry Pi 4 not a 3b+. The basic reason being the Pi 4 is the same price and a more powerful system. When I build the unit there wasn’t yet a supported build for the Pi 4 though. In the end the only features that wouldn’t work for me was the splash screen/video.

I did run the speakers to the audio jack on the Pi this time tough. I couldn’t do the audio from the HDMI off of the BenQ and get rid of the static. Running the audio off of the Monitor audio out in the last one had eliminated the noise from the shared power supply on the speaker and Pi, but this time with this monitor that didn’t work. I had to put in a ground loop isolator. It is hard to make out much of it, but it is sitting there at in the middle of the bundle of wires. It is a little unit that has what looks like “Design” on it it is actually “Besign” Ground Loop Noise Isolator available on Amazon for $8.99 usually. I have had a number of these little units, one being in my pi1541. Since putting the audio through the monitor out didn’t fix the ground loop, I went strait to the Pi’s audio jack, as the output on the monitor I believe was much lower making the speakers not as loud.

The Pi4 does get hotter, and requires a good cooling solution. I went with a heatsink style case with the 2 fans on it. This case keeps the Pi nice and cool, the fans are not very loud. It is attached to the bottom of the cabinet with a piece of Velcro.

Here is another view, just showing the fan mounted in. You can also see the the stopper block in the middle of where the door closes. I think the unit looks much nicer inside. You can’t see it any pictures I though to take, but the controllers use a different pc board design. The ones I have used before are the kind with a header for a permanently attached usb cable, these have the usb port and use standard usb a to b cables. The order of the buttons is different. So it took me a little while to sort out how to wire these in the exact same order as my other cabinet and usb arcade stick. Having everything wired the same lets me use the usb arcade stick I had made as a third player controller. I also can have a single Retropie image for any cabinet without having to reconfigure the controllers. My Pi3 SD card is not compatible with the Pi4 though. I used alternate instructions on getting a new image setup with the Pi4. I built this back in the end of January, but they have since released a new version with “beta” support for the Pi4. The game scraper has not been working on either machine, but the update is listed to have fixed that. To set this one up, I pulled game info and images from another Retropi install that I have.

Here you can see how narrow that black border is along the sides. The larger screen goes nearly to the edge on this build. It looks like I still had the tape on the speaker grills as the silicone that I used to install them was still curing.

Here you can see a better view of the Marquee as the unit is powered off. The marquee is the same design and print that I made for the first one printed on the inkjet printer. This marquee is slightly shorter, that is why the Atari is about to get cut off in the trim pieces. I don’t think I went over the trim pieces in the last build, they are cut from some angled vinyl window trim pieces I had left over. They go back in between the mdf and aluminum pan to hold them in, and have a short lip that goes up and holds in the plexiglass.

The other changes with it are that I ended up doing a 3d printed customized volume knob for the speakers. The knob is nothing special, it was off of Thingiverse, so that I had the proper shape and fitting, I then stretched it in Tinkercad to be tall enough. It did have a bit that stuck out to denote the position, I removed most of that, as there really is not a relative marking on the cabinet. I did it in white so it would not stand out too much. I also ended up designing and printing out some speaker covers on my 3d printer. They are nothing fancy, and are held in with some clear silicone in the openings. With the first one, I used the 2″ desk insert pieces with the fabric, I didn’t have any fabric or 2″ desk grommet inserts.

The Melamine coating saved a lot of work. The draw back being it is a very thin coating and brittle. It is easy to chip out and not much can be done to fix it that I know of anyways. The fiber board in it is coarse board not the fine cardboard like consistency of the MDF, which I think may make it lighter. Tmolding is just very slightly undersized, this exposed some of the unfinished edge of the board. With the MDF black cabinet, I had paint on the edge although not as smooth or well coated as the other surfaces, so that is more hidden on it. If I had realized that, I would have painted the edge of the board before putting on the tmolding or had the edge banding put on it all around. Overall the cabinet is lighter, I think partly the coarser board rather than the MDF, also the lack of a base on the monitor as well as no blocking to build that up. The monitor itself may be lighter even though it is a bit larger. Then there is the lack of corner blocking that may very well add up overall.

It is certainly different looking than the first cabinet. I like it though.

If you are interested and have not seen the other Bartop cabinet posts I do go into more detail there. This just notes many of the differences on this build. I have also posted about an AirMouse project that I made to use as a Zapper replacement for Duck Hunt.

AirMouse for Light Gun Games

Since I built my Bartop Arcade I have been wanting to play Duck Hunt. I knew the original Light Gun could not work with the Raspberry Pi on RetroPie. I came across that you can use a mouse, which wouldn’t be fun. I knew the Arduino Pro Micro (and a couple others) could emulate a Keyboard or Mouse. There was a video about a year ago on the Element 14 Presents Youtube channel “NES Zapper on Retropie”. It is the same concept with a little different components. The Pro Micro board is a cheaper option than the board he used there. The boards based on the ATmega32U4 have a built in USB inferface on the ATmega chip, where the more common Uno Nano, and Pro Mini do not support being used in this way.

Using that as the base idea, I found various info on making an Air Mouse using a GY-521/MPU-6050 module attached to the Pro Micro board. I had found a video by “Asiq’s Theory” on Youtube with a basic Air Mouse using this setup along with code. I can no longer find the channel or video though.

I didn’t have either the GY-521/MPU-6050 board or a Arduino Pro Micro so I had to get them in to try this project out. I have plenty of Arduino Unos and Nanos around, but I hadn’t purchased any Pro Micros. The boards are similar but I usually use an Uno for prototyping then I can directly do that to a Nano without any code changes, where the Pro Micro with the different ATmega model is slightly different as well as slightly more expensive. I had been wanting some Pro Micro boards for keyboard projects in the past, but I never got into anything with them to this point. Once they arrived I took built it up on breadboard to test operation.

I ended up looking for a decent 3d model to use as a light gun model. I couldn’t find something that I could print reasonably for the amount of effort I wanted to put into this project. Really I don’t see this getting much use, mostly a little Duck Hunt now and then, maybe a few other games. I did end up finding a model I could use as a basis that had a completely different intended use. https://www.thingiverse.com/thing:2560577 I can print it as two parts now without any support. It feels pretty good to hold it. I went with some larger buttons I had in my stock with snap on caps.

I did my initial modifications included taking away parts from the model and slicing it in half. I also cut an opening for the usb cable as well as areas inside to hold the electronics. I did that work in Tinkercad. It works well enough for modifying things, but I wouldn’t want to use it to start it from scratch. I am looking for another program to use that I can get familiar enough to make items from scratch though. I first made a blue printed prototype half. It worked out fairly well, the Pro Micro fit in the area I made for it and the MPU-6050 board fit great as well. I put the 6050 forward in the gun expecting better readings of the motion, I am not sure if it makes much difference. That first half is basically a hollow shell, then I had to go on and make the other half “hold” everything. For the buttons I used my calipers to measure the button dimensions and built a placeholder model that I was able to use to give proper placement in the frame. It let me build up the back support and I slightly over sized the button “caps” so I could use them as holes to cut into the model. I also made a mock up of the MPU-6050 board so I could model in posts to hold it in place. I cut in recessed screw holes in the right side as well. For the prototype gun also had 3 opens in the shell that were from the original model that I then had to fill in so I printed them as extensions off of the right side on it. The screws I used used pointed screws to go into the left side making holes as I put them into it. That is holding that prototype together quite well so far.

After the first one was done, I decided I would make another for the second cabinet in Grey. For this one I reworked the left side with the holes filled in. I also setup to put in threaded inserts into it. This was the first time I used them, and I wasn’t sure what size to make the holes. They went in, but not very well and I ended up giving them more support and hold with glue so they hopefully won’t pull out. Otherwise the inserts are working well. They are very cheap and not well made though. For the Grey gun I tried to line up the usb cable coming in more to the center of the Pro Micro holding area. I placed it in a cut out to hold a zip tie as strain relief in the cord area. I didn’t make enough room for the “head” of the zip tie though, so when I put it in I cut out a smaller square deeper into the shell so that it would slot the whole way in and I could properly close the gun. It worked out very well. Still I have had to make my own custom cables to get enough room in there for the cable and the Pro Micro. I may rework the model a bit more to see if I can get a standard MicroUSB cable inside instead of soldering up a minimal one of my own.

Grey Model

The 3d model is posted here: https://www.thingiverse.com/thing:5805908

The electronics are mostly the Pro Micro and MPU-6050 board. The additions are the two momentary switches with pull down resistors wired to ground to prevent false presses. As an added feature I put in a green 5mm LED with an appropriate current limiting resistor in the tip that glows when pressing the trigger button. The device is a motion sensitive mouse using the accelerometer feature of the GY-521/MPU-6050 module. The Trigger button is the Left Mouse Button, and the other button is the Right Mouse button. So it isn’t like the old Light Gun where the game knows where the gun is pointing. It is based on relative motion, and so Duck Hunt has an onscreen cursor. It isn’t the same, but it still is fun. Those Ducks are tricky even with a cursor. To keep the gun relatively lined up, between rounds I point the gun to the upper right corner of the screen making sure the cursor has moved the whole way up there.

For the base code and initial wiring I used info from a post and YouTube video by “Asiq’s Theory”. I think it was under 50 lines of code. It was about the bare minimum to get one of these MPU-6050s working and that was very helpful to me to break down what changes I needed to make.

The exact code for one gun doesn’t work for the second one as each MPU-6050s seems to be slightly different. That is as far as “standing still” status. If that is wrong, then the cursor will constantly drift in either up or down or left or right. So a couple numbers are changed to kill the drift. I think for the one I had to do a +3 to the X (which is left/right) and the other a +4.

Asiq’s code had been based on a different orientation of the MPU module, so I adjusted for that and the code also included pauses and would freeze the cursor when pressing the button. It made it pretty good for an air mouse on a computer, but bad for tracking Ducks on the screen. This means these are not very good mice,

The Air Mouse can be pulled into about any pc and used, but as it is constantly tracking the action of pressing the buttons tends to move the cursor even if you are quite careful. You could make a more proper Air Mouse with the same components and a bit different code on the Arduino board. I have thought of making it so that if one of the buttons was held down as it was plugged in that it would make it behave differently. Still this is was to be a relatively quick project that I don’t expect to use all that heavily.

Parts:

This project uses an Arduino Pro Micro and a GY-521 Accelerometer Gyroscope Module. There are two buttons with 10k pull down resistors on them. There is also a single LED with a 1k Resistor to limit the current on it. Those bits of information are on the Code below as to what they are and what pins they goto. The resistor values aren’t critical. You could use 20k for the pull downs and possibly higher, you could use something a bit lower than 10k for the pull downs but the lower you go the more current that is drawn when pressing the button. For the LED resistor you can go as low as 330 Ohm for the LED and be safe with most any standard LED, I also commonly use 1.5k and sometimes higher for LED current limiting resistors.

Arduino Pro Micro clone: https://www.amazon.com/HiLetgo-Atmega32U4-Bootloadered-Development-Microcontroller/dp/B01MTU9GOB/

GY-521 Module: https://www.amazon.com/HiLetgo-MPU-6050-Accelerometer-Gyroscope-Converter/dp/B00LP25V1A/

12x12x7.3mm Tactile Push Button: https://www.amazon.com/TWTADE-Momentary-Tactile-Button-12x12x12mm/dp/B07CG7VTGD/

Resistors, 1k an 10k: https://www.amazon.com/EDGELEC-Resistor-Tolerance-Multiple-Resistance/dp/B07QJB31M7/

LED, hopefully you have a couple, or you can pick them up on Amazon etc too.

All links are current as of posting this in 2/4/23 none are affiliate links or anything.

Below is the code for the Arduino Pro Micro Line 78 and 79 are where the drift adjustment numbers are Currently the “+7” on Line 78 and the “-1” on 79. I am referencing “Test code” that Ashiq mentioned, again I can’t find that source to get it. I guess Ashiq’s video was deleted or channel on Youtube or something, if someone finds it let me know so I can reference it properly. That code would return numbers from what are the gx and gz values. Using those values as a starting point, I guess I had something around a constant 400 and 100 respectively out of the 6050. The point of Line 78 and 79 are to get us a result of 0 if the Air Mouse is not in motion. Changing the divide by 150 will change the speed at which the mouse will track and possibly throw off your adjustment values at the end by a number or two. You may notice the Serial.print at the end there, that returns the vx and vy values that are created on line 78 and 79. So if you open the Arduino (or other) serial monitor set to the 9600 and to the serial port the Pro Micro is showing up as and look at those numbers you can use that as your Test code to get an idea of what changes you need to make be it to the 400 or 100 or the minor fine tuning numbers at the end of those lines. The goal is to get the values to 0 when the gun is not being moved. If you make the “dead zone” area to large you can’t make fine movements, which makes aiming even more difficult. These motions are relative, and not to “scale”, so at the start of a round you point at the screen, but to get the cursor to move the way you want you likely end up pointing in a very different place by the end. You can quickly move to aim at the center again and over correct to get the cursor more inline with where you are pointing. It is hard to describe. I enjoy it for a few rounds of Duck Hunt, for longer round games it may not be as much fun. I don’t know for sure as I haven’t played other games with it to this point.

Air Mouse Code for the Pro Micro is below:

#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>
#include <Mouse.h>

/*
  Name: Prototype Arduino Pro Micro AirMouse
  Author: Markeno
  Created: 3/7/2020
  Version .99
  Based on a sketch posted by "Asiq's Theory".

  Feature:  USB 2 Button AirMouse for RetroPie Gun

                     +-----+
        +------------| USB |-------------+
        |            +-----+             |
    D1  | [ ]1/TX/INT3            RAW[X] |    
    D0  | [ ]0/RX/INT2            GND[X] |    
        | [ ]GND                  RST[ ] |    
        | [ ]GND                  VCC[X] |    
    SDA | [X]2/INT1    ___         21[ ] |   A3
    SCL |~[X]3/INT0   /   \        20[ ] |   A2
    A6  | [X]4       / PRO \       19[ ] |   A1
        |~[X]5       \Micro/       18[ ] |   A0
    A7  |~[x]6        \___/   SCLK/15[ ] |     
        | [ ]7/INT6           MISO/14[ ] |     
    A8  | [ ]8                MOSI/16[ ]~|     
    A9  |~[ ]9                  SS/10[ ]~|   A10
        |                                |    
        +--------------------------------+  
		
		Based on: http://busyducks.com/ascii-art-arduinos
		
		Gy521 2=SDA 3=SCL, RAW to GY521 VCC in (didn't want to work from the PRO Micro VCC pin), GND to GND 
		4 Left Mouse Button, 10k Pulldown to Ground, press to VCC
		5 Right Mouse Button, 10k Pulldown to Ground, press to VCC
		6 Additional Wire, for an LED in the tip when the main trigger was pressed.
*/

MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;//Variable for the Accel and Gyro Data
int vx, vy;// X and Y axis variables

const int button1 = 4; //For Left Mouse Button
const int button2 = 5; //For Right Mouse Button
const int fled1 = 6; // For Tip LED

int responseDelay = 10;
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time Button was updated
// constants won't change:
const long interval = 100;           // interval at which to change button states (milliseconds)
// Variables will change:
int btn1State = LOW;             // ledState used to set the LED
int btn2State = LOW;             // ledState used to set the LED

void setup() {
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(fled1, OUTPUT);
  
  Serial.begin(9600);
  Wire.begin();
  Mouse.begin();
  mpu.initialize();
  if (!mpu.testConnection()) {
    while (1);
  }
}

void loop() {
	
  //Get the Acel and Gyro Data as 6 values
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  vx = ((gx - 400) / 150)+7 ; // (Grey Gun +3) (Blue Gun +4)"-400" because the X-Axis Left/Right of gyroscope give values about -400 while it's not moving. Change this value if you get something different using the TEST code, checking if there are values far from zero. "+3" added due to value around -3..
  vy = (-(gz - 100) / 150)-1 ; // (Grey Gun 0) (Blue Gun -1)"- 100" same here for the Y-Axis Up/Down. may need to "-1" "+1" etc due to some drift still.

  vx = vx / 2;
  vy = vy /2;
  
  //Create a small -1,0,1 DeadZone for the Y-Axis
  if (vy>=-1 && vy <= 1)
  {
    vy=0;
  }
 
  //Create a small -1,0,1 DeadZone for the X-Axis
  if (vx>=-1 && vx <= 1)
  {
    vx=0;
  }
  
  int buttonState1 = digitalRead(button1);
  int buttonState2 = digitalRead(button2);

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    if (buttonState1 != btn1State) {
      if (buttonState1 == HIGH) {
        Mouse.press(MOUSE_LEFT); //5
        digitalWrite(fled1,1);// Light LED
      }
      else
      {
        Mouse.release(MOUSE_LEFT);  
        digitalWrite(fled1,0);// Light LED Off
      }
    btn1State = buttonState1;
    }

    if (buttonState2 != btn2State) {
      if (buttonState2 == HIGH) {
        Mouse.press(MOUSE_RIGHT);
      }
      else
      {
        Mouse.release(MOUSE_RIGHT);  
      }
    btn2State = buttonState2;
    }

/*
    if (buttonState2 == HIGH) {
      btn2State = HIGH;
      Mouse.press(MOUSE_RIGHT);
      delay(100);
      btn2State = LOW;
      Mouse.release(MOUSE_RIGHT);
    }
*/

  }

  Serial.print(-vx);
  Serial.print(-vy);
  Serial.print("\n");
  if (millis() - previousMillis >= 20) {
  Mouse.move(-vx, -vy);
  }
 
}

Note: the “X” in the Pro Micro Ascii diagram denotes something is wired to that pin, below the diagram is described what is going to those various pins.


There are far better options out there. You could use a regular mouse, but that certainly wasn’t remotely the same. You could buy an Air Mouse, the feel is not the same either. There are units you can get similar to the Wii motion bar that will work with Retropi and use a Wiimote in a gun holder. Those should track much better because it is real tracking and not relative acceleration. With the Air Mouse solution it just knows it went right or left or up or down, you don’t even have to be facing the right direction. Still it is not a very expensive solution.

Addendum: MPU-6050 Test code. This is some Test code I had on file for the MPU-6050 this is NOT the Air Mouse code, that code is the Section Above here. I believe this is the code I used to get my baseline “stationary” values to put in the Air Mouse Code The 400 and 100 in the Air Mouse Code above. To use the code, again open the Arduino or other Serial Monitor set to 9600 and the Serial Port that the Pro Micro is connected to. I could be wrong and that may not be what this is. It has been sitting there a long time.

// MPU-6050 Test Code.  This is NOT the Air Mouse Code!
// (c) Michael Schoeffler 2017, http://www.mschoeffler.de

#include "Wire.h" // This library allows you to communicate with I2C devices.

const int MPU_ADDR = 0x68; // I2C address of the MPU-6050. If AD0 pin is set to HIGH, the I2C address will be 0x69.

int16_t accelerometer_x, accelerometer_y, accelerometer_z; // variables for accelerometer raw data
int16_t gyro_x, gyro_y, gyro_z; // variables for gyro raw data
int16_t temperature; // variables for temperature data

char tmp_str[7]; // temporary variable used in convert function

char* convert_int16_to_str(int16_t i) { // converts int16 to string. Moreover, resulting strings will have the same length in the debug monitor.
  sprintf(tmp_str, "%6d", i);
  return tmp_str;
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(MPU_ADDR); // Begins a transmission to the I2C slave (GY-521 board)
  Wire.write(0x6B); // PWR_MGMT_1 register
  Wire.write(0); // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
}
void loop() {
  Wire.beginTransmission(MPU_ADDR);
  Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) [MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.2, p.40]
  Wire.endTransmission(false); // the parameter indicates that the Arduino will send a restart. As a result, the connection is kept active.
  Wire.requestFrom(MPU_ADDR, 7*2, true); // request a total of 7*2=14 registers
  
  // "Wire.read()<<8 | Wire.read();" means two registers are read and stored in the same variable
  accelerometer_x = Wire.read()<<8 | Wire.read(); // reading registers: 0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
  accelerometer_y = Wire.read()<<8 | Wire.read(); // reading registers: 0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
  accelerometer_z = Wire.read()<<8 | Wire.read(); // reading registers: 0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)
  temperature = Wire.read()<<8 | Wire.read(); // reading registers: 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)
  gyro_x = Wire.read()<<8 | Wire.read(); // reading registers: 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)
  gyro_y = Wire.read()<<8 | Wire.read(); // reading registers: 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)
  gyro_z = Wire.read()<<8 | Wire.read(); // reading registers: 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)
  
  // print out data
  // Serial.print("aX = "); Serial.print(convert_int16_to_str(accelerometer_x));
  // Serial.print(" | aY = "); Serial.print(convert_int16_to_str(accelerometer_y));
  // Serial.print(" | aZ = "); Serial.print(convert_int16_to_str(accelerometer_z));
  // the following equation was taken from the documentation [MPU-6000/MPU-6050 Register Map and Description, p.30]
  // Serial.print(" | tmp = "); Serial.print(temperature/340.00+36.53);
  Serial.print(" | gX = "); Serial.print(convert_int16_to_str(gyro_x));
  Serial.print(" | gY = "); Serial.print(convert_int16_to_str(gyro_y));
  Serial.print(" | gZ = "); Serial.print(convert_int16_to_str(gyro_z));
  Serial.println();
  
  // delay
  delay(1000);
}

Bartop Arcade Build Part 2

This is part 2 of the Arcade. The first post has the Arcade in a good working condition. This will cover some of the final touches.

I did a bit more work on the Marquee. I am in no way a graphic artist. I had downloaded some logos to do the initial graphic. I found some better ones to use and made some other changes to it. I then printed it out on my inkjet printer onto 3 sheets just like the previous test one I did on a black only laser printer. It turned out pretty well, I couldn’t do a full color graphic though. I think I will leave it at this paper graphics for awhile anyways.

For the Marquee there really aren’t any hot spots. I was thinking doing a frosted piece of Plexiglass behind the marquee to handle any hotspots, but that turned out to not be needed (with the paper that is). It is a little brighter than I think I want it, but I didn’t find it too distracting while test playing it. It is quite hard to photograph anywhere near properly though as bright as it is. I have at this point decided to not make a dimmer system for it. I have a couple of workable circuits that I have used for that in the past, I just don’t want to take the time at this point, when the biggest issue is taking photographs of it.

For the LCD I wanted to make a bezel/cover that went over it. To do this I put some 1/8th inch strips up the sides of the cabinet to rest the Plexiglas against. It slides up behind the Marquee bottom board, between it and the top edge of the LCD itself. For Mike’s it seemed he was putting the MDF strips up infront of the monitor? At least in his plans, that would have pushed it back, in my case with the thin strips they are even with the front of the LCD and are just guides to keep the plexiglass from flexing. Mike also had a small board along the bottom above the control panel, which I omitted due to the Plexiglas. I fitted the Plexiglas so that it just meets up with the back edge of the control panel. It is not held along the bottom and just goes up against the control panel board, so it can flex and make a gap there a bit. I may have to secure that in some way in the future, but currently it is minimal, and I do not want to make it difficult to remove the control panel if I can help it.

Above is the Plexiglas I was cutting for the screen. To cut it, I used a board and metal angle clamped together. I was cutting from the side on the right side where the knife is laying. Because the Plexiglas had a bad edge from when I purchased it, I needed to be sure to get one good long cut for the bottom edge. The top edge is hidden up past the marquee bottom board. This stuff is very hard, it is not the softer type so I found that it likes to fracture/crack. I managed to get a very good first cut on the top edge. The next cut, which I was doing in that picture really cracked up the edge. The last cut, cutting it down to the right width, that cut went very well thankfully. I had 1 factory edge and 2 cut edges exposed that turned out pretty well. It was very slightly too wide, to get it down to the right width I used some 180 grit sandpaper with a sanding block to get it just right.

The next part after fitting the Plexiglas was to get it in the final position with the LCD in place and the Control Panel in place. I then used a marker to mark the corners of the LCD behind the Plexiglas. I removed the Plexiglas, and monitor. I placed the monitor on the bench facing up and then placed the Plexiglass back over it using the marks I did while it was in the Cabinet to get a good view and check the marks were correct and centered properly. Once I was sure I had the corners marked correctly, I took away the monitor and flipped the Plexiglas to the back side. The back side being the side that will in the end be toward the monitor itself once installed. From the back side, I cut into the protective plastic with a fresh Xacto blade around where the monitor will be placed, and removed the outer portion (yes only the outside part, not the center where the monitor will be). This left the “monitor area” covered and protected. I also kept the protective layer on the “front” side as well. Then I used some Gloss Black Rustoleum 2x Ultra Cover paint, painting that on the outer rim that I exposed by removing the film from it. This paint is on the back side of the plastic not the front, I have done this before for other projects. It leaves with me with a super gloss finish when viewed through the plexiglass and the paint won’t be touched so it won’t get scratched. You could use any opaque paint color, in my case I was using Black due to the black case, red, blue anything really should work. Even Flat paints look super gloss from the front side. I have used dark flat primers before to get the same effect. The back is not flawless, it is not quite 100% opaque if back lit with a single coat(with more coats of paint it can be made fully opaque), but it is opaque enough for this use in my case with the single coat. Viewing it from the front the finish is flawless.

Below you see the painted edge once the “inner” monitor protective plastic film was removed after painting on the black paint. The “front” still has the protective film on at this point, which is where that white label is stuck to.

Above is the panel after painting it once I removed the protective layer from the inside. This reveals where the monitor will now be behind. The paint does take a while to dry well. I wanted to make sure it was good and dry before installing it, I didn’t want paint lifting where it meets the strips on the side. The final installation it went well, it is held tightly in place by the monitor at the top edge. I have a fair bit of pressure on the board there from the Monitor to get a little more tilt than the base will give on its own. I was very happy with the result. If I didn’t have the monitor keeping pressure against the Plexi I would have drilled 2 or 3 small holes in the top edge of the Plexi and screwed it into the mdf at the top to keep it in place.

Above you can see the thin strips the Plexiglas rests on when it is installed. After installing them I painted them gloss black to blend in. You can also see the door latch and spacer block to keep it from moving much. The little block at the bottom of the door is to keep it from going in to far, there is another stop block on the top corner as well, but it is out of view in the picture. The round speaker grills are again easy to see here as well as the chrome volume knob on the right.

Above is the Plexiglas installed with the monitor behind it before I removed the front protective film. Yes those are the wires leading to the front panel, when I reinstalled the panel I wrapped them up so they weren’t such a tangled mess. The monitor is there sitting on the blocking it is screw into the cabinet with. I have some pressure on the marquee bottom support board to get a little more angle out of it, as well as the block is a bit angled itself. I would have used the VESA mount board in the cabinet except this monitor doesn’t support VESA mounting (The VESA mount method is so much easier to work with, and cleaner..). There are two screws in the back of the monitor base going into the block there. The block is built up so that the monitor was at the height I was going for, and it is secured to the bottom of the cabinet with 4 brackets with screws. I used brackets as I have it set so that I can get to the screws if I need to remove the monitor rather than gluing it in or putting in screws from the underside.

Above you can see the speakers installed before securing the wiring, the power supply board has been removed, or it would be attached there at the black and red wire, which now lead down to the 5Volt output on the Meanwell power supply below it. The other picture shows more of the internal wiring that goes to the Raspberry Pi, the two front mounted USB ports, the USB power cable which goes to the Meanwell 5Volt output as well. The safe shutdown/power up button wiring is there as well as the speaker input wiring. I ended up plugging the speakers into the Monitor’s Audio Output as I am using HDMI from the Pi. If I had plugged into the Pi I would have likely needed an audio ground loop isolator, because I have the Pi and the Speakers powered by the same power source. When powering the Pi and Speakers from the same power source, you can end up with a “buzz”, there are cheap Audio Ground Isolators that you can pass the audio through. I used one on my Pi1541 & Tapduino combo build post due to that. Using the Monitor Audio Out that it gets the Audio from from the HDMI input, lets me eliminate the need for that for this build.

Here is the back with the door latched of course. There is a fair gap at the hinge side, but with the wide hinge that does not show. I should have made it just a little shorter, it rubs easily, but I hope to not have to open it much. I also hope to not loose the keys.. You can see a bit of the run in the paint at the top, but it is on the back and shouldn’t be seen. Overall I have to say the paint turned out pretty good. I am certainly not great with spray painting, but those “Paint Spray Handles” I used really help me. My hand can’t take pressing that little nozzle enough for a paint project this size. There at the top, there is that extra T Molding strip on the Marquee Top. The Plug/Fuse/Switch unit in the back there can be wired a few different ways. The one I have has a lighted switch, that switch could be wired either as an Always On light even when turned off, or it can be wired to light up when the power is on (or not wired to ever light up). I have chosen to wire it so that it will only be lighted if the power is on. Some of them do come with a black switch and those don’t have lights in them. You could just switch the Hot line so that the light would not come on then because if the Neutral isn’t there it won’t light up. With the plug unit, be certain all the connections are secure and making good contact and not loose, a loose wire can cause heat and melting and potentially fire. I nearly used soldered and heat shrink on the plug unit for that reason, but I didn’t as then I would have to desolder it to ever remove the plug or power strip.

I had to edit the above picture, as the Marquee keeps washing out almost completely. That is the Marquee that is in it, I just took two pictures and over laid it over the lighter cabinet picture. The Marquee looks a little better in the picture than it looks to look at it. I did not remove the protective plastic from either side of the Marquee Plexiglas yet though. It turns out to be very hard to photograph this cabinet.

Above is the Pi 3B+ as it is sitting in the cabinet currently. I would have taken it out of the case and mounted it to the cabinet, but then I have to rig up a fan to it somehow. I may do that later (I never did, but it would be easier for me now that I have a 3d printer. I could make up a case with mounting points and a fan). You can see in the picture the wires coming down to the GPIO Pins. The round momentary button on the back of the case there is wired to GPIO3 (Physical Pin 5) and Ground (Physical Pin 6) of the Pi 3B+. GPIO3 is a pin that will by default wake the Pi from a the shutdown/halt condition. Simply editing the /boot/config.txt file and adding the line “dtoverlay=gpio-shutdown” will activate GPIO3 to be a “shutdown” button. You can change the Pin that it will use for the Shutdown by defining the pin in the dtoverlay value. That will then make the other pin be the shutdown pin, but it won’t move the “wake/start” function from GPIO3. The Pi will start the Shutdown process as soon as it has been pressed and detected. Once the Pi has shutdown, you can start it back up by pressing the button again (as long as you are using GPIO3 (Physical Pin5). There are other ways to set this up, they can include a delay where it will make sure the button is held down for a period of time, which could be handy to have. I went with the easiest option though, as I have the button on the back where it is not very likely to get bumped while the cabinet is in use. I found the instructions on how to set that up on this thread: https://www.raspberrypi.org/forums/viewtopic.php?t=217442#p1337231

I did do just a little testing firing up one of my old 2600 games. Asteroids, I managed to roll over the score easily. I was playing on the easiest level though. I went back and started with the next level and that did not go so well.

I want player 1 to be the left side, and player 2 to be the right side. I found after reinstalling the control panel that they were backwards. To correct his, I unplugged the joysticks from the USB ports on the Pi and swapped their positions. Joysticks are based on the USB Port they are plugged into. So Originally I must have had them in the other ports, and when I re connected them they were put in the opposite positions. I didn’t have to swap the control boards or anything.

The Pi is accessible from the back door if I need access to it. I can also easily remove the control panel. I have two brackets on the back of the Control Panel with screws into to keep it in from coming off. I briefly thought of making the SD Slot accessible on the Pi from the outside like I did with the Pi1541 project. It is a bit much with 3/4″ material though, and I don’t want the card to be to easy to remove and loose. If I want to add anything to it or make changes I have it connected to my wifi and I can access it over the network.

The Marquee top has some brackets and screws that I used to secure it to the cabinet. I want to have it remain removable to easily access the Marquee graphics etc if needed. If I make another I am thinking of making it set back just slightly then use painted angle metal pieces to hold the Marquee in place like full size machines did. This will mean there would be no T Molding across the Marquee Top and Bottom. It would make it easier to install and support the Marquee though. I think I will still use the light box design behind it. That worked great, and I hope the Aluminum will distribute any heat from the LEDs which shouldn’t be very much. They are using nearly half an amp at 12volts, so there is some heat there over time.

So one may ask about what this project cost to build. In my case I believe that I have a little over $250 wrapped up in materials. I am not counting the Pi 3B+, SD card, Monitor or Power Strip. If those were purchased as well, I would have been looking at around $410. I did not include cost of Wood Glue, Brads, the bit of Aluminum sheet, as those are supplies I had around, as well as the corner blocks which are scrap wood. I did purchase a few tools, a 30mm Forster bit, a Slot Cutting bit for a router, and the Edge Guide Clamp, those items add up to around another $100. I now have those tools for future projects though.

I have enough MDF, LED strip light, hinge, Plexiglas and a few other bits for a second cabinet. I would need to buy some T Molding, Controls, the Pi, Monitor etc though. I would like to find a better way to cut the Plexiglas, the scoring it with a knife doesn’t work very well on this hard stuff, at least for long cuts. I managed to get it cut, but it could very easily have turned out bad. It really isn’t “Plexiglas” brand that I picked up, I think I have had some softer stuff in the past that was easier to cut, but that probably wouldn’t hold up well for this usage. I don’t remember Lucite cracking like this material has for me, I have used that in the past, it is pretty good stuff, although even more expensive. It has been quite a long time since I worked with it, so I don’t know if it was all that much more fun to work with.

In the end the cabinet is still difficult to photograph, at least with the camera I have. I guess Gloss Black is not much fun for that. Although it is not flawless, I am quite happy with the final result. Above the Plexiglas over the LCD is quite obvious though and gives a good view of how well that turned out for me. The little mix of colors of the buttons is that I purchase a Blue and Yellow set, and already had a white set. I felt mixing the colors gave a better effect.

I figured I would give a little update to what the machine looks like currently as of 2021. I did get around to having a marquee printed up on Plexiglass. This is based on my prototype design. It looks great, but does not photograph well.. It is direct printed on the back of the plexiglass by a local sign company. The background is a dark blue starfield looking effect. The PiCade text came out great. I made the marquee in GIMP, which is what I tend to use for anything like this. The background and the effects on the PiCade text are all effects that it can create. For the most part though I have been using it off and on for years, mostly I got lucky getting it looking that good, I really don’t know how to use it properly.

Here is the machine turned off.
This is the best shot I could get of the marquee. You may be able to just see the starfield effect a bit.

The other thing that has changed is it is now sitting on a stand/cabinet that was made for it. One of my uncles is a cabinet maker and he put it together. The top is inlayed about one inch, so there is a lip all the way around that keeps the Arcade cabinet from sliding off. You can see that pretty well in the one picture above. It has a good sized door on it that lets me use the cabinet for storage. I keep my SNES knock off USB Controllers inside, the Airmouse Gun and some other items. I put on a little hand turn lock on the front, it is like the key lock in the back of the cabinet but without a key. If I wanted I could simply swap it out for a lock, but in reality that is the kind of latch I wanted on the cabinet.. I really don’t want to loose the key someday and have to drill it out.. I wanted something secure that wouldn’t flap around though when I was building the Arcade, so I ended up putting in the lock. Lowes doesn’t carry the the keyless type.. Below you can see the complete cabinet powered up. The only fault on the marquee was that I didn’t know it would need light blocking on the “dark” areas, so it does end up washing out the “starfield” area. It is not as bad as the camera makes it look though. If I get another printed I will have to figure out the light blocking layer on the back first. I have since seen the backs of Pinball Backglass which you can see they have thicker paint for light blocking and such for dark areas. I can’t fault the company that printed it, they did a great job with their part.

The Complete Cabinet

Thanks for checking out the project. I do have the second Grey cabinet build posted as well. It mostly shows the differences from this build. In some ways it is neater inside, due to using the VESA Mount for the monitor, which was not an option for this monitor. The other cabinet uses the controller version that has removable USB cables, they are seen by the Pi as the same type of controller, but it seemed the order of the buttons were different. I did match them up to work in the same order for two reasons. The first reason I wired them the same, is the cabinets are wired to let me use my arcade stick that uses the same electronics as a third player, if they weren’t wired in the same order one, or the other would be using the wrong buttons. The other reason is so the SD card images are then also compatible and the Pi could be swapped from one cabinet to the other. The second cabinet uses a Pi4b instead of a Pi3b+, I put it together last year before the Pi4 was supported, but it worked well. At that time the setup was more involved and you couldn’t do the splash screen/video with it. The Pi4 is now officially supported and it is also faster and that does help with RetroPie. I recently also rebuilt the Pi3b+ taking it to the latest RetroPie build from scratch and putting my games and getting the configurations back in place. The image was so old it couldn’t be directly upgraded. I may swap out for a Pi4 at some point, or maybe not..