There oughta be a Game Boy Photo Booth

21 July 2025

Another one of my cousins got married, so it was time for another photo/video booth. This time it uses a Game Boy Camera and a Game Boy Printer.

Thumbnail of the youtube video: The thumbnail shows a wedding couple on the left hand side. The groom is carrying the bride, both laughing. On the right hand side, there is a details shot of a Game Boy Printer, showing the logo of the device and a print-out coming out of it. The printout shows the couple from the left side of the thumbnail in typically low quality black and white quality of a thermal paper print.
Click the image to see the video on youtube.com.

The video above gives a good overview of the project. The blog entry below contains a few more technical details as well as links to source code and additional resources.

Please note that this article contains affiliate links, i.e. links that tell the target site that I sent you there and that earn me a share of their revenue in return, i.e. as an Amazon Associate I earn from qualifying purchases. In contrast to regular external links, such affiliate links are marked with a dollar sign instead of a box.

What is a Game Boy Photo Booth?

Loyal readers of my blog will certainly remember my bullet time video booth. It was a rig for my cousin’s wedding allowing guests to take short video clips of themselves with a bullet time effect as transition. In fact, building these video booths has become a bit of a tradition as I first created one for my own wedding, followed by a total of three for friends and cousins. Each time resulting in a wonderful memory of the wedding reception with clips from all the guest cut into one long video with upbeat music selected by the couple.

So, when another one of my cousins1 got married, it was time for another one, video booth number five. Since reusing the bullet time rick was not an option due to space constrictions, it was a perfect chance to make a crossover between my camera stuff and my Game Boy stuff to create a Game Boy photo booth. After all, that cousin also loves the old video game systems.

Wide angle shot of a small room. On the left there is a table with colorful disguises like hats and oversized sunglasses. On the table are also a red and green push button and a Game Boy Printer. Above the table are two large video lights an a screen inbetween those lights with a camera barely visible above the screen. On the right, in front of the camera, are three party guests with diguises singing, linking arms and looking at the camera.
The video/photo booth in action. Guests control it via the green and red push buttons on the table and will see a preview of their recordings and their printout on the screen.

Ok, so what is it? A photo booth or a video booth? Well, both.

When guests push the green button, they get some intructions and a countdown. At the end of the countdown a five second video clip is recorded using a proper modern mirrorless camera and a Game Boy camera simultaneously, resulting in a bunch of video clips for me to assemble later. That’s a video booth. But with this setup, it does not end here. It also takes three stills from the Game Boy Camera recording and offers the guests to print them through a Game Boy Printer as a souvenir for the guests themselves - like typical photo booths do at many wedding receptions2.

Detail shot of the camera assembly at the top of the photo booth. From left to right it shows a Game Boy Pocket, a Game Boy Camera in a mount and a Sony a6400 from which mostly a big Tamron lens is visible.
The video/photo booth records with a Game Boy Camera and a Sony a6400 simultaneously.
Close-up of the Game Boy Printer on the table at the wedding reception. A half-printed strip of paper is sticking out from its top, showing two stills from a video recorded by guests.
Guests can print stills from their videos on the Game Boy Printer.

Setup overview

The entire setup does not really do something unusual I haven’t done before, but it combines many different components.

At the heart sits a Raspberry Pi 4, which runs a Python script to control everything and to show a GUI to the guests. That GUI is actually a web-interface, based on Flask and displayed locally via Chromium. In theory, you could use this to show the status of the video booth remotely or display the newest video clips somewhere else at the wedding reception, but I only used it to show the GUI on a screen attached to the same Raspberry Pi for a simple reason: I find it much easier to create a full screen GUI with frame-precise playback3 of multiple videos via HTML5 and JavaScript than doing so with some specialized and OS-specific Python modules4.

Photo of two large push buttons (the really big emergency stop types). The left one has a green hat, the right one has a red hat.
Two emergency stop type push buttons are used to control the photo booth via Bluetooth Low Energy.

The video box is controlled by two big push buttons. These are exactly the same push buttons I already used for the bullet time video booth. They run on two AA batteries each and have a Raspberry Pi Pico W inside that acts as a Bluetooth Low Energy keyboard, sending only a single button press to the Pi 4 whenever the push button is pressed. Its source code can be found here.

The top of one of the push buttons is lifted to reveal its insides. The edge of a Raspberry Pi Pico W is visible at the edge.
The push buttons contain a Pi Pico W powered by two AA batteries.

Then there is the main camera, the Game Boy Camera and the Game Boy Printer, which I will discuss in the next sections.

Controlling the main camera

In the context of this project, controlling the main camera, a Sony a6400, should be the boring part, but there are a few details to it that make this trickier than you might think.

In a perfect world, I would just hook up my modern camera to a USB port and be able to control it and to download recorded videos, so I can show the results to the guests. Unfortunately, that’s not possible with the a6400 (no video download in anything but mass storage mode).

