A 3D-printed parallel gripper that controls how hard it squeezes, not just where its jaws go. I built it to practice design for assembly while preparing for the CSWP exam, and to show a force-control loop working clearly enough that anyone can follow it. The layout is intentionally open so the control scheme stays visible.
An MG996R servo drives both fingers through a 2:1 spur gear reduction. A 1:1 cross-mesh makes the two fingers rotate equal and opposite, so they close symmetrically regardless of load. Parallelogram four-bar linkages keep the jaw faces parallel through the full range of travel.
Each fingertip holds an FSR-402 force sensor under a rigid disc and a TPU pad. The Arduino filters both readings and runs a cascade loop: an outer PID force loop at 5 to 10 Hz sends position commands to the servo's own internal position loop. The controller closes until measured force reaches the setpoint and holds it there. If force overshoots, it backs off. A per-sensor lookup table compensates for the FSR's nonlinear response. It closes symmetrically and regulates grip force in closed loop, measuring about 5 N in total force output on a rigid body.
The most impactful lesson I learned was needing to take more time to spec the system before buying parts. The first build lacked both the electrical power and the motor torque it needed, and both had to be reworked. Now I calculate the requirements first and choose the components to meet them.