<robrotics/>

<test-report/> · Rinnegan drive (HDP30) v2.0 (RevC) · 18 October 2026

Rinnegan drive load-cell test

v1.0 ratcheted at 1.48 N·m. For v2.0 we printed the flexspline in PLA, lined it up properly and put it back on the same rig. It stopped skipping teeth. Then we ran a second one until it broke, and a third one slowly enough to measure its backlash: about 2 arcmin.

~2 arcminbacklash (0.03°)
1.49 N·mheld, no tooth skips
5,744flex cycles at 1.0-1.2 N·m
1.5-1.67N·m: wall starts cracking
47-60%static efficiency
40-61 N·m/radtorsional stiffness
Short version. The headline is backlash: about 0.03° at the output, roughly 2 arcmin, measured on 12 slow runs. That's close to what commercial strain-wave gearboxes quote, from a printed part.

The skipping is gone too: v2.0 held 1.49 N·m for four seconds without losing a tooth, past the point where v1.0 started ratcheting. It's stiffer, it creeps half as much, and the efficiency is the same or a little better.

But the limit moved to the flexspline itself. After this recording we pushed further and heard the PLA flexspline wall crack from about 1.5 N·m, and it broke at about 2.0 N·m. So 1.5 N·m is the ceiling, not a working load.

So we built a second unit and ran it until it broke. It took 5,744 flex cycles and 188 hard stops at 1.0-1.2 N·m with no damage, then cracked after a single 1.67 N·m impact. The working limit is peaks under about 1.3 N·m (see what this means for you).
Summary tiles. Torque 1.49 N·m held with no skip (v1.0 first skipped at 1.48). Efficiency 47 to 60 percent (v1.0 43 to 55). Stiffness 40 to 61 N·m/rad (v1.0 31 to 44). Creep 5 percent in 2 s (v1.0 10 percent). Transmission error 1.9 degrees peak to peak (v1.0 2.6).
v2.0 on top, v1.0 underneath each tile.

<what-changed/>

Two changes at once means we can't fully split the credit. Where the data points one way or the other, we say so below.

<the-rig/>

Same rig as the v1.0 test: a 100 mm arm on the output swings between two load cells, so output torque is cell force × 0.1 m. The input is a NEMA 17 under closed-loop FOC on an RP2350, with an MT6835 encoder on the motor shaft and an MT6701 reading a magnet ring on the output. The motor ran at 150 RPM, with current limits of 0.40, 0.40, 0.55 and 0.70 A.

Every efficiency number is measured against the bare motor's torque constant from the v1.0 baseline run, 0.151 N·m per amp, so an ideal 30:1 makes 4.5 N·m per amp.

<torque/>

The whole run. Top: three holds against the load cells, 0.84 and 0.87 N·m on one side at 0.40 A and 1.49 N·m on the other at 0.55 A, with v1.0's first-skip level marked at 1.48 N·m. Bottom: motor position, returning to exactly the same stop positions every time.
The whole run. The stop positions in the bottom plot don't drift, so not a single tooth was lost.
Bar chart. v1.0: held 1.48, first skip 1.48, ratcheting afterwards 1.13 N·m. v2.0: held 1.49 and peaked at 1.59 N·m without skipping. Dashed lines mark cracking heard at about 1.5 and the flexspline wall breaking at about 2.0 N·m.
v1.0's capacity next to v2.0's. The dashed lines were heard on the rig, not logged.

<torsional-stiffness/>

Torque against gearbox twist. Below about 0.5 N·m both revisions overlap. Above it, the v2.0 curves get steeper, reaching 1.47 N·m at about 1.55 degrees, while v1.0 needs 2 to 2.6 degrees for 1.25 to 1.35 N·m.
Torque against twist across the gearbox alone, on the unloading side of each hold.

40 N·m/rad at 0.85 N·m, rising to 61 N·m/rad at 1.5 N·m. v1.0 was 31-44 N·m/rad. At 1.25 N·m, v2.0 twists about 1.2° at the output where v1.0 twisted 2.0-2.6°.

