Open source force plates for golf performance.
Two low-profile golf force plates, one per foot. Each plate has four load cells, eight in total. A single Arduino UNO Q reads them, and a web dashboard on the LAN shows live weight shift and swing replay.
Status: Hardware bring-up is under way. Four of the eight load cells read on one SPI bus through the toe stripboard carrier, at about 944 Hz each (
bench/ads1220_all; results indocs/VERIFIED.md). An assembled, no-solder ADC board for all eight channels has been designed and ordered (hardware/pcb/adc-board). The pure-Python processing (app/python/open_fp/: protocol, clock, pipeline, calibration, swing detection, storage) is written and tested, and runs underpytestwith no hardware. The web UI and a desktop simulator work too: runpython tools/sim/sim_server.pyand open http://localhost:7070 to see live weight shift, swing capture, replay and diagnostics on synthetic swings. Not written yet: the production MCU firmware (app/sketch/) and the board-sidemain.pythat links it to the pipeline. Milestones:docs/PROJECT_INIT.md§12 (M0–M1 done, M2 in progress).
| Output | Notes |
|---|---|
| Vertical force per foot (Fz) | N and %BW |
| Centre of pressure (CoP) per foot and combined | mm, in the stance frame |
| Lead/trail weight % | set by handedness (RH/LH) |
| Swing capture and metrics | address, max trail, transition, max lead, finish |
- Vertical force only. Each plate has four vertical cells, which give Fz and CoP (x, y) per plate. The plates cannot measure shear (horizontal) forces or torque about the vertical axis, so the app does not report ground torque or horizontal force.
- Inter-channel skew up to ~1 ms. Each ADC runs on its own oscillator. All eight are read on the DRDY signal of one board.
- 200 Hz stream. The MCU↔Linux router link runs at 115200 baud. That is enough for weight shift but too slow for impact transients.
- Temperature drift. Half-bridge cells and their completion resistors drift with temperature. The app auto-zeros when the plates are empty.
- Impact timing is external. Impact is known only when the OpenFlight launch monitor sends a shot event or you mark it by hand. Over Wi-Fi with NTP, expect 5–20 ms of error.
- 2 × 12" × 12" × 1/4" 6061 aluminum plates, 8 × 50 kg half-bridge load cells, 8 × ADS1220 24-bit ADCs, 1 × Arduino UNO Q
- Bill of materials:
hardware/bom.md(its Buy column uses Amazon affiliate links) - ADC wiring: hand-built stripboard carriers (
docs/harness.md), or the assembled, no-solder ADC board inhardware/pcb/adc-board/ - Print files:
hardware/cad/(STL, STEP, and the CadQuery sources) - Assembly:
docs/assembly.md· Wiring:docs/wiring.md· System wiring, step by step:docs/harness.md· One-cell bench test:docs/bench-single-cell.md· Calibration:docs/calibration.md
app/ Arduino App Lab app: MCU sketch, Python processing, static web UI
bench/ bring-up sketches for the ADS1220s
docs/ project spec, assembly, wiring, calibration, VERIFIED log
hardware/ BOM and CAD (STL/STEP in Git LFS)
tools/ deploy scripts, desktop simulator, offline analysis
tests/ pytest suite, runs without hardware
Full walkthrough from a fresh clone and an unboxed board: docs/SETUP.md. The short version:
tools/dev_setup.sh # dev machine: git-lfs, arduino-cli + UNO Q core, CAD files, .venv
# App Lab: first-boot the board as "open-fp", then create app "open-fp" with the WebUI - HTML brick
tools/board_setup.sh # install your SSH key on the board
tools/deploy.sh # push app/ and restart; UI at http://open-fp.local:7000
tools/logs.sh # follow the app's Python logsBuild reports, fixes and new features are welcome. Start with CONTRIBUTING.md: it covers the dev setup (no hardware needed), the checks CI runs, and how hardware changes are recorded. Please follow the Code of Conduct, and report security issues privately as described in SECURITY.md.
AGPL-3.0, the same license as OpenFlight.