#3dprinting #voron #doron-velta #delta #arms #fixture #build
# Overview
Plan for building six matched 210mm fisheye parallel arms for the [[Doron Velta]] from carbon tube and off-the-shelf M3 rod ends, instead of sourcing NOS FLSUN Q5 arms.
Written because the Q5 aftermarket has dried up — see [[Doron Velta#Arms — sourcing]]. This path is supply-proof: if an arm breaks in 2029, the plan and the fixture are still on the shelf.
**The whole method rests on one idea:** don't try to *cut* six identical arms. Cut them all deliberately short, then let the epoxy cure while the arm is clamped in a fixture that defines the length. The fixture sets the dimension, not your saw and not your calipers. Every arm comes off identical to every other arm, and identical to the fixture.
That reframe is what makes a **3D printed fixture viable**. Read the next section before anything else — it's the part people get wrong.
# Design
## Why a printed fixture is fine here
The instinct is that a printed fixture is too inaccurate for a precision jig. That's true for absolute dimension and irrelevant for this job, because the two specs are not equally important:
| Spec | How tight | Why |
|---|---|---|
| **Arm-to-arm matching** (esp. within a pair) | **Hard requirement** | A mismatch between the two arms of one tower *tilts the effector*. The nozzle sits ~50mm below the pivot plane, so tilt becomes lateral position error. No calibration routine fixes this — the geometry is simply wrong. |
| **Absolute length** (is it really 210.00?) | **Soft requirement** | A uniform error just means every arm is, say, 210.4mm. You measure it once, put the real number in `arm_length`, and the printer is correct. |
Cure-in-fixture gives you perfect matching *for free*, regardless of the fixture's absolute accuracy, because all six arms cure against the same two pins. The fixture's absolute error transfers to all six equally — which lands in the soft column.
So: **fixture repeatability is what matters, not fixture accuracy.** A printed fixture with steel dowel pins is repeatable to well under a thousandth. It just might be 210.4mm instead of 210.0mm, and that's a number you write down rather than a defect you fight.
Tolerance targets:
- Within a pair: **±0.02mm** — achievable trivially with this method
- Across all six: **±0.05mm**
- Absolute vs. nominal 210: **±0.15mm is fine**, as long as you *know* the real figure
## Length math (parameterized)
Rod ends aren't yet chosen, so define:
- `L_ctc` = 210.0mm — target center-to-center of the two ball centers
- `L_re` = ball center → shank shoulder, **per rod end** (from the vendor drawing)
- `L_slack` = 2–3mm — intentional short-cut so the fixture has room to pull the joint
Then:
```
tube_length = L_ctc − (2 × L_re) − L_slack
```
The slack is not sloppiness — it's the adjustment range the fixture consumes when it pulls both rod ends out to exact length before the epoxy sets. Cut every tube to the same computed figure; ±0.5mm on the cut is irrelevant because the fixture, not the tube, sets `L_ctc`.
==Fill in `L_re` and recompute once rod ends are chosen. Do not order tube until this number is settled.==
## Rod end options
Both are M3-bore fisheye (spherical) ends. Decide from the DV mount envelope (see Phase 0) and the mass budget.
| | Metal spherical (SI3T/K, SA3T/K, PHSA3) | Polymer (igus KBRM / EBRM) |
|---|---|---|
| Slop when new | Near zero on good ones; cheap ones rattle | Low, slightly compliant by design |
| Mass | Heavier — worst place to add it, it's all moving mass | Lighter |
| Lubrication | May need it; can attract dust | Self-lubricating, dry |
| Noise | Can tick/click | Quiet |
| Spec data | Varies wildly by seller | igus publishes real dimensioned drawings — makes `L_re` trustworthy |
| Risk | Buying 12 with inconsistent `L_re` | Higher compliance under side load |
Buy **12** (2 per arm × 6). Buy a couple spare. All from **one batch, one seller** — batch-to-batch `L_re` drift is a real thing and it lands straight in the hard-spec column.
==Before ordering: confirm the eye body physically fits the DV pockets — Phase 0.==
## Carbon tube and the stud trick
The open question was how to bond an M3 rod end shank into a tube without either starving the joint or flooding a 0.5mm gap with epoxy. [jonathanlundstrom's QQ-S arm fixture](https://www.thingiverse.com/thing:4444539) solves it cleanly, and his arms are field-proven:
- **4mm OD / 3mm ID woven carbon tube**
- **M3 threaded rod cut into 25mm studs**
- Tap the rod end M3, thread a stud in, epoxy the exposed stud into the 3mm bore
M3 threaded rod in a 3mm ID tube is a near-perfect epoxy fit — the thread crests locate it, the roots hold glue. No bushing, no ferrule, no machining. Roughly 25mm of engagement per end is plenty of bond area at these loads.
==Adopt this unless Phase 0 rules it out. Recompute `tube_length` accordingly — his 285mm arms used 240mm tube, i.e. ~22mm of non-tube length per end, but that figure is specific to his ball links and does **not** transfer to your rod ends.==
- Woven/roll-wrapped over pultruded if the price gap is small; either is stiff enough at 210mm
- Buy ~2m for six arms plus setup waste and two spares
## Do not copy his push-rods
Worth stating plainly because the rest of his build is so directly applicable: he uses **MPJet 7mm ball links**, which are ball-and-socket. The QQ-S mounts take ball links. **The Doron Velta does not** — it uses fisheye eyes with an M3 bolt passing through, into heat inserts on the CraneFly effector.
Same rejection as the Traxxas 5347 kits. Take his *method*, not his hardware BOM.
# Sourcing (US)
All verified in-browser 2026-08-21. Stock and price move — re-check before ordering.
| Item | Source | Price | State |
|---|---|---|---|
| Fisheye rod ends, 12pc | [Amazon B0FV3J217T](https://www.amazon.com/Fisheye-Bearings-Thread-Bearing-Printer/dp/B0FV3J217T) — **select the `SI3T K M3` variant** | $12.77 | In stock, ships 2–3 days |
| **CF tube 5mm OD / 3mm ID, 4 × 400mm** | [Amazon B0951XXJ35](https://www.amazon.com/uxcell-Carbon-Pultrusion-Airplane-Quadcopter/dp/B0951XXJ35) (uxcell, pultruded) — **preferred, see below** | $14.09 | Only 6 left |
| CF tube 4mm OD / 3mm ID, 6 × 400mm | [Amazon B0CZLFYP1F](https://www.amazon.com/uxcell-Pultruded-Airplane-Quadcopter-Multicopter/dp/B0CZLFYP1F) (uxcell, pultruded) | $14.59 | Only 12 left |
| CF tube, 4/3mm, 3 × 400mm | [Amazon B07R7TNBXB](https://www.amazon.com/uxcell-Carbon-Pultrusion-Airplane-Quadcopter/dp/B07R7TNBXB) (uxcell, pultruded) | $13.79 | In stock |
| M3 × 300mm threaded rod, 5pc | Amazon — commodity, several sellers at this price | ~$6 | In stock |
| Structural epoxy | Loctite Power Epoxy / JB Weld — any US hardware store | ~$10 | — |
| 3mm dowel pins | Same stock as the DV bed pins | ~$8 | — |
**12 rod ends is exactly 12** — 6 arms × 2 ends, zero spares. Consider two packs.
**The variant trap, again.** That rod end listing covers four variants and **defaults to `SA4T K M4`**, which is wrong on both counts. You want:
- **`SI`** = female thread — the M3 stud screws *into* the rod end
- **`3`** = 3mm bore — the M3 bolt that passes through the eye into the CraneFly heat inserts
`SA3T K M3` (male thread, integral stud) is the same price and would skip the threaded rod entirely, but the shank is short — less bond area and no coarse length adjustment. `SI` + your own 25mm studs is the proven combination.
### Female + stud, or male with an integral stud?
Worth settling explicitly, because it's the obvious question once tube diameter changes — and the answer is that **tube OD is irrelevant to it.** The stud lives in the *bore*, and the bore stays 3mm whether the tube is 4mm or 5mm outside. Nothing about the rod end choice moves.
| | `SI3T/K` female + M3 stud | `SA3T/K` male, integral shank |
|---|---|---|
| Bond length | Yours to pick — 25mm | Fixed by the part, typically 15–20mm |
| Coarse length adjust | Yes, thread depth | None |
| `L_re` | A number you control | A number the vendor chose |
| Parts count | One extra (threaded rod, ~$6) | Fewer |
Stay with **female + your own studs**. The extra $6 buys bond area and an adjustment axis, and it's what's actually been proven on a working delta.
## Go 5mm OD / 3mm ID, not 4mm
Same 3mm bore, so **nothing about the joint changes** — same M3 stud, same rod end, same bond area. The wall goes 0.5mm → 1.0mm. Run the numbers per unit length:
| | 4×3mm | 5×3mm | Ratio |
|---|---:|---:|---:|
| Cross-section (mass) | 5.50 mm² | 12.57 mm² | **2.29×** |
| Second moment `I` (stiffness) | 8.59 mm⁴ | 26.7 mm⁴ | **3.11×** |
| Wall thickness | 0.5 mm | 1.0 mm | 2× |
**3.1× the bending stiffness for 2.3× the mass** — stiffness rises faster than mass, which is the whole point.
The reason this matters more than I first credited: delta arms alternate between tension and compression every time the effector crosses over a tower. In compression a slender 210mm tube is a **Euler column**, and critical buckling load scales with `EI/L²`. Tripling `I` triples the buckling margin. Split resistance at the bonded joint is a bonus, not the main event.
Mass cost is small. At ~165mm of tube: ~1.45g → ~3.32g per arm, so ~11g across all six. Roughly half an arm's mass acts at the effector, so call it ~6g of added moving mass — the steel rod ends dominate the arm's weight regardless.
==Phase 0 note: 5mm OD is 1mm fatter. It doesn't touch the mounts (those grip the eye, not the tube), but check arm-to-arm and arm-to-effector clearance at travel extremes — the DV is already tight.==
**Buy quantity:** 4 × 400mm = 1600mm. At ~165mm per tube that's 2 arms per stick — 8 arms' worth, so six plus two spares from one pack.
## Note on pultruded vs. woven
jonathanlundstrom used **woven** tube; everything available in the US at 4×3mm is **pultruded**. At 0.5mm wall, woven in this size is effectively unobtainium.
Pultruded is unidirectional — stiffer and stronger along the axis, which is the dominant load in a delta arm, but it has almost no hoop reinforcement and *can split longitudinally at a bonded joint*. Mitigation is straightforward:
- Keep the stud a **slip fit**, never interference — the epoxy carries the load, the stud must not wedge
- Don't over-tighten anything that squeezes the tube
- Optional insurance: a short overwrap of CF tow or Kevlar thread wetted with epoxy at each bonded end
==If a joint ever splits, that's the signal to hunt down roll-wrapped tube from a composites specialist rather than an RC supplier.==
**Not usable:** McMaster's catalog is locked to automation so I couldn't verify M3 rod ends there — worth a manual look, their quality beats Amazon generic. igus igubal `KBRM-03` pairs a 3mm bore with an **M4** thread, which won't take an M3 stud in a 3mm bore tube, and it's quote-only pricing.
## Non-Amazon alternatives
Also verified in-browser 2026-08-21.
### Rod ends
| Source | Part | Price | State |
|---|---|---|---|
| [Bearings Direct](https://bearingsdirect.com/categories/rod-end-ball-joint-bearings/female-rod-ends/right-hand-thread-female-rod-end-bearings/metric-right-hand-thread-female-rod-ends.html/) | **PHS03** right-hand, genuine IKO, 3mm bore, M3 | **$27.84 ea** | In stock, Glendale CA |
| [Misumi US](https://us.misumi-ec.com/vona2/mech/M2200000000/M2205000000/?CategorySpec=00000042607::b) | Rod End Bearings, Connecting Screw M3 — PHS/POS series | not listed | Category confirmed live |
| [eBay 284454276402](https://www.ebay.com/itm/284454276402) (captainusa223, 100%) | 10pc SI3T/K, 3mm bore, M3×0.5 female RH | $11.99 + **$26 ship** | Only 3 available, ships Zhejiang, no returns |
**Bearings Direct is the quality answer and the expensive one** — $334 for twelve. Genuine IKO means effectively zero slop, which is the failure mode that ruins arms. Justifiable only if the cheap ones turn out notchy at Phase 3.
**Misumi is probably the smart play**: you already order extrusion from them for the [[Voron Cascade BOM]], so these can ride along on an existing order at industrial quality. ==Pull PHS3/POS3 pricing from your account — the public category doesn't show it.==
eBay works out to ~$76 for 12 once shipping is counted, with a three-week wait and no returns. Worse than Amazon on every axis.
### Carbon tube — thin outside Amazon
| Source | Part | Price | State |
|---|---|---|---|
| [Easy Composites US](https://www.easycomposites.us/4mm-pultruded-carbon-fiber-tube) | 4mm/3mm pultruded, 1m | $2.70–4.25/m | ==**OUT OF STOCK**== |
| [Easy Composites US](https://www.easycomposites.us/5mm-pultruded-carbon-fiber-tube) | 5mm/3mm pultruded, 1m | $6.10–9.15/m | ==**OUT OF STOCK**== |
| SpeedyFPV | 4mm OD but **2mm ID** — wrong bore | — | Out of stock anyway |
| CST Composites | Only sub-1.5mm sizes on their tube page | — | No fit |
| Rock West | Search 404s; metric small sizes not found | — | Unverified |
Easy Composites is the right vendor when they restock — reputable composites house, far cheaper per meter than Amazon, US storefront (ships UK→US, 5–8 working days, no duty). ==Set a back-in-stock alert.==
**Their 5mm/3mm is arguably the better part**: same 3mm bore so the M3 stud fit is unchanged, but a 1mm wall instead of 0.5mm — which directly answers the pultruded-splitting risk above. Costs ~1mm more OD and a little mass.
Their woven roll-wrapped line starts at **16mm OD**, confirming woven simply isn't made at 4×3mm. Pultruded it is.
# Build plan
## Phase 0 — Confirm the mount envelope (do this first)
Everything downstream is wasted if the eye doesn't fit the pockets. rogerlz designed around the Q5 eye, so any substitute has to live in that envelope.
Pull these from CAD — the [Fabreeko GrabCAD viewer](https://grabcad.com/library/doron-velta-r2-by-fabreeko-1) or the STEP/F3D in the repo:
- Eye **bore**: 3mm (M3 screw through)
- Eye **body thickness** — must fit the slot in the CraneFly effector and the carriage
- Eye **outer diameter** — must clear the pocket walls through full swing
- **Pocket depth** and screw spacing
Then check the swing: a delta arm sweeps a real angular range. An eye that fits statically can still collide at travel extremes — and the DV is already travel-limited.
==Record the four measured figures here before ordering anything.==
## Phase 1 — Build the fixture
Design intent: two steel dowel pins, parallel, at exactly `L_ctc`, standing off a flat plate that keeps both eyes coplanar.
- **Pins**: 3mm steel dowels. You're already buying 3×20mm dowels for the bed — same stock, order extra.
- **Plate**: print in ABS/ASA, thick enough not to bow (6mm+, high infill). Print flat-side-down on glass/PEI for the reference face.
- **Adjustability**: put one pin in a fixed boss and the other in a **slotted block** that locks with two M3 screws. This is what lets you dial absolute length and, more importantly, correct for print shrinkage without reprinting.
- **Coplanarity**: both eyes must lie flat on the plate so the pivot axes end up parallel. A twisted arm binds. Relieve the plate under the tube so only the eyes touch.
- **Release**: PTFE spray, wax, or a thin PTFE sleeve over each pin. Skip this and you will epoxy an arm to your fixture.
- **Backing**: bolt the fixture down to a wood/MDF plate. Stops the printed part bowing over a 24h cure — jonathanlundstrom calls this out specifically and it's cheaper than printing something thick enough to be self-rigid.
- **Capacity — single station, one arm at a time.** ~~6-up~~. This reverses my first draft, and the reasoning matters: a 6-up fixture has *twelve* pin positions, and any variation between the six pin-pairs transfers directly into arm-to-arm mismatch — the one spec that can't be calibrated out. Printed parts vary measurably across the bed. A single station means the entire build has exactly **one** dimension in it, and all six arms inherit it identically. jonathanlundstrom independently reached the same conclusion.
### Measuring the pin spacing
Measure outside-to-outside across both pins with the 300mm calipers, then subtract pin diameter:
```
C-to-C = (outside measurement) − pin_dia
```
With 3mm dowels at 210mm C-to-C that's a ~213mm reading. Take it a few times, rotating the calipers slightly, and use the mean.
**Write the final number down** — it becomes `arm_length` in `printer.cfg`.
## Phase 2 — Bond
Repeat this loop six times — one arm per fixture session.
1. **Prep the studs.** Tap each rod end M3. Cut M3 threaded rod into 25mm studs, thread one into each rod end.
2. **Cut** the tubes to `tube_length`. Deburr and square the ends.
3. **Mask.** Tape the ends of the tube and the rod end body. Keeps squeeze-out off the parts you care about — his tip, and a good one, because cured epoxy on a rod end body is much harder to remove than tape.
4. **Prep the bond** — this is where joints fail, not in the epoxy brand. Abrade the studs and swab the bores, then degrease with IPA and let it flash off. No skin oils after this point.
5. **Epoxy** — slow-cure structural only. Loctite Power Epoxy, JB Weld, West System. **Not 5-minute epoxy**: brittle, and no working time.
6. **Butter** the stud all round, insert into the tube without fully seating — leave the slack.
7. **Seat on the fixture.** Press both eyes onto the pins; the pins pull the joint out to exact length. Wipe squeeze-out now, not later.
8. **Check coplanarity** — both eyes flat on the plate, tube not twisted.
9. **Cure undisturbed.** 24h is the safe call. If you're impatient, the geometry is locked once the epoxy *gels* — you can pull the arm off the fixture at that point and post-cure it off-fixture at ~60°C, which frees the station for the next arm. ==Only worth trying after the first arm has proven the process.==
## Phase 3 — Verify
1. **Re-seat each arm on the fixture.** It should drop onto both pins freely, no bind, no gap. Anything that fights the pins is out of spec — cut it apart and redo it.
2. **Comparator check.** Nominate one arm as master. Set the dial indicator to zero against it, then check the other five. This measures *matching* directly, which is the spec that matters, and needs no absolute reference at all.
3. **Sort into pairs.** Put the two closest-matched arms on the same tower. Push any residual spread *between* towers, where calibration absorbs it better than effector tilt does.
4. **Slop check.** Work each joint by hand — no detectable radial play. A gritty or notchy ball means a bad rod end; replace it now, not after assembly.
5. **Weigh one.** Compare against the OEM Q5 arm mass if you can find a figure. Heavier arms mean lower usable acceleration.
## Phase 4 — Klipper
- Set `arm_length` to your **measured** value, not 210 — unless 210 is what you measured
- Run `DELTA_CALIBRATE` — this solves endstop positions, tower angles, and delta radius
- Run enhanced calibration (`DELTA_ANALYZE`) with caliper measurements of a printed test object for the finer geometry pass
- ==Verify against current Klipper docs whether `DELTA_ANALYZE` refines `arm_length` itself, or whether it must be measured and fixed by hand.==
Symptom to watch for: if calibration converges but the nozzle-to-bed relationship shifts as the toolhead moves off-center, suspect effector tilt — i.e. a within-pair mismatch that got past Phase 3.
# Decisions
| Decision | Options | Status |
|---|---|---|
| Rod end type | Metal spherical vs. igus polymer | ==open — gated on Phase 0 envelope + mass budget== |
| Tube/shank fit | Direct fit vs. bushing/ferrule | **resolved** — 4mm OD / 3mm ID tube + M3 threaded stud (2026-08-21) |
| Fixture capacity | 6-up vs. single station | **resolved — single station** (2026-08-21); one dimension in the whole build |
# Risks
| Risk | Mitigation |
|---|---|
| Eye doesn't fit DV pocket | Phase 0 before any order — this kills the whole plan if missed |
| Inconsistent `L_re` across rod ends | One batch, one seller; the fixture masks this anyway since it sets C-to-C |
| Starved or over-gapped epoxy joint | Hit the 0.1–0.25mm radial gap; use a bushing rather than flooding |
| Arm bonded to the fixture | Release agent on pins, every single time |
| Rod end slop → ringing | Reject notchy joints at Phase 3, before assembly |
| Added moving mass | Weigh early; polymer ends if it's marginal |
| Printed fixture warps between sessions | Cure all six in one session; re-verify spacing if you come back to it |
# Cost
| Item | Est. |
|---|---|
| 2 × 12pc SI3T/K rod ends | $25.54 |
| CF tube 5×3mm, 4 × 400mm | $14.09 |
| M3 threaded rod, 5 × 300mm | $5.99 |
| Structural epoxy | ~$10 |
| 3mm dowel pins | ~$8 |
| Filament (fixture) | ~$3 |
| **Total** | **~$67**, plus the fixture is reusable forever |
Comparable to what a set of OEM arms cost when you could still buy them — and it doesn't evaporate when a vendor delists.
# TODO
- ==Phase 0: pull eye bore, body thickness, OD, and pocket depth from the DV CAD==
- ==Choose rod ends and record `L_re`; recompute `tube_length`==
- ~~Confirm tube ID vs. shank OD; decide whether a bushing is needed~~ (resolved 2026-08-21 — 3mm ID tube + M3 stud)
- ~~Source 4mm OD / 3mm ID CF tube and M3 threaded rod~~ (done 2026-08-21 — see Sourcing)
- ==Phase 0 gate: confirm the SI3T/K eye OD and body width fit the CraneFly and carriage pockets before ordering==
- ==Check McMaster manually for M3 rod ends — better quality than Amazon generic, their catalog blocks automation==
- ==Pull Misumi PHS3/POS3 pricing from your account and compare against Amazon generic + Bearings Direct IKO==
- ~~Set a back-in-stock alert on Easy Composites 5mm/3mm tube~~ — moot, Amazon has 5×3mm in stock (2026-08-21)
- ==Phase 0: check arm clearance at travel extremes with the 1mm-fatter 5mm tube==
- ==Speculative: would slightly longer arms buy back some of the DV's missing travel? jonathanlundstrom went 280 → 285mm on the QQ-S for reach. Model before touching — changes reachable envelope, max Z, and collision clearances, and rogerlz says full travel needs a redesign.==
- ==Model and print the fixture; measure and record actual pin spacing==
- ==Verify `DELTA_ANALYZE` behavior re: arm_length in current Klipper docs==
# References
- [[Doron Velta]] — main build note and BOM
- [[Voron Cascade BOM]] — tooling inventory (dial indicator, 123 blocks)
- [[Calibration - Shrinkage and Skew]] — relevant to the printed fixture
- [[3D Printer Belt Tensioning]]
- [Doron Velta BOM (rogerlz)](https://github.com/rogerlz/Doron-Velta/blob/main/BOM.md) — "210mm Fisheye Rods, 6"
- [FYSETC DV BOM](https://github.com/FYSETC/FYSETC-Doron_Velta/blob/main/BOM.md) — line 12, "Fisheye Rods 210mm, 6 PCS"
- [CraneFly effector](https://github.com/chirpy2605/voron/tree/main/general/CraneFly) — arm mount geometry
- [Fabreeko DV CAD on GrabCAD](https://grabcad.com/library/doron-velta-r2-by-fabreeko-1) — for Phase 0 measurements
- [FLSUN Q5 wiki](https://wiki.flsun3d.com/en/Q5Manual/Q5Introduction) — confirms 210mm is measured fisheye-center to fisheye-center
- **[FLSUN QQ-S Delta Arm Fixture — jonathanlundstrom (Thingiverse, CC BY)](https://www.thingiverse.com/thing:4444539)** — closest prior art. Same problem (mismatched OEM arms causing effector tilt), same cure-in-fixture solution, field-proven. Method transfers; his ball-link hardware does not.
- [Rod braces — jonathanlundstrom](https://www.thingiverse.com/thing:4444440) — companion part, QQ-S geometry, not directly applicable
# Build Log
## 2026-08-21
- Plan drafted after Q5 arm sourcing came up empty across every vendor checked.
- Settled on cure-in-fixture as the core method, printed fixture with steel dowel pins.
- Rod end type left open pending Phase 0 envelope measurements.
- Switched tube spec to **5mm OD / 3mm ID** (Amazon B0951XXJ35, $14.09, in stock). Bore unchanged so the joint is identical, but 3.1× the second moment for 2.3× the mass — the real gain is Euler buckling margin in the compression half of each stroke. Rod end choice is unaffected: the stud lives in the bore, not the OD.
- Non-Amazon check: Bearings Direct stocks genuine IKO PHS03 in California at $27.84 ea ($334 for twelve). Misumi US carries M3 rod ends and is worth pricing since there's already an account. Carbon tube outside Amazon is thin — Easy Composites has the exact spec but is out of stock in both 4mm/3mm and 5mm/3mm. Confirmed woven isn't manufactured at this size; their roll-wrapped line starts at 16mm.
- US sourcing verified in-browser. Rod ends and tube both available on Amazon for ~$67 all-in. Nothing exotic needed — but the rod end listing defaults to the wrong variant, so `SI3T K M3` has to be selected deliberately. Woven tube isn't available at 4×3mm in the US; going pultruded with slip-fit studs.
- Found jonathanlundstrom's QQ-S arm fixture — independent confirmation of the whole premise. He hit mismatched OEM arms → effector tilt, built new arms in a fixture, and reports the tilt fully gone. Two changes taken from it: **4mm/3mm tube + M3 threaded stud** (resolves the bond-gap problem) and **single-station fixture, not 6-up** (fewer dimensions in the system). Also adopted masking the ends and bolting the fixture to MDF.