Mechatronics 3D Printing Wearable Robotics 2025

3D-Printed
Wrist Exoskeleton

A lightweight, fully 3D-printable wrist-assist exoskeleton designed to support flexion and extension movements. Driven by a single servo, guided by flex sensors, and controlled by an Arduino Nano — this is a complete build guide covering every component, print setting, and assembly step.

SolidWorks FDM Printing Arduino C++ Servo Control Flex Sensors Wearable
3D-Printed Wrist Exoskeleton – finished assembly
// Finished Assembly

What Is This Build?

The EXO-W1 (Wrist Exoskeleton, Version 1) is a research-grade wearable device that assists the natural wrist flexion–extension range of motion. It was designed as a mechatronics capstone project and as a platform to learn about biomechanical mechanism design, embedded sensing, and closed-loop actuator control — all in a single, wearable package.

The entire structural frame is 3D-printable in PLA or PETG. It uses a single MG996R metal-gear servo as the prime actuator, a flex sensor glued to a glove liner as the intent-detection input, and an Arduino Nano as the brain. Total BOM cost comes in under €60.

This guide walks through every step: the parts you need, how to print them, how to assemble the mechanical structure, and how to wire and flash the electronics.

Print Time ~14 hours
Assembly Time 2–3 hours
Total Cost ~€55–65
Assist Force ~1.2 kg·cm
ROM Covered 0° – 70° Flex
Weight 210 g
Power Supply 5V – 2A USB
Skill Level Intermediate

STL Files & Print Configuration

All structural parts should be printed with the following settings for adequate strength and dimensional accuracy.

Components & Products

Everything you need to build a complete EXO-W1. Quantities are per one unit.

All EXO-W1 components laid out flat

All components before assembly — sorted and ready.

🔩

Hardware & Fasteners

Qty Item Spec Notes
×18 Socket-head cap screw M3 × 8 mm Shell side panels
×12 Socket-head cap screw M3 × 12 mm Servo mount & pivots
×6 Socket-head cap screw M3 × 16 mm Wrist pivot axle
×4 Socket-head cap screw M3 × 20 mm Electronics bay
×24 M3 hex nut Standard Press into nut pockets
×8 M3 nylon lock nut Nyloc Moving pivot joints
×4 Radial bearing MR83 (3×8×3 mm) Wrist pivot
×2 Radial bearing 605ZZ (5×14×5 mm) Forearm shell pivots

Electronics

Microcontroller
Arduino Nano (V3)
ATmega328P · 5V · 32 KB Flash

The compact size makes it ideal for fitting inside the electronics bay. Any Nano-compatible clone works fine. Solder header pins before installing.

~€5–12 Buy on Amazon ↗
Actuator
MG996R Servo (Metal Gear)
Torque: 9.4 kg·cm · 4.8–7.2V · PWM

Metal gears are mandatory here — plastic gears will strip under repeated load cycles. The MG996R's torque is more than sufficient for wrist-assist at this scale.

~€8–14 Buy on Amazon ↗
Sensor
Flex Sensor 2.2"
Resistance: 25 kΩ flat → 125 kΩ bent

Taped to the back of a thin glove liner over the wrist joint. Wired as a voltage divider with a 47 kΩ resistor into the Arduino ADC.

~€10–15 Buy on Adafruit ↗
Power
USB Power Bank (5V · 2A)
Capacity: 5000 mAh recommended

Powers the Arduino and servo directly. The Nano's 5V rail can pass through to the servo — 2A peak is sufficient for MG996R at this load. Mount to forearm strap with velcro.

~€12–18 Buy on Amazon ↗
Misc
Breadboard + Jumper Wires
Half-size breadboard · 40-piece dupont kit

Used for prototype wiring before soldering. Final build should use a custom perfboard layout to reduce bulk inside the electronics bay cover.

Misc
Velcro Straps (25 mm wide)
Hook-and-loop · 50 cm minimum length

Three straps secure the forearm shell to the arm. Thread through the printed buckles and trim to fit. Medical-grade velcro is more comfortable for extended wear.

🔧

Tools Needed

Allen key set (M3)
Needle-nose pliers
Soldering iron + solder
Heat-shrink tubing
3 mm drill bit + hand drill
Super glue (CA glue)
Multimeter
Sand paper (400-grit)
USB-A to Mini-B cable
Tape measure / calipers

Exploded Assembly View

Exploded view of EXO-W1 assembly
A
Forearm Shell (L + R)

Two-piece clamshell that wraps the forearm. Houses the servo and electronics bay. Closed with M3 × 8 screws.

B
Wrist Pivot Assembly

Two pivot halves joined by an M3 × 16 axle bolt with MR83 bearings on each side. This is the main rotation joint — the servo horn attaches here.

C
Hand Dorsum Plate

Sits over the back of the hand, attached to the wrist pivot. The two finger guide rails press-fit into slots on this plate and provide gentle support without restricting finger motion.

D
Servo Mount Block

Bolted to the inside of the right forearm shell with M3 × 12 screws. The MG996R sits flush and is secured with the servo's own M3 mounting tabs.

