So, I started this project page quite a ways into my effort for the project. This project log is intended to review what I've done on the project to this point. With that said, here are some design aspects along with their status:
Processing and Software
The brains of the console are run from a Raspberry Pi 4 model B. I think that it's got 4gb of RAM, but am having a hard time pulling up the Ebay page that I purchased it from to see. So, I'll have to figure out how to find that info in the RetroPie OS the next time I turn it on.
RetroPie is successfully installed on an SD card and a lot of the initial setup is done. A keyboard is connected via Bluetooth, an IP address is setup and SSH enabled, and some games have been loaded and tested. There's definitely a lot more to configure here, including getting shaders dialed in for each console, testing the limits of running N64/Playstation games, and testing overclocking.
The current display being used is an 8" IPS with 4:3 aspect ratio (1024x768). Honestly, this is a little bit larger than I'd like, but there just isn't much that I can find at the 4:3 aspect ratio. I am a bit worried that the end result will be too big and unwieldy, but we'll just have to wait and see. I originally tried a 7" 16:9 display (I was surprised at how much smaller the 7" 16:9 display was compared to the 8" 4:3, but it totally makes sense after thinking about it a bit... math!), and I couldn't accept having to choose between a skewed looking game or having black bars on the side.
This display is a Pimoroni product and comes with a driver board that interfaces to the LCD screen ribbon cable and provides an HDMI port for video from the RPi and a usb port for power. This has the advantage that it easily plugs into the RPi with an HDMI cable and doesn't require any special drivers or setup in RetroPie. I would have considered an LCD screen with a DSI interface if there was much available, but choices were limited. And it saves me from having to learn about DSI interfaces and install the correct drivers.
One lament that I have about the larger screen size is that it doesn't feel necessary for retro games. And being a portable device, weight and battery consumption are big considerations. Maybe the larger size will be a win if N64 and Playstation games run well, but I'm skeptical of the impacts of battery life and think that later generation games will require overclocking (further draining precious battery).
When all is said and done there should be three audio sources for the pandaPi. Bluetooth, speakers, and a headphone jack. I'm a little worried that if I put the effort in for the speakers and headphone jack, that I'll just fall back on bluetooth 100% of the time. But it just feels wrong to not have them as an option.
I have purchased a 2.5W Class D amplifier and a couple different speakers to test out for volume and sound quality. The initial test I ran was absolutely horrendous, very little volume and what sound did come out was only treble... after reviewing the connections I definitely didn't make the correct connections. Long story short, I didn't really understand the amplifier board terminals well before making connections. After re-viewing the terminals and what signals they are meant for, I believe that I've got it wired correctly now. Just waiting for a new battery to ship so I can try it out...
The plan is to simply extend the headphone jack to the console case via a perf-board. I'm going to try some Adafruit breadboard style perf-boards that look pretty slick. I know how to do PCB layout and could have a custom board manufactured, but it's expensive, time consuming, and I don't want to. I'm hoping that these Adafruit boards are a nice compromise that are more accessible than a custom PCB and also less sloppy than the old RadioShack perf-boards. And at the end of the day, if it came down to not having enough room inside the case, I would be willing to create a custom board to make this circuitry fit.
Now the controller seems like the most difficult piece of the equation (eh... the case is close behind). What makes it seem daunting is that I feel that this could make or break the system. It is going to be the difference between me wanting to use this console vs. just letting it collect dust. Early on I decided that the controller essentially needs to be some Frankenstein'ed version of a purchased controller that feels good. And I've gone down several rabbit holes investigating an approach for this. Initially, I got my hands on a PS5 controller with a broken joystick (easy fix). This controller has two separate PCBs for the D-pad and right hand buttons and these connect to a sort of motherboard using ribbon cables. I mulled over that one for awhile and decided against it for a few reasons: don't know the feasibility of getting longer ribbon cables to extend the buttons away from the motherboard, 3d modeling/printing a case to fit the same button profile would be complicated, and it consumes ~100mA which is high compared to other controllers I tested and not insignificant for a 10,000mAh battery.
The second idea that I landed on was to utilize a really nice 8Bitdo Pro 2 controller. Seriously, this controller is so nice! I don't really play games on PC anymore, but if I ever do, this controller will be my go-to. So popping it open, I was hoping that it would be simple enough to chop the PCB up with a dremell so that the buttons could be moved further out to the side. And then reconnect the button traces to the microprocessor that is interfacing to the usb port. It didn't take long after opening it up and looking at the PCB to understand that wouldn't be easy and would likely turn out just gross.
And finally, the current plan is to utilize some of the 8Bitdo pieces and a TeensyLC (Arduino) to create a custom controller. Admittedly, this approach is a little more involved than I wanted to go with, but I think that it will work without too much effort (knock on wood) and will turn out clean. This is based on an Xinput library that somebody else created (I'll provide links in future project logs and/or the build instructions page). I've tested this library with a TeensyLC and some tactile buttons as a proof of concept. So, from there I'm going to create some custom PCBs (one right, one left) which have the same layout membrane button traces as the PCB on the 8Bitdo. The custom PCBs will need to have the same shape and dimensions as the 8Bitdo PCB so that they can attach to the plastic chassis in the 8Bitdo. And when 3D printing the case, it will need to have the same button slots and tracks as the 8Bitdo controller. This will enable the use of the 8Bitdo controllers buttons and triggers in the custom PCBs/case. Even writing this just hammers home that this will be a large effort with lots of fine tuning. But I think I can do it. And this is probably hard to follow in words. At some point I'd like to create a project log going into more detail with pictures, PCB designs, etc.
The name of the game with the power supply is to get the largest battery that will feasibly fit in a portable console. I did find a 10,000mAh battery that comes with a charging controller from a company called MakerFocus. We'll see how it performs. The board actually already failed, but the company is sending me a new one. It could have been a mistake on my part that broke it... there is a JST connector that allows the use of an external button to turn the battery power on/off, and I was pretty sloppy in testing these pins and may have accidentally shorted the charger's positive and negative. I'm not sure, but am hoping that is what happened and that the new board will not give me any problems. If it does, then I'll just have to find another product. This charger board also has some communication capabilities and can send serial data to the RPi, so I might test that out at some point. I think that it may be used to signal to the RPi that the battery is low so that the RPi can shut itself down. I'm not super hopeful of getting this to work and don't think it will be terrible if it doesn't since the charger board has battery status LEDs that can be used as well. It will not be possible to have the power button shutdown the RPi softly. The RPi will need to be shutdown via the menu system, and then after it has shutdown the OS then the power button may be pushed. This is a little clunky, but I can live with it.
And the last aspect of this project is the case. This is also the area that requires the most effort. I've recently bought a 3D printer and have been playing with it. I've also been learning Fusion 360 and just finished a tutorial series for it on Youtube. I've began modeling the 8Bitdo controller so that I can start fine tuning the button mounting. A ton of effort has been put into learning 3D modeling and it feels like there is a long way to go. I did just print the first prototype of the controller face and it turned out pretty good.
Mounting the electronics is another part that is unknown. I've experimented a small amount with a mounting option, but don't think it will work well. I've been browsing some other folks projects to see how they've accomplished this two. Lastly, the icing on the cake would be for the case to allow the screen to swivel slightly so that it could be viewed at different angles depending on if the user was sitting or laying down. I've got zero leads on a good way to accomplish that and am not counting on coming up with anything.