bench-verified · firmware on real hardware

ET-160

48V FLIPSKY VESC · ESP32-S3 dash · CAN bus · C++ / LVGL

Built for:
One tractor, converted from gas to electric end to end — the drivetrain, the safety wiring, and a cockpit that reads like a vehicle, not a hobby project.
Not built for:
Anyone who wants a kit. Every wire, current limit, and fail-safe here was decided for this machine; none of it is a product you can buy.

A 48-volt battery, a motor controller meant for electric skateboards pushed to do real work, two pedals wired straight to the controller so a software crash can never take the brakes, and a touchscreen dash I wrote in C++. It is designed, wired, and flashed; the firmware runs on the real screen and talks to the real controller over CAN. It has not yet turned a wheel on the tractor — that is the next step, after the motor is bolted in.

§ I

The problem

Converting a gas tractor to electric is mostly not the motor. The motor is the easy part. The hard part is everything that keeps 48 volts of direct current from doing something stupid: a contactor that can weld shut under load, a screen that could hang while you’re moving, a pedal signal that has to mean the same thing every single time. A car company solves this with a hundred engineers and a wiring harness the size of a person. I had one tractor and a spreadsheet.

So the whole build is organized around one idea — the dangerous paths are physical, and the convenient paths are software. Braking and throttle are hardwired to the controller. The dash is allowed to be clever because it cannot touch anything that stops the machine.

§ II

Decisions

  1. deleted

    The main contactor. A mechanical relay switching 48V DC under load will eventually weld its contacts closed — and a relay welded closed is a tractor that won’t turn off. The controller already enforces current limits in firmware and coasts to neutral when power is cut, so the relay was doing a dangerous job badly. It came out of the diagram entirely; a fused enable line replaces it.

  2. hardwired

    Both pedals straight to the controller’s analog inputs — right pedal throttle, left pedal regenerative brake. Not through the dash, not over the bus. If the screen hangs, freezes, or reboots, the pedals still work, because the pedals were never talking to the screen. The dash only ever selects gear and reads telemetry; it is never in the path that makes the machine go or stop.

  3. kept

    One netlist as the single source of truth — 51 wires, 20 components — and a small verifier that checks the firmware, the spreadsheet, and the controller’s pin map all agree before anything gets powered. When I rename a pin in code, the check fails until the diagram catches up. It is the only reason an eleven-day solo build of high-voltage wiring didn’t drift into a mistake I couldn’t see.

The ET-160 dashboard running on the real ESP32-S3 touchscreen: a John Deere ET-160 cockpit with a 0–30 MPH speedometer reading 0.0, NEUTRAL selected, DRIVE / N / REV gear buttons on the right with N highlighted green, a SETTINGS button, and a battery-health bar reading 0% because no pack is connected on the bench.
FIGURE 1. The firmware running on the real screen — a Waveshare ESP32-S3 touch panel, flashed and live. Battery health reads 0% because there’s no pack on the bench; the gauge is voltage-mapped and turns green when one is connected.
§ III

System

Power runs in a straight line and the controls hang off it. The battery feeds a DC-rated fuse, a bus bar, then the controller, then the motor’s three phases. The dash is a separate world: it sits on a CAN bus with the controller, sends gear selection, and reads back pack voltage, temperature, and current at 50 Hz. The pedals never appear in that conversation — they go straight to the controller’s analog inputs.

Stack — current pins.
LayerImplementationPurpose
Pack48V nominal (35.8–54.6V)Drive energy · 35A BMS limit
ControllerFLIPSKY FSESC 75100 ProMotor drive · current limits in firmware
Motor1000W Hall-sensoredDifferential drive · 30A / −15A regen
Dash MCUESP32-S3 · LVGL v8Gear select · live telemetry · 800×480
CommsCAN bus · TWAI · 500 kbit/sDash ⇄ controller · big-endian VESC frames
Pedals2× analog → controller ADCThrottle + regen · never via software
An isometric 3D render of the full ET-160 wiring harness: a blue battery pack at left, fuses and a buck converter in the middle, the ESP32 dash board and the FLIPSKY controller on the right, and the motor at bottom, all connected by color-coded wires showing the power chain and the CAN/control lines.
FIGURE 2. The harness, rendered from the netlist. Heavy gauge for the power chain, thin pairs for CAN and the pedal signals. The render is generated from the same wire list the verifier checks, so the picture can’t lie about the wiring.
The ET-160 interactive dashboard demo running in DRIVE: a green speedometer reading 9.8 MPH, DRIVE / N / REV buttons, LIGHTS toggle, brake and throttle bars, a settings panel with speed limit and pack-voltage sliders, and a telemetry strip showing motor 1623 rpm, throttle 24%, pack 51.0V, state of charge 77%, gear DRIVE.
FIGURE 3. A browser version of the same dash, wired to a simulated drivetrain. It mirrors the firmware’s logic — gear rules, speed cap, the voltage-to-color battery map — so the interface and the rules could be tested before the hardware was on the bench. It is a simulator, not live telemetry.
§ IV

Where it stands

Bench-complete and paused before install. The dash firmware is flashed and running on the real panel; the controller is configured and its settings written to flash; the CAN link is up, reading live pack voltage, temperature, and current. What’s left is physical — motor detection, a direction test, and the speed cap — all of which wait until the motor is permanently mounted on the tractor. It has been designed, wired, and proven on the bench. It has not yet been driven, and the copy here won’t pretend otherwise.

Acknowledgments

ET-160 stands on the VESC project and its CAN protocol, LVGL for the cockpit, the Arduino-ESP32 TWAI driver, and the conviction that on anything carrying 48 volts, the boring safe path should be a wire and the clever path should be software.

← Index