Game Boy Advance XL

A scaled-up version of the original Game Boy, but not really; the hardware is an SBC running Windows.

It's powered by a DFRobot LattePanda Mu N305 single-board computer, paired with its Lite carrier board and a massive 15-inch HDMI display salvaged from a PC monitor.

A few months ago, I built the Motorola DynaTAC Max, a giant replica of the iconic Motorola DynaTAC phone. That project got me hooked on building oversized versions of everyday devices, and I knew I wanted to take on something even more ambitious: the Game Boy Advance, in this case.

I've been working on this project for nearly three months, and trust me, it took a lot longer than I expected.

So, what exactly is the Game Boy Advance XL?

It's a giant Game Boy replica that I built from scratch using 3D printing. The body consists of multiple individually printed parts, all assembled to create this ridiculously oversized handheld console.

But unlike the original GBA, this one is powered by a DFRobot LattePanda Mu with an Intel N305 processor, paired with its Lite carrier board and a massive 15-inch HDMI display salvaged from a PC monitor.

For the controls, I'm using a Raspberry Pi Pico W configured as a Bluetooth game controller. Every button is mapped in Steam to work as the D-pad, A, B, Select, and Start buttons.

There's no onboard battery yet, so the entire device runs on an external 12V, 4A power adapter.

And what can it play?

Well, obviously, we have Pokémon Emerald running through RetroArch, but thanks to the LattePanda Mu, this thing can handle modern PC games, too! I've already tested Fallout: New Vegas, Bayonetta, Nier Automata, and Minecraft on it.

So, this isn't just a giant Game Boy Advance. It's basically a Windows PC disguised as a classic handheld console!

In this article, I'll walk you through the complete build process, from designing and 3D printing the massive enclosure to setting up the hardware, configuring the controls, and getting games running on this oversized beast.

Let's get started.

GAMEBOY ADVANCE

Released in 2001, the Game Boy Advance was a 32-bit handheld gaming console developed and manufactured by Nintendo. It succeeded the original Game Boy and Game Boy Color, bringing a significant leap in graphics, processing power, and gameplay to portable gaming.

The original Game Boy had already established Nintendo as a dominant force in handheld gaming, but the GBA took things to another level. Its landscape-oriented design, shoulder buttons, and improved display made it feel much closer to a home console experience that you could carry in your pocket.

The Game Boy Advance was powered by a 32-bit ARM7TDMI processor running at approximately 16.78 MHz, accompanied by 256 KB of external DRAM and 96 KB of VRAM. It also included 32 KB of internal work RAM and 96 KB of internal graphics memory, along with dedicated hardware for 2D graphics and audio.

Despite its modest specifications by today's standards, the GBA was capable of impressive visual effects, colourful environments, detailed sprites, and surprisingly complex games. Its hardware supported a resolution of 240 × 160 pixels and a colour palette of up to 32, 768 colours, making it a substantial upgrade over its predecessors.

One of the most impressive features was its backward compatibility with Game Boy and Game Boy Color cartridges, allowing players to enjoy an enormous library of existing games alongside the new GBA titles.

Even today, the GBA remains popular among retro gaming enthusiasts, collectors, and hobbyists. Its extensive game library and relatively straightforward hardware make it an excellent platform for emulation and DIY gaming projects.

And that brings us to my own project. I always wanted a Game Boy Advance when I was younger, but never got one. Years later, instead of buying the original console, I decided to build my own version; only this time, I made it absolutely massive!

HARDWARE- LATTEPANDA MU N305

For the brain of this project, I'm using the LattePanda Mu compute module with the Intel Core i3-N305 processor. It's an 8-core, 8-thread x86 processor with a base frequency of 1.8 GHz and a maximum turbo frequency of 3.8 GHz, making it capable of handling desktop applications, multitasking, and even some gaming.

I'm using the 16GB RAM variant, which features 16GB of LPDDR5 memory running at 4800 MT/s, along with 64GB of onboard eMMC storage. However, for this project, I'll be using an external NVMe SSD for additional storage and faster access to my files. The module also features integrated Intel UHD Graphics, making it suitable for running a full desktop operating system without requiring a dedicated graphics card. (Will do some hella gaming on this setup)

The LattePanda Mu is a compute module rather than a conventional single-board computer, so it doesn't provide the usual external ports on its own. To make it usable in this project, I'm pairing it with the DFRobot LattePanda Mu Lite Carrier Board, which exposes the necessary connectivity and expansion interfaces.

The carrier board provides two USB 3.2 ports supporting speeds of up to 10Gbps, two USB 2.0 ports, Gigabit Ethernet, HDMI 2.0 with support for 4K output, and M.2 slots for storage and wireless connectivity. It also includes a PCIe 3.0 x4 expansion slot, along with UART and I²C interfaces for connecting additional hardware. The board supports a 12–20V DC input through its barrel jack, making it suitable for compact computing projects.

