Quasi-Direct-Drive Actuator and Force-Sensing Gripper
This is a small, cheap version of the actuator in MIT's Mini Cheetah. A bare N20 motor turns a printed 6:1 planetary gearbox. The ratio is low enough that the output can be pushed backwards, so the motor current tells me the force at the output. I put a parallel gripper on it to see if it can feel a grape with no sensor in the fingers.
Where it's at: designed and modelled in Fusion 360, with the print files ready. Nothing is printed yet, and the motor numbers come from the listing until I measure them. The design reasoning is in Stage 0.
Stages
Why I'm building this
I wanted to find out if a gripper could sense force through its own motor, using an N20 I already had and about $40 of parts.
Stage 2: Print plan October 2026
Everything fits on two plates of the A1. The structure prints at 0.2 mm layers. The gears print at 0.12 mm, because a module-0.6 tooth is only about 1.3 mm tall. The fingers lie on their side so the layers run the way they bend, and the racks lie flat so the teeth print in plan. I'll print a tolerance test for the bearing bores first.
| Plate | Parts | Settings |
|---|---|---|
| 1: Structure | Base, electronics bay and lid, gripper body, bracket, pedestal, 2 fingers | 0.2 mm, 4 walls, 25% gyroid, about 9–10 h |
| 2: Gears | Ring housing, cover, carrier, 3 planets, 2 suns, pinion, 2 racks | 0.12 mm, 5 walls, 40% infill, about 4–5 h |
Stage 1: CAD and interference checks
Each part is its own parametric file, and the gears have real involute teeth. I placed the parts with joints and tied the pinion to both racks with a motion link, so turning the pinion closes the jaws in CAD the same way it will on the bench.
The interference checks caught three problems before I printed anything.
| Check | Problem | Fix |
|---|---|---|
| Electronics bay | Lid bosses clipped the ESP32 by 0.5 mm | Moved them 1 mm into the corners |
| Fingers | Screw heads overlapped | Spacing from 5 to 7 mm |
| Planet carrier | Hit the motor shaft and sun | 10 mm relief pocket |
| Gear mesh | No collisions at four rotation angles | None needed |
I also built a MATLAB model of the motor, gear mesh, backlash and current loop to check the ratio and torque response.
Stage 0: Design requirements and calculations
The gripper has to hold a 7 g grape, never be able to crush it, and sense contact from motor current alone. The motor values are estimates from the listing (12 V, about 16,000 rpm bare, about 30 Ω) until I measure them.
Design requirements
| Requirement | Target | Predicted |
|---|---|---|
| Jaw opening | ≥ 30 mm (grape is 19–22 mm) | 12–40 mm |
| Hold a 7 g grape | ≥ 2× grip margin | 4.9× |
| Can't crush it | Force capped by motor stall | ≤ 0.57 N per jaw |
| Sense contact | ≤ 0.1 N per jaw | About 0.05 N |
| Backdrivable | Push open by hand | About 0.06 N |
| Holding power | ≤ 0.5 W | 0.34 W |
| Parts cost | < $60 | About $40 |
How it works
A quasi-direct-drive actuator uses a small reduction, around 6:1 to 10:1, instead of the 50–300:1 in a normal gear motor. The gearbox stays easy to push backwards, so the grape's reaction travels back to the motor and shows up as current.
Motor torque is proportional to current, so measuring current gives torque. The ratio has to stay low because friction scales with it and the rotor's felt inertia scales with its square: 36× at 6:1 against 10,000× at 100:1. About 82% of a push on the output gets back to the motor.
To grip, the ESP32 closes slowly and records the current with nothing touching. A rise above that baseline means contact. It then holds at about 107 mA, or 0.12 N per jaw, just over the 0.11 N a 7 g grape needs.
Why 6:1
Of the three ratios I compared for the same N20, 6:1 is the only one that can hold the grape and feel it.
| 1:1 | 6:1 (this design) | 100:1, 60% efficient | |
|---|---|---|---|
| Max jaw force | 0.11 N, no margin | 0.57 N | About 6.7 N, crushes it |
| Rotor inertia felt | 1× | 36× | 10,000× |
| Smallest contact it can feel | About 0.01 N | About 0.05 N | Over 0.8 N |
| Backdrivable | Yes | Yes | Barely |
Planetary gearbox
12, 24 and 60 teeth at module 0.6 give exactly 6:1 and fit three planets 120° apart.
ratio = 1 + Z_ring / Z_sun = 1 + 60 / 12 = 6
planets fit : 60 = 12 + 2 × 24 ✓
3 planets mesh : (12 + 60) / 3 = 24, a whole number ✓
sun tooth force = 2.86 mN·m / (3 planets × 3.6 mm) = 0.27 N
bending stress = 0.27 N / (6 mm × 0.6 mm × 0.245) ≈ 0.3 MPa
| Quantity | Result |
|---|---|
| Centre distance | 10.8 mm |
| Gap between planets | 3.1 mm |
| Contact ratio, sun–planet / planet–ring | 1.51 / 1.97 |
| Backlash allowance | 0.15 mm |
PLA is good for 40–50 MPa, so tooth strength isn't a concern. Accuracy and wear are, which is why the gears print at 0.12 mm and get greased.
Gripper drive
torque constant = 12 V / 1676 rad/s ≈ 0.0072 V·s/rad
output torque = 6 × 0.85 × (2.86 − 0.2) mN·m ≈ 13.6 mN·m
jaw force = 13.6 mN·m / (2 racks × 12 mm) ≈ 0.57 N
grip needed = 0.007 kg × 9.81 / (2 jaws × 0.3) ≈ 0.11 N per jaw
margin = 0.57 / 0.11 ≈ 4.9×
| Quantity | Result |
|---|---|
| Rack travel per pinion turn | 75.4 mm |
| Full 14 mm stroke | 67° of pinion rotation |
| Pinion tooth stress | 0.56 MPa |
| Jaw speed, no load | 3.4 m/s, limited to 20 mm/s in firmware |
I don't know a grape's burst force yet. Measuring it is one of the first tests.
Sensing
force per current = 6 × 0.85 × 0.0072 / (2 × 0.012 m) ≈ 1.52 mN per mA
friction deadband = 6 × 0.2 mN·m / 24 mm ≈ 0.05 N
| Quantity | Result |
|---|---|
| INA219 resolution | 0.1 mA, or 0.15 mN at the jaw |
| Holding current and power | 107 mA, 0.34 W |
| Stall power | 4.8 W, cut in firmware after a second or two |
| TB6612 headroom | 1.2 A rated against 0.4 A stall |
The sensor resolves about 300 times finer than I need, so friction sets the limit.
What the numbers decided
| Choice | Reason |
|---|---|
| 6:1 planetary, not 100:1 | It feels a 0.05 N contact. At 100:1 the gripper couldn't feel the grape and could crush it. |
| Ring printed into the housing | The ring and bearing bores line up with no extra part to align. |
| Rack and pinion, not a lead screw | The jaws stay parallel, and a lead screw would lock instead of backdriving. |
| Current sensing, not a load cell | 1.52 mN per mA through an INA219, with no wires running to the fingertips. |
| Bare N20, bracket with 10 mm of slide | I already had the motor, and a brushless one can go in later. |
Known limits: brush friction, wear on printed module-0.6 teeth, and estimated motor values. Once it's built I'll measure R, K and friction and rerun these numbers.