Build Your Own Video Game Console — Kids & Tech

Ryan Boder
Technology Hits
Published in
11 min readMar 24, 2023
Home-made game console vs Nintendo Switch (image by author)

If you read my article on teaching kids to code then you know the importance of making it fun and intrinsically rewarding for them. My son and I are building our first game with Godot but a drain on our fun is that we’re using laptops with a little screens and a regular keyboards. That playing experience can’t compete with Nintendo Switch games on a big TV screen and vibrating Joy-Cons! I needed to level the playing field.

A game console like the Switch is just a small computer with an HDMI output and USB/Bluetooth controller inputs. The obvious solution is to make a game console that runs our own games. As a bonus, building a game console is a project in itself with plenty of opportunity for learning. It’s a win-win.

So I set out to find console-like hardware & software that would run Godot games, output HDMI, and work with real game controllers. Here’s what happened.

This is written as a general guide in case you want to build your own game console, whether exactly like ours or very different.

The Requirements

Start with the games you want to play and work backward. What kind of games are you building this for? What operating systems can run those games? What hardware do you need to create a good gaming experience?

In our case it’s the games we’re making with Godot so that’s where I started. It needs:

  • An operating system that runs Godot games
  • Support for game controllers like Nintendo, PlayStation, and Xbox
  • Hardware sufficient to run 2D games and lightweight 3D games
  • USB and Bluetooth to connect the controllers
  • HDMI output so we can play it on the TV
  • WiFi because there’s no wired internet by our TV

To make things interesting, Godot 4 was released just weeks after I bought the hardware which changed our requirements. Game engines use a graphics API to communicate with the graphics processing unit (GPU) and render games on the screen. Godot 3 worked fine with OpenGL 2.1. Godot 4 prefers Vulkan and only supports OpenGL in “compatibility mode” for older devices, with a minimum version of OpenGL 3.3. Pay attention to the graphics API your game engine uses. Choose hardware & an operating system that supports it.

The Hardware

The hardware is the part that costs money. I didn’t want to spend more than necessary for a good gaming experience. I also wanted it to look and feel like a game console and not a desktop PC. A single-board computer (SBC) with a nice looking case seemed to fit the bill.

There are 2 SBC architectures widely available that can power video games, Intel and ARM. Intel CPUs power desktops and laptops. They’re typically higher performance, consume more power, and cost more. ARM CPUs power mobile devices and tablets. They’re typically lower performance, more power-efficient, and cost less. I decided to go with ARM because we’re making 2D games which don’t need as much processing power and, to be fair, modern 64-bit ARM processors are impressive despite being the lower-end architecture.

The most popular ARM SBC for DIY projects is the Raspberry Pi so that’s where I started. The RP4 seemed like the obvious choice. It’s low cost, powerful enough to run 2D games, and widely used in learning environments. There is even a project for running Godot on Raspberry Pi. The problem is they’re nearly impossible to get a hold of. They’ve been on backorder for years due to COVID-related supply chain issues.

Not wanting to wait or pay a big premium for a used RP4, I looked into alternatives. Some similar ARM SBCs are Asus Tinker, Orange Pi, Banana Pi, ODROID N2+, and BeagleBoard.

If you’re looking for something higher-performance than ARM, consider more powerful Intel-based SBCs such as Intel NUC, UDOO BOLT, and ODROID H3+. You can even go so far as to build a PC with a high-end graphics card but that makes it feel less like a game console and more like a desktop computer.

The most important hardware consideration is the GPU, especially if you intend to run 3D games. Also make sure to get enough general purpose memory (RAM). 4GB is probably the minimum worth considering but 8GB won’t hurt. This post serves as a nice guide if you’re using Godot.

I ended up ordering an Orange Pi 4 LTS. It’s low cost, similar to the RP4 but with a better GPU, and runs Ubuntu or Android. Most importantly, it was available to order unlike the RP4. We’re not making complex games so 4GB RAM felt like enough.

Orange Pi 4 LTS (image by Orange Pi)