For storage, I've installed a 256GB NVMe SSD in the M.2 M-key slot and an M.2 Wi-Fi card in the E-key slot. I'm powering the entire setup using a 12V, 4A power adapter, which provides up to 48W of input power. This gives me a compact x86 computing platform with the storage and connectivity needed for the Fallout terminal.

DFROBOT SERVICE

A huge thanks to DFRobot for supporting this project and providing the hardware that made this build possible. From the LattePanda Mu N305 and its Lite Carrier Board, their support played a big part in bringing this GBA XL to life.

DFRobot is a great resource for makers, engineers, and electronics enthusiasts, offering a wide range of development boards, sensors, modules, robotics components, and other electronics hardware for all kinds of projects.

Their product wiki was also incredibly helpful throughout this build, with detailed documentation and examples that helped me understand how the hardware works and figure out the code for different modules.

I'm genuinely grateful to the DFRobot team for supporting my work and helping me bring this project to life. If you're planning your next DIY electronics project, make sure to check out DFRobot and explore their range of hardware. You might just find what you need for your next build!

HARDWARE- DISPLAY

Since this was an extra-large project, it needed an extra-large display to match! Unfortunately, displays around 10 inches are much more readily available, while larger panels with similar specifications can get quite expensive.

So, I decided to take a different approach, which was to buy a 15-inch 4:3 monitor and salvage its display panel.

I specifically looked for a monitor that supported 12V DC power and included both HDMI and VGA inputs. HDMI was essential for connecting it to the LattePanda Mu, while the VGA port gives me the flexibility to reuse the display in future projects.

The salvaged LCD panel connects to a display driver board, which contains the necessary driver circuitry along with the HDMI and VGA ports and a DC power input. Since the panel's backlight requires its own driver, there's also a separate LED backlight driver board connected to the setup.

This arrangement lets us power the display electronics and backlight from a 12V supply, provided the power source can handle the combined load.

By salvaging the panel instead of buying a dedicated large-format display, I was able to get the screen size this project needed without spending a fortune. And with a 15-inch display fitted into the enclosure, our Game Boy Advance XL was starting to look appropriately gigantic!

MONITOR DISASSEMBLY

Here's a little sneak peek at how I salvaged the display for our Game Boy Advance XL from a standard 15-inch monitor!

I picked up a generic 15-inch monitor for less than $20, which made it a pretty affordable option for our project. It came with both a 12V DC power jack and an AC power input.

We start by removing all the screws from the back of the monitor and carefully prying open the frame.

Once it's open, we remove the display panel from its mounting position and disconnect it from the driver board.

Inside, we can see three separate boards: the AC power supply, the display driver board, and the button board.

The AC power supply provides power to both the display driver and the panel. However, we don't actually need it for our build! By removing the AC power supply, we can power the display driver directly through its 12V DC input jack.

Next, we need to take care of the display's backlight. For this, I used a separate LED backlight driver, which takes 12V DC and drives the LEDs behind the LCD panel. I connected its power input to the positive and negative terminals of the DC input on the display driver board. This allows us to power both the display electronics and the backlight from the same 12V supply, provided the power source is rated for the combined load.

The third board is the button board, which handles the monitor's brightness, contrast, and other display settings. Once everything was powered on, I adjusted the brightness and contrast to my liking, then disconnected the button board. We don't need it for normal operation anymore, unless we want to change those settings later.

And that's pretty much it! We've managed to salvage a 15-inch HDMI display for less than $20, making it a great fit for our Game Boy Advance XL project.

It's a much more affordable alternative to buying a dedicated display, and since we're building a giant handheld console anyway, that extra screen real estate is exactly what we need!

HARDWARE- BLUETOOTH SPEAKER


For audio, I'm using a ZK-1002M Bluetooth amplifier module. It supports dual-channel speaker output and comes with several additional features, including USB playback and 3.5 mm audio connections. However, for our project, we only need its Bluetooth audio functionality.

The idea is simple: we'll connect a speaker to the module and pair it with our Game Boy Advance XL over Bluetooth, allowing us to play audio wirelessly from the LattePanda Mu.

Another advantage is its DC power input, which allows us to power the audio setup using our existing 12V supply. This keeps the wiring simple and avoids the need for a separate power adapter.

CONSOLE DESIGN

The main goal behind this project was to create a giant replica of the original Game Boy Advance while keeping its iconic design as close to the original as possible. I could have redesigned the entire enclosure to make it look more modern, but that would have defeated the purpose of this project. I wanted it to look like a Game Boy Advance, just on a much larger scale, with a few modifications to accommodate the hardware inside.

I started by finding a top-view image of the original Game Boy Advance and importing it into Fusion 360 as a reference. Using that image as a guide, I traced the outline and gradually built the main body, making adjustments along the way to get the proportions as close to the original console as possible.

Once I had the basic shape, I started working on the details. This included creating the display housing, hollowing out the enclosure to make room for the electronics, and dividing the model into smaller sections that could be 3D printed and assembled later.

I also modelled the familiar controls, including the D-pad, A and B buttons, Select and Start buttons, and the shoulder trigger. I designed the buttons as separate components so they could be printed individually and fitted into the main enclosure. Since I only needed one shoulder button to control the power of the LattePanda Mu, I modified that part of the design accordingly.

