<robrotics/>

<actuator/> · v1.0 (RevA)

HD20

A 3D-printable 20:1 harmonic drive that bolts onto any standard NEMA 17 stepper. Prints on a normal printer, assembles with about $4 of hardware, and has been tested to 3.3 N·m.

Free and open under CC BY-SA 4.0. Build it, change it, sell it. Just credit us and share alike.

The HD20 opened up: the circular spline and output ring separated from the motor-mounted body, with the ball-cage wave generator visible inside.
20:1reduction
3.3 N·mmeasured torque
~$3.96hardware per unit
10printed parts
Testing is ongoing. The figures on this page come from the load-cell runs in our torque test report. We're in the middle of revising the test method, so expect these numbers to be updated. Please read known behaviour before you build.

<how-it-works/>

Three parts do the work. A wave generator, an ellipse riding on eleven loose 5 mm balls in a printed cage, pushes a flexible toothed ring (the flexspline) into an oval, so its teeth engage a rigid circular spline at only two points. The circular spline has two more teeth than the flexspline, so a full turn of the motor walks the output around by just two teeth. That tiny slip per revolution is the 20:1.

New to strain wave gearing? We wrote a plain-language explainer. And the tooth profile in this drive came out of our own free harmonic maker. You can use it to generate profiles for your own designs.

<specs/>

Reduction20:1
Tooth profileCycloidal, module 0.8
Measured torque2.1–2.6 N·m @ 0.7 A · 3.0–3.3 N·m @ 1.4 A (peak 3.5 N·m)
Efficiency48–58%
Backlashmeasurement in progress; we'd rather publish nothing than a guess
MotorAny NEMA 17 with a 5 mm shaft. Tested with an OMC StepperOnline 17HE12-1204S: 42 × 42 × 30 mm, 26 N·cm, 1.2 A, 4-wire.
LubricationSuper Lube synthetic PTFE grease
Printed parts10 pieces across 9 unique parts, including 2 shear pins
Fasteners8 × M3×0.5 × 6 mm button head screws per drive
MaterialsPLA throughout, PETG for the flexspline
Versionv1.0 (RevA), 9 August 2026
LicenseCC BY-SA 4.0

<what-you-need/>

Beyond the bill of materials below, you supply:

Do not print the flexspline in PLA. It flexes on every single revolution of the motor. PLA has almost no fatigue life under that duty and will crack, usually within minutes of running.

<bill-of-materials/>

loading the bill of materials…

<printed-parts/>

PartQtyMaterial
Circular spline (base)1PLA
Circular spline (output)1PLA
Base preloader1PLA
Output preloader1PLA
Interface / motor mount1PLA
Wave generator1PLA
Ball cage1PLA
Flexspline1PETG
Shear pin2PLA

Both shear pins are required. They carry shear load across the output joint directly, so the connection doesn't have to rely on friction from the preloaded screws to resist it. The screws clamp; the pins take the sideways load.

Print settings

No custom temperatures and no special bed prep. The tested units were printed on a Bambu Lab P1S with Bambu PLA (and PETG for the flexspline), using the Arachne variable-width wall generator and one extra wall loop for strength.

Two things are not the default. The output circular spline and the interface both need supports; everything else prints unsupported. And we set seam position to random on all parts, so a single seam line doesn't stack up into a weak spot or a visible ridge on the round surfaces.

The nylon MJF option

There's also a Multi Jet Fusion nylon version of the flexspline, which we had made through PCBWay. Nylon has far better fatigue life than PETG, so it should last considerably longer. Ours cost $24.89 for five pieces, about $4.98 each, before tax, shipping and any import duty, which on a small order can easily cost more than the parts themselves.

The MJF variant is a matched set of three parts: flexspline, cage and wave generator. All three have different geometry from the standard printed versions, so use them together. Pairing an MJF flexspline with the standard cage and wave generator will not fit correctly.

Only the flexspline actually has to be made in nylon MJF, because that's the part fighting fatigue. The MJF cage and wave generator have their own geometry, but you can still print them yourself in PLA. So a service bureau order can be just the flexspline, and you print the other two from the MJF set at home.

If you order from PCBWay, ask for the parts unpainted. Dyeing or painting adds cost and puts a coating on the tooth flanks and the bore, which is exactly where you don't want extra material on a part this dimensionally fussy.

<the-files/>

Everything lives in robrotics/hd17. Grab the packaged bundles from the releases page. The STEP files are large, so you probably don't want to clone the whole repo.

There are no pre-sliced files. Import the STEP into your slicer and use the print settings above — that way the geometry you print is always the current one.

<assembly/>

📹 assembly video coming soon

We're filming a full build walkthrough and it'll be posted to youtube.com/@robrotics and embedded right here. Written step-by-step instructions are being put together alongside it.

<known-behaviour/>

Read this before you conclude you assembled it wrong.

Hit something we haven't listed? Please open an issue and tell us your version, filament and printer.

<test-data/>

We measured this on a load cell with a 100 mm lever arm rather than guessing from motor specs: seven configurations, 1,500–3,000 samples each, with a no-gearbox baseline to compute efficiency honestly.

read the full torque report →

<make-your-own/>

The full parametric model is public on Onshape. Copy it into your own workspace and change whatever you like: a different motor face, a different output interface, a different ratio. If you build a variant we would genuinely like to see it: open an issue on the repo or tag @robrotics.

open the model in onshape →
The three main subassemblies of the HD20 laid out from above: the motor-mounted body with the ball-cage wave generator, the toothed output spline, and the knurled outer ring.
The three subassemblies: body with wave generator, output spline, and the knurled outer ring.