The shape matters more than the number. Below about 0.5 N·m the two revisions are the same. Above that, v2.0 gets stiffer as the load rises, which is what you'd expect if more teeth share the load as it grows. That points at the alignment. A stiffer material on its own would have raised the whole curve, including the low-load part, and it didn't.

<creep/>

Torque on the stop as a percentage of its peak during each hold. v1.0 falls to about 90 percent within two seconds. v2.0 falls to about 95 percent and stays there for the rest of an eight second hold.
Torque during each hold, with the motor stalled at the current limit.

About 5% in two seconds, then it levels off. v1.0 lost about 10% in the same time. This one is the PLA: it creeps less than PETG at room temperature.

<efficiency/>

Static efficiency against held torque. v2.0: 47 and 48 percent at 0.84 to 0.87 N·m, 60 percent at 1.49 N·m. v1.0: 55 percent at 0.94 N·m, 43 to 46 percent at 1.25 to 1.35 N·m.
Held torque ÷ (30 × what the bare motor makes at the same current).

47-48% at 0.40 A and 60% at 0.55 A, against 43-55% for v1.0. All the lower readings were in one direction and the 60% was in the other, at a higher current, so we can't yet say whether that's the load or the direction. No-load drag at 150 RPM is the same as v1.0, so the alignment didn't add friction.

<hysteresis/>

Load, hold, unload loops. Left, v1.0: narrow loops losing 7 to 14 percent. Right, v2.0: the 0.85 N·m loops close within resolution; the 1.49 N·m loop is wider and loses 27 percent.
Load, hold, unload, at every stop. v1.0 on the left, v2.0 on the right.

<backlash/>

About 0.03° at the output (2 arcmin), and no run showed more than about 0.1°. The fast runs above couldn't resolve it: at 150 RPM one sample is 0.15° of output travel, and a few milliseconds of timing between the two encoders swamps any slack. So on 23 October we built a third unit (fresh PLA flexspline) and ran it slowly: 12 runs at 5 input RPM, three each way at 0.4 and 0.6 A. Each run starts from rest, pushes into one cell, stalls, then backs off. At 1° per second at the output, one sample is 0.005°.

Arm motion off the cell against motor travel back, for all 12 slow runs. Every curve leaves zero within about 0.05 to 0.1 degrees of motor travel and then follows the motor, well inside the dotted line that shows 0.1 degrees of backlash.
Backing off the cell, all 12 runs. The dotted line is what 0.1° of backlash would look like.

We measured it three ways, all in output degrees:

Bar chart of the three backlash estimates for each of the 12 runs. All sit between zero and 0.11 degrees, mostly between 0.02 and 0.08.
Every estimate for every run. The threshold-based bars (departure, start lag) read up to 0.03° high; the threshold-free gap never exceeds 0.055°.

Our measurement floor is about 0.02°, so we call it about 2 arcmin typical, 6.7 arcmin worst case. What you'll actually feel at the output is the elastic twist above, not slack.

How it compares

To keep this fair, we plotted our drive at its worst reading against the listed maximums of off-the-shelf NEMA 17 gearboxes. Even at its worst it has less backlash than every planetary gearbox under $200, at a fraction of the price. Metal strain-wave gearboxes are tighter still, from about $100.

Log-log plot of price against backlash. The Rinnegan drive sits at about 5 dollars and 6.7 arcmin worst case (1.8 typical). StepperOnline MG planetary gearboxes sit at 24 to 43 dollars and 30 to 50 arcmin. A precision right-angle planetary is 246 dollars at 5 arcmin. Metal strain-wave gearboxes are 100 to 215 dollars at 2 arcmin and under.
Price against backlash for NEMA 17 gearboxes. Ours is plotted at its worst reading; the commercial ones at their listed maximum.

Commercial figures are listed maximums and gearbox-only prices from October 2026 listings, which move: StepperOnline MG series via Oz Robotics and eBay; precision right-angle planetary; PGFUN harmonic 30:1; VXB harmonic 50:1 and 100:1. Ours is the worst single reading of 12 slow runs on one unit (0.111°, with the detection threshold left in), and about $5 for the drive without a motor. The script is compare_cots.py.