E
Electronics Bay

Recessed cavity in the left forearm shell. The Arduino Nano and voltage divider circuit sit on a half-size breadboard held with double-sided foam tape. Covered by the bay-cover print.

F
Strap Buckles (×4)

Printed flat in PLA. Three straps thread through them and fold back on themselves with velcro. Buckles are glued to the underside of the forearm shell with CA glue.

Step-by-Step Assembly

Follow each step in order. Do not skip ahead — some steps install parts that become inaccessible later.

01
Wrist Pivot Assembly

Assemble the Wrist Joint

Parts: 2× MR83 bearings · 2× EXO-W1_Wrist_Pivot_A/B · 2× M3 × 16 mm · 2× M3 nyloc nut
  1. Press one MR83 bearing into the bearing seat on Pivot_A. The fit should be snug — use a flat surface and press gently with your thumb, or tap carefully with a mallet and a 3 mm dowel.
  2. Press the second MR83 bearing into Pivot_B in the same manner.
  3. Align Pivot_A and Pivot_B — the axle hole centres must be co-linear. If they're not twisting freely, check that both bearing seats are fully seated (bearings should sit flush, not proud).
  4. Insert an M3 × 16 bolt through the axle hole from the A side. Thread on a nyloc nut on the B side. Tighten until there is no play but the joint rotates freely. This is the main wrist joint.
  5. Repeat for the second axle position (the finger-guide rail attachment point).
⚠️

Important: Do NOT over-tighten the nyloc nuts. The joint must rotate freely under servo power. If it feels stiff, back the nut off a quarter-turn at a time.

02
Servo Sub-Assembly

Mount the Servo to its Block

Parts: 1× MG996R servo · 1× EXO-W1_Servo_Mount · 4× M3 × 12 mm · 4× M3 hex nut
  1. Press M3 hex nuts into the four nut pockets on the Servo_Mount block. If they feel loose, add a drop of CA glue and let it cure for 2 minutes before continuing.
  2. Slide the MG996R into the mount cavity. The servo output shaft should protrude through the shaft slot and face upward (toward the wrist pivot).
  3. Secure the servo with 4× M3 × 12 bolts through the servo's mounting tabs into the nut pockets. Tighten evenly in a cross pattern — do not over-tighten or you'll crack the servo casing tabs.
  4. Attach the servo horn from the MG996R kit to the output shaft. Use the shortest circular horn (disc horn). The centre-lock screw holds it to the shaft; tighten firmly.
💡

Tip: Before mounting the servo horn, connect the servo to your Arduino and centre it by sending a 90° signal. This ensures the horn is attached at the mechanical midpoint, giving equal range in both directions.

03
Right Forearm Shell

Install Servo Mount into Shell (Right)

Parts: Servo sub-assembly from Step 2 · EXO-W1_Forearm_Shell_R · 4× M3 × 12 mm
  1. Orient the right forearm shell with the interior cavity facing up. Locate the four mounting pillar holes for the servo mount block — they are on the inner lower wall, with a slot cut for the servo cable to exit.
  2. Feed the servo cable through the cable exit slot first, then lower the servo mount block into position. The servo output shaft should align with the wrist pivot slot opening at the top of the shell.
  3. Fasten with 4× M3 × 12 mm screws into the shell's pillars. Tighten until the mount does not rock — if it does, add a thin shim of electrical tape to the contact surfaces before tightening.
  4. Pull several centimetres of slack cable into the electronics bay cavity side so there is enough length for later connections.
04
Wrist Linkage

Connect the Wrist Pivot to the Servo Horn

Parts: Wrist pivot assembly from Step 1 · 2× 605ZZ bearing · 2× M3 × 16 mm · 2× M3 hex nut
  1. Press the two 605ZZ bearings into the forearm shell's wrist pivot bearing seats — one on each side wall of the shell opening at the top.
  2. Slot the wrist pivot assembly between the two bearing seats. The pivot axle should pass through both bearings. It will require light pressure — push from both sides simultaneously to keep it aligned.
  3. Locate the servo horn connection point on Pivot_A — it has a slot and a single M3 hole. Align this with the hole in the servo disc horn.
  4. Use an M3 × 16 mm bolt to pin the servo horn to the pivot arm. Add an M3 hex nut on the inside and tighten. There should be no gap — if there is, the pivot will backlash. Use a washer if needed.
⚠️

Critical: Before closing the shell, manually rotate the servo through its full range and confirm the wrist pivot rotates smoothly from 0° to 70° without binding. If it catches, the servo horn and pivot are misaligned — re-check the horn bolt.

05
Electronics

Wire the Electronics