The model also includes dedicated mounting points for the internal hardware, including a holder for the LattePanda Mu and a space for the speaker. Every component had to be positioned carefully to make the most of the available space while keeping the exterior true to the original design.

One detail I particularly wanted to get right was the display bezel. I recreated the black frame surrounding the screen, just like the one on the original Game Boy Advance. However, printing such a large, flat piece would have been impractical, so I decided to have it laser-cut from a 3 mm-thick acrylic sheet instead. This gave me a cleaner finish and a more authentic look.

The overall design is fairly straightforward, consisting of two main sections: the front body, which houses the display, controls, and electronics, and the rear lid, which covers the internals. Everything else, from the buttons and switches to the hardware mounting brackets, was modelled as separate parts.

The entire design process took considerable time, especially because I had to balance the original console's proportions with the practical requirements of fitting a PC inside it. But that was the whole point of the project: to build a Game Boy Advance that looks as close to the original as possible, only much, much bigger!

MAIN BODY


The main body was initially modelled as a single unit in Fusion 360.

However, considering the size of the enclosure and the build volume of my 3D printer (250 × 250 × 250 mm), I had to divide the model into eight individual parts so that each section could be printed separately.

To join these parts together, I designed mounting walls along the rear side of each section. These walls have four to five mounting holes positioned to align with the neighboring parts. The idea is to use M4 nuts and bolts to fasten the sections together, creating a rigid, unified structure.

This approach makes the model easier to print and assemble while keeping the Game Boy Advance XL's overall shape and dimensions intact. Once all eight sections are bolted together, they form the complete main body, ready for finishing and internal hardware installation.

I also made sure that the LattePanda Mu's I/O ports remain accessible once everything is assembled. To achieve this, I added an opening along the bottom edge of the main body, providing direct access to the ports on the carrier board without having to remove the lid.

Right next to this opening, there's a dedicated slot for the DC barrel jack, allowing me to connect the external 12V power adapter conveniently.

SCREEN POSITION

The 15-inch display is installed from the rear of the main body. I've modelled a dedicated mounting area inside the enclosure so that the display fits neatly into position and stays aligned with the front bezel.

For securing the display, I decided to go with the good old hot glue gun! I could have designed custom mounting brackets, but that would have added more complexity to the design and required additional parts to be printed.

After all, this is a DIY project, not a commercial product, so I decided to keep things simple and use what I had available. A few strategically placed spots of hot glue were enough to hold the display in place and get the job done!

LATTEPANDA & DISPLAY DRIVER HOLDER

Next, we install the DFRobot LattePanda Mu Lite carrier board and the display driver board inside the main body.

To mount both boards securely, I designed a custom holder that fits inside the enclosure. First, we secure this holder to the main body, creating a stable mounting platform for the electronics. We can then mount the LattePanda Mu Lite carrier board and the display driver board onto the holder.

BUTTONS

Next, let's work on the controls. The A, B, Select, and Start buttons all use the same button board PCBs, which I reused from another project. This saved me some time and meant I didn't have to design a new PCB specifically for this build.

Let's start with the A and B buttons. I modelled circular buttons in Fusion 360, keeping their proportions as close to the original Game Boy Advance as possible. The main body has dedicated openings for these 3D-printed buttons, allowing them to sit neatly in position.

Behind each button, we mount the corresponding button board PCB, which houses the tactile push button. I designed a 0.5 mm gap between the tactile switch and the 3D-printed button to allow for some movement when pressing it. This clearance is important because it lets the buttons move back and forth without constantly pressing against the switches, giving them a more natural button-press feel.

To secure the PCBs, I added two screw bosses for each board, allowing them to be fastened directly to the enclosure. This keeps everything aligned and prevents the boards from moving around during use.

The Select and Start buttons follow the same design and mounting approach, with the only major difference being that their 3D-printed buttons are slightly smaller.

The D-pad uses a similar mechanism, but instead of individual circular buttons, it features a larger, plus-shaped 3D-printed component. This sits inside a dedicated opening in the enclosure, with a square button PCB mounted behind it. Just like the other controls, the D-pad has a small clearance between the printed part and the tactile switches, allowing it to move freely and register directional inputs when pressed.

TRIGGER BUTTON

The trigger button uses a slightly different mechanism from the other controls. For this part, I reused a PCB from another project and designed a custom mounting arrangement to fit it inside the Game Boy Advance XL.

First, I added a small support rib inside the enclosure to hold the PCB vertically. This keeps the switch board firmly in position and aligned with the trigger mechanism.

Next, I modelled a trigger button with a hollow cylindrical opening. On the main body, I created a cylindrical pillar of the same size, which acts as the pivot for the button. The trigger fits over this pillar, allowing it to rotate slightly around the centre when pressed.

This small rotational movement is what activates the switch on the vertically mounted PCB. Instead of pushing the switch directly from the front, the trigger uses the pivot mechanism to transfer the movement to the switch.

