Arduboy Games & Flasher

POOM plays Arduboy games, and there are two ways in. Play: pick a ready-made game and flash it in one click — start here. Build: use the POOM Arduboy library to compile and migrate your own Arduboy sketches to run on POOM. Consumer POOM is an ESP32-C5.

Heads up: flashing a game replaces the POOM multitool firmware — it's one app at a time. To get the full POOM tools back, re-flash poom.bin with the POOM web flasher (see Getting Started).
Desktop only: the Games Flasher uses Web Serial and is not available on phones or tablets. Use Chrome or Edge on a desktop or laptop to connect POOM and flash a game.

What Is Arduboy?

Arduboy is a credit-card-sized open-source game console with a 128×64 1-bit OLED and six buttons. Its games are small Arduino sketches (.ino) written against the Arduboy2 library, and the community has published hundreds as open source. POOM has the same screen shape and button layout, so with the right library those games run on it.

Play — The Game Flasher

The games flasher is a browser tool (like the POOM web flasher) that writes a ready-built game onto POOM over USB using Web Serial + esptool-js. No toolchain, no Arduino IDE.

  1. Open the games flasher and pick a game (thumbnail, name and details show up). The catalog has 167 flash-ready games across Arcade, Action, Puzzle, Shooter and more.
  2. Plug POOM in with a data USB-C cable and click Flash Game.
  3. The tool connects to the ESP32-C5, erases flash, and writes the game's merged image.
  4. On DONE!, power the device off then on to boot the game.
Games Flasher — pick a game, Flash Game, then off / on to boot it.

Under the hood it flashes the game's *.ino.merged.bin at 0x00000 with Arduino ESP32-C5 settings dio / 80m / 4MB, using the esptool-js C5 stub with compressed writes and erase-all.

Browser rules: Chrome or Edge on desktop (Web Serial), a data cable, and close any other serial terminal first. If the port won't appear, enter download mode (hold BOOT, tap RESET, release BOOT).

Build — The POOM Arduboy Library

The poom library is an Arduboy2-compatible port for ESP32 boards with a 128×64 I2C OLED, discrete buttons and a one-pin buzzer. It gives you the familiar Arduboy2 development experience — 1-bit framebuffer, frame timing, sprites, button input, audio — so an existing Arduboy sketch mostly just recompiles for POOM.

What it providesDetail
APICompatible with Arduboy2Base / Arduboy2; include <Arduboy2.h>
Display128×64 1-bit framebuffer, SH1106 via Adafruit_SH110X
Inputpressed, justPressed, justReleased, classic button masks
GraphicsPrimitives, text, bitmaps, compressed bitmaps, Sprites / SpritesB
AudioBuzzer via arduboy.tunes; audio state saved in EEPROM
ExtrasBoot menu (hold UP), SD .bin loader, ESP-NOW multiplayer, IMU

Library metadata: name Arduboy2, version 5.2.1, architecture esp32. Dependencies to install in Arduino: Adafruit GFX, Adafruit SH110X, and Adafruit NeoPixel (for the RGB LED; disable with POOM_USE_WS2812 = 0).

Install the Library

Drop the repo into your Arduino sketchbook libraries/ folder as poom:

cd ~/Arduino/libraries
git clone <repo-url> poom

Restart Arduino IDE. Because the library exposes Arduboy2.h, sketches still use #include <Arduboy2.h>, and the bundled examples (ArduBreakout, BeepDemo, Buttons, HelloWorld, IMUdemo, PlayTune, RGBled, VidTest, menu) show up under File → Examples. Also install an ESP32 board package.

If the IDE doesn't detect it: the folder must sit directly inside libraries/, not nested. Confirm your I2C address / pins in src/BoardConfig.h if your board differs.

Quick-Start Sketch

#include <Arduboy2.h>

Arduboy2 arduboy;

void setup() {
  arduboy.begin();
  arduboy.setFrameRate(30);
}

