DIY Handheld computers are very common in the hacker community and are generally based around a Raspberry Pi Zero or similar Linux SBC. There are many great examples here on Hackaday, and I was eager to make my own version. But I'm not interested to go the Raspberry Pi route because I want to experience the true retro computing world where RAM is counted in kiloBytes. So for the CPU I choose the ATmega 1284 which has specs similar to an 80s personal computer, and is available in an easy to solder 40DIP package. Since this is my very first "serious" project (with custom PCB and 3D printed case) I wanted it to be as simple as possible with the absolute minimum of components. In fact the only components soldered on the board are the ATmega 1284 and the few capacitors and resistors required to program it over serial. Everything else (including the USB to serial interface) are connected with 2.54mm headers and thus modular by design.
There are 2 CPU on the board:
- The ATmega 1284 is the main CPU responsible for the program logic and displays the user interface on an LCD shield.
- The Arduino Nano is responsible for handling the user inputs. All its pins are connected to the corresponding Arduino Uno pins on the lower sets of headers. The extra pins A6 and A7 (not present in the Uno pin layout) are connected to the PS/2 plug.
The Atmega 1284 Tx pin is connected to the Nano Rx pin and vice-versa.
On the bottom of the board there are actually 2 sets of Uno compatible headers. The lower one is designed specifically to be used with the common gamepad shield found on many chinese websites. The issue with this shield is that on a regular Uno it's shifted toward the right side of the board to make space for the USB and power connectors located on the left. But for my handheld console this would mean the gamepad would be misaligned with the LCD. Since I don't have connectors on the lower half of my PCB I put a second set of headers starting from the left edge of the board and now everything is (almost) aligned.
The KiCad project and gerber files for the PCB are available on this page.
No official Arduino board comes with an ATmega 1284 CPU so by default it's not possible to flash the Arduino bootlader with the Arduino IDE. Fortunately there is an unofficial core called MightyCore which fullfills this need. All the instructions to flash the bootlader have been found on this blog : http://www.technoblogy.com/show?19OV
There are no less than 4 ways to power the board:
- USB port on the serial interface
- ground and VCC pins of the serial header
- USB port on the Nano
- Battery shield
Only one of these methods can be use at a time since there is no isolation between the power pins. The first 3 methods require the use of an external battery pack. Since USB powerbanks come in all shapes and sizes, to stay true to my modular approach the battery is held on the back of the case with a pair of brackets attached with screws to the holes present on each side of the case. This way you just have to design brackets adjusted to the powerbank you probably already own (or you can use rubber bands for true Mac Gyver aesthetic). Anyway the 3D files for both the case and battery brackets can be found in the files section.
TO DO list
Currently I was only able to test the device with IoT BASIC, the great BASIC for Arduino developped by Stefan Lenz. I plan to fork it to add support for gamepad and keyboard over serial.
On the hardware side I'd like to improve the board to make full use of the 32 GPIO of the ATmega 1284, with an expansion connector whose purpose is yet to be defined (Camera? MIDI?). An audio jack/speaker would be nice too.