To keep everything securely in place, I also designed a stopper that mounts onto the cylindrical pillar using an M2 screw. This prevents the trigger from slipping off the pivot while still allowing it to move freely when pressed.

PICO DRIVER HOLDER

To handle all the button inputs, I'm reusing a controller board from one of my previous projects: the giant Motorola DynaTAC. This board features a Raspberry Pi Pico connected to a CD74HC4067 multiplexer, allowing it to handle multiple button inputs through a single microcontroller.

Rather than designing a new PCB from scratch, I decided to reuse the existing board as it was, saving time and making use of hardware I already had available.

For mounting, I selected a spot along the top of the enclosure where the board could fit comfortably without interfering with the other components. I then added two screw bosses to the 3D model, allowing the PCB to be secured firmly in place.

LID SECTION

Moving on to the rear lid, I followed a similar approach to the main body. Since the lid is also quite large, I divided the model into six individual sections to ensure that each part would fit within my 3D printer's build volume.

For assembling these sections, I decided to use a plastic welder. To make this possible, I designed thicker joining areas along the inner edges of the lid, where the individual sections meet. These areas feature walls approximately 5 mm thick, providing enough material to reinforce the joints using plastic welding staples. The idea is to join the sections from the inside, keeping the exterior as clean as possible while creating a stronger, unified structure.

Next comes mounting the lid to the main body. In the main body, I designed reinforced screw bosses supported by additional ribs to provide strength and prevent the mounting points from breaking under stress.

Each screw boss has a pilot hole of approximately 2.5 mm in diameter, designed to accommodate M3 wood screws. These screws bite into the plastic and create a secure connection between the two sections.

In total, I added 13 mounting holes to the lid, allowing it to be fastened securely to the main body using M3 wood screws. This distributed mounting arrangement helps keep the lid firmly attached while maintaining the overall structural integrity of the enclosure.

3D PRINTED PARTS

Once the design was finalized, I exported all the individual components as mesh files, ready for 3D printing. This included the main body, lid sections, button assemblies (D-pad, A and B buttons, and Select and Start buttons), the trigger button and its holder, and the mounting frame for the LattePanda Mu.

For printing, I used my Anycubic Kobra S1 3D printer with white Hyper PLA filament. I went with a 0.4 mm nozzle, 25% gyroid infill, and a layer height of 0.16 mm to achieve a good balance between print quality and structural strength.

For parts that required support, I used tree supports with a 0.2 mm Z-top distance between the support structure and the printed part. This helped support the overhanging sections while making the supports easier to remove after printing.

Printing all the components was a lengthy process, taking nearly a week and a half to complete. The main body sections were the most time-consuming parts, with each taking around 10–12 hours to print, while the smaller buttons, holders, and mounting components took considerably less time.

MAIN BODY ASSEMBLY

We start the assembly process by positioning all the 3D-printed body sections in their correct orientations. For this step, the parts are placed upside down on the table, with the front face pointing downwards so we can access the mounting holes from the back.

Using M3 nuts and bolts, we fasten each section to the neighboring parts, gradually joining all the individual pieces together. The idea is to secure every section tightly so that the separate prints form one continuous enclosure.

Once all the nuts and bolts are tightened, we end up with a single, solid Game Boy Advance XL body.

BODY FILLER PREP WORK

For filler material, we are using a 3M automotive two-part filler, which consists of a filler and a hardener.

Wearing protective gloves and a dust mask is mandatory for this step, so make sure you put them on before proceeding.

We begin by adding 2% hardener and mixing it thoroughly with filler; we get a compound that can be used to fill gaps, layer lines, and other imperfections on our printed body.

The filler process is an important step before painting. Applying filler to 3D prints, then sanding the surface smooth, followed by primer and paint, results in a finish so clean that it no longer looks 3D printed at all.

BODY FILLER PROCESS

We start by applying filler to the joints between the 3D-printed parts. The idea is to fill any visible gaps, seams, or uneven areas across the enclosure. The filler gets into these gaps and creates a more uniform surface.

We also apply filler to any areas that aren't perfectly even. Once the filler has dried, we'll sand it down to remove the excess material and smooth out the surface, making the joints less visible and giving the entire enclosure a cleaner, more finished look.

BODY FILLER SANDING

I begin by sanding the top surfaces of the front body, followed by sanding down the gaps between parts that were filled with filler. The edges of the parts with fillets are also sanded.

The goal here is not to sand down the plastic itself, but the added filler. This way, we remove excess filler while keeping the plastic body intact.

Doing this removes the visible gaps between layer lines and evens out the surface.

PRIMER PROCESS

Now comes the priming process, and this one was quite lengthy.

For painting, primer is a mandatory base coat because it helps the paint adhere better to the surface, improves durability, and highlights any remaining imperfections that need fixing.

Here, I used a spray primer, which works just like spray paint but is specifically designed as a base layer.

I started by applying light, even coats across the entire body, gradually covering the full surface. After the first coat, I let the primer dry for a couple of hours, then applied a second coat and allowed it to dry again.