The slow runs also give a cleaner stiffness, because there's no impact on the way in: 39.5 N·m/rad on the loading side, in line with the unloading numbers above. One unit, all within a few degrees of the same arm position. Backlash can vary around the output revolution, so a check at a few more positions is next.

<transmission-error/>

Arm position error against input turns for each free stroke. v1.0 and v2.0 overlap, both within about plus or minus one degree.
How far the arm strays from motor ÷ 30 while swinging freely.

About the same as v1.0: 1.9-2.1° peak to peak against 2.3-2.7°, with the same rms. Most of it is the spacing of the magnets on the output encoder ring, not the gears, so this rig can't tell us whether the alignment helped here.

<endurance/>

Later the same day we built a second unit with a fresh PLA flexspline and ran it until it broke: a 21 s static hold, then 20 minutes of reversing strokes at 0.4 A, then shorter runs at 0.6, 0.8, 1.0 and 1.2 A. Every stroke drove the arm into a cell and held it there for 4 s.

Every hit across the endurance runs: holds around 1.0 N·m for the 20 minute 0.4 A run, 1.15 at 0.6 A, about 1.35 from 0.8 A up. Impact peaks on the CH2 side reach 1.6 to 1.67 N·m at 1.0 and 1.2 A. The last CH2 hold collapses to 0.65 N·m where the flexspline wall cracked.
All 188 hits. Filled: the steady hold. Hollow: the impact peak as the arm hits the cell.
Two damage indicators per hit. Top: twist needed to unload. Bottom: torque lost right after the peak. Both stay flat for 2,500 motor turns, then the CH2 side climbs steadily after the 1.67 N·m hit, ending in a 0.89 N·m drop at the fracture. The CH1 side stays flat throughout.
Before the 1.67 N·m hit, both sides look the same. After it, the CH2 side softens and gives way on every hit.
The fracture sample by sample. The previous hit peaks at 1.58 N·m and settles at 1.22. The fracture peaks at 1.54 N·m and drops to 0.66 within 30 ms while the motor lurches further into the stop.
The fracture: the torque halves in 30 ms. The motor moves half a degree, far less than a tooth, so this is the wall giving way, not a skip.

The other direction never yielded. Its impacts topped out at 1.49 N·m, and it still held 1.35 N·m on the very last hit, after the crack. So we read this as "the bigger impacts did the damage", not as one weak direction.

More current doesn't mean more torque

Hold and impact torque against motor current. Holds rise from 1.0 N·m at 0.4 A to about 1.35 at 0.8 A, then stay flat. Impact peaks keep rising into the 1.5 to 1.7 N·m cracking zone.
Holds level off near 1.35 N·m past 0.8 A. Impact peaks keep rising, into the cracking zone.

The motor on its own stays linear all the way to 1.2 A, so the ceiling is in the gearbox: static efficiency falls from 56% at 0.4 A to 25% at 1.2 A. What extra current does buy is harder impacts, and those are what cracked the wall. On a NEMA 17 like ours, about 0.6 A is the sweet spot.

It holds its position with the motor off

Static hold at 0.5 A: torque peaks at 1.24 N·m and creeps down to 1.13 over 21 seconds. When the motor is switched off, the torque only drops to 0.98 N·m and stays there.
A 21 s hold at 0.5 A, then the motor switched off.

<what-this-means-for-you/>

<method-and-caveats/>

<raw-data/>

Same columns as the v1.0 data: time_s, ch1_n and ch2_n (load cells in N), input_deg (motor angle, wrapped), output_deg (MT6701 angle, wrapped, about 12 turns per output turn), current_cmd_a and iq_a / id_a. The comparison script reuses the v1.0 scripts and data, so put all the CSVs from both reports in one folder, the scripts in a subfolder below it, and run python revc_analysis.py, python endurance_analysis.py or python backlash_analysis.py. For the backlash script, unzip the slow runs next to the CSVs so they sit in a gearbox2-backlash folder.

back to the Rinnegan drive build →

Looking for the older numbers? The v1.0 test and the HD20 torque test are in the archive.