Storybox · the build

How to build a kids' story player with an ESP32

Five bench tests on one board, one part at a time, cheapest failure first. Each step shows only its own wires, the pads on the real board, and what my bench said when it passed.

Louder-ESP32-S3 rev K1 5 pads + the PN532 header to solder [time from bare parts]
photo: the finished box in use, a kid's hand placing a figure, from above
case: Owlbox by xtract, MakerWorld · firmware 0.2.7 on my box
The printable pack

The steps are free. The pack is one email.

  • Parts list with shop links
  • The pin map and all five tests as one PDF
  • One-click browser flashing for every test
  • The case files and notes as each build ships

Unsubscribe is one click.

01 · Parts

At the prices I paid

Part Qty Test Paid Where · when
Sonocotta Louder-ESP32-S3, rev K1 1 A €19.88 [shop] · [date] · bought 3
AIYIMA 2.5″ 4 Ω full-range speakers 1 pair B €21.49 [shop] · [date]
5 V 3 A supply, USB-C pigtail 1 B [price] skip if one is lying around
SPI microSD module (XC6206) 1 C [price] [shop] · [date]
microSD card, FAT32, 32 GB or less 1 C [price] [shop] · [date]
PN532 v3 NFC reader 1 D €3.90 [shop] · [date]
NTAG tags 1 per figure D €0.19 each [shop] · [date]
KY-040 rotary encoder 1 E [price] [shop] · [date]
MX switches 2 E [price] [shop] · [date]
Total, before filament about €60 single unit, board at €19.88

Some links earn dadbuilt a commission. The price shown is what I paid.

02 · Before you start

Four things to settle first

The board says K1 Check the silkscreen near the ESP32 module. Everything here is written for rev K1; the published Owlbox manual assumes an older board. Not K1? Send me a photo before you solder.
⚠ Power and polarity The barrel jack and the screw terminal share the same nets, with no fuse anywhere. Meter first, plug second. Speaker outputs are bridged: never tie one to ground. A, D and E run on laptop USB; B and C need the 5 V 3 A supply.
PlatformIO One environment per test, so a failure points at one part. Start with pio run -e a_board -t upload -t monitor.

First flash on a blank S3

once per board

A new S3 has no USB serial firmware, so the port appears and vanishes in a loop. This puts it in the bootloader. After that, every flash works over plain USB.

  1. 1 Hold IO0
  2. 2 Tap RESET, IO0 still held
  3. 3 Release IO0, last
  4. 4 Flash, then press RESET once more

Three ways to flash, every step

  1. 1 · From the browser A prebuilt test firmware per step, with ESP Web Tools. Desktop Chrome or Edge. Comes with the build note.
  2. 2 · PlatformIO, one command per step pio run -e <step env> -t upload -t monitor Pinned to espressif32@6.12.0: newer versions change the I2S API and test B stops compiling.
  3. 3 · Over the air, once the main firmware runs pio run -e g_box_airplay -t ota Finds the box over Bonjour. A build that crashes or never reaches Wi-Fi rolls back.
03 · The bench tests

Five tests, one part each

  1. Is the board alive? USB cable only · no soldering · laptop USB ✓ PSRAM, amp at 0x2D, 8 MB flash
  2. Speakers, playing a stream speakers + supply · screw terminals · 5 V 3 A Not yet passed on my bench
  3. microSD on its own SPI bus SD module · 2 pads to solder · 5 V 3 A ✓ 371 kB/s · MISO 43, CS 44
  4. The reader, into the sockets PN532 · header on the PN532 only · laptop USB ✓ Reader found · UIDs still to log
  5. Knob and buttons encoder + 2 switches · 3 pads to solder · laptop USB Not yet passed on my bench
04 · After the bench

Case, figures, firmware

CaseThe Owlbox case by xtract, printed from MakerWorld. The reader goes under the lid, clear of the speaker magnets.

FiguresPrinted in colour on a Bambu H2S with the AMS, no paint, an NTAG tag in the base.

Main firmware0.2.7 runs on my box. It ships with the Plans on [Plans date].