If you like Orange Pi devices and want something more powerful the Orange Pi 5B is available now (it wasn’t when I ordered) with a significantly better GPU and a newer version of Android. But it’s more expensive and only comes with WiFi6. If I were starting the project today I might go with this instead.

Finally, determine what additional items you’ll need such as game controllers, mouse & keyboard, USB cables, storage devices, a power supply, heat sinks, and a case for the SBC. I ordered a kit on Amazon that includes the case, antenna, heat sinks, and power supply. The documentation says you need a TF card and reader, which is true if you want to install Ubuntu, but it’s not necessary to install Android.

The Software (Operating System)

Godot supports many operating systems and platforms. We’re building our games on laptops so we only need the console to run exported games, which means Android and iOS are viable options in addition to Windows, OSX, and Linux.

I assumed we would use Ubuntu Linux on the Orange Pi 4 because it’s a popular gaming OS and similar to the OS we would have used on a Raspberry Pi. It turns out I was wrong and Android was the answer. As I mentioned before, Godot 4 changed the graphics API requirements. The minimum OpenGL version went from 2.1 to 3.3. Additionally, OpenGL is only used as a “compatibility mode” in Godot 4. Vulkan is the preferred graphics API for good reasons. Vulkan is higher performance, more efficient, and is the successor to OpenGL.

Vulkan vs OpenGL (video by oreonengine9444)

The new graphics API requirements didn’t work with Ubuntu on the Orange Pi 4. Although the Mali-T860 GPU on the Orange Pi 4 does support Vulkan, the Linux device driver for Mali-T860 does not. It only supports OpenGL 3.1. The minimum OpenGL version for compatibility mode in Godot 4 is OpenGL 3.3. Therefore, Ubuntu on the Orange Pi 4 cannot run Godot 4 games.

I would have run into a similar problem if I had used an RP4 because there aren’t Godot 4 exporters yet so it was a blessing that they were on backorder.

Luckily, the Orange Pi 4 can also run Android 8.1 which supports Vulkan with the Mali-T860 GPU. It’s not what I originally had in mind but Android solved the problem. It works better than it would have using Ubuntu and Godot compatibility mode since Vulkan is the preferred graphics API.

The lesson: Pay careful attention to the graphics APIs on both your GPU itself, and the operating system you plan to run. Make sure the API required by your games is supported in both. I didn’t check for Linux driver support and got lucky that Android bailed me out. If you run Linux then it probably uses Mesa and you can check driver support here. If you run Android then you can check for compatibility here.

The other software issue to consider is compatibility with game controllers. Game controllers are mostly standardized as USB HID devices over both USB and Bluetooth. We’re using old PlayStation 3 controllers which work on any modern Linux or Android system. I ran into an issue with them on OSX because Apple dropped support which made developing our game a little harder. But there is a workaround posted on Github that still works today on OSX Ventura. If you don’t already have game controllers, there are low cost options available online that work as HID game controller devices. If you plan to use a specific controller then make sure it works with your OS before you buy.

This guide is geared toward Godot games but the concepts apply no matter what kind of games you will run. If you’re making your own games then look up the system requirements for your game engine. If you’re building a console for commercial games then look up the requirements of that platform. For example, there are guides to build a console for Steam or RetroPie. But since our goal is learning by making our own games and not just playing commercial games, building a custom console makes more sense.

Putting It Together

Once you have all the equipment, the fun begins. This is when I started including my kid in the activities. Before this point it was just planning and specs which are way over a 7-year-old’s head. Now we get to put some electronics together and have a little fun.

I tested the board myself before we got started to make sure it actually worked. Imagine troubleshooting hardware problems while trying to keep a kid engaged.

Orange Pi makes nice hardware but their support & documentation, at least in English, is lacking compared to Raspberry Pi. This wiki page is pretty much it for the OP4 LTS. An English-speaking forum exists but it’s not quite up to par with Raspberry Pi’s.

Putting the kit together involved:

  1. Put the heat sinks on the chips
  2. Place the board in the case bottom
  3. Install the antenna that comes with the case (the board came with another antenna that we had to remove first)
  4. Put the case top on and screw it together

