barbell probe (wip)
x 0.35 · purpose 0.70 · t 2 s · scope 0.40
from 2026-10
ESP32-C3 · ICM-42688-P · BLE · C++
A lift is a repeated movement, but most workout records contain only weight and repetition count. The barbell probe is an ESP32-C3 motion tracker that attaches to a barbell or moving weight stack and turns each repetition into a path, a tempo and a set of measurable phases.
a rep as a trajectory
Barbell bench press, 8 reps. The bar path at 1:1 in the device's frame: the bar descends about 37 cm from its start, reverses and returns, drifting -4 to 26 mm sideways. Beside it, each rep's vertical travel against time, with earlier reps kept faint and each reversal marked.
data
| rep | rom (cm) | lower (s) | lift (s) | cycle (s) | counted at (s) | reversal z (mm) | reversal x (mm) |
|---|---|---|---|---|---|---|---|
| 1 | 37.2 | 1.08 | 0.81 | 2.49 | 3.21 | -375.0 | 19.2 |
| 2 | 38.0 | 1.10 | 0.84 | 2.52 | 5.76 | -383.1 | 19.4 |
| 3 | 37.5 | 1.13 | 0.87 | 2.57 | 8.33 | -377.2 | 17.3 |
| 4 | 36.5 | 1.12 | 0.89 | 2.59 | 10.93 | -367.4 | 17.5 |
| 5 | 37.1 | 1.15 | 0.91 | 2.63 | 13.57 | -373.5 | 15.3 |
| 6 | 35.7 | 1.18 | 0.95 | 2.73 | 16.29 | -359.5 | 18.6 |
| 7 | 34.8 | 1.20 | 1.00 | 2.78 | 19.09 | -352.0 | 18.5 |
| 8 | 35.5 | 1.23 | 1.07 | 2.92 | 21.98 | -358.4 | 20.1 |
The main object is the movement itself: a thin trace written across an otherwise empty frame. Position advances with time, pauses at the end of the range and returns. Previously completed reps remain as faint references, so the movement reads without a photo of the gym or the device.
an entire set
Cable-row weight stack, 10 reps over 30.7 s. The stack rises above its start on every rep, so its trace runs upward. Range of motion 43.1 cm on average (2.45% variation); each rep's range and lowering and lifting time sit under it.
data
| rep | start (s) | rom (cm) | lower (s) | lift (s) | cycle (s) | counted at (s) |
|---|---|---|---|---|---|---|
| 1 | 1.00 | 43.4 | 1.24 | 0.83 | 2.65 | 3.23 |
| 2 | 3.65 | 44.2 | 1.25 | 0.84 | 2.69 | 5.90 |
| 3 | 6.34 | 43.8 | 1.27 | 0.87 | 2.75 | 8.66 |
| 4 | 9.09 | 44.7 | 1.29 | 0.85 | 2.74 | 11.41 |
| 5 | 11.83 | 43.1 | 1.31 | 0.90 | 2.84 | 14.23 |
| 6 | 14.67 | 43.9 | 1.33 | 0.92 | 2.88 | 17.12 |
| 7 | 17.55 | 42.6 | 1.34 | 0.96 | 2.93 | 20.05 |
| 8 | 20.48 | 42.3 | 1.36 | 1.00 | 3.01 | 23.05 |
| 9 | 23.49 | 41.8 | 1.37 | 1.03 | 3.04 | 26.11 |
| 10 | 26.53 | 41.2 | 1.41 | 1.08 | 3.17 | 29.25 |
Alongside the primary trace sit small fields for repetition number, range of motion, direction, and lifting and lowering time. The examples are a bench-press set and a moving cable-row stack; the two traces run in opposite signed directions relative to their starting position.
device to phone
The ESP32-C3 reads its ICM-42688-P at 100 Hz, marks each motion phase on the device and sends the phone a BLE notification every 100 ms: 234 frames and 8 counted reps in the bench-press set, from connect and tare to save. The load is entered in the phone; the sensor measures motion only.
data
| set | t (s) | from | to | event |
|---|---|---|---|---|
| BP-042 | 0.00 | phone | device | ble connect |
| BP-042 | 0.12 | device | phone | ready |
| BP-042 | 0.20 | phone | device | set config |
| BP-042 | 0.26 | phone | device | tare |
| BP-042 | 1.00 | device | phone | tare ok |
| BP-042 | 1.15 | phone | device | start set |
| BP-042 | 1.20 | device | phone | set started |
| BP-042 | 3.21 | device | phone | rep 1 · 37.2 cm |
| BP-042 | 5.76 | device | phone | rep 2 · 38.0 cm |
| BP-042 | 8.33 | device | phone | rep 3 · 37.5 cm |
| BP-042 | 10.93 | device | phone | rep 4 · 36.5 cm |
| BP-042 | 13.57 | device | phone | rep 5 · 37.1 cm |
| BP-042 | 16.29 | device | phone | rep 6 · 35.7 cm |
| BP-042 | 19.09 | device | phone | rep 7 · 34.8 cm |
| BP-042 | 21.98 | device | phone | rep 8 · 35.5 cm |
| BP-042 | 23.33 | device | phone | set ended |
| BP-042 | 23.36 | phone | device | save set |
| BP-042 | 23.43 | phone | set saved | |
| WS-016 | 0.00 | phone | device | ble connect |
| WS-016 | 0.12 | device | phone | ready |
| WS-016 | 0.20 | phone | device | set config |
| WS-016 | 0.26 | phone | device | tare |
| WS-016 | 0.80 | device | phone | tare ok |
| WS-016 | 0.95 | phone | device | start set |
| WS-016 | 1.00 | device | phone | set started |
| WS-016 | 3.23 | device | phone | rep 1 · 43.4 cm |
| WS-016 | 5.90 | device | phone | rep 2 · 44.2 cm |
| WS-016 | 8.66 | device | phone | rep 3 · 43.8 cm |
| WS-016 | 11.41 | device | phone | rep 4 · 44.7 cm |
| WS-016 | 14.23 | device | phone | rep 5 · 43.1 cm |
| WS-016 | 17.12 | device | phone | rep 6 · 43.9 cm |
| WS-016 | 20.05 | device | phone | rep 7 · 42.6 cm |
| WS-016 | 23.05 | device | phone | rep 8 · 42.3 cm |
| WS-016 | 26.11 | device | phone | rep 9 · 41.8 cm |
| WS-016 | 29.25 | device | phone | rep 10 · 41.2 cm |
| WS-016 | 30.70 | device | phone | set ended |
| WS-016 | 30.73 | phone | device | save set |
| WS-016 | 30.80 | phone | set saved |
An IMU provides accelerometer and gyroscope readings, while the phone receives motion and rep events over BLE. The device interprets relative movement; the user enters the load separately, because the sensor never measures the weight being lifted.