Back to projects Mini EV platform · active build

DriveWire

A 2WD mini EV built end to end: ESP32-S3 firmware proven on the bench, load measured from a 2S LiPo, and a custom power PCB designed in Altium.

Now · PCB sent to fab, bring-up next
Render of the DriveWire PCB Marco laid out in Altium, power-input end first: the DRIVEWIRE silkscreen, fuse holder, terminal blocks and buck stages, with the ESP32-S3 module at the far end
DriveWire V1 · rendered from the Altium layout
Custom PCB · sent to fab4 layers
Buck rails designed6 V + 3.3 V
Peak stall current · 2S LiPo1.35 A
Motor PWM, effectively silent17.5 kHz

Working on hardware

  • Forward, reverse, coast and active brake on the printed test stand
  • 17.5 kHz motor PWM, chosen by sweeping the carrier
  • 100 ms FreeRTOS sensor task that survives a failed read

Measured on the bench

  • 1.35 A peak stall current from a 2S LiPo
  • 0.44 V of battery sag versus 0.95 V lost in the prototype wiring
  • Reliable ToF ranging to about 1.3 m indoors

Designed in Altium

  • Protected battery input with current sensing and power muxes
  • Two TPS62130A bucks, 6 V for the motors and 3.3 V for logic
  • ESP32-S3 controller with native USB and per-rail status lines
Bench replay · Jul 14 sessionidleBUS 5.73 VCURRENT 2.8 mAPOWER 16 mW
PCB layout · Altium

The schematic, laid out.

The power path, both bucks and the ESP32‑S3 controller, laid out on a 57.5 × 124.1 mm, 4‑layer board with ground and power inner layers. These renders come straight from the Altium STEP and Gerbers, so every pad, trace and label is the real layout.

4 layersSignal, GND, PWR, signal
124.1 mmBoard length
0.2 mmSmallest drill
Spin 1Sent to fab Oct 23
Overhead render of the DriveWire PCB: ESP32-S3 module and headers on the left, buck stages in the middle, the protected battery input with fuse, PMOS switches and slide switch on the right
Overhead · ESP32-S3 and headers left, buck stages centre, protected input right
Render of the DriveWire PCB from the ESP32 end, with the module's antenna past the board edge, the thermistor connectors and the BOOT and RESET buttons
ESP32 end · antenna past the board edge
Render of the DriveWire PCB from the long side, showing the terminal blocks, pin headers and USB-C connector
Long side · terminal blocks, headers, USB-C
Power path · Altium

From the battery to two regulated rails.

GND 1 1 2 2 J1 TB006-508-02BE 1 2 F1 VBAT_RAW VBAT_FUSED 2 3 Q1 VBAT_PROTECTED GND 2 3 Q2 2 1 3 SW1 GND VBAT_SWTCH VIN+ 8 VIN- 7 A0 2 A1 1 SCL 4 SDA 3 VS 5 GND 6 U2 INA219BIDR SDA SCL GND 20mR R11 3V3 20kR R5 20kR R4 0.10 µF C8 GND 3V3_BUCK_IN VBAT_BUS OUT 1 OUT 8 IN1 7 IN2 2 OV1 5 OV2 4 CP2 3 ILM 10 PR1 6 SS 11 ST 9 GND 12 U1 TPS2121RUXR 6V_BUCK_IN 6V VBAT_BUS BOOST_SEL 100K R9 GND MOTOR_BUS GND 102k R2 49.9K R10 GND 301K R1 49.9K R6 GND 402K R3 49.9K R8 GND 29.8K R7 GND 0.10 µF C7 GND 10kR R12 3V3 MUX_STATUS 0.10 µF C4 0.10 µF C3 10uF C2 10uF C1 GND GND 0.10 µF C6 100uF C5 Reverse polarity protection
Power and sensing schematic · completed, validation at bring-up
  1. 01

    Protected input

    A 5 A fuse and two AOD4185 PMOS stages give reverse-polarity protection and let a low-current slide switch control the main rail.

  2. 02

    Board-level sensing

    An INA219BIDR on a 20 mΩ shunt measures the whole board's current, with 20 kΩ I2C pull-ups.

  3. 03

    Motor-supply mux

    A TPS2121 feeds the motors from the regulated 6 V rail or straight from the battery for a hardware boost mode, with a failsafe pull-down on its select line.

  4. 04

    Two buck rails

    VBAT_BUS feeds the 6 V motor buck. A second mux runs the 3.3 V logic buck from USB's 5 V when it's plugged in, and from the battery when it isn't.

Buck converters · TPS62130A

Two buck converters, sized by hand.

Both rails come from the measured load: the 1.35 A stall on the bench became a 2 A design point for the motor rail, and the logic rail is budgeted part by part.

1.25 MHzSwitching frequency
2.2 µHOne inductor, both rails
2 AMotor design point
1 ALogic rail budget

6 V motor rail · TPS62130A

AVIN 10 PVIN 11 PVIN 12 SW 1 SW 2 SW 3 DEF 8 EN 13 FB 5 FSW 7 PG 4 SS/TR 9 VOS 14 AGND 6 PGND 15 PGND 16 Exposed Thermal Pad 17 TPS62130ARGTR GND GND GND 6V_BUCK_IN 10kR RMCF0402FT10K0 3V3 6V_PG 6V 6V 10nF GCM155R71H103KA55D GND 6V GND 130 kOhm RN73R1ETTP1303B25 20KR RT0402BRD0720KL DFE322520F-2R2M=P2 GRM32ER61C476KE15L 6V GND 100 nF 22uF 22uF
6 V buck · 8.4 V pack in, motor rail out · completed schematic
  1. 01

    Inductor from the ripple

    From an 8.4 V pack at 1.25 MHz, 25 % ripple at 2 A needs 2.74 µH. TI's 2.2 µH gives 0.78 A peak to peak at its −20 % tolerance, accepted knowing light loads won't stay in continuous conduction.

  2. 02

    Smaller part, loss priced in

    The smaller Murata inductor has 84 mΩ against the larger Eaton part's 20 mΩ: 13 mW instead of 3 mW at the typical 400 mA, and 336 mW instead of 80 mW at a 2 A stall.

  3. 03

    Capacitors under DC bias

    Two 22 µF input capacitors keep about 8.7 µF at 8.4 V of bias, near the datasheet's 10 µF. A 0.4 to 2 A stall step dips the output about 53 mV per 22 µF; the 47 µF output part was checked for ESR and bias derating.

From my notebook · the math behind both bucks

Marco's handwritten calculations: 6 V · inductor from the ripple current
6 V · inductor from the ripple current
Marco's handwritten calculations: 6 V · output capacitor and the stall step
6 V · output capacitor and the stall step
Marco's handwritten calculations: Inductor losses · 3.3 V current budget
Inductor losses · 3.3 V current budget
Marco's handwritten calculations: 3.3 V · feedback divider
3.3 V · feedback divider
Controller · ESP32-S3

The dev board, rebuilt onto the PCB.

ESP32-S3WROOM-1 module, 8 MB + 8 MB
5Power-status lines to GPIOs
2Motor thermistor inputs
8Spare GPIOs, 3 on ADC1
GND_1 1 3V3 2 EN 3 IO4 4 IO5 5 IO6 6 IO7 7 IO15 8 IO16 9 IO17 10 IO18 11 IO8 12 IO19 13 IO20 14 IO3 15 IO46 16 IO9 17 IO10 18 IO11 19 IO12 20 IO13 21 IO14 22 IO21 23 IO47 24 IO48 25 IO45 26 IO0 27 IO35 28 IO36 29 IO37 30 IO38 31 IO39 32 IO40 33 IO41 34 IO42 35 RXD0 36 TXD0 37 IO2 38 IO1 39 GND_2 40 GND_3 41 GND_4 42 GND_5 43 GND_6 44 GND_7 45 GND_8 46 GND_9 47 GND_10 48 GND_11 49 B1 ESP32-S3-WROOM-1-N8R8 GND 3V3 USB_D- USB_D+ GND 22uF C23 100nF C24 1uF C28 GND 10KR R24 1 1 2 2 3 3 4 4 X2 SKHUALE010 BOOT 1 1 2 2 3 3 4 4 X1 SKHUALE010 10KR R23 3V3 GND UART0_RX UART0_TX 2 1 3 4 5 6 P1 61300611121 GND 3V3 ESP32_EN ESP32_EN BOOT VBUS 1 D- 2 D+ 3 ID 4 GND 5 SHLD1 6 SHLD2 7 SHLD3 8 SHLD4 9 SHLD6 11 SHLD5 10 J3 10118194-0001LF GND USB_VBUS 22 Ohm R25 22 Ohm R26 VCC 1 NC 2 IO1 3 GND 4 NC 5 IO2 6 U6 TPD2E001DRYR GND 100nF C31 I2C_SDA I2C_SCL MOTOR_L_IN1 MOTOR_L_IN2 MOTOR_R_IN2 MOTOR_R_IN1 BOOST_SEL MOTOR_MUX_STATUS LOGIC_MUX_STATUS 6V_PG 3V3_PG 10KR R27 10KR R28 3V3 2 1 J2 B2B-PH-K-S(LF)(SN) 2 1 J4 B2B-PH-K-S(LF)(SN) GND GND 100nF C30 100nF C29 MOTOR_L_TEMP_ADC MOTOR_R_TEMP_ADC IO4 IO5 IO6 IO4 IO5 IO6 ADC + Digital I/O IO11 IO12 IO11 IO12 IO16 IO17 IO16 IO17 IO38 IO38 General Digital I/O IO39 IO40 IO41 IO42 IO40 IO39 IO41 IO42 JTAG 2 1 3 4 5 6 P3 61300611121 GND 3V3 3V3 GND 3 1 4 2 5 6 7 8 9 10 11 12 13 14 15 16 P4 61301621121 100nF C25 100nF C26 100nF C27 GND I2C_SDA I2C_SCL I2C Bus Headers 3 1 4 2 5 6 7 8 P2 61300821121 3V3 GND GND
ESP32 sheet · module, USB, buttons, thermistors and headers · wired and annotated
  1. 01

    Clean start, two buttons

    A 10 kΩ / 1 µF RC on EN holds the module in reset until the 3.3 V rail settles. RESET and BOOT buttons sit on EN and IO0, with a 10 kΩ pull-up keeping IO0 high for a normal boot.

  2. 02

    Native USB, protected

    USB D+ and D− run straight to the S3's own USB pins through 22 Ω series resistors, with a TPD2E001 ESD clamp at the connector. A 6-pin UART header is footprinted as a fallback programming path, not populated at first.

  3. 03

    A board that reports on itself

    Both bucks' power-good outputs, both power-mux status lines and the boost select reach GPIOs, so firmware can see every rail. Two thermistor inputs, each a 10 kΩ pull-up with a 100 nF filter, watch the motor temperatures.

Load testing · September 12 to 14

Measuring the load before choosing the hardware.

RunningStallRecoveryBattery current (mA)05001,0001,5001,352.4 mA peakINA219 bus voltage (V)6.06.57.07.58.06.27 V in stall010203040506070Elapsed time (s)
Data table · 147 samples
Time (s)Current (mA)Bus voltage (V)Phase
0.03.47.79Idle
0.53.67.79Idle
1.03.17.79Idle
1.53.57.79Idle
2.03.57.79Idle
2.53.47.79Idle
3.03.57.79Idle
3.53.27.79Idle
4.03.17.79Idle
4.53.47.79Idle
5.03.37.79Idle
5.53.77.79Idle
6.03.37.79Idle
6.53.37.79Idle
7.03.37.79Idle
7.53.37.79Idle
8.03.57.79Idle
8.53.37.79Idle
9.03.37.79Idle
9.53.67.79Idle
10.03.47.79Idle
10.53.37.79Idle
11.03.37.79Idle
11.53.17.79Idle
12.03.47.79Idle
12.53.57.79Idle
13.03.37.79Idle
13.53.47.79Idle
14.03.47.79Idle
14.53.47.79Idle
15.03.37.79Idle
15.53.17.79Idle
16.03.57.79Idle
16.53.37.79Idle
17.03.47.79Idle
17.53.17.79Idle
18.03.37.79Idle
18.5435.37.34Running
19.0322.87.50Running
19.5254.47.50Running
20.0267.47.51Running
20.5285.67.47Running
21.0247.17.50Running
21.5260.27.52Running
22.0277.57.53Running
22.5325.27.50Running
23.0262.17.51Running
23.5262.07.58Running
24.0965.56.79Running
24.51343.46.28Stall
25.01343.16.27Stall
25.51345.66.29Stall
26.01346.16.28Stall
26.51350.26.28Stall
27.01351.16.28Stall
27.51351.86.28Stall
28.01351.96.28Stall
28.51352.46.27Stall
29.01350.46.28Stall
29.51349.56.27Stall
30.01349.46.28Stall
30.51347.46.28Stall
31.01346.46.28Stall
31.51345.46.28Stall
32.01344.56.28Stall
32.51343.66.28Stall
33.01341.76.28Stall
33.51340.96.28Stall
34.01340.16.28Stall
34.51339.16.28Stall
35.01338.26.28Stall
35.51337.56.28Stall
36.01336.16.28Stall
36.51334.06.28Stall
37.01333.56.28Stall
37.51333.16.28Stall
38.01331.96.27Stall
38.51330.96.28Stall
39.0915.16.74Recovery
39.5321.87.40Recovery
40.0223.97.52Recovery
40.5269.17.50Recovery
41.0271.27.51Recovery
41.5292.27.43Recovery
42.0214.27.50Recovery
42.5241.27.47Recovery
43.0248.67.48Recovery
43.5226.97.51Recovery
44.0267.67.45Recovery
44.5260.77.52Recovery
45.0252.07.47Recovery
45.5248.37.47Recovery
46.0255.67.53Recovery
46.5216.07.47Recovery
47.0212.17.53Recovery
47.5226.87.57Recovery
48.0271.87.49Recovery
48.53.57.77Idle
49.03.47.77Idle
49.53.57.78Idle
50.03.47.78Idle
50.53.37.78Idle
51.03.27.78Idle
51.53.27.77Idle
52.03.37.78Idle
52.53.17.78Idle
53.03.47.78Idle
53.53.37.78Idle
54.03.37.78Idle
54.53.27.78Idle
55.03.57.78Idle
55.53.27.78Idle
56.03.47.77Idle
56.53.47.78Idle
57.03.37.78Idle
57.53.47.78Idle
58.03.47.78Idle
58.53.17.78Idle
59.03.17.78Idle
59.53.37.78Idle
60.03.37.78Idle
60.53.27.78Idle
61.03.47.78Idle
61.53.17.78Idle
62.03.27.78Idle
62.53.47.78Idle
63.03.47.78Idle
63.53.37.78Idle
64.03.57.78Idle
64.53.47.78Idle
65.03.57.78Idle
65.53.37.78Idle
66.03.67.78Idle
66.53.17.78Idle
67.03.27.78Idle
67.53.27.78Idle
68.03.27.78Idle
68.53.57.78Idle
69.03.37.78Idle
69.53.37.78Idle
70.03.27.78Idle
70.53.37.78Idle
71.03.37.78Idle
71.53.17.78Idle
72.03.07.78Idle
72.53.27.78Idle
73.03.47.78Idle
Re-plotted from the raw serial log · 0.5 s per sample · hover to read values
Engineering stories

Debugging that actually happened.

Motor terminal wiring with soldered automotive wire and heat shrink
Fault isolation

The dead motor channel

Symptom
During dual-motor bring-up, one wheel ran cleanly while the other stayed dead.
Test
Swapped the driver's inputs and outputs so each suspect carried the other's signal, and watched whether the dead behavior followed the wiring or stayed with the driver output.
Fix
The fault stayed with one DRV8833 output. That channel was retired, and the second wheel now runs on the working channel of a backup driver.

Swap-based isolation pins a fault to a single stage quickly, without special equipment.

DriveWire chassis wired on the bench in front of firmware code
Frequency sweep

Making the motors effectively silent

Symptom
Both motors produced an audible tone during low-duty operation.
Test
Held duty constant and swept the PWM carrier across 8 points from 1 kHz through 18 kHz. The tone rose with frequency, barely audible at 17 kHz and effectively unnoticeable at 17.5 kHz.
Fix
Replaced implicit analogWrite with explicit ESP32 LEDC channels at 17.5 kHz, keeping the existing 8-bit 0 to 255 command scale.

The fix had to match Arduino-ESP32 core 2.0.17 rather than the newer 3.x API.

Finished black PLA DriveWire support stand with engraved front lettering
Test fixture

A test stand instead of a runaway robot

Problem
Bench-testing drive commands on a desk was unsafe and unrepeatable.
Approach
Modeled a support stand in SolidWorks that holds the chassis with the wheels suspended, and printed it in black PLA on a Raise3D E2 after a printer error stopped the first attempt.
Result
The stand has been the testbench for every motor debugging session since.

Test fixtures are part of the engineering.

Firmware

Firmware tuned against real hardware.

What the firmware does today

01

Modular left and right motor control through a shared drive state

02

Four ESP32 LEDC channels at 17.5 kHz and 8-bit resolution

03

Forward, reverse, coast and active brake tested on hardware

04

INA219 voltage, current and power refresh with online status

05

VL53L0X refresh rejects invalid range without erasing the last good value

06

Nonblocking millis-based motor-test timing keeps telemetry flowing

07

Motor task coasts both wheels if no command arrives within 500 ms

const TickType_t sensorPeriod =
  pdMS_TO_TICKS(100);
TickType_t lastWakeTime = xTaskGetTickCount();

for (;;) {
  refreshAllSensors(*sensorState);
  xQueueOverwrite(sensorQueue, sensorState);
  xTaskDelayUntil(&lastWakeTime, sensorPeriod);
}
Bench test

Both wheels spinning on the printed stand after the two-driver workaround.

Roadmap

Speed with direction.

01

Working now

  • 17.5 kHz motor PWM
  • 100 ms sensor-task scheduling
  • 2S LiPo load plots and DMM checks
02

Designed

  • Protected input, sensing and power muxes
  • 6 V and 3.3 V bucks and the ESP32-S3 sheet
  • 4-layer PCB with test points, sent to fab
03

Next up

  • Bring up each rail on the new board
  • Measure the path loss against the prototype
  • Validate the motor task on hardware
04

Later

  • Wi-Fi control and a browser dashboard
  • Encoder feedback and obstacle braking
  • 5 V buck breakout for a Raspberry Pi
Records

The paper trail.

Dated build log32 entries · June 12 to October 23
June 12

Mechanical chassis assembled

Built the 2WD chassis with DC motors, wheels, front caster, and wheel encoder discs to create the rolling test platform.

June 13

ESP32-S3 communication confirmed

Brought up the microcontroller over serial and confirmed the board could communicate cleanly with the development machine.

June 14

Motor driver soldered and direction tested

Soldered the DRV8833 motor driver board, wired an initial powertrain circuit, and confirmed motor forward/reverse behavior from firmware.

June 29

Full bench circuit wired and PWM issue debugged

Soldered motor leads, heat-shrunk joints, mounted the battery pack and breadboard, added current and ToF sensor boards, and solved a low-PWM static-friction issue by raising the duty value to 140.

July 1-3

SolidWorks support stand designed for testing

Modeled a custom DriveWire stand, iterated support geometry, sliced the STL, and started a black PLA print on a Raise3D E2 so the wheels can spin safely during bench tests.

July 6

Support stand print restarted and adhesion issue noted

A printer error stopped the first stand print early, so the job was restarted. The second attempt reached late-stage progress, with slight corner lift noted for future brim, bed-temperature, or first-layer tuning.

July 7

Printed stand became the DriveWire testbench

Picked up the successful black PLA support stand and confirmed the chassis mounts securely and remains stable, creating a safer bench setup for motor debugging and firmware bring-up.

July 8

Motor driver fault isolated and both wheels brought online

Swapped motor driver inputs and outputs to isolate the dead channel, confirmed the fault stayed with one driver output, then used the working channel on a backup driver so both wheels spin. The active bug is now turn-command direction mapping.

July 20

Custom PCB battery power architecture started in Altium

Designed the first battery-entry schematic for the custom DriveWire PCB, including a planned 5 A fuse, AOD4185 PMOS reverse-polarity protection, and a second PMOS so a low-current slide switch can control the main power rail safely.

July 23

VL53L0X ranging tested on the chassis

Wired and mounted the time-of-flight sensor, then wrote a 1 Hz serial-ranging test. Reliable readings reached approximately 1.3 m under the tested indoor conditions, providing a measured starting point for obstacle detection and braking logic.

July 24

Motor-control module and braking behavior validated

Completed the motors.cpp and motors.h module, tested forward drive, reverse, coast, and brake at different speeds, and confirmed that active braking stops the wheels much faster than coasting from full speed.

July 29

PWM frequency sweep eliminated audible motor noise

Swept the carrier from 1 kHz to 18 kHz at constant duty, linked the changing motor tone to PWM-driven vibration, and selected 17.5 kHz as an effectively unnoticeable operating point. Explicit LEDC control preserves the existing 8-bit command scale and matches Arduino-ESP32 core 2.0.17.

July 31

Electrical telemetry module tested with fault injection

Added INA219 voltage, current, and power refresh logic to sensors.cpp, verified healthy serial output, then unplugged the sensor to confirm the module marks it offline and exits on the first failed poll without overwriting the last valid readings.

August 1

V1 sensor refresh pipeline completed and tested

Completed distance and combined-sensor refresh functions, then tested valid range, out-of-range data, and sensor disconnection. Invalid measurements preserve the last good distance while hardware status reports the fault. A direct Wire-based INA219 register read also matched the library voltage result.

August 10

Firmware prepared for task-based operation

Restructured main.cpp for continued serial bring-up and upcoming FreeRTOS work, while organizing the repository with the early Altium PCB files under Hardware and the existing support-stand model under Mechanical CAD.

August 13

First FreeRTOS sensor task verified on hardware

Added one dedicated task that refreshes the INA219 and VL53L0X every 1.5 seconds with xTaskDelayUntil, then overwrites a single-item queue with the latest DriveWireState snapshot. The Arduino loop receives and prints its own copy, and setup stops safely if the queue or task cannot be created. The firmware built successfully and produced live sensor telemetry.

September 12

Custom PCB sensing and motor-supply architecture expanded

Added INA219BIDR sensing circuitry to the Altium schematic with a tentative 20 mΩ shunt and 20 kΩ I2C pull-ups. The protected VBAT_BUS is intended to feed a 3.3 V logic supply and a TPS2121 power mux selecting between a planned 6 V motor rail and direct battery power for a hardware boost mode. Component values and the unfinished power circuitry still require validation.

September 12

2S LiPo stall-current measurements captured

Tested the prototype with a 2S LiPo measured at approximately 7.8 V unloaded. Two captured system stall-current readings were 1.3414 A and 1.3308 A, with telemetry reporting 6.39 V during both captures. These initial observations inform PCB component selection; they do not establish worst-case peak current. The roughly 1.2 V drop from running readings remains under investigation with direct DMM measurements planned.

September 14

DMM follow-up separated battery sag from prototype losses

Repeated the stall test with similar current readings and measured the battery-connected rails directly: 7.78 V in normal operation and 7.34 V during stall. The 0.44 V rail drop was smaller than the drop reported through the INA219: against the 6.39 V stall reading, about 0.95 V was being lost in the prototype power path rather than to battery sag. Reducing those losses with the custom PCB remains a goal to verify during bring-up.

September 14

Faster telemetry captured a MATLAB stall-current plot

Changed the sensor task period from 1.5 seconds to 100 ms and replaced blocking motor-test delays with millis-based drive/coast timing. Plotted the recorded voltage and current in MATLAB to show running, stall, and recovery behavior. Completed the tentative power schematic with TPS2121 support circuitry; values still need validation, and an OV2 battery-voltage interlock remains under consideration.

September 22

6 V motor buck regulator selected

Selected the TPS62130ARGTR as the regulator for the planned 6 V motor supply and began designing its supporting circuit. The supply has not yet been built or tested.

September 24

6 V buck schematic advanced

Chose a soft-start capacitor and a 130 kΩ / 20 kΩ feedback divider for the TPS62130A design. The dated schematic had every pin addressed except the switching-node connection, so the circuit remained unfinished and unvalidated.

September 25

Motor-supply inductor and footprint selected

Selected an inductor against saturation current, RMS current, DC resistance, size, and shielding requirements, then drew a custom Altium footprint from its datasheet. PCB integration and electrical validation are still ahead.

October 10

Smaller inductor and output capacitor chosen

Moved the 6 V buck to a smaller-footprint inductor that still meets its needs, and chose the output capacitor after checking its ESR and DC-bias derated capacitance to keep motor-rail ripple low.

October 11

6 V buck finalised, 3.3 V buck completed

Finalised the provisional 6 V schematic with two 22 µF input capacitors in parallel, about 8.7 µF at 8.4 V of bias against the datasheet's 10 µF. Set the 3.3 V buck's current limit and completed it, so all of the power converter schematics are done. A future Raspberry Pi will get its own 5 V buck breakout fed from a battery connector, rather than a third rail on this board.

October 13

ESP32 schematic started

Placed the ESP32-S3 module with its power, ground and input capacitors, plus the RESET and BOOT buttons.

October 14

USB, a fallback UART header and the 3.3 V supply mux

Wired the USB connector, and added male UART header footprints for a future adapter option that won't be soldered at first. Created and completed the 3.3 V supply power mux: it prefers 5 V USB power through the 3.3 V buck, and switches to the LiPo when USB is disconnected.

October 15

ESP32 schematic complete

Finished the ESP32 sheet: native USB programming with ESD protection, a backup UART programming and debug header, manual BOOT and RESET, all four motor PWM signals, I²C for the INA219 and VL53L0X, power-good, boost-control and mux-status signals, two removable motor thermistors, eight spare GPIOs including three ADC1 channels, an external JTAG header, and a dual I²C expansion interface.

October 19

Buck input hot loops laid out

Placed each buck's input capacitors close to the IC with short, wide copper to keep the hot-loop area and parasitic inductance down. Added local ground-return paths and thermal vias in the exposed ground pads to spread heat.

October 20

PCB routed, DRC clean

Finished routing the first DriveWire PCB: power converters, motor driver and ESP32 interfaces. Filled the unused bottom-layer space with a GND pour and stitching vias for copper balance and ground-return continuity. DRC reports zero active violations, with 19 waived. The design is complete pending final checks, with fabrication planned shortly.

October 21

Dedicated FreeRTOS motor task

Added a motor task with its own single-item command queue and its own DriveWireState, separate from the sensor task. It applies left/right PWM commands and coasts both motors if no new command arrives within 500 ms. A temporary test sends PWM 140/255 to both motors every 100 ms for two seconds, then stops sending to exercise the timeout while sensor telemetry keeps running.

October 23

Spin 1 sent to fab

Finished the final checks, exported the Gerbers, drill files, BOM and pick-and-place file, and placed the order with JLCPCB.

V1 bill of materials8 items in use
01

ESP32-S3 DevKitC-1-N8R8 main controller

02

Pololu DRV8833 dual motor driver under active test

03

2WD robot chassis with wired DC gear motors

04

2S LiPo pack used in September bench tests; AA pack used in earlier bring-up

05

INA219 current sensor soldered for current and power measurement

06

VL53L0X distance sensor mounted and tested to approximately 1.3 m indoors

07

22 AWG automotive wire, heat shrink, zip ties, and mounted breadboard

08

SolidWorks support stand printed in black PLA for safer debugging

Next

DriveWire is moving.

The drivetrain, telemetry and fault handling work on the bench, and the 4-layer PCB passed DRC and is at fab. Next is bringing up the protected input, the mux and both bucks, and measuring how much of the prototype's 0.95 V path loss the board removes.