Finally, I applied a third coat for a consistent and well-prepared surface.

PRIMER SANDING

We then use finer-grit sandpaper (150) and begin sanding the main body. The goal here is to sand everything thoroughly, every surface, every face, every edge, and every corner.

This step is done to achieve an ultra-smooth surface, which is essential for painting. A smoother surface allows the paint to adhere evenly and results in a clean, professional finish without visible imperfections or texture.
 

PAINT PROCESS BODY

Finally, we begin the painting process, using Purple spray paint, specifically an aerosol paint can.

  • We slowly and steadily coat the main body with the first coat. The key here is to apply light, even layers across the entire surface.
  • After letting the first coat dry, we apply a second coat and then leave the parts for about 3 hours to dry. After that, we proceed with the third coat.

By the third coat, we achieve a refined, properly painted surface that resembles a purple Game Boy Advance body.

BODY DETAIL PROCESS

The original Game Boy Advance has a black border surrounding the display, just below the glass mounting area. Since we painted the entire body purple, I had to recreate this detail manually.

For this, I used black acrylic paint and a flat brush to carefully paint the border area.

Once the black paint had dried, I moved on to the lettering. Using white acrylic paint and a fine 1 mm brush, I manually filled in the Game Boy Advance XL lettering to replicate the branding found on the original console.

Finally, after allowing all the acrylic paint to dry, I applied a coat of conformal clear coat spray to seal the painted details and protect the finish.

 

PAINT PROCESS SWITCHES

The painting process was fairly simple. We skipped the primer and directly painted the entire body using grey aerosol spray paint.

The buttons were already well-finished, with smooth surfaces and no visible layer lines, so they didn't require any additional surface preparation. We simply applied the paint directly, using two coats and allowing each coat to dry for approximately an hour before applying the next one.

PCB DESIGN—BUTTON BOARDS

For the button controls, I'm reusing two types of PCBs from one of my previous projects, the SNES Console.

The first is the D-pad PCB, which consists of four individual 12 × 12 mm tactile push buttons, one for each direction. Pin 2 of each tactile switch is connected to a CON1 connector, while Pin 3 is connected to a common GND connection. This allows the Raspberry Pi Pico to read each directional input independently.

The second type is a single-button PCB, designed for the A, B, Select, and Start buttons. Each board has a single 12 × 12 mm tactile push button with four CON1 connectors.

Here, Pin 3 of the tactile switch is connected to two CON1 connectors, which serve as the signal connections and will be wired to the GPIO pins of the Raspberry Pi Pico. Similarly, Pin 2 is connected to two other CON1 connectors, which serve as the common ground connections.

BUTTON BOARDS PCB ASSEMBLY

First, we begin with the relatively simple PCB assembly process for the XYAB, Select, and Start buttons.

  • Start by placing a 12 × 12 mm tactile push button onto the designated switch pads on the PCB.
  • Solder all four terminals of the switch to secure it firmly in place.
  • Repeat the same process for the remaining XYAB, Select, and Start button PCBs.
  • Once all the individual button boards are assembled, move on to the D-pad PCB. Place four tactile switches onto their respective pads and solder all four terminals from the bottom side of the PCB.

All the button PCBs are now assembled and ready to be installed inside the Game Boy Advance XL.

PICO DRIVER BOARD


For handling all the button inputs, we're using a Raspberry Pi Pico W paired with a custom controller PCB from my previous Motorola DynaTAC Max project.

The PCB uses a CD74HC4067 multiplexer, which allows us to connect multiple button inputs to the Pico W while keeping the GPIO usage to a minimum. All our button boards, including the D-pad, A, B, Select, and Start, will be connected to this controller board.

The Raspberry Pi Pico W is flashed with custom wireless game controller firmware that makes it appear as a Bluetooth gamepad. This allows us to pair it directly with the LattePanda Mu and use the physical buttons as standard game controller inputs.

One advantage of this approach is that we don't need to develop a completely new controller circuit for this project. I'm reusing the entire PCB from the Motorola DynaTAC Max, which has already been tested in another build.

I've also linked the original Motorola DynaTAC Max project below if you'd like to learn more about the controller PCB and its implementation.

 

https://www.hackster.io/Arnov_Sharma_makes/motorola-dynatac-max-e10b5b#toc-pcb-design--pico-driver-18