Parts: Arduino Nano · Flex sensor · 47 kΩ resistor · breadboard · jumper wires · heat shrink
  1. Place the Arduino Nano on the half-size breadboard. The Nano's USB port should face the bay opening so you can reflash without disassembly.
  2. Build the flex sensor voltage divider: connect one end of the flex sensor to 5V, the other end to a node shared with a 47 kΩ resistor to GND. The shared node connects to Arduino A0. This gives ~2.5V at neutral and ~4.0V fully flexed.
  3. Connect the MG996R servo cable: Brown → GND, Red → 5V (Nano VIN), Orange → Arduino D9 (PWM).
  4. Apply heat-shrink to all bare solder joints. Route cables inside the shell so no wire crosses the wrist pivot path.
  5. Seat the breadboard in the electronics bay cavity and secure with double-sided foam tape. The bay board should sit below the shell rim so the cover fits flush.
C++ · Arduino exo_w1_control.ino
// EXO-W1 Wrist Exoskeleton Controller
#include <Servo.h>

Servo wrist;
const int FLEX_PIN  = A0;
const int SERVO_PIN = 9;
const int DEADBAND  = 20;  // ADC counts

void setup() {
  wrist.attach(SERVO_PIN);
  wrist.write(90);  // neutral on boot
  Serial.begin(9600);
}

void loop() {
  int raw  = analogRead(FLEX_PIN);
  int angle = map(raw, 400, 800, 90, 160);
  angle = constrain(angle, 90, 160);

  wrist.write(angle);
  Serial.println(angle);
  delay(20);
}
06
Hand Plate & Rails

Attach the Hand Dorsum Plate & Finger Rails

Parts: EXO-W1_Hand_Dorsum_Plate · 2× EXO-W1_Finger_Guide_Rail · 2× M3 × 12 mm · 2× M3 hex nut
  1. Align the Hand Dorsum Plate with its two mounting tabs over the Pivot_B holes. The plate should lay flat over the dorsum (back of hand) when the wrist is at 0° (neutral).
  2. Fasten with 2× M3 × 12 mm bolts and hex nuts — hand tighten only so the plate can still flex slightly to conform to wrist shape. You will lock these down fully after fitting to the user.
  3. Press-fit the two Finger Guide Rails into the slots on the Hand Dorsum Plate. They should snap in firmly. If loose, add a drop of CA glue along the press-fit edge. Let it cure before continuing.
💡

Tip: The finger rails are universal-length and can be trimmed with a hobby knife if they extend past the user's finger knuckles. Trim in 5 mm increments and check fit before cutting more.

07
Shell Closure & Straps

Close the Shell and Install Straps

Parts: EXO-W1_Forearm_Shell_L · EXO-W1_Electronics_Bay_Cover · 4× EXO-W1_Strap_Buckle · 18× M3 × 8 mm · 3× velcro strap (25 mm × ~22 cm)
  1. Align the left forearm shell with the right, checking that the wrist cable and electronics are fully inside the cavity. Press the two halves together — there should be no gap along the entire perimeter.
  2. Insert and tighten all 18× M3 × 8 mm clamshell screws. Work in a star pattern to close the gap evenly without warping the print.
  3. Snap the electronics bay cover onto the bay opening and secure with 4× M3 × 20 mm screws.
  4. Glue the four strap buckles to the underside of the forearm shell with CA glue — two near the distal end and two near the proximal end. Let cure for 5 minutes.
  5. Thread each velcro strap through its pair of buckles. The straps should be tight enough that the device does not slide when the wrist moves but comfortable enough to wear for 30+ minutes.
Complete

Flash Firmware & Calibrate

  1. Connect the Arduino Nano via USB and upload exo_w1_control.ino using the Arduino IDE (Board: Arduino Nano, Processor: ATmega328P).
  2. Open the Serial Monitor (9600 baud). With the flex sensor straight, note the raw ADC value — this is your flat baseline. Record the value when bending your wrist fully — this is the max reading.
  3. Edit the map(raw, 400, 800, 90, 160) line to reflect your actual flat and bent readings. Re-upload.
  4. Power via USB power bank. The device should now respond proportionally to wrist flex intent detected through the glove sensor.
🎉

Congratulations! Your EXO-W1 is complete. If the servo twitches at neutral, widen the deadband constant in firmware. If response feels lagged, reduce the delay(20) to delay(10).

What I Learned

🦴

Biomechanics Matters

Designing around a human joint is completely different from designing a robot joint. Skin compresses, wrist anatomy varies person-to-person, and the axis of rotation shifts as you flex. Version 1 had a fixed pivot axis that caused the device to slip up the forearm — a problem that required studying actual wrist biomechanics to solve properly.

📐

Iterative Fit Testing

I printed 11 iterations of the forearm shell before getting a comfortable fit. Key learnings: measure the wrist circumference at three points, add at least 4 mm of padding clearance in the CAD, and always test-fit the print dry before adding electronics — you'll need to disassemble it many times.

🧠

Intent Detection is Hard

A single flex sensor is a crude input — it can't distinguish between voluntary movement and passive loading. Future versions will use EMG (muscle electrical signals) for true intent detection. This project made me appreciate how much signal processing goes into commercial exoskeleton products.

// Open Source

Get the Files

All STL files, the Arduino firmware, and the SolidWorks source files are available on GitHub under the MIT licence.