A friend handed me a Ninebot ES2 that was not charging and throwing error codes 19 and 21. It was heading for the bin. I took it apart.
The full step-by-step guide with photos is published as an interactive page. This post is the reasoning behind the approach.
The diagnosis
Error 19 is a battery communication fault. Error 21 is a battery voltage fault. Together they pointed at the internal battery. I tested the cells with a multimeter — four were completely dead, the rest were marginal. No recovery with a charger bypass; the BMS had hard-faulted.
The external battery (the add-on pack that clips to the stem) was fine. It held charge, communicated correctly, and had plenty of capacity. The ES2 is designed to use both batteries together, with the internal as primary. The question was whether it could run on the external battery alone.
Why it should be possible
I looked at the motor controller board. The internal and external battery connectors share a common negative wire and the same four control wires. The only distinct wires between them are the positive power wire and the RX/TX communication lines.
The Ninebot ES2 ESC pin-out is publicly documented by the etransport project. That documentation was the difference between a tractable reverse-engineering problem and a guessing game. With the MCU I/O port assignments in hand, I could identify exactly which connections to reroute and which presence-detection resistors to remove.
The mod
Three changes on the motor controller board:
-
Reroute the external battery’s positive and communication wires to the internal battery’s connector positions — so the MCU sees the external battery as the internal one.
-
Remove the external battery RX/TX resistors — the pull-down resistors that tell the MCU an external battery is present. With the external battery now acting as internal, leaving these in place would confuse the firmware.
-
Remove the external battery sense resistor — the voltage divider used for external battery presence detection. Same reason.
The result: from the motor controller’s perspective, there is one battery (the former external pack) connected to the internal battery port. The firmware runs normally.
The connector fault
After the first successful test run, error 21 came back. I suspected a poor connection — and it was two problems, not one. The motor controller’s external battery connector had a bent pin from the original impact that damaged the scooter. The external battery’s female connector had also been damaged and was intermittent under load.
The motor controller connector I straightened carefully with a probe. The battery connector I re-engineered: cut back the damaged housing, re-crimped the terminals, and rebuilt the connector body with heat-shrink and epoxy. After that, no more error 21.
What it cost
A few hours, some solder, heat-shrink, and a roll of thin wire. The scooter now runs on the external battery as its sole power source. Range is reduced compared to the dual-battery configuration but it’s functional and the external pack is in good health.
The limiting factor if I want more range is a new internal battery — cells and a spot welder. That’s a future project.