ADR-0038: Power subsystem — Waveshare UPS Module 3S (3× 18650), supersedes TP4056 + PowerBoost + bare LiPo
Context
Section titled “Context”The KN-86 power subsystem was a three-board stack: a TP4056 USB-C charger/protection module, an Adafruit PowerBoost 1000C 5 V boost converter with USB pass-through, and a bare 3000 mAh LiPo pouch cell on JST-PH leads. The Elecrow 7” primary display was deliberately left off this rail in v0.1, running from its own USB-C supply to decouple the display power budget from build bring-up.
Two events forced a rethink:
-
The PowerBoost was destroyed by a reverse-polarity LiPo. A bare LiPo on a JST-PH pigtail has no keying that prevents an inverted connection. One reversed plug took out the boost converter. The bare-cell-on-JST topology carries a standing reverse-polarity hazard that the three-board stack does nothing to mitigate.
-
A 5 A UPS-with-fuel-gauge replaces three boards at once — and unlocks the Row-0 battery meter. The realization driving this ADR: a single Waveshare UPS Module 3S subsumes the charger, the protection circuit, and the 5 V regulator into one board, runs at 5 V / 5 A (enough to carry the 7” display in addition to the Pi + Pico + amp + hub), and carries an onboard INA219 that reports pack voltage/current/power to the Pi over I²C. That last point is decisive: the firmware-rendered Row-0 battery glyph needs a host-readable state-of-charge, and a sealed USB-C power bank fundamentally cannot provide one — a power bank regulates its internal cells to a flat 5 V, hiding state-of-charge from the Pi behind its own regulation.
Forcing functions
Section titled “Forcing functions”- Reverse-polarity safety is a hard requirement after the PowerBoost loss. The replacement topology must make a reversed-cell connection physically or electrically safe.
- The Row-0 battery meter is a product surface, not a nice-to-have. nOSh renders a battery glyph + remaining-percentage readout in Row 0 (firmware status bar). That surface requires a host-readable SoC. The power subsystem must expose one.
- Board count and integration complexity were too high. Three power boards on the interior plate, each with its own wiring, is more BOM, more harness, and more failure points than the build wants.
- The display-on-its-own-supply split was always a v0.1 deferral. It was explicitly tagged “future merge to main rail.” A 5 A rail makes the merge available now, so the deferral closes here rather than carrying forward.
Decision
Section titled “Decision”Replace the TP4056 + PowerBoost 1000C + bare LiPo stack with a single Waveshare UPS Module 3S powered by 3× 18650 Li-ion cells in series. The 5 V / 5 A rail powers the entire device including the 7” primary display. Battery state is read from the module’s onboard INA219 over I²C.
Concrete commitments:
- Power board: Waveshare UPS Module 3S. 5 V / 5 A regulated main output, plus a 3.3 V / 300 mA auxiliary output. True UPS: simultaneous charge + output (the device runs while charging).
- Cells: 3× 18650 Li-ion in series (9.0–12.6 V pack). Batteries are not included — the build specs genuine cells (Samsung / LG / Sony-Murata / Panasonic, ~3500 mAh each), purchased as a matched set. Reverse-polarity-safe 18650 holders eliminate the bare-JST polarity hazard that destroyed the PowerBoost.
- Charging: 12.6 V 2 A via a DC5521 barrel jack — not USB-C. The BOM adds a 12.6 V 2 A barrel adapter. The charge port on the enclosure becomes a barrel jack, not a USB-C connector.
- The 5 V / 5 A rail powers the entire device, including the Elecrow 7” primary display. The display no longer runs off its own v0.1 USB-C supply; it moves onto the main rail. Loads on the 5 V rail: Pi Zero 2 W, Pi Pico 2, MAX98357A amp, internal USB hub IC, and the 7” display. Typical 5 V-rail draw with the display active is ~1.5–2 A.
- Battery readout: onboard INA219 over I²C (voltage / current / power). nOSh reads battery state from the INA219 and drives the Row-0 battery glyph. This replaces the prior resistor-divider + MCP3008 ADC plan entirely.
- Onboard protection and regulation chips: S-8254AA (Li protection), SY8286 (5 V regulator), HY2213 (charge balancing), INA219 (monitor), RT9193 (3.3 V regulator). Protection covers overcharge / over-discharge / overcurrent / short-circuit / reverse.
- Runtime (estimate): ~4–5 h with the 7” display active; ~10–12 h electronics-only. Validated at bring-up. The runtime is now display-dominated and shorter than the prior display-off envelope, because the display is on the battery.
- On/off control reconciles to the UPS module’s own power control. The prior “latching slide switch on the PowerBoost EN / 5 V rail” gating is removed; the exact on/off mechanism against the UPS module is marked TBD at bring-up.
Options considered
Section titled “Options considered”Option A: Sealed USB-C power bank
Section titled “Option A: Sealed USB-C power bank”Pros. Off-the-shelf, integrated charging + protection + regulation, no cell handling, USB-C in and out.
Cons. A power bank regulates its internal cell to a flat 5 V — there is no host-readable state-of-charge. The Pi sees a constant 5 V whether the bank is at 100% or 10%. The firmware-rendered Row-0 battery meter cannot be driven. This is disqualifying: the battery glyph is a committed product surface.
Rejected. No host-readable SoC; can’t drive the Row-0 meter.
Option B: Bare LiPo + MAX17048 fuel gauge + boost converter
Section titled “Option B: Bare LiPo + MAX17048 fuel gauge + boost converter”Pros. Viable. A dedicated I²C fuel gauge (MAX17048) gives the Pi a host-readable SoC, and a boost converter delivers the 5 V rail. Keeps the single-cell pouch form factor.
Cons. More discrete parts (cell + gauge + boost + protection), more wiring, and it keeps the bare-JST reverse-polarity hazard that destroyed the PowerBoost in the first place. Solves the meter problem but not the safety problem, and at higher integration cost than the UPS module.
Rejected. More parts, and it preserves the polarity hazard the change is meant to eliminate.
Option C: Waveshare UPS Module 3S (3× 18650) (CHOSEN)
Section titled “Option C: Waveshare UPS Module 3S (3× 18650) (CHOSEN)”Pros. One board replaces three (charger + protection + 5 V regulator). 5 A output carries the 7” display in addition to the rest of the device. Onboard INA219 gives the Pi a host-readable SoC over I²C — the Row-0 meter is driven directly. Reverse-protection plus reverse-polarity-safe 18650 holders close the polarity hazard. Simultaneous charge + output preserves the ADR-0011 charge-while-flashing flow.
Cons (accepted). Charging is 12.6 V via a barrel jack, not USB-C — the enclosure charge port changes and the BOM gains a 12.6 V 2 A adapter. 3× 18650 holder volume must fit the Pelican interior. The display now runs off the battery, so runtime is display-dominated and shorter (~4–5 h display-active vs. the prior display-off envelope).
Accepted. The Cons are real but bounded; the Pros resolve the meter requirement, the safety requirement, and the board-count problem in one move.
Consequences
Section titled “Consequences”Positive
Section titled “Positive”- One board replaces three. Charger, protection, and 5 V regulation collapse into the UPS module — less BOM, less interior wiring, fewer failure points.
- Reverse-polarity-safe. Onboard reverse protection plus keyed/reverse-safe 18650 holders eliminate the bare-JST hazard that destroyed the PowerBoost.
- Host-readable battery state. The onboard INA219 over I²C drives the Row-0 battery glyph directly — the meter a sealed power bank fundamentally cannot provide.
- 5 A runs the display. The single rail carries the 7” primary display alongside the Pi + Pico + amp + hub, closing the v0.1 display-on-its-own-supply deferral.
- True UPS. Simultaneous charge + output preserves the ADR-0011 charge-while-flashing flow with no special handling.
Negative / accepted
Section titled “Negative / accepted”- 12.6 V barrel charging, not USB-C. The charge port on the enclosure is now a DC5521 barrel jack; the BOM gains a 12.6 V 2 A adapter. Operators charge with a barrel-jack brick, not a USB-C cable.
- 18650 holder volume in the Pelican. Three 18650 cells in series take more interior volume than a single LiPo pouch. The Pelican 1170 interior (~80 mm depth) must seat the holder against the rest of the component layout; confirm at bring-up.
- Runtime is display-dominated and shorter. With the display on the battery, runtime drops to ~4–5 h display-active (vs. ~10–12 h electronics-only). This is the accepted cost of moving the display onto the main rail.
Documentation Updates (REQUIRED — part of the decision, not aspirational)
Section titled “Documentation Updates (REQUIRED — part of the decision, not aspirational)”Per CLAUDE.md Spec Hygiene Rule 3, this ADR lands with every dependent doc updated in the same PR:
-
docs/adr/README.md— add ADR-0038 to the index (Status: Accepted 2026-06-13). -
docs/device/hardware/power.md— rewrite the power path (12.6 V charge → Waveshare 3S UPS / 3× 18650 → 5 V/5 A rail → Pi + Pico + amp + hub + display), Loads table, INA219 low-battery section, charging + bring-up sections. -
docs/device/hardware/sourcing-guide.md— BOM: remove bare LiPo / TP4056 / PowerBoost 1000C / latching slide switch; add Waveshare UPS Module 3S, 3× 18650 cells, 12.6 V 2 A barrel adapter; update supplier notes. -
docs/device/hardware/primary-display.md— display power now on the main 5 V rail; remove the “own USB-C supply in v0.1 / future merge” framing. -
docs/device/hardware/processor.md— low-battery text → battery state from the UPS module’s INA219 over I²C. -
docs/device/hardware/build-specification.md— §3 power topology + §4 Stage 4 bring-up steps → UPS module. -
docs/device/hardware/enclosure.md— charge-port cutout is now a 12.6 V barrel jack (not USB-C); foam/bracket seating updated. -
docs/device/hardware/README.md— power summary line. -
docs/software/runtime/prototype-architecture.md— power section. -
docs/software/cartridges/operator-manuals/ice-breaker-manual.md— spec-summary battery rows. -
docs/marketing/pr-faq.md— battery-life answer. -
docs/software/runtime/orchestration.md— low-battery trigger/recovery references (INA219 path; UPS charge + output). -
docs/definitive-guide.md— power summary line. -
docs/device/os/update-system.md— ADR-0011 charge-passthrough-while-flashing note (flow preserved; part name updated to the UPS module). -
docs/_meta/definitive-articles.md— power.md index description. - ADR inline supersession pointers — ADR-0011, ADR-0015, ADR-0017 gain a brief ”— superseded by ADR-0038 for the power subsystem” inline pointer where they cite a PowerBoost / TP4056 / 3000 mAh value as the current spec. Their historical reasoning is left intact.
- CLAUDE.md Battery row — handled by the PM in the kinoshita repo (CLAUDE.md is not in this repo).
Authority trail
Section titled “Authority trail”Decided by Josh on 2026-06-13 following the PowerBoost reverse-polarity loss and the recognition that a 5 A UPS-with-fuel-gauge replaces the three-board stack while unlocking the host-readable battery meter the Row-0 glyph requires. PM drafted; this ADR is the decision record. The on/off control mechanism and the 18650-holder interior fit are flagged TBD at bring-up.