Hardware
Parts chosen, with the losing candidates and why they lost. Dropping the Bluetooth speaker unlocked the modern ESP32 line, and doing the power budget before buying anything disqualified the charger everyone reaches for first.
The bill of materials
Rendered from parts.json, which is the only place it is
written down. Every link is checked by tape/check-links.mjs — and the check is
not “does it return 200”, because vendors retire and reuse product ids, so a dead link
resolves cheerfully to something else. The check is does the page still say the part’s
name.
What lost, and why
The useful half of a parts list.
| Rejected | For | Because |
|---|---|---|
| IP5306 charge/boost module | MCP73871 | The one the power budget caught. It is cheaper and more integrated, and its boost converter shuts down when the load falls below roughly 45 mA. Waiting-for-a-card draws 13 mA. The box would switch itself off every time a story ended. You cannot find this by reading a parts list; you find it by writing the budget first. |
| TP4056 charger | MCP73871 | No power path. Running the box off the cell while it charges puts the load across the charger’s sense circuit, which is bad for the cell and worse for the charge termination. It is the module everyone reaches for and it is wrong for anything that runs while plugged in. |
| ESP32 (classic WROOM) | ESP32-S3 | Its one advantage over the S3 was Bluetooth Classic, i.e. A2DP to a wireless speaker. That requirement is gone, so what remains is older silicon, less RAM and a library ecosystem drifting away from it. |
| Raspberry Pi Zero 2 W | ESP32-S3 | Twenty-five seconds to boot against about one, an SD filesystem a toddler corrupts by pulling the plug, and an idle draw around ten times higher — which on its own ends the portable version. |
| MFRC522 reader | PN532 | $4 cheaper and a bare ISO 14443A front end: you implement the NDEF layer yourself, including writing, which is the part we actually depend on. Smaller antenna, shorter range, and range is what a four-year-old’s aim spends. |
| PN5180 reader | PN532 | Genuinely better — longer range and hardware low-power card detection that would improve standby. Also ~$15, two supply rails, and thinner library support. Worth revisiting if standby ever matters more than it does. |
| DFPlayer Mini | SD + software decode | The TonUINO choice, and the reason TonUINO cannot do what we want: it is a sealed MP3 player that owns its own SD card. The firmware cannot see the filesystem, so there is no manifest, no upload, no playlists — the entire ingest story dies with it. |
| PCM5102 DAC + PAM8302 amp | MAX98357A | Two parts, two board areas, and an analogue link between them that picks up switching noise on hand-wired perfboard. The MAX98357A takes I²S straight in. |
Electrical
Power chain
The one non-obvious choice. A 3.7 V cell sags to 3.0 V when flat, so a 3.3 V rail taken straight off it browns out before the cell is empty, and an amplifier fed from it gets quieter as the evening goes on. Boosting to a steady 5 V costs about 13% of the runtime and removes both problems — the budget below assumes it.
Schematic
Every net, drawn from tape/lib/pinmap.js — so this picture and the firmware
cannot disagree about a pin number.
Connections
pinmap.js and the selftest fails if an assignment lands on one, which is cheaper
than finding out with a multimeter.
Left over for whoever adds a screen or a third button:
The power budget
Every figure below comes from tape/lib/power.js and is pinned by the selftest, so
the prose cannot drift away from the arithmetic. Change the cell and the numbers move:
Where it goes while a story plays
The cards
A deck of playing cards, a sheet of NFC stickers, and a biro. The card lives in the book — that is the whole idea, and it is better than anything a product designer would have arrived at: the pairing between the physical book and the recording is maintained by the object itself, in the place you will next look for it.
The stack
- A standard poker deck, 63×88 mm. About $2.
- An NTAG213 25 mm round sticker on the back. ~12¢ in hundreds.
- The 13-character id written on it in biro. The alphabet has no I, L, O or U precisely so that a hand-written id reads back unambiguously.
Two things that will bite
- Cards get stacked. A deck is a stack by nature, and two tags in the field is an anticollision event, not a read. The firmware counts targets and refuses to act on more than one — the box blinks rather than guessing. In the state machine.
- Not every deck works. Paper, linen-finish and PVC are all fine. A foil or metallic-backed deck detunes the antenna and will not read at all. Test one card before you sticker fifty.
Treating the cards as consumable is the right instinct, and it is what the architecture already assumes: the recordings are the asset and they live on the SD card, backed up wherever you like. A chewed card is a 12¢ problem — write a new sticker, bind it to the same book, and the audio never moved.
The enclosure
Two constraints arrive from elsewhere in the design and rule out most of what looks suitable. Get these right and the rest is carpentry.
It must be RF-transparent over the reader
No metal tin, no metallised or foil-lined finish, no steel lid, no magnetic catch anywhere near the nest. A conductive layer over the antenna detunes it and the card simply never reads — the same physics that kills foil-backed playing cards. Wood, plywood, ABS and acrylic are all fine.
Lid thickness eats read range directly. Measure yours at assembly stage 4, through the material you actually intend to use, before you commit to a design.
A speaker needs a box, not a hole
This is the part that is not trivial. A driver radiates from both faces in antiphase; if front and back air can meet around the rim, the bass cancels and it sounds like a telephone. Two rules fix it:
- Seal the driver to its baffle. A ring of self-adhesive foam draught-excluder, compressed by the screws. This one step is most of the difference.
- Leave enclosed air behind it. Even 200–500 cm³ is plenty for a 40 mm driver, and the box is that anyway — just do not leave the back open or shared with a vented battery bay.
Grille: many small holes rather than few large. Total open area at least the cone area, each hole under 4 mm so a child cannot get a finger or a crumb to the cone.
Three routes, none of which need a printer
| Route | Good for | The catch |
|---|---|---|
| A · A wooden box craft shop, ~$8–20 |
The recommendation for build one. RF-transparent by nature, acoustically better than thin plastic, drills with hand tools, a hinged lid gives you access forever, and it looks like something that belongs in a child’s room rather than a gadget that wandered in. Unfinished pine and bamboo boxes are stocked by every craft retailer and general online store. | Not precise. Buy solid wood, not MDF with a printed foil wrap. Check the catch and hinges are away from the card nest, or replace them with wooden ones. Sizes vary, so measure before ordering: you want roughly 150×100×80 mm inside. |
| B · Hammond 1599 hand-held ABS, widely stocked |
Precise, repeatable, moulded for hand-held use, and available from every distributor rather than depending on what a shop happens to have. Some variants have an integral battery compartment, which solves the screwed-shut requirement for you. | Thin ABS is a poor speaker baffle — it will need bracing or the panel resonates. And drilling a tidy grille pattern in a moulded face by hand is fiddlier than it sounds. |
| C · A laser-cut front panel ~$25–40, no machine of your own |
Best combined with A. Send a 2D drawing to a cutting service and get back one precise panel: the speaker grille, the card nest, the button and pot holes, all exactly where the schematic says. The box supplies the volume and the charm; the panel supplies the precision. No printer, no machine, and a DXF is a morning’s work. | Order it in acrylic or plywood, never metal — a metal panel over the reader is exactly the failure mode above. And you will want two, because the first panel is where you discover a hole is 2 mm out. |
Still open
- MP3 or WAV as the studio’s output. Both play. MP3 at 64 kbps mono gives ~1,200 hours on the card and needs an encoder in the browser; WAV needs nothing but
AudioContextand gives ~220 hours. Both are far more than a childhood. - Enclosure material, above.
- Whether standby is worth more silicon. The PN532’s duty-cycled field is the largest idle load. A PN5180 with hardware card detection would roughly triple standby. At eight days it does not feel worth $9 and a harder build.