Learn what a healthy column looks like on the jig. Then the deck's main PC tells a technician which tile, which column and which part to fix, before it fails.
| Part | Note |
|---|---|
| TMC5240 dev kit: NUCLEO-G474RE + TMC5240-BOB | The bench board for every test, from first moves to the encoder (Order 1) |
| MPS TBMA732-Q-LT-00A encoder board (MA732, 14-bit) | 3.3 V only; A/B/Z at 1,024 ppr out of reset. Solder 5 wires, bridge TEST to GND. USD 11.91, 13 at Digi-Key (2026-10-13) |
| Diametric magnet 6 × 2.5 mm N35SH (Radial 9049) | 150 °C max (motor side reaches ≈ 80 °C at 2.0 A) |
| M2.5 screws: 2 × 5, 2 × 8, 2 × 6 | Mount to motor (rear holes only 3 mm deep), tray to mount, board to tray |
| Printed: encoder_magnet_holder, encoder_mount, encoder_tray | From print/make_parts.py; measure the rear shaft and the board thickness first |
Prices and order: parts page ↗
Wiring and power-up order: bench guide, TMC5240 dev kit section ↗; encoder steps in its part L.
| Encoder in the chip | Setting |
|---|---|
| Input | A/B/Z → BOB ENCA/ENCB/ENCN, 1,024 ppr = 4,096 counts/rev |
| Scale | Firmware boots at enc_counts_rev 4096 (nothing to set) → ENC_CONST = 3.125 (binary, 0x00032000; 12,800 microsteps/rev). The firmware converts to 16,384 counts/rev (1 count = 4), so the analysis is unchanged. |
| Lag and hysteresis | 8–10 µs ≈ 2 counts at 50 rev/s; ABZ hysteresis 0.52° ≈ 6 counts (MA732 datasheet). For the load-angle signal subtract a ≈ 0.26° direction offset (estimate). |
| Lost-step flag | ENC_DEVIATION = 128 microsteps (2 full steps) → deviation_warn, read every 1 ms → event ENC_DEVIATION |
| Must stay off | GCONF.stop_enable (else ENCA high stops the motor) |
Firmware: firmware/dist/firmware_nucleo_g474re_cube.bin. Add --board nucleo-g474re --no-estop to every bench command (.venv/bin/bench from the repository root) (no E-stop wired on the bench: the supply's output button is the stop).
bench --board nucleo-g474re --no-estop health-run --db jig.sqlite --encoder --ambient 21. Homes, full strokes at 50 and 200 mm/s, ±2 mm reversal probe for nut play. Refuses to start without a valid encoder. Magnet field: MGL and MGH pads both off (meter).--steps load. 0, 0.5, 1, 2, 3, 4 kg on the weight tower. Gives signal per kg.--steps soak --soak-min 30. Temperature effect on the readings.--steps stroke,reversal,endurance --cycles 2000 --repeat 0. Standard test every 100 cycles, homing check every 250. Telemetry off (50 Hz = 0.5 GB/day).deck-health report --db jig.sqlite → HTML with alerts, baselines, a chart per signal.--new-unit --unit nut-B2 to restart the baseline.Stops at the first E-stop, driver fault or unexpected stall. Everything goes into one SQLite file.
Cycle one column until it fails: play above 0.3 mm, more than 5 lost steps per km at 2 kg, or a stall in the standard test. Then look back: which signal moved first, and how many km before. That sets the alarm limits and the production test rate.
| IC | NOVOSENSE MT6826SGT-AKD-R: A/B = 1,000 ppr (4,000 counts/rev) out of reset, ENC_CONST 3.2 as on the AS5047P. 10 µs delay, 30–1,000 mT, 1–3 mm gap (DS Rev 1.1) |
| Price | USD 2.38 / 100, 2.12 / 1k at LCSC (2026-10-13). -AKD out of stock; -STD in stock (1 ppr: one SPI write, ABZ_RES = 999, then EEPROM burn) |
| Placement | Small daughterboard on the motor's rear-face M2.5 pair; 5-wire cable (3V3, GND, A, B, Z) to the Tile-20. Magnet Radial 9049 |
| Supply | 22 mA each: 0.44 A at 3.3 V per Tile-20; size the rail for 0.6 A |
| Fault | Signal | Action in the alert |
|---|---|---|
| Friction rising | Average load reading of up and down tests falls | Clean and re-grease screw and nut; if it returns, replace the nut, then the screw |
| Tight spot | Dip in the load profile at one height | Inspect at that height; replace a bent screw |
| Nut play | Reversal probe: start of each move gets lighter | Gauge it; replace the nut above 0.3 mm |
| Coupler slipping | Zero shifts at homing, encoder moved with it | Tighten set screws on the shaft flat; replace the coupler if it slips again |
| Lost steps | Chip's encoder deviation flag | Look for binding or overload |
| Something on the cap | Up/down difference rises on an empty column | Remove what rests on or rubs the cap |
| Supply or cable | Voltage dips; open-coil or short flags | Check connector and motor cable; swap the board |
| Running hot | Driver temperature rise per test grows | Check current, cooling, friction |
| Event | Reaction | Still working? |
|---|---|---|
| A few missed steps | Position reset from the encoder, event logged | Yes |
| Blocked by a jam | Move stopped and reported; no re-homing | Yes, once cleared |
| Encoder dies | Runs open-loop; flagged for repair | Degraded |
| Motor, cable or driver fault | Output off; column sinks to its bottom stop; planner routes around it | No, deck keeps running |
Bottom stop 1–3 mm below flush: a dead column leaves a shallow dip, not a pit.
Real firmware on a simulated 4-column tile: 30 test sessions over 40 km, one column wearing, 8 seeds. Wear models are plausible, not measured: this proves the chain, not the warning times.
| Scenario | Fails at | Warned before failure |
|---|---|---|
| Healthy columns | — | 0 false alarms |
| Friction rising | 3 × new (30 km) | 14 km |
| Nut play | > 0.3 mm (24 km) | 4–6.7 km |
| Tight spot | first lost steps | 17–20 km |
| Coupler slipping | 0.5 mm slip | 1.3 km (more with more homing) |
firmware/core/ (health.*, machine_health.cpp, machine_tmc5240.cpp), dev-kit hardware layer firmware/board/; design in firmware/docs/HEALTH.txt.software/link/health_run.py (bench health-run).software/link/health/ (deck-health report | baseline | calibrate | alerts | simulate).docs/print/encoder_*.stl.