When I was a young kid I was able to play Super Mario when visiting my cousin. As I didn’t have my own game console I was not able to get enough from Mario. Since then Super Mario has always such an interesting aura.
Being bored one weekend it struck me that what if I could acquire my own Game Boy. The idea sounded good and I started to work with it. Fast Google search revealed that I was not the only one with the interest and there are some “do it yourself” descriptions available.
The general operation can be seen in the video.
Step 1: What Do You Need
- Raspberry Pi A(+) or B
- A screen for the Raspberry
- 8 pushbuttons
- A battery and a way to charge it
- Boost converter to make 5V from the battery voltage
- A switch to turn power on or off
- Bunch of resistors (≤100Ω, 1kΩ, ≥10kΩ)
- 2 red LEDs (optional)
- 1 green LED (optional)
Step 2: Test Version
Combining several designs and ideas together I was able to develop my own. Special thanks to adafruit.com community with inspiration and components.
I found one very nicely described version with all required components from adafruit.com. They used a Raspberry Pi as the core and I liked it. Additionally, adafruit.com provides specially designed screens for the Raspberry Pi, so that makes assembly easier.
In general, everything is very well described in adafruit.com and I will not rephrase it. I think their idea and implementation is good, but one could improve it with better mechanical arrangement.
For me the choice of Raspberry Pi A+ was clear as it's the smallest and least energy consuming version from the Raspberries. The screens offered screens would fit well with the A+ and the provided software (adafruit.com) suits too without any modifications.
In the end what I had is a prototype game console.
It worked well, but
- It was not portable (the idea of having a Game Boy style gadget)
- it was bulky
- it was not comfortable to play
Consequently it could only be a nice prototype.
Step 3: Final Version
I was looking little further around in Google and noticed that often fancy and/ or 3d printed cases were used. I had something completely different in my mind. It was clear I need to build my own circuit board and arrange a compact design.
One could choose between 2.8” and 3.2” screen specially designed for the Raspberry Pi. I ordered both and compared the benefits. Clearly the larger screen would be better. 3.2” screen has the same resolution as the smaller one, nevertheless most, if not all, old games were designed with relatively low resolution and that’s not an issue. The main difference between the screens is the mechanical arrangement.
The 2.8” screen is glued with a tape on the PCB. It‘s not a perfect solution, but it works as long there are not much movement. After some screen rotation and looking the tape was already getting loose. The 3.2” screen is pre-glued with thicker pads. They looked more solid than the tape, still I was not convinced with the stability.
After some consideration how to assemble the screen in a stable way, I decided to add additional PCB layer that presses (gently) the screen on the PCB and fix it this way. With the 3.2” screen it’s not possible due to the pins under the screen. Thus, the choice to use 2.8” screen. Besides, it felt large enough to play Super Mario.
I don’t have a 3d printer and I was more into using normal PCBs. Thus, I designed the game console with 3 PCB layers. The middle PCB layer has almost all the connections allowing smooth surfaces on the outer ones.
The place was very limited and I was hoping I could skip the GPIO cable and do all the connections with the PCB. I was not fully sure if I could really solder it as needed, therefore I added the GPIO connector on the PCB. Soldering through two PCBs the plug worked very well and I was able to skip the large GPIO cable.
In the Adafruit design one doesn’t need any resistors between the switches and the Raspberry Pi. I decided to add small SMD resistors (they can be up to 100 Ohms) for some safety. Additionally, that allowed for me to access all the pins through resistors. If I want to modify the design later or when I need a signal, I can easily access it through a resistor or solder an extra wire there.
In order to be mobile, it requires a battery and suitable charger and voltage converters. In order to reduce amount of work needed I bought simple battery charger (a cheap one from ebay) and a boost converter (a cheap one from ebay) that can make very nice work. Resulting much less work for me. The battery empty indicator is achieved with a simple resistive voltage divider and a comparator. Not very sophisticated solution, but it’s very simple and it works.
The Raspberry together with the screen consumes 150-250mA current, depending on the activities done with it. The Raspberry is working with 5V, thus the voltage choice and micro-USB charging. No additional voltage conversation is needed. The LiPo battery (standard 18650 type) is charged up to 4V and voltage booster is needed to reach 5V. I noticed that 4.5V is actually enough, but eventually the battery is getting emptier and its voltage is reduced and I anyway need a voltage booster.
The battery charger has two LEDs on it indicating that the battery is full or charging. I used extension wires and placed two additional LEDs on the board so that one could see them without tilting the device.
I wanted to have a sound too, thus I needed access to the headphone plug. Due to the mechanical arrangement it was not possible directly and I made an extension. It required some extra wire soldering on the Raspberry, but it was simpler than I thought.
Although it doesn’t say much it could indicate some hints behind the design. For better understanding one should read the Adafruit description, there are all the pins explained.
Again Adafruit is providing everything. There is no need to rephrase it. Everything is well described and it worked well for me without any hassle.
Step 4: Finalizing
The final design is very compact and looks nice. So far everything works really well. The basic usage can be seen in the video I added at the beginning.
The only limitation I noticed was with the micro-USB plug. It is very tight and when I tried to remove the charging cable it applies lot of force to the connections and eventually the first one broke away. Now I have added little soldering tin and always hold the plug tightly when I’m removing the cable. Maybe with a more expensive version the connection is done better and this problem doesn't exist.
Additionally I placed the on-off switch after the boost converter. It should be actually between the battery and the boost converter. Now I have continuous energy consumption even when the device is turned off. It doesn’t affect much the performance, but if I need to make a modification than that would be the first one.
Hopefully this can inspire somebody to try it too.
If you liked it then vote for me in the Gaming contest :)