tape.card audio player

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.

Yes, it can be portable. About 20 hours of stories on the 2500 mAh pack in the parts list, and roughly 6 days between charges on an hour a day. A bigger cell buys proportionally more. The budget is live below — change the cell and watch it move.

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.

RejectedForBecause
IP5306 charge/boost moduleMCP73871The 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 chargerMCP73871No 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-S3Its 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 WESP32-S3Twenty-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 readerPN532$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 readerPN532Genuinely 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 MiniSD + software decodeThe 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 ampMAX98357ATwo 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.

USB-C 5 Vcharge + run Li-ion cell 3.0–4.2 V2500 mAh MCP73871 power path: runs AND charges 5 V buck-boost TPS63060 steady across 3.0–4.2 VSYS MAX98357Aat 5 V → 3.2 W into 4Ω DevKitC 3V3 regulator→ S3, PN532, microSD 2:1 divider → GPIO2 the cell can reach 4.2 V; the ADC cannot
Choice A, which the BOM buys. Choice B — amp straight off the cell, LDO for the logic — is one conversion and ~13% more runtime, but the volume sags and the logic browns out at about 3.45 V, which gives most of that back. Switch the chain in the calculator below.

Schematic

Every net, drawn from tape/lib/pinmap.js — so this picture and the firmware cannot disagree about a pin number.

3V3 and GND go to every part and are left off for legibility. The amplifier’s GAIN pin is left floating for 9 dB; the PN532’s two DIP switches must be set to I²C.

Connections

The pins you may not have. The ESP32-S3 looks like it has 45 free GPIOs and it does not. The costly one: GPIO33–37 carry the octal PSRAM on any “R8” module, and they look completely free on the pinout drawing. GPIO22–25 do not exist at all — the numbering jumps from 21 to 26. The full list is in 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:

—continuous play
—between charges
—waiting for a card
—draw while playing

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

RouteGood forThe 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.
Requirements checklist, for whichever route. A card nest that positions a 63×88 mm card by geometry, with nothing conductive between it and the reader · a battery compartment that needs a tool to open · the speaker sealed to its baffle with enclosed air behind · the volume pot’s end stop reachable once at build time · the speaker firing up or forward, never into a table · and small enough that a four-year-old carries it with two hands, which is the actual size specification.

Still open

  1. 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 AudioContext and gives ~220 hours. Both are far more than a childhood.
  2. Enclosure material, above.
  3. 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.