CODE
#include <JoystickBLE.h>
#define S0 20
#define S1 19
#define S2 18
#define S3 17
#define SIG 16
const uint8_t NUM_BUTTONS = 8;
// Mux Channel to Gamepad Button Mapping:
// CH0 -> Button 1 (Up)
// CH1 -> Button 2 (Down)
// CH2 -> Button 3 (Left)
// CH3 -> Button 4 (Right)
// CH4 -> Button 5 (A)
// CH5 -> Button 6 (B)
// CH6 -> Button 7 (Select)
// CH7 -> Button 8 (Start)
bool currentBtnState[NUM_BUTTONS];
bool lastBtnState[NUM_BUTTONS];
unsigned long lastDebounceTime[NUM_BUTTONS];
const unsigned long debounceDelay = 10; // 10ms debounce
void selectMuxChannel(uint8_t channel) {
digitalWrite(S0, (channel >> 0) & 0x01);
digitalWrite(S1, (channel >> 1) & 0x01);
digitalWrite(S2, (channel >> 2) & 0x01);
digitalWrite(S3, (channel >> 3) & 0x01);
delayMicroseconds(20); // Settling time for CD74HC4067
}
void setup() {
Serial.begin(115200);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(SIG, INPUT_PULLUP);
for (uint8_t i = 0; i < NUM_BUTTONS; i++) {
currentBtnState[i] = HIGH;
lastBtnState[i] = HIGH;
lastDebounceTime[i] = 0;
}
// Send reports manually only when states change
JoystickBLE.useManualSend(true);
JoystickBLE.begin();
// Keep analog axes locked at center so Steam doesn't detect axis drift during binding
JoystickBLE.X(512);
JoystickBLE.Y(512);
JoystickBLE.send_now();
Serial.println("Pico W 8-Button BLE Gamepad Ready.");
}
void loop() {
unsigned long now = millis();
bool stateChanged = false;
// 1. Scan Mux Channels 0 to 7
for (uint8_t i = 0; i < NUM_BUTTONS; i++) {
selectMuxChannel(i);
bool reading = digitalRead(SIG);
if (reading != lastBtnState[i]) {
lastDebounceTime[i] = now;
}
if ((now - lastDebounceTime[i]) > debounceDelay) {
if (reading != currentBtnState[i]) {
currentBtnState[i] = reading;
// JoystickBLE buttons are 1-indexed (1 to 32)
// Active LOW: LOW means pressed (true), HIGH means released (false)
JoystickBLE.button(i + 1, (currentBtnState[i] == LOW));
stateChanged = true;
}
}
lastBtnState[i] = reading;
}
// 2. Push the BLE report only when a button is pressed or released
if (stateChanged) {
JoystickBLE.send_now();
}
}

LID ASSEMBLY

  • We begin the lid assembly by bringing all six 3D-printed sections together to form one large enclosure. Each section is positioned alongside its neighboring parts, making sure all the edges align properly. It's pretty much like putting together a giant jigsaw puzzle!
  • Once all six sections are aligned, we apply a little superglue along the joints between them. This temporarily bonds the pieces together and keeps everything in position while we prepare for the next step: plastic welding.
  • For permanently joining the sections, I'm using a plastic welding tool with metal reinforcement staples. The tool heats the staples and pushes them into the plastic across the joints. As the heated staples sink into the material, they fuse the adjoining sections together, creating a much stronger mechanical connection.
  • We repeat this process along all the joints, adding staples at regular intervals to reinforce the entire lid. Once everything is secured, we use a wire cutter to trim off the excess staple legs protruding from the surface.

The result is a single, solid rear lid assembled from six individual 3D-printed parts. This technique provides a much stronger and more durable structure compared to simply gluing the sections together.

FRONT ACRYLIC GLASS

For the front screen glass, I decided to use a 3 mm-thick acrylic sheet. I had it laser-cut to match the ratio and shape of the original Game Boy Advance screen glass.

If you don't have access to a laser cutter, you can also make this manually using a jewellery saw and a paper stencil as a cutting guide. However, since I had access to a laser cutter, I went with that approach.
 

FRONT GLASS & MAIN BODY ASSEMBLY


To attach the acrylic glass to the main body, I'm using transparent double-sided adhesive tape. I cut the tape into smaller strips and apply them along the entire display border, making sure the edges are properly covered.

Once the tape is in place, we remove its protective backing to expose the adhesive surface. We then carefully position the laser-cut acrylic sheet over the display opening and press it down firmly so that it bonds securely with the tape.

DISPLAY ASSEMBLY

We begin by removing the protective film from the display panel. Next, we carefully position the display into its mounting position from the back side of the main body, making sure it is properly aligned with the screen opening.

Once the display is in position, we use a hot glue gun to apply adhesive around its corners and edges. This secures the panel to the enclosure and prevents it from shifting out of position.

LATTEPANDA & DISPLAY DRIVER HOLDER ASSEMBLY


First, we position the combined LattePanda and display driver holder inside the enclosure and secure it using two M2 screws.

Next, we place the LattePanda Mu on the holder and fasten it using four M2 screws.

We then position the display driver board right next to the LattePanda and secure it with two more M2 screws.

POWER SOURCE WIRING

Next, we install the DC barrel jack at the bottom of the enclosure and secure it using the provided mounting nut.

We then connect its positive and negative terminals to the 12V and GND inputs on the display driver board, respectively.
 

HDMI CONNECTION


Because space is so tight inside the Game Boy, there wasn’t enough room for a regular HDMI cable.

So, we got two HDMI breakout boards and connected them with an FFC ribbon cable.

This makeshift HDMI cable is perfect for the LattePanda’s cramped HDMI port. We plug it into the LattePanda and the display driver board, and that’s pretty much the whole HDMI connection.

