GANTRY-3_
A materials lab was moving sample coupons between a furnace, a scale and a camera by hand, one coupon at a time, for runs that lasted nine hours. They wanted the moves automated without rewriting the Python they already trusted.
- Repeatability
- 0.05 mm
- dial indicator at nine points in the envelope, 30 returns each
- X travel
- 900 mm
- Pick cycle
- 3.40 s/pick
- median of 500 picks, 180 mm move, median of the acceptance run
- Build
- 39 d
- Brief → Handover on site
- △3 · 10-02
- Soft limits added on all three axes after a scripted move drove the gripper into the furnace door.
- △2 · 09-17
- Published the nine-point accuracy map, including the ±0.18 mm miss, in the handover pack.
- △1 · 09-05
- Z head rebuilt on two rails at 90 mm centres. Droop at full Y extension 0.30 mm → 0.02 mm.
BDR-25-04-A — reserved. Welded steel frame, ballscrews on X and Y. The frame is the accuracy argument, not the motors.
- Position accuracy
- 0.18 mm · against gauge blocks at the same nine points, 270 moves total
- Y travel
- 600 mm
- Z travel
- 220 mm
- Settle
- 120 ms · encoder, ±0.05 mm band, median of 500 moves
- Payload
- 1.20 kg · calibrated masses at the worst-case Y extension
- Parts
- 214
- Machined here
- 22
What we were asked for.
Sample coupons were being moved between a furnace, a scale and a camera by hand. The runs are nine hours long, the interesting part is at the end, and the person doing the moving was a graduate student who had to be in the room the whole time.
The constraint that shaped everything was not mechanical. They had years of Python that drives the furnace and logs the scale, and they were clear that a machine which required them to abandon it was worse than no machine.
The targets, and what we actually hit.
| Constraint | Target | Achieved | How measured |
|---|---|---|---|
| Return repeatability | ± 0.05 mm | ± 0.05 mm | dial indicator, nine points, 30 returns each |
| Absolute accuracy across the envelope | ± 0.10 mm | ± 0.18 mmMissed | gauge blocks at nine points, uncompensated ballscrew pitch |
| Working envelope | 900 × 600 × 200 mm | 900 × 600 × 220 mm | soft limits, measured with a height gauge |
| Pick cycle | < 4 s | 3.4 s | median of 500 picks over a 180 mm move |
| Driven from the lab’s existing Python | No rewrite of their run scripts | Four function calls added | their nine-hour furnace script ran unmodified apart from the calls |
| Nine-hour unattended run | No intervention | No intervention, three consecutive runs | logged on site during handover week |
Targets were set at kickoff, before the first part was cut. A target we missed stays on the sheet with the number we actually got.
How it moves.
Ballscrews on X and Y, a belt on Z, on a welded steel frame rather than extrusion. Extrusion would have been three days faster and we would have spent those three days back on accuracy — a 900 mm extrusion span with a 1.2 kg load hanging off a Y carriage racks by more than our whole error budget.
The Z axis started as a belt and stayed a belt, but the head was rebuilt: the first version drooped 0.3 mm under payload at full extension because we cantilevered the gripper off one linear rail. The second version uses two rails 90 mm apart and the droop is gone.
What it runs on.
Off-the-shelf closed-loop steppers and a controller we wrote, rather than a motion card. The reason is the interface: they needed a documented serial protocol they could call from Python, and every industrial controller we priced wanted its own language in the middle.
| Subsystem | Specification |
|---|---|
| Motors | Closed-loop stepper, 1.8°, 1000 count encoder |
| Drive | X and Y ballscrew 5 mm pitch, Z belt 2 mm pitch |
| Controller | STM32F4, 8 kHz trajectory update |
| Interface | Serial, documented, plus a 210-line Python client |
| Gripper | Pneumatic, two-finger, 1.2 kg rated |
| Homing | Inductive, repeatable to 0.02 mm |
What it did.
Delivered in 39 days and accepted on a 500-pick run at 3.4 s per pick. Repeatability held at ±0.05 mm, which is the number that matters for returning a coupon to the same spot on the scale.
Absolute accuracy missed its target: ±0.18 mm against ±0.10 mm. The error is dominated by uncompensated ballscrew pitch and it is systematic, so we measured it at nine points, gave them the map, and told them a compensation table would close most of it in an afternoon. They decided repeatability was what they actually needed and did not want to pay for the afternoon. We think they were right.
Elapsed days between recorded milestones, drawn to scale from the dates. The overall dimension runs from the brief to the last entry.
What changed since.
| Rev | Date | Change | By |
|---|---|---|---|
| △3 | 2025-10-02 | Soft limits added on all three axes after a scripted move drove the gripper into the furnace door. | RM |
| △2 | 2025-09-17 | Published the nine-point accuracy map, including the ±0.18 mm miss, in the handover pack. | RM |
| △1 | 2025-09-05 | Z head rebuilt on two rails at 90 mm centres. Droop at full Y extension 0.30 mm → 0.02 mm. | DZ |
What we would do next
Ship the pitch compensation table as part of commissioning rather than as an option. It costs one measurement pass and it would have made the accuracy row read as a hit.
The pneumatic gripper needs shop air, which meant running a line across their lab. An electric gripper is heavier and slower and we would take it, to delete the hose.
We would build the Python client first and the machine second. It was the risk in the brief and it was the last thing we wrote.
Who built it, and when.
- Entry
- CLIENT
- Client
- A university materials lab, six people, publicly funded — named parts withheld under NDA
- Status
- ◍ DELIVERED
- Brief
- 2025-08-11
- Demo
- 2025-09-19
- Elapsed
- 39 d
- Built by
- DZ, RM
- MEC
- Mechanical design
- FAB
- Fabrication and finishing
- ELE
- Electronics and PCB
- FRM
- Firmware
- CTL
- Controls and motion