There were no instructions for this on the wiki page but there is a video on Orange Pi’s YouTube account.

Assembling the Orange Pi 4 in a case (video by Orange Pi)

The SBC came preloaded with Android so no software installation was actually required. That didn’t stop me from making it harder than necessary. As mentioned above, I assumed we would be running Ubuntu so I followed the instructions to burn Ubuntu on a TF card, booted Ubuntu from the TF card, and ran the `sudo /usr/sbin/nand-sata-install` command to permanently install Ubuntu to the on-board EMMC, wiping out Android entirely.

Ubuntu was fine running games exported from Godot 3 but then they released Godot 4 and it no longer worked. After realizing Android 8.1 has Vulkan support I had to reinstall Android. Apparently you need Windows to install Android using the TF card. I don’t have a Windows PC but luckily you can install Android directly from an Ubuntu PC using a USB cable and the Rockchip “upgrade tool”. So I did that and we were back to running Android with Vulkan support. This setup works great with Godot 4.

Your Orange Pi 4 might come with a different OS installed, in which case you’ll need to install Android to get the Vulkan API as needed by Godot 4.

Once we had the board installed in the case and running Android we were ready to start playing games.

Using Your Game Console

Android usually runs on mobile devices and tablets which have a touch screen. Since we’re using the game console with a TV and no touch screen, we need a mouse. A regular USB mouse works fine. A USB keyboard is nice to have for typing text but not required because Android has an on-screen keyboard.

Connect your game controller(s) to the console. To connect a game controller via USB, just plug it in. If you want to connect it wirelessly via Bluetooth then this video does a nice job showing how.

Connect game controller to Android (video by 9to5Google)

Some game controllers might not work via Bluetooth on the Orange Pi 4 because Android 8.1 is older. More should work on the Orange Pi 5 which runs a newer version of Android.

In order for your games to work with game controllers, you’ll need to associate game controller inputs with input events in the Godot Input Map.

Mapping game controller inputs (image by author)

The Android OS for Orange Pi 4 is able to side-load APKs (Android applications) out of the box which is nice because our home-made games are not in any official app store.

In order to run your own Godot games on the console you need to export them from the Godot editor as Android APKs. Set the Godot rendering method to “Mobile” because the Orange Pi 4 is effectively a mobile device, not a high-end desktop. Then follow the instructions to export for Android. When you’re done you’ll have an APK (.apk) file to install on the console.

Exporting for Android (image by author)

The simplest way to transfer your APK file to the console is with a USB storage device. Copy the APK from your computer to a USB drive and then insert the USB drive into a USB port on the console. Use the “Files” app on the console to find the USB drive and double-click the APK file. Android will warn you that installing your APK is dangerous but since you trust yourself, click CONTINUE. Then click INSTALL. If Android asks you whether you want to report your app to Google as suspicious, click NO. When installation is complete you can run the app by clicking OPEN.

Installing the APK (images by author)

After that you can find it in the apps menu.

Run the Game (image by author)

Using a USB drive to transfer games to the console is simple but perhaps not the most convenient method if you’re making updates and reinstalling frequently. Alternatively, you can install an FTP server app on the console and transfer them over WiFi. If you’re comfortable using ADB you can install apps remotely by connecting ADB over WiFi. Or, if you’re really serious about this, you could create your own Android app store and install your games through it. I’m not that serious.

Wrapping It Up

That’s it folks. You now have your very own Android video game console that runs Godot 4 games, uses real game controllers, and plays on your big screen TV.

There is plenty of room along the way for making different choices than I did to better suit your own needs. The design and planning concepts work regardless of whether you use Godot, an Orange Pi 4 LTS, Android, or any other combination of tools. What’s important is that you and your kids had fun building it, learned a little, and now have a home-made game console that feels comparable to their Nintendo Switch, PlayStation, Xbox, or whatever game system they’re used to playing.

If you’re interested in chatting about this topic comment below or mention me on Twitter or LinkedIn.

--

--