A B BUTTONS ASSEMBLY

We begin the A and B button assembly by placing the B button in its designated position, followed by the A button.

Next, we position the button PCB over the A and B buttons, aligning it with the screw bosses modeled into the enclosure. Using four M3 screws, two for each PCB, we secure the button board in place.

The PCB is positioned so that the 3D-printed buttons remain firmly in place while allowing approximately 0.5 mm of movement when pressed. This small amount of movement allows the buttons to register clicks reliably without shifting out of position.

START SELECT BUTTON ASSEMBLY


Similar to the A and B button assembly, we first position the 3D-printed Select and Start buttons in their designated slots.

Next, we place the switch PCB over the buttons, aligning it with the screw bosses in the enclosure. Using four M3 screws, we secure the PCB in place, ensuring that both buttons remain properly positioned and can move freely when pressed.

DPAD BUTTON ASSEMBLY

We next place the D-Pad in its designated position inside the enclosure. Once the D-Pad is in place, we position our custom switch PCB over it, aligning it with the screw bosses.

Using four M3 screws, we secure the PCB and switch assembly in place, ensuring that the D-Pad remains properly positioned and can move freely when pressed.

With this, our D-Pad PCB assembly is complete.

RIGHT TRIGGER ASSEMBLY

  • Next, we move on to the right trigger assembly, which will be used to turn the device on and off.
  • We begin by positioning the switch PCB in its designated place inside the enclosure.
  • We then slide the 3D-printed trigger into position, followed by the stepping part, which helps keep the trigger aligned.
  • Finally, we use an M2 screw to secure the stepping part and trigger together, locking the entire button mechanism in place while allowing the trigger to move freely when pressed.

PICO DRIVER BOARD & BODY ASSEMBLY

  • We position the PICO Driver PCB near the top section of the main body, aligning it with the two screw bosses modeled into the enclosure.
  • Using two M2 screws, we secure the PCB in place, ensuring that it remains firmly mounted inside the main body.

PICO DRIVER & BUTTON BOARDS WIRING

Following the provided wiring diagram, we connected the PICO Driver board to the Button board using single-core copper wires.

We started by connecting the GND terminals of all the buttons together and then connected the common ground to the PICO Driver board. Once the ground connections were complete, we connected the remaining terminal of each button to its corresponding output channel on the PICO Driver board.

The connections were made as follows:

  • CH0 to Up button
  • CH1 to Down button
  • CH2 to Left button
  • CH3 to the right button
  • CH4 to A button
  • CH5 to B button
  • CH6 to Select button
  • CH7 to Start button

This completes the wiring between the PICO Driver board and the Button board, allowing each button to be read independently by the controller.
 

RIGHT TRIGGER WIRING

Next, we used a long 2-pin JST cable and connected its terminals to the trigger button switch.

We then plugged the JST connector into the power switch connector on the LattePanda Mu. This allows us to turn the LattePanda on or off by pressing the trigger button.

BLUETOOTH SPEAKER ASSEMBLY

We started by connecting one of the Bluetooth speaker module's output channels to a 4-ohm speaker, connecting the positive and negative terminals accordingly.

  • We also added positive and negative power wires to the module's input power terminals.
  • Next, we placed the speaker in its designated position inside the enclosure, with the Bluetooth module positioned right next to it.
  • To secure both components in place, we applied hot glue around the speaker and the Bluetooth module, ensuring that they remained firmly fixed.
  • Finally, we connected the Bluetooth module's power input wires to the 12V input section of the PICO Driver board, which receives power from the DC power jack. This allows the Bluetooth module to receive power directly from the main power supply.

FINAL ASSEMBLY

For the final assembly, we start by using cable ties to organize the internal wiring of the game controller. We group the wires together and secure them with cable ties to keep everything neat and prevent loose cables from getting in the way.

Once the wiring is organized, we position the rear lid over the back of the main body. We then use M4 screws to fasten the lid to the main enclosure, securing both sections together.

And with that, the assembly of our Game Boy Advance XL is finally complete!

RESULT

And here's the result of our rather long, but relatively simple build process!

This is a Game Boy Advance, well, not exactly the one we all know. It's a much bigger and more powerful version that we created by 3D printing a giant enclosure, working on the body finishing, and using an SBC as its brain.

We've combined the classic Game Boy Advance design with modern PC hardware, added functional gaming controls, and turned it into our very own Game Boy Advance XL.

It looks like the original Game Boy Advance and retains the familiar button layout and overall design, but under the hood, it's a completely different machine with a few major upgrades, of course!

FIRST BOOT

Since our version doesn't have an onboard battery yet, we rely on an external 12V, 4A power adapter. We connect the adapter to the DC barrel jack located at the bottom of the device and press the trigger button to power on the LattePanda Mu.

Within a few seconds, the system boots straight into Windows, thanks to the onboard NVMe SSD.

BUTTONS DEMO

First, we pair the Raspberry Pi Pico W game controller with the LattePanda over Bluetooth. Next, we open Steam and configure the button mapping so that the onboard D-pad, A, B, Start, and Select buttons are recognized as controller inputs.