In a less perfect, but still somewhat nice world, I would use the camera’s Wifi interface for this, but nope, also not possible on the a6400 (no video download via Wifi).

In a cumbersome but still livable world, I would grab the video directly from the camera through an HDMI grabber, but that is not possible on the a6400 with USB control (one camera stream is reserved for USB preview and hence unavailable for HDMI out).

The combination that actually worked well for me is (brace yourself!) controlling the camera via Bluetooth Low Energy and retrieving the recording through a Wifi SD card. In fact, this is what gave me the idea to create my Bluetooth remote control app for alpha cameras for which I already discussed the different control and retrieval options.

The downside is that I had to limit the resolution to 1080p instead of 4k due to the slow memory card, but compared to the Game Boy Cameras resolution that’s still plenty.

Photo of fingers holding a white SD card. Its label reads FlashAir W-03, Wireless LAN 16GB Toshiba.
An old Wifi SD card turned out to be the best way to retrieve the data. That should probably tell us a few things about proprietary firmware and generally bad software of Sony cameras.

Capturing the Game Boy Camera

Believe it or not, but recording a video stream from the Game Boy Camera is much simpler. At least if you already have another one of my projects at hand: The GB Interceptor.

Quick explanation if you have not heard of it: It is a little adapter that goes between a Game Boy and a game cartridge (like the Game Boy Camera). It captures the communication between the two to reconstruct what the Game Boy is showing on the screen, all handled by an rp2040 microcontroller. In case of the Game Boy Camera, you can simply enter the shoot mode of the Game Boy Camera and the video will be available to the GB Interceptor.

Detail shot of a Game Boy Camera sticking out from a classical Game Boy. The shot shows the camera while only the top edge of the Game Boy is visible.
This is the original Game Boy Camera from my childhood in the original Game Boy also from my childhood (not used in this project).

The GB Interceptor simply acts as a regular USB webcam and since my original article on the GB Interceptor, I managed to implement MJPEG encoding which makes it compatible with pretty much any host device5, including computers and laptops with Linux, Windows and MacOS as well as Android tablets and iPads with iPadOS. If you are interested in learning how encoding MJPEG on an rp2040 works when it is already fully occupied following a Game Boy and rendering its graphics, I would recommend watching my talk at the 37c3 Chaos Communication Congress (yes, I am quite proud of that talk).

The point is that I only had to use a regular Game Boy, plug in the GB Interceptor, plug in the Game Boy Camera into the GB Interceptor and connect the GB Interceptor with a USB-C cable to the Raspberry Pi. Maybe the only unusual thing is that I used the break-out board of the GB Interceptor PCB to use a long ribbon cable between the Game Boy and the Game Boy Camera, allowing me to position it more freely.

Detail shot of the Game Boy and the Game Boy Camera above the photo booth screen. The Game Boy on the left is a blue Game Boy Pocket with a purple PCB sticking out from its top. A USB-C cable is attached to the side of the PCB. On the right is a green Game Boy Camera, held to a mount with zip ties.
The Game Boy Camera on the right is running on the Game Boy Pocket on the left. It is hooked up with a long ribbon cable that is attached to the back of the GB Interceptor (purple PCB sticking out the back of the Game Boy). The USB-C cable at the side of the GB Interceptor is connected to the Raspberry Pi 4 to capture a video of the Game Boy screen.
View from the back of the previous photo. Now the GB Interceptor is visible on the right with the long ribbon cable attached to it and the label GB Interceptor well visible. On the left is the Game Boy Camera (slightly blurred outside the focal plane).
The GB Interceptor is connected to a long ribbon cable and the GB Camera is actually plugged into the GB Interceptor's breakout board to allow for a more flexible placement.

Printing on the Game Boy Printer

And finally, the Game Boy Printer. This is the part for which I had to write the most code. Not because it was particularly difficult, but simply because I had not done it before.

When I am saying that it was not difficult, then this is the case not because I naturally speak Game Boy Printer, but because I could of course once again count on the Game Boy dev community to have long solved how this is to be done. As always, the gbdev.io Pandocs give all the necessary info in a compact overview, but there are also plenty more explanations for the Game Boy Printer communication to be found on the web.

Electrically, the communication is done through a Game Boy link cable, which is basically an SPI interface. In case of the printer it is even more rudimentary as data is never transmitted in both directions at the same time. So, I wrote some minimal Arduino code that receives data through a USB serial interface, writes it as SPI to the Game Boy Printer and returns the answer back to the USB serial.

A photo of an oscilloscope showing three traces and decoding information below. From top to bottom they are labelled as CLK, MOSI and MISO. The CLK signal is on 5V most of the time with very frequent drops to 0V. MOSI is mostly on 0V with sporadic rises to 5V and MISO shows very pronounced cross-talk from CLK, but basically stays on 0V until some 5V activity towards the end of the signal. The CLK signal appears in clusters and below all three traces are two lines of decoded data labelled MISO and MOSI with one byte represented as two hex digits corresponding to each cluster of the CLK signal.
The GB Printer signal is basically a fixed SPI connection and can be decoded by simple oscilloscopes.

The Arduino code runs on a 5V variant of the Pro Micro. You know how much I love the Pi Pico / rp2040, but in this case I had to yield to the old technology of the Game Boy Printer, which has a logic level of 5V. So, as the Printer would not accept the 3.3V commands from a Pi Pico, instead of fiddling with level shifters, I simply grabbed the first 5V uC from my collection that I could find - which was a Pro Micro.

A photo on the left shows the Pro Micro with four cables soldered to the pins 16, 14, 15 and GND. The pins are labelled as MOSI, MISO, SCLK and GND with matching colors of the cables. The photo on the right shows the connector for the Game Boy printer with four of its six pins labelled SIN, SCK, SOUT and GND and matching colors for the Pro Micro. The remaining two pins are labelled as not connected.
A quick (and dirty) solder job is enough to hook up the Game Boy Printer to the Pro Micro's SPI interface. Note that the colors are just the ones that happened to be used in the cheap cable I used for this. Also be aware that naturally MOSI and MISO are swapped on both ends of such cables, so even if you had the same cable as shown here, the colors might be different if you use the other end.)

The Printer itself is somewhat limited. It can receive commands for line feed and accepts 8 pixel high rows of 2bit tile data in the same format that the Game Boy uses to print batches of eight pixel rows. Its horizontal resolution matches the Game Boy with 160 pixels while you can print endlessly to achieve any vertical resolution. However, it only has internal memory for a single Game Boy sized screen (144 pixels or 18 tile rows), so long images have to be split up into multiple commands. Transfer and printing takes a while although I am driving the Printer’s SPI interface at four times the data rate that could be achieved by the original Game Boy (32kbit/s instead of 8kbit/s).

I wrapped it all into a neat little Python module, which boils it down to a single command that takes an arbitrary image to be printed on the Game Boy Printer. Well, almost arbitrary: The height of the image must be a multiple of eight after it has been scaled to a width of 160 pixels.

You should be able to easily reuse my work by using my Arduino code on almost any 5V micro controller and using my Python module for the Game Boy Printer:

1
2
3
4
from GBPrinter import GBPrinter

with GBPrinter("/dev/ttyACM0", 115200) as gbp:
    gbp.printImageFromFile("testprint.png", 0.5)

The second parameter adjusts the “exposure” of the thermo paper, i.e. making the entire printout darker or brighter.

And a final important tip: You do not have to find some of the rare old stocks of original Game Boy Printer paper or expensive reproductions. Any thermal paper with the right width of 38mm and a not too big roll diameter should do fine.

Conclusion

In the end the guests had a lot of fun and especially my cousin who also appreciates old video games loved the Game Boy video/photo booth. Of course, the final video with the clips from all the guests primarily used the footage from the “good” camera. You would not want this memory of your wedding to be lost in 128x112 pixels6, but I could use the Game Boy Camera footage to spice up the video.

It might also be worth noting that once the setup was running, I did not have to look after it except for refilling the printer paper twice. I emphasize “once it was running”, because I was a bit careless with the quick solder job on the Pro Micro while setting it up, which means that I am now known as that nerd who brought a soldering iron to a wedding. Totally worth it.

Photo of me in a white shirt holding a soldering iron next to a table with a sign Foto Box (in German) on it.
If you are too careless about your soldering and packing, you might want to bring a soldering iron...

Usually, I provide one link to the source for a project, which contains everything, but in this case it is unlikely that you will reuse the entire project (after all, it is quite specific to all the components) and some parts have been reused from previous projects. So, here is an overview of all the bits and pieces already provided throughout the blog article:

  1. This is now cousin 3 of 5, so this might not be the last blog/video on the subject. 

  2. Of course, this is what I perceive as “typical”. I could not even say if a wedding tradition is actually typical for Germany or only for the part of Germany where I live. No idea if the rest of the world does the same, but I suspect that a lot of these traditions has been unified by Hollywood. 

  3. Frame-precise playback is also the reason that I do most of my presentations in HTML instead of something like PowerPoint. When I started doing this more than ten years ago, the HTML5 players in Chrome and Firefox were pretty much the only ones who could jump to a specific frame and not just the nearest I-frame. Being able to do such jumps and scripting them is so helpful for showing nicely rendered animations. 

  4. In fact, I am so used to doing this in HTML, which runs pretty much on any platform, I cannot even be bothered to check which alternatives might be available. 

  5. With the Nintendo Switch 2 being a notable exception. Since I do not own a Switch 2 I cannot test this, but I suspect that it rejects the odd resolution with a 10:9 aspect ratio. 

  6. Yes, the Game Boy Camera resolution is even lower than the Game Boy’s 160x144.