Choosing a Battery for a Small ESP32 Robot: Why Boost Converters, 18650s and Series 1S Packs All Lost

Four N20 motors can stall at over 3 A combined, and a consumer LiPo cell with a 2 A protection board cannot deliver it. The budget, the four rejected options, and the 2S high-discharge pack that won.

The robot’s original power source was a single consumer-grade LiPo pouch with a 1S protection board. It worked for the electronics. The first time all four wheels stalled against something, the protection board tripped and the whole robot went dark.

This article is the reasoning that followed: what the load actually is, four options that looked plausible and were not, and the pack that was chosen.

Step 1: the current budget

Everything referred to the 2S (7.4 V) side:

Load Current
Four N20 gear motors, all stalled (typical N20 figure, to be measured) ~3.2 A
Camera pitch servo, stalled ~0.56 A
ESP32-P4 + C6 radio + audio codec + display ~0.52 A
Worst-case sum ~4.3 A

So the pack needs to supply at least 5 A continuously, and 6 A gives headroom. A typical consumer pouch cell is rated 1-2 C; a 1000 mAh cell at 2 C is 2 A. The cell, not just the protection board, is the bottleneck.

Plug your own numbers in — the defaults are this robot’s budget against a consumer 1000 mAh / 2 C cell behind a 2 A board, which is exactly the combination that failed:

Battery runtime & discharge check

Runtime uses 85 % usable capacity (LiPo below ~3.3 V/cell is off-limits). Peak check compares against both the cell's continuous rating and the board's trip point.

Four options that were rejected

Boost converter from a single cell to the motors

Take the existing 1S cell, boost to 7.4 V for the motor rail. Rejected because it hands the hardest load to the power stage least suited to it:

Separate motor and logic packs

Electrically sound; it is what larger combat robots do. Rejected on packaging: the chassis has one battery bay sized for one 2S pack, and adding a second pack means redesigning the frame. Not worth it at this scale.

18650 cylindrical cells

Pure geometry. The cell is 18 mm in diameter; the bay is 11.3 mm tall. Fitting it means raising the bay roof by 8 mm, which raises the servo bay, the hinge line, and the whole robot. Higher centre of mass, more weight — exactly what the layout work had just spent effort reducing. A 14500 (AA-sized) cell would fit but has no capacity advantage over a pouch.

Two protected 1S cells in series

The tempting hack: keep the cells and boards already on hand and wire them in series. Rejected for three reasons:

  1. Resistance doubles. Two 1S boards in series is ~110 mΩ versus 20-30 mΩ for a single 2S board. At 4 A that is 0.44 V of sag and 1.8 W of heat in the protection circuitry.
  2. Current limit stays at the 1S board’s rating, typically 2-3 A. Nothing gained.
  3. Charging goes wrong. Whichever cell reaches the cut-off first has its board open the charge path — for the whole string. The other cell never fills, and the gap widens every cycle. The only workaround is disassembling the pack to charge cells individually, which removes the point of a swappable pack.

A follow-up question was whether one cell failing would over-volt the other during discharge. It does not: series current is the same everywhere, so the good cell is not “pushed”. The actual danger is the weak cell being driven into reverse polarity once it is empty, which causes gas generation and can lead to thermal runaway. During charging, the good cell does see the full 8.4 V, but that is precisely what a protection board cuts at 4.25 V. Protected cells in series are a bad design; unprotected ones are a dangerous one.

A detour: hardware current limiting on the driver

Before committing to a new pack I considered using the DRV8833’s ISEN pins with sense resistors to clamp motor current in hardware (limit ≈ 0.2 V / R). It responds in microseconds, far faster than any firmware. But at the current needed to protect the existing pack, each motor would be capped around 0.3 A — a third of its stall torque. Driving would be fine; pushing would not. It treats the symptom. Left the ISEN pins grounded.

Also considered: the two ~100 µF electrolytic capacitors already on the driver board. They do not help with the stall inrush at all. Q = C·ΔV gives them about 100 µs of support; a stalled motor’s current rises over 20-50 ms. Three orders of magnitude apart. What they do is smooth the 20 kHz PWM current ripple, which keeps the protection board’s peak-sensitive over-current detector from tripping on switching noise.

What was chosen

Two high-discharge pouch cells plus one 2S 10 A protection board, assembled into a flat pack to fit the existing bay:

Item Spec
Cells High-rate (“RC / high-discharge”) LiPo pouch, not consumer-grade
Capacity, per cell 900-1000 mAh, roughly 10 × 25 × 50 mm
Continuous discharge ≥ 5 C (≥ 5 A) per the datasheet’s continuous figure
Internal resistance ≤ 50 mΩ per cell
Protection board 2S, 10 A, HY2120-class, mounted at the tab end of the cells
Connectors XT30 for discharge, JST-XH 3-pin for balance charging
Finished pack envelope ≤ 62 × 52 × 10 mm (bay is 64.5 × 54.5 × 11.3)

Bay volume is about 40 cm³; at roughly 0.25 Wh/cm³ for LiPo, the ceiling is ~10 Wh, or ~1300 mAh at 7.4 V. Allowing for the case, 1000-1200 mAh is the sweet spot, which works out to about 40-45 minutes of driving.

Buy matched cells. Same batch, same capacity, internal resistance within 5 mΩ, open-circuit voltage within 20 mV. Mismatched cells in series age apart and the pack ends up limited by the weaker one.

Wiring the 2S protection board

The board has three sense connections and one switched output:

Cell 1 1000 mAh · ≥5C + Cell 2 matched pair + 2S 10 A board HY2120 class B− BM B+ P− P+ 1 2 3 XT30 to PCB VBAT + JST-XH balance + (= B+) Solder order B− → BM → B+. Wrong order can kill the protection IC.
2S protection board connections. B− / BM / B+ are sense lines to the cells; P− is the switched output. Numbers are the soldering order.

Order matters: B-, then BM, then B+. Connecting them out of order exposes the protection IC’s sense pins to voltages outside their range and can destroy it. After soldering, measure P+ to P-: expect ~7.4 V. If you read zero, the board has latched into protection; briefly connecting a charger wakes it.

What this did to the rest of the design

Because protection now lives in the pack, the main PCB needs only an XT30 input and a resistor divider for battery-voltage sensing. No protection circuitry on the board, no extra BOM lines.

The board’s under-voltage cut-off (2.4-2.5 V per cell) is a fire-prevention floor, not a battery-care threshold. Real low-voltage handling is in firmware from the ADC reading: warn at 3.3 V/cell, refuse to drive at 3.0 V/cell.

Three software-only improvements are queued that need no hardware: a 100-200 ms PWM soft-start ramp so four motors do not launch simultaneously, stall detection (PWM > 0 and RPM == 0 for 300 ms → back off duty) using the existing hall encoders, and staggering the four PWM phases by 90° so current pulses do not line up, which should cut the peak current the pack sees by roughly a third.