Once the mapping is complete, we can navigate Steam and control the interface directly using the built-in Game Boy Advance XL controls.

BENCHMARKS

To test the graphics performance of the LattePanda Mu, I installed Steam and ran 3DMark's Time Spy benchmark on its integrated Intel UHD Graphics.

The system scored 670 points, slightly above the displayed average of 605 for the same hardware.

The graphics test ran at an average of around 3.37 FPS, so this is definitely not a gaming powerhouse, but it's an interesting result for such a compact x86 computing platform.

I'll also be testing a few games on the system to see how well it handles actual gameplay.

POKEMON EMERALD

To play Pokémon Emerald, we installed RetroArch through Steam. Using a legally obtained copy of the game ROM, I was able to get Emerald running on the device without any issues.

With a Bluetooth speaker connected, we fired up the game and started playing using the onboard D-pad, A, and B buttons. And honestly, it was an absolute feast!

As someone who grew up playing the older Pokémon games, this brought back a lot of memories. Sure, this console is absolutely absurd in size, harder to control, and nowhere near ergonomic, but the fact that it runs Emerald and lets me play it just like a regular GBA is something else.

I've played Pokémon games on my phone using emulators and very recently got my hands on a working original GBA. But seeing Pokémon Emerald running on something I designed, 3D printed, assembled, and programmed myself? That genuinely blew my mind!

It's ridiculous, it's oversized, and it makes absolutely no sense as a handheld console, but that's exactly what makes it so much fun!

FALLOUT NEW VEGAS

The next game I tried was Fallout: New Vegas, and it ran just as expected. Using a Bluetooth keyboard and mouse, I was able to play it just like I would on any regular PC. Thanks to the LattePanda Mu's Intel N305 processor, the gameplay was smooth, making it feel like a proper desktop PC packed inside a giant Game Boy Advance.

I bet it could handle games like Fallout 4 or even Fallout 76, but honestly, we don't really need to test those. I’m not a fan of Fallout 4, and especially not Fallout 76, so let's just leave those out of the equation!

MINECRAFT

The last game I wanted to try was Minecraft. I installed it along with a few mods and gave it a go. It performed quite well!

Minecraft runs on almost anything these days, even on single-board computers. I've run it on boards like the Raspberry Pi before, so it wasn't much of a surprise that the LattePanda Mu's N305 processor could handle it.

Heck, this little thing can even run games like Red Dead Redemption 2 at around 20 FPS on high settings! And with a GPU connected through the onboard PCIe slot, we can push it even further and run more demanding titles, which I've already tested.

So yeah, Minecraft ran pretty well, and the LattePanda Mu had no trouble handling it!

OVERVIEW

So this was my Game Boy Advance XL, a giant Game Boy replica I built from scratch. But here's the thing: it works more like a Steam Deck than an actual Game Boy!

For Game Boy games, we use RetroArch, while Windows and Steam handle everything else.

Thanks to the addition of an M.2 Bluetooth and Wi-Fi card, we can connect to the internet wirelessly and pair all kinds of devices. In our case, we've connected a mouse, keyboard, PS5 controller, and even a Bluetooth speaker. The onboard buttons are connected to a Raspberry Pi Pico W, which handles all the inputs.

Honestly, this has been a massive project for me, probably one of the best I've ever made. My biggest project before this was the giant Motorola DynaTAC phone, which actually gave me the idea to build something like this.

Although it shares its name with the original Game Boy Advance, this device is completely different under the hood. Thanks to the LattePanda Mu inside, it's essentially a PC disguised as a classic gaming console.

If only I could tell my 12-year-old self that one day I'd be building something like this!

I always wanted a Game Boy Advance when I was in school, but my parents never got me one. Now, original GBAs are getting harder to find in India, so I decided to build my own version. And the best part? It's open source!

Of course, there are plenty of things I want to improve in Version 2.

The biggest issue is the power supply. Unlike the original GBA, which runs on two AA batteries, mine doesn't have an onboard battery yet.

I plan to design a custom battery lid with two giant AA battery holders. Inside, I'll use my own 12V battery packs disguised as oversized AA cells. Two of these cells will power the entire device while keeping the classic Game Boy aesthetic.

The second issue is audio. I originally planned to use a different audio driver, but that component wasn't available, so I had to improvise. I'll be replacing it with my original plan in Version 2.

Next, we need a stand. This thing is massive and pretty heavy, so a foldable stand built into the lid would be a great addition.

And finally, cooling. The LattePanda's stock cooler does the job, but airflow inside such a massive enclosure is a challenge. I'll need to add intake and exhaust fans to improve air circulation throughout the device.

Those are the major improvements I'm planning for Version 2.

If you have any questions about this project or need additional information, feel free to DM me on Instagram. I'm super active there!

And if you've made it this far, you're awesome! I'll be back with another project very soon.

Peace out.

icon 3D FILES.zip 8.13MB Download(0)
License
All Rights
Reserved
licensBg
0