← All projects
Ongoing October 2026 Fusion 360 MATLAB ESP32 Bambu A1

Quasi-Direct-Drive Actuator and Force-Sensing Gripper

CAD model of the gripper: a printed planetary actuator drives two racks that close blue jaws on a green grape, with the electronics bay behind

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

  • ✓Stage 0:Design requirements and calculations.
  • ✓Stage 1:CAD and interference checks in Fusion 360.
  • ◐Stage 2:Print plan, two plates on the A1.
  • ○Next:Print, assemble and measure the motor.
  • ○Next:Current-control firmware on the ESP32.
  • ○Next:Grip tests on real grapes.

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.


Build log

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.

PlatePartsSettings
1: StructureBase, electronics bay and lid, gripper body, bracket, pedestal, 2 fingers0.2 mm, 4 walls, 25% gyroid, about 9–10 h
2: GearsRing housing, cover, carrier, 3 planets, 2 suns, pinion, 2 racks0.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.

Inside the gearbox: a 12-tooth sun gear on the N20 motor driving three 24-tooth planets on bearings
Housing hidden: a 12-tooth sun and three 24-tooth planets.
The assembled 54 mm actuator, front cover and output carrier facing the camera
The 54 mm actuator. The carrier is the output.
Front view of the gripper mechanism: one pinion between two racks, jaws closed on the grape
One pinion drives both racks, so the jaws close evenly.
Electronics bay with the lid off: ESP32, TB6612 driver and INA219 current sensor on a perfboard backplane
ESP32, TB6612 and INA219 on a perfboard backplane.

The interference checks caught three problems before I printed anything.

CheckProblemFix
Electronics bayLid bosses clipped the ESP32 by 0.5 mmMoved them 1 mm into the corners
FingersScrew heads overlappedSpacing from 5 to 7 mm
Planet carrierHit the motor shaft and sun10 mm relief pocket
Gear meshNo collisions at four rotation anglesNone 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

RequirementTargetPredicted
Jaw opening≥ 30 mm (grape is 19–22 mm)12–40 mm
Hold a 7 g grape≥ 2× grip margin4.9×
Can't crush itForce capped by motor stall≤ 0.57 N per jaw
Sense contact≤ 0.1 N per jawAbout 0.05 N
BackdrivablePush open by handAbout 0.06 N
Holding power≤ 0.5 W0.34 W
Parts cost< $60About $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.

Torque goes out through the gears, and the grape pushes back through them Grey arrows carry torque out to the jaws. The orange dashed path is the sensing loop. TB6612 driver 12 V PWM H-bridge N20 motor torque = K × i bare, no gearbox 6:1 planetary torque × 6 backdrivable Pinion + racks 24 teeth, module 1 torque to force Jaws on grape up to 0.57 N 0.11 N to hold ESP32 current loop detects contact INA219 reads current 0.1 mA steps grape pushes back, so motor current rises about 1.52 mN of jaw force per mA sets the PWM duty
When the jaws meet the grape, the extra motor current is the signal.

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:16:1 (this design)100:1, 60% efficient
Max jaw force0.11 N, no margin0.57 NAbout 6.7 N, crushes it
Rotor inertia felt1×36×10,000×
Smallest contact it can feelAbout 0.01 NAbout 0.05 NOver 0.8 N
BackdrivableYesYesBarely

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
QuantityResult
Centre distance10.8 mm
Gap between planets3.1 mm
Contact ratio, sun–planet / planet–ring1.51 / 1.97
Backlash allowance0.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×
QuantityResult
Rack travel per pinion turn75.4 mm
Full 14 mm stroke67° of pinion rotation
Pinion tooth stress0.56 MPa
Jaw speed, no load3.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
QuantityResult
INA219 resolution0.1 mA, or 0.15 mN at the jaw
Holding current and power107 mA, 0.34 W
Stall power4.8 W, cut in firmware after a second or two
TB6612 headroom1.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

ChoiceReason
6:1 planetary, not 100:1It feels a 0.05 N contact. At 100:1 the gripper couldn't feel the grape and could crush it.
Ring printed into the housingThe ring and bearing bores line up with no extra part to align.
Rack and pinion, not a lead screwThe jaws stay parallel, and a lead screw would lock instead of backdriving.
Current sensing, not a load cell1.52 mN per mA through an INA219, with no wires running to the fingertips.
Bare N20, bracket with 10 mm of slideI 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.