

Esp32Tap
Controlling my procor-9.3x treadmill
- Size
- 95 × 58 mm
- Copper layers
- 4
- Thickness
- 1.59 mm
- Parts
- 94
- Nets
- 77
- Pads
- 304
- Tracks, vias
- 1,258, 265
- Pours
- 10
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 28 Jan 2026
- Updated
- 7 Sep 2026
Overview
Esp32Tap is an open-source printed circuit board by scottmsilver, from the scottmsilver/treddy repository on GitHub. It is a 4-layer board of 95 × 58 mm with 94 parts on 77 nets, routed with 1,258 tracks and 265 vias.
It is built around the ESP32-S3-WROOM-1-N8, SN74LVC1G126DBVR-TP and TPS54202DDCR, with the SN74LVC2G08DCTR, TPS3700DDCR and TPS70950DBVR-TP among its other parts. Its parts include 32 resistors, 21 capacitors, 8 diodes, 7 ICs and 3 connectors. It belongs with the ESP32 boards of this library.
Main components
12ESP32-S3-WROOM-1-N8
SMD,25.5x18mm-40℃~+85℃ -98.2dBm 2.4GHz 20.5dBm 355mA 3V~3.6V 95mA Bluetooth5.0 ESP32-S3 Chip On-board PCB Antenna UART、SPI、I2C、I2S、USB SMD,25.5x18mm WiFi Modules ROHSEspressif SystemsWiFi ModulesSN74LVC1G126DBVR-TP
SOT-23-5-40℃~+125℃ 1 1 1.65V~5.5V 10uA 32mA 32mA 74LVC 9ns@5V,50pF Power-off isolation、Output enable Tri-State Unidirectional SOT-23-5 Buffers, Drivers, Receivers, Transceivers ROHSTECH PUBLICBuffers, Drivers, Receivers, TransceiversTPS54202DDCR
SOT-23-6-40℃~+125℃@(TJ) 1 2A 4.5V~28V 45uA 500kHz Adjustable Buck Buck Built-in Yes SOT-23-6 DC-DC Converters ROHSTexas InstrumentsDC-DC ConvertersSN74LVC2G08DCTR
SM-8-40℃~+125℃ 1.65V~5.5V 1.7V~2V 10uA 2 2 2.3V~3.8V 24mA 24mA 4.7ns@3.3V 400mV~550mV 700mV~800mV 74LVC AND Gate SM-8 Logic Gates ROHSTexas InstrumentsLogic GatesTPS3700DDCR
SOT-23-6-40℃~+125℃ 1.8V~18V 11uA 1nA 2 2.2us 29us 5.5mV Open-drain SOT-23-6 Comparators ROHSTexas InstrumentsComparatorsTPS70950DBVR-TP
SOT-23-5-40℃~+85℃@(Ta) 1 200mA 2uA 36V 5V 660mV@(100mA) 70dB@(100Hz) Fixed Over Current Protection、Over Temperature Protection、Enable Positive SOT-23-5 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSTECH PUBLICVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsUSBLC6-2SC6
SOT-23-60.35pF、0.8pF 100nA 150W@8/20us 15V 2 5V 6A@8/20us 6V ESD SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSUMWESD And Surge Protection (TVS/ESD)M2.5
-0.45mm 2.5mm 2mm 5mm DIN934 Hex M2.5X0.45 Nickel plated Silver white - Hexagonal nutsShuntianHex NutPESD3V3L1BA-N
SOD-323100pF 1uA 20A@8/20us 24V 3.3V 480W@8/20us 4V Bidirectional ESD IEC 61000-4-2、IEC 61000-4-5、IEC 61000-4-4 Single-channel SOD-323 ESD and Surge Protection (TVS/ESD) ROHSBORNESD And Surge Protection (TVS/ESD)SKRPACE010
SMD-4P,4.2x3.2mm-30℃~+85℃ 16V 2.5mm 2.6N 3.2mm 4.2mm 50,000 cycles 50mA J-Lead Oval button SPST-NO Surface Mount,Vertical SMD-4P,4.2x3.2mm Tactile Switches ROHSALPSALPINETactile Switches1812L075/24DR
1812-40℃~+85℃ 1.25mm 1.5A 100A 110mΩ 200ms 24V 290mΩ 3.41mm 4.73mm 750mA 800mW 1812 Resettable Fuses ROHSLittelfuseResettable FusesBC817-40,215
SOT-23SOT-23 Bipolar (BJT) ROHSNXP SemiconductorsBipolar (BJT)
README
README.mdTreddy
A 2005 treadmill that listens when you talk to it.
A Raspberry Pi sits between the console and motor controller of a Precor 9.31 treadmill, intercepting the serial bus. It runs an AI coach (Gemini), voice control, a tablet UI, and a Bluetooth daemon that makes Zwift think it's a modern smart treadmill.
The Ridgeline HUD — your workout drawn as a trail up a real mountain. The route's switchbacks tighten with the grade, the strip on the right shows what's coming and when, and every panel is adaptive glass floating on the photo.
Voice + AI Coach
- "Set speed to 5" or "give me a 20-minute hill workout" — Gemini controls the belt directly
- Voice works mid-run via Gemini Live (real-time, no wake word)
- Says "this is the hardest interval" or "you're faster than last time" because it can query your run history
Apps
- Android (Kotlin + Compose): runs on a tablet mounted on the treadmill console
- Workout library, run history, live elevation profile, calorie tracking
Bluetooth
- Rust daemon makes the treadmill show up in Zwift, Peloton, QZ Fitness, and Apple Watch as a standard FTMS device
- Fitness apps can read speed/incline and write speed/incline commands back
Heart Rate
- Connects to any Bluetooth heart rate strap
- HR shows in the UI and feeds into calorie calculations
Architecture
┌───────────────────────────────────────────────────────┐
│ Android (Kotlin + Compose) │
├───────────────────────────────────────────────────────┤
│ REST / WebSocket / Gemini Live (voice) │
├───────────────────────────────────────────────────────┤
│ server.py (FastAPI) │
│ Sessions, programs, AI chat, workout query DB │
├──────────────────┬──────────────┬─────────────────────┤
│ treadmill_io │ ftms-daemon │ hrm-daemon │
│ C++20, GPIO │ Rust, BLE │ Rust, BLE │
│ serial, safety │ FTMS │ heart rate │
└──────────────────┴──────────────┴─────────────────────┘
│
Precor 9.31
RS-485 serial bus- C++ binary — reads/writes the serial bus, enforces safety (3-hour timeout, physical buttons always override software)
- Python server — FastAPI. All the logic: Gemini AI, workouts, sessions, run history
- FTMS daemon — Rust. Bluetooth for fitness apps
- HRM daemon — Rust. Connects to heart rate straps
- Android — display layer. All decisions happen server-side.
Details: CLAUDE.md
The Hardware Story
The serial protocol turned out to be plain ASCII text. We just had the polarity wrong and spent days decoding "binary" that was actually
[key:value]pairs with every bit flipped.
Full reverse engineering writeup →
Custom hardware: the breadboard tap was productized into a custom Pi
Zero 2 W hat — dual RJ45 (From Console / To Motor), a Pololu D24V10F5
buck so the treadmill's +8V rail powers the Pi, full 2×20 header. KiCad
sources, gerbers, and wiring guides are in
hardware/PiZeroHat/ (adapted from the
vasya-zh/PiZeroHat pogo-pin base).
Quick Start
You need: a Raspberry Pi (any aarch64 model — Zero 2 W or 4), the treadmill
serial tap (the custom hat in hardware/PiZeroHat/,
or a breadboard tap wired per HARDWARE.md), Docker on your dev
machine (for the cross toolchain), and a Gemini API key.
1. Build the OS image for your Pi. The Pi runs a stock Debian-based Pi
OS; you flash a reproducible image built for your hardware. See
provisioning/ for the image builder
(DietPi is the reference implementation — adapt the regulatory/board
settings for yours). Flash it, boot, confirm SSH.
2. Deploy the software. Compiled code is cross-built off-Pi in one
Docker toolchain — nothing is compiled on the Pi. The OS runtime
prerequisites (python3, libpigpio1) are installed automatically by
the deploy; you do not apt-install anything by hand.
make deploy # cross-build → rsync → restart all 4 services
make deploy-key # one-time per device: push your ./.gemini_key (a secret;
# never rsync'd by a normal deploy)
make image # OR: bake a flashable .img with everything pre-installedLocal dev (no Pi needed):
TREADMILL_MOCK=1 ./scripts/dev.sh # server.py in mock modeAPI reference, deploy details, tests: CLAUDE.md
License
MIT
Parts
94| Qty | Value | Footprint | References |
|---|---|---|---|
| 16 | 10k | Resistor_SMD:R_0603_1608Metric | R7, R8, R10, R13, R18, R20, R21, R23, R24, R25, R26, R27, R28, R29, R30, R31 |
| 7 | 100nF | Capacitor_SMD:C_0603_1608Metric | C4, C5, C9, C11, C17, C20, C21 |
| 3 | 100k | Resistor_SMD:R_0603_1608Metric | R1, R3, R22 |
| 3 | 22uF/25V X7R 1210 | Capacitor_SMD:C_1210_3225Metric | C1, C6, C7 |
| 3 | M2.5 | MountingHole:MountingHole_2.7mm_M2.5 | MH1, MH2, MH3 |
| 3 | PESD3V3L1BA-N | Diode_SMD:D_SOD-323 | D5, D6, D7 |
| 2 | 10uF/25V X7R 1206 | Capacitor_SMD:C_1206_3216Metric | C2, C3 |
| 2 | 1nF/50V C0G 0603 | Capacitor_SMD:C_0603_1608Metric | C18, C19 |
| 2 | 22R | Resistor_SMD:R_0603_1608Metric | R15, R16 |
| 2 | 441440003 | RJ45_SMD:RJ45-SMD_441440003 | J1, J2 |
| 2 | 5.1k | Resistor_SMD:R_0603_1608Metric | R4, R5 |
| 2 | DNP | Capacitor_SMD:C_0603_1608Metric | C13, C14 |
| 2 | SKRPACE010 | Button_Switch_SMD:SW_SPST_SKRPACE010 | SW1, SW2 |
| 1 | +5V_RLY | TestPoint:TestPoint_Pad_1.5x1.5mm | TP6 |
| 1 | 100R | Resistor_SMD:R_0603_1608Metric | R6 |
| 1 | 10uF/16V 0805 | Capacitor_SMD:C_0805_2012Metric | C8 |
| 1 | 10uH SWPA4030S100MT | Inductor_SMD:L_Sunlord_SWPA4030S | L1 |
| 1 | 150k | Resistor_SMD:R_0603_1608Metric | R17 |
| 1 | 1812L075/24DR | Fuse:Fuse_1812_4532Metric | F1 |
| 1 | 1k | Resistor_SMD:R_0603_1608Metric | R12 |
| 1 | 1uF | Capacitor_SMD:C_0603_1608Metric | C10 |
| 1 | 1uF/25V X7R 0603 | Capacitor_SMD:C_0603_1608Metric | C15 |
| 1 | 22k | Resistor_SMD:R_0603_1608Metric | R2 |
| 1 | 255k | Resistor_SMD:R_0603_1608Metric | R19 |
| 1 | 2N7002 | Package_TO_SOT_SMD:SOT-23 | Q2 |
| 1 | 330R | Resistor_SMD:R_0603_1608Metric | R11 |
| 1 | 3V3 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP3 |
| 1 | 4.7k | Resistor_SMD:R_0603_1608Metric | R32 |
| 1 | 4.7uF/25V X7R 0805 | Capacitor_SMD:C_0805_2012Metric | C16 |
| 1 | 47k | Resistor_SMD:R_0603_1608Metric | R14 |
| 1 | 560R | Resistor_SMD:R_0603_1608Metric | R9 |
| 1 | 56pF C0G 0603 | Capacitor_SMD:C_0603_1608Metric | C12 |
| 1 | BC817-40,215 | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | ESP32-S3-WROOM-1-N8 | RF_Module:ESP32-S3-WROOM-1 | U1 |
| 1 | G6K-2F-Y-TR DC5 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K1 |
| 1 | GND | TestPoint:TestPoint_Pad_1.5x1.5mm | TP4 |
| 1 | K1_NC_FB | TestPoint:TestPoint_Pad_1.5x1.5mm | TP12 |
| 1 | K1_NO_FB | TestPoint:TestPoint_Pad_1.5x1.5mm | TP13 |
| 1 | RED-0603 | LED_SMD:LED_0603_1608Metric | LED2 |
| 1 | RELAY_GATE | TestPoint:TestPoint_Pad_1.5x1.5mm | TP8 |
| 1 | RELAY_SW | TestPoint:TestPoint_Pad_1.5x1.5mm | TP9 |
| 1 | RXD0 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP2 |
| 1 | SMAJ6.0CA | Diode_SMD:D_SMA | D4 |
| 1 | SMBJ10A | Diode_SMD:D_SMB | D3 |
| 1 | SN74LVC1G126DBVR | Package_TO_SOT_SMD:SOT-23-5 | U7 |
| 1 | SN74LVC2G08DCTR | Package_SO:SSOP-8_2.95x2.8mm_P0.65mm | U6 |
| 1 | SS34 | Diode_SMD:D_SMA | D1 |
| 1 | TPS3700DDCR | Package_TO_SOT_SMD:SOT-23-6 | U4 |
| 1 | TPS54202DDCR | Package_TO_SOT_SMD:SOT-23-6 | U2 |
| 1 | TPS70950DBVR | Package_TO_SOT_SMD:SOT-23-5 | U5 |
| 1 | TREAD_OK | TestPoint:TestPoint_Pad_1.5x1.5mm | TP7 |
| 1 | TXD0 | TestPoint:TestPoint_Pad_1.5x1.5mm | TP1 |
| 1 | TX_DRV | TestPoint:TestPoint_Pad_1.5x1.5mm | TP11 |
| 1 | TX_GATE | TestPoint:TestPoint_Pad_1.5x1.5mm | TP10 |
| 1 | USB-C_HRO_TYPE-C-31-M-12 | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J3 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U3 |
| 1 | VIN | TestPoint:TestPoint_Pad_1.5x1.5mm | TP5 |
| 1 | XL-1608UGC-04 | LED_SMD:LED_0603_1608Metric | LED1 |
More from scottmsilver/treddy
1- 2 layers65 × 45 mm

