<robrotics/>

<archived/>

This report covers HDP30 v1.0 (RevB), with a PETG flexspline. The current revision is the Rinnegan drive (HDP30 v2.0), which held 1.49 N·m without skipping. It has its own test report. The numbers below still stand for v1.0, so they stay up.

<test-report/> · HDP30 v1.0 (RevB) · 11 October 2026

HDP30 load-cell test

We bolted a 100 mm arm to the HDP30, drove it into a pair of load cells and turned up the current until something gave. Something did. Here is everything we measured, the plots, and the raw data.

1.47 N·mheld before it ratchets
43-55%static efficiency
< 0.3°backlash (below resolution)
36 N·m/radtorsional stiffness
~10%hysteresis loss per cycle
Short version. The HDP30 is tight: there is no backlash our rig can measure, and it is stiff for a printed drive. But at about 1.5 N·m the teeth start ratcheting, jumping over each other one tooth at a time, and every round of that leaves the drive weaker. In the next session the same unit slipped at 0.3-0.7 N·m.

That is well short of the HD20, which we tested to 3.3 N·m. If you need torque today, build the HD20. If you build an HDP30, keep it under about 1 N·m (see what this means for you).

<the-rig/>

A 100 mm arm on the output swings between two load cells, one on each side. Output torque is simply cell force × 0.1 m. The input is a NEMA 17 stepper under closed-loop FOC on an RP2350, with a 21-bit MT6835 encoder on the motor shaft. The output angle comes from an MT6701 reading a ring of magnets on the output, about 12 sensor turns per output turn. Everything is logged at 200 Hz.

The motor runs a speed profile that drives the arm into one cell, stalls there at the current limit, then reverses into the other. The current limit steps up every 12 s, so each push into a cell is a hold at a known motor current.

RunWhatMotor speedCurrent limit
BaselineMotor alone, arm straight on the shaft, no gearbox~10 RPM0.1 → 1.2 A
Run 1HDP30, freshly assembled300 RPM0.1 → 1.2 A
Run 2The same HDP30, a few hours later, after run 1150 RPM0.2 → 0.4 A

The baseline gives the motor's own torque constant, 0.151 N·m per amp of measured q-axis current. An ideal 30:1 would therefore make 4.5 N·m per amp at the output. Every efficiency number below is measured against that.

<torque/>

Peak output torque of every push into a load cell. Run 1: holds of 1.04, 1.30, 1.40 and 1.47 N·m, then repeated skips between about 1.0 and 1.48 N·m. Run 2: holds of 0.6 to 0.78 N·m and skips at 0.29, 0.66 and 0.71 N·m.
Every push into a cell. Circles held; crosses are a tooth skipping. Blue is one direction, orange the other.

What ratcheting looks like

One second of ratcheting. Top: torque on the stop rises to about 1.25 N·m and collapses, ten times a second. Bottom: the motor position keeps falling steadily while the output arm stays flat.
One second of it. The motor keeps turning, the arm doesn't move, and the torque saws up and down ten times a second.

Between jumps the motor turns exactly half a turn (median 0.500, interquartile range 0.49-0.51). With 60 teeth against 62 and the output held still, half a motor turn is precisely one tooth. So this isn't anything breaking all at once: the flexspline is lifting out of mesh and dropping back in one tooth further on.

Histogram of motor travel between consecutive skips, tightly clustered at 0.5 turns.
Motor travel between consecutive skips. One spike, at one tooth.
Torque on the stop plotted against motor travel in output degrees: one rise and collapse every 6 degrees.
The same thing against angle: wind up, jump, once every 6° of output (one tooth pitch).

<efficiency/>

Static efficiency against held torque. Healthy points at 55, 43, 43 and 46 percent; damaged points from 62 percent down to 8 percent.
Held torque ÷ (30 × what the bare motor makes at the same current).

Healthy and stalled, the HDP30 delivers 43-55% of an ideal 30:1, falling as the load rises. That's in the same range as the HD20 (48-58% at 0.7 A, same method). On the damaged unit, the worn direction fell to 8-20%.

These are static numbers: the output only carries load while it's pressed against a cell, so this rig can't measure efficiency while moving under load. With no load, the drive and motor together draw about 0.6 W at 300 RPM, roughly in proportion to speed.

<backlash/>

Reversing off a stop. Top: torque unwinds to zero. Bottom: from the moment the cell reads zero, the arm follows the motor one to one, with no flat dead band.
Reversing off a stop. Once the load is gone, the arm follows the motor immediately. The dotted line is what 1° of backlash would look like.

Too small to measure: under about 0.3° at the output. In all ten reversals, the arm started moving within one 5 ms sample of the load cell reading zero. One sample is 0.29° of output travel at 300 RPM and 0.15° at 150 RPM, so any slack is smaller than that.

What you can feel isn't slack, it's give: the drive twists elastically under load (next section). A slow, short-stroke test that never touches the cells would pin backlash down properly, and it's next on the list.

<torsional-stiffness/>

Output torque against gearbox twist. Healthy curves rise at about 0.63 N·m per degree to around 1.3 N·m. Damaged curves rise at about 0.29 N·m per degree, peak at 0.5 to 0.7 N·m, then fall.
Torque against twist across the gearbox alone (motor angle ÷ 30, minus the measured arm motion).

36 N·m/rad (0.63 N·m per degree) healthy, range 31-44 across four holds, and a little stiffer at higher load. At the 1.47 N·m limit that's about 2.3° of twist at the output. After the ratcheting it roughly halved, to 17 N·m/rad.

The damaged curves also show why it got weaker: torque rises to 0.5-0.7 N·m and then falls with more twist. When the arm was held on a stop, the teeth were sitting partway over each other's tips.

Measured on the unloading side of each hold, which starts from rest. The loading side agrees (0.56-0.73 N·m per degree) but includes the impact of hitting the stop at speed.

<hysteresis/>

Torque against twist loops for each hold. Healthy loops are narrow and close at zero; damaged loops in one direction are wide.
Load, hold, unload, at every stop. Healthy on the left, after damage on the right.

<why-it-ratchets/>

Ratcheting means the flexspline teeth are being pushed out of mesh far enough to ride over the circular spline teeth. We don't think there's a single cause, and we haven't isolated one yet. The suspects:

RevC changed the flexspline material and its alignment, and stopped the skipping up to 1.49 N·m. Got a theory? Open an issue.

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

<method-and-caveats/>

<raw-data/>

Every number on this page comes out of these files. Columns are time_s, ch1_n and ch2_n (load cells in N), input_deg (motor angle, wrapped 0-360°), output_deg (MT6701 angle, wrapped, about 12 turns per output turn), current_cmd_a (current limit) and iq_a / id_a (measured FOC currents). Put the CSVs in a folder with the scripts in a subfolder below it, and run python analysis.py then python key_metrics.py.

back to the v1.0 build →

Looking for the older drive's numbers? The HD20 torque test is in the archive.