void loop() {
  if (!arduboy.nextFrame()) return;   // frame timing

  arduboy.pollButtons();
  arduboy.clear();

  arduboy.setCursor(18, 18);
  arduboy.print("Hello ESP32");

  if (arduboy.justPressed(A_BUTTON)) {
    arduboy.tunes.tone(880, 80);      // beep
  }

  arduboy.display();
}

The loop is the classic Arduboy pattern: nextFrame() gates timing, pollButtons() reads input, you draw into the framebuffer, and display() pushes it to the OLED. Button masks are the standard set: A_BUTTON, B_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON. Audio is toggleable at runtime (arduboy.audio.on()/off()) and its state persists in EEPROM.

Board Config (ESP32-C5)

All board-specific settings live in src/BoardConfig.h. Defaults for the consumer POOM (ESP32-C5):

SignalGPIOSettingValue
I2C SDA / SCL0 / 1OLED I2C address0x3C
Buzzer26OLED X shift-2
Button A / B28 / 9WS2812 RGBon (GPIO 27)
UP / DOWN7 / 24SD MISO / MOSI8 / 4
LEFT / RIGHT3 / 23SD SCK / CS6 / 5
OLED silent? Check SDA/SCL, try address 0x3D, and adjust OLED_X_SHIFT if you see a horizontal offset/wraparound.

IMU & ESP-NOW Multiplayer

Beyond stock Arduboy2, the POOM library adds an IMU (see the IMUdemo example) and wireless ESP-NOW multiplayer exposed as arduboy.multiplayer:

arduboy.multiplayer.begin("GAME_ID");
arduboy.multiplayer.update(arduboy.pressedButtons());
if (arduboy.multiplayer.remoteJustPressed(A_BUTTON)) { /* remote P2 */ }
arduboy.multiplayer.send(payload, length);
arduboy.multiplayer.read(payload, maxLength);

Two POOMs sync buttons and small state payloads so a second device can join a match. FESTIVEFIGHT_AB is the pilot: local two-player still works, and a remote P2 can control the second fighter over the air.

Migrate Your Own Game to POOM

This is the point of the library — take an Arduboy game and make it a POOM-flashable image:

  1. Install the poom library into ~/Arduino/libraries (above).
  2. Open the game's .ino (its own folder). Existing Arduboy sketches include <Arduboy2.h> already, which now resolves to the POOM library.
  3. Select the ESP32-C5 board and compile. With arduino-cli:
arduino-cli compile \
  --fqbn esp32:esp32:esp32c5 \
  --build-path /tmp/arduino-build/mygame \
  path/to/MYGAME_AB
  1. Merge the build artifacts into a single image and flash it with the game flasher (at 0x0), or load it from SD (below).

The repo already ships this done for many titles: migrated, compile-verified game sources live under arduboy/arduboy games/okay games/ (~125 compile-verified entries; open any .ino such as JETPAC_AB, FIREPANIC_AB or POOPPANIC_AB). Compile reports sit under esp32-games/_reports/.

What might need hand-fixing: AVR-specific assumptions, very timing-sensitive code, advanced audio engines, or board-specific pinout/boot behaviour. Most straightforward games recompile as-is; these are the usual porting snags. Third-party sources keep their own license/credits — check each game folder.

Loading a Game from SD

The library's boot menu (hold UP at startup) can include Binary Load: browse the SD card, pick a .bin, and it flashes to the ESP32 with Arduino Update, then reboots. This needs an OTA partition scheme (two app slots) and the SD wired over SPI (C5: MISO 8, MOSI 4, SCK 6, CS 5). It's a handy on-device alternative to the web flasher for images you've already built.

Controls

Arduboy's D-pad + A/B map straight onto POOM's six buttons. Boot shortcuts from the library: hold UP for flashlight / boot menu, hold RIGHT during the logo to skip it, and B + UP / B + DOWN at boot enable/disable audio.

Stuck in a game? A game image replaces the multitool, so re-flash poom.bin to restore the full POOM tools.