Similar boards
- 4 layers72 × 70 mm

- 4 layers21.7 × 89.8 mm

- 4 layers141.6 × 135.2 mm

Controller core reva
itorralbo/open-saeco-controller
Controladora open-source para sustituir la electrónica de la Saeco Incanto HD8911, placa objetivo 421941308981/01. Proyecto independiente, sin afiliación a Philips/Saeco.
226 partsMIT - 4 layers110 × 90 mm

FilMachine Mainboard
yesnoj/FilMachine_Reworked
FilMachine is an automated film processing machine designed for photographic film development. It handles the entire process: chemical baths, water rinses, temperature regulation, and motor-driven film agitation — all…
205 parts - 6 layers300 × 220 mm

AIPE Buck 1kW
FulongLi/AIPE-PCB-Agent
AIPE-PCB-Agent is the PCB design automation of the AIPE power-electronics ecosystem. Python generators turn a requirement file set (specification, insulation table, components, interfaces, floorplan and routing inputs)…
240 parts - 4 layers90 × 66 mm

ChassisBoard
SolarEnergyRacers/solar_car_control_system_v6
solarenergyracers.ch - control system (AC, DC, MC), Documents
71 parts - 4 layers100 × 90 mm

Nexus pear reva
aminewe898/nexus-pear-reva
NEXUS PEAR Rev A hardware design, schematics, PCB, manufacturing review exports and engineering documentation
117 partsMIT - 4 layers560.1 × 158.8 mm

Keyboard
DEV-ajthedj/Keyboard
A custom RGB keyboard that features three 1D capacitive touch sliders, two joysticks, an OLED screen, a fingerprint sensor, and plenty of macro keys!
439 parts
Questions
How big is the Esp32Tap PCB?
It measures 95 × 58 mm and has 4 copper layers, 1.59 mm thick.
What parts does the Esp32Tap use?
94 parts, built around the ESP32-S3-WROOM-1-N8, SN74LVC1G126DBVR-TP, TPS54202DDCR and SN74LVC2G08DCTR. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the Esp32Tap KiCad files?
From the scottmsilver/treddy repository on GitHub, at the commit this page was made from: the board is hardware/Esp32Tap/kicad/Esp32Tap.kicad_pcb and its schematic hardware/Esp32Tap/kicad/Esp32Tap.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Esp32Tap design in my own project?
Its repository states no licence, so its author keeps all rights: ask scottmsilver before reusing the design.