Assembly
About this guide
Structure and presentation are inspired by exemplary open-source robotics docs. We keep the content specific to the NML Hand Exo.
At a Glance
- Audience: researchers, graduate students, and advanced makers
- Build time: ~6–10 hours over 2 sessions (mechanics + electronics)
- Difficulty: Intermediate (precision mechanical + light electronics)
- Safety: E-stop accessible; no power during wiring; eye protection
Safety first
Always disconnect power before adjusting wiring, and keep fingers clear of force paths. Treat energized actuators as powered tools—they can pinch and crush.
Bill of Materials (BOM)
Use the table below for quick reference, or download the full spreadsheet.
- Download:
/assets/bom/nml_hand_exo_bom.xlsx - Vendors & alternates: see Notes column for drop-in equivalents
- Quantities: per single exo (mirror build requires ×2 for handed parts)
| Group | Part / Spec | Qty | Example PN / Link | Notes |
|---|---|---|---|---|
| Actuation | Dynamixel (or your model) | 5 | — | Match torque to finger section |
| Control | OpenRB-150 (or compatible) | 1 | — | Default baud 57600 |
| Power | 12 V DC PSU, 5 A | 1 | — | Bench supply OK |
| Fasteners | M2/M3/M4 assortment | — | — | Button/SHCS + nylocs |
| Sensors | (optional) IMU/EMG set | — | — | Skip for basic build |
| Printed | See Print list below | — | — | PETG/ABS recommended |
| Cabling | JST-XH/PH, Dupont leads | — | — | Color-code harness |
Tools & Materials
- Metric hex drivers (1.5–3 mm), torque screwdriver (recommended)
- Side cutters, needle-nose pliers, flush trimmer
- Soldering iron + heatshrink (for custom harness)
- Threadlocker (medium), PTFE dry lube for sliding surfaces
- ESD strap/mat if handling IMU/MCU
Print List & Settings
- Material: PETG or ABS (PLA acceptable for early protos; avoid for load-bearing parts)
- Layer height: 0.2 mm (0.28 mm for large shells)
- Walls: 3–4; Infill: 20–35% (gyroid/cubic)
- Orientation: prioritize hole alignment & layer-line strength on living hinges and thin walls
- Critical fit: Ream/clear M3/M4 holes to nominal after print; chase heat-set inserts carefully.
Pre-Assembly: Electronics Preparation
Do this BEFORE mechanical assembly! Testing electronics on the bench prevents frustration later.
1) Flash Controller Firmware
- Clone the NML Hand Exo repository and navigate to
src/cpp/nml_hand_exo/. - Follow the instructions in the main
README.mdto flash your controller (e.g., OpenRB-150) using Arduino IDE. - Connect via USB and note the serial port:
# Windows
python examples\tools\hand_exo_cli.py --list-ports
# Look for your device (e.g., COM5)
# macOS
ls /dev/tty.usbmodem* /dev/tty.usbserial*
# Linux
ls /dev/ttyUSB* /dev/ttyACM*
- Test communication:
python examples\tools\hand_exo_cli.py --connect COM5 --baud 57600 --info
Expected: Firmware version and device info without errors.
2) Program Motor IDs
Set unique IDs for each motor on the bench before installation.
- Connect one motor at a time to avoid ID conflicts.
- Use Dynamixel Wizard (or your motor manufacturer’s tool) to set IDs:
- Thumb: ID 1
- Index: ID 2
- Middle: ID 3
- Ring: ID 4
- Pinky: ID 5 (if applicable)
- Test each motor’s motion range:
- Verify smooth rotation/actuation
- Check current draw is reasonable
- Confirm no grinding or binding
-
Log motor IDs in
/config/motor_map.ymlfor reference. - Label each motor cable with its ID (use tape/stickers).
3) Verify Power Supply
- Confirm polarity: +12 V (center-positive if barrel jack).
- Test under load: connect controller + one motor; command motion.
- Verify E-stop or power cutoff is accessible.
QA checks
- Voltage stable under load (no significant droop)
- No overheating of PSU or cables
- Emergency cutoff tested and working
Pre-Assembly Checklist
Before starting mechanical assembly, verify:
- Printed parts: All finished, supports removed, holes cleared and reamed
- Controller: Firmware flashed, serial communication tested
- Motors: IDs programmed (1-5), each motor tested individually on bench
- Power supply: Polarity confirmed, tested under load
- Cables: Labeled by motor ID, connectors verified
- Fasteners: Sorted by size, threadlocker and tools ready
- Workspace: Clean bench, ESD protection if using IMU/sensors
Mechanical Assembly
Electronics should already be tested. Now we’re building the mechanical structure.
1) Palm & Base
Goal: rigid base plane with aligned inserts and datum surfaces.
- Heat-set M3 inserts into the palm and base as indicated. Allow to cool.
- Dry-fit the palm cover; confirm cable channels are free.
- (Optional) Apply thin PTFE dry lube to sliding interfaces.
QA checks
- Inserts sit flush; no proud brass.
- Base remains flat on bench; no rock.
2) Thumb Module
Goal: actuated thumb with clean tendon routing.
- Mount motor to thumb bracket (do not overtighten; see torque table).
- Route tendon through guides; leave 30–40 mm service slack.
- Verify full travel manually—no scraping or binding.
QA checks
- Tendon sheaths anchored; no kinks.
- Free travel from end-stop to end-stop.
3) Finger Modules (Index–Ring)
Goal: repeatable assembly across fingers.
- Install proximal links to palm with M3 × (length) screws.
- Add intermediate/terminal phalanges, checking hinge motion.
- Add return elastic/assist if used.
QA checks
- All hinges move freely with even resistance.
- Parallel fingers when fully extended (±1.5 mm).
4) Wrist/Back-of-Hand
- Mount wrist shell and cable retainer.
- Stage cable bundle along dorsal channel with velcro ties.
- Confirm strain relief at each exit.
Electronics Integration
Electronics should already be tested! Now we integrate into the assembled mechanical structure.
1) Mount Controller
- Mount the controller (e.g., OpenRB-150) on standoffs in the designated location.
- Verify clearance below and around the controller.
- Ensure USB port is accessible for programming/debugging.
2) Power Distribution
Power stays off until final bring-up!
- Route main power: +12 V → fuse/E-stop → distribution board → motor bus.
- Verify polarity at every connection point.
- Use proper gauge wire for current requirements (typically 18-20 AWG for 5A).
- Secure power connections with strain relief.
3) Motor Wiring
- Connect motors using the pre-labeled cables (IDs 1-5).
- Follow this connection order (reduces debugging later):
- Thumb (ID 1)
- Index (ID 2)
- Middle (ID 3)
- Ring (ID 4)
- Pinky (ID 5, if applicable)
- Run communication bus (TTL/RS-485) as a separate twisted pair from power.
- Keep motor signal wires away from high-current power lines.
4) Cable Management
- Dress cables along the dorsal (back-of-hand) channel with velcro ties.
- Keep sharp bends away from moving joints (minimum bend radius: 10× cable diameter).
- Add strain relief at each cable exit point.
- Verify cables don’t interfere with finger motion through full range.
Final check before power-up
- All connections tight and verified
- Polarity checked at every point
- No pinched or kinked cables
- E-stop accessible and tested
- Motor IDs match cable labels
Torque & Fastener Guidance
Values are starting points; verify against your plastics and screws.
| Thread | Into | Start Torque | Notes |
|---|---|---|---|
| M2 | plastic | 0.15–0.2 N·m | stop at first solid resistance |
| M3 | plastic | 0.35–0.5 N·m | prefer heat-set inserts where possible |
| M4 | plastic | 0.8–1.0 N·m | washers reduce creep |
Add a tiny amount of medium threadlocker on metal-to-metal fasteners only.
System Commissioning
This is your first power-up with everything assembled!
1) Initial Power-Up
- Triple-check all connections one more time.
- Connect USB cable to PC.
- Apply power to the system (12V supply).
- Watch for any smoke, unusual sounds, or overheating → Power off immediately if detected.
2) Communication Verification
Open a terminal and verify serial communication:
python examples\tools\hand_exo_cli.py --connect COM5 --baud 57600 --info
Expected output:
- Firmware version
- Controller type
- Motor IDs detected (1-5)
- No error messages
3) LED Sanity Check
Test that commands are being received:
python examples\tools\hand_exo_cli.py --connect COM5 --send "led:1:on" --read-for 1
python examples\tools\hand_exo_cli.py --connect COM5 --send "led:1:off" --read-for 1
If the LED toggles, communication is healthy! If not, verify port, baud rate, and power.
4) Motor Detection Test
Verify all motors are detected on the bus:
# Scan for motors (adjust tool/command as needed)
python examples\tools\hand_exo_cli.py --connect COM5 --send "motor:scan" --read-for 3
Expected: All programmed motor IDs (1-5) should respond.
If missing:
- Check motor power connections
- Verify data bus wiring
- Confirm motor IDs were set correctly
Motion Bring-Up
Keep the glove OFF your hand during first motions!
1) Individual Motor Tests
Test each motor one at a time:
# Test each motor individually (adjust script/commands as needed)
python examples\02_motor_control\example_motor_control.py --connect COM5 --motor 1
python examples\02_motor_control\example_motor_control.py --connect COM5 --motor 2
# ... repeat for motors 3, 4, 5
For each motor, verify:
- Smooth motion through full range
- No binding or grinding sounds
- Current stays within limits
- Position tracking is accurate
2) Homing Procedure
Run the homing sequence:
python examples\04_advanced\example_motor_config.py --connect COM5 --home
Checks:
- All motors reach home position
- No stalls or skipped steps
- Position offsets are saved correctly
3) Safety Limit Tests
python examples\04_advanced\example_advanced_config.py --connect COM5 --test-limits
Verify:
- Current limits prevent damage at end-stops
- Motors stop when limits exceeded
- No unexpected heat buildup (< 50°C motor case)
- No unusual smells or smoke
4) Coordinated Motion Test
Once individual motors pass, test coordinated movements:
python examples\01_basic\example_connect.py --connect COM5
Checks:
- All fingers move smoothly together
- No mechanical interference between fingers
- Cables don’t snag during motion
- Timing is synchronized
Fit & Comfort
- Add hook-and-loop straps; verify range does not force hyperextension.
- Pad contact surfaces (silicone/foam) where needed.
- Verify don/doff can be done one-handed in under 60 s with practice.
Troubleshooting
- No serial port: try another cable/port; install USB CDC driver (Windows).
- Binding joint: loosen, re-align hinge, re-ream bushings; re-lube sparingly.
- Overcurrent trips: increase soft-start time; verify tendon path and stops.
- Oscillation: reduce Kp; increase damping; confirm rigid mounts.
What’s Next?
- Examples: try Quick Gestures, then Telemetry + GUI on the Examples page.
- API: integrate the Python SDK for scripted experiments: /python-api/.
- ROS 2: coming soon—track progress on the roadmap.
Image & File Conventions (for maintainers)
- Place assembly photos under:
/assets/images/assembly/ - Name by step:
01_palm_base.jpg,02_thumb_stage.jpg, … - Keep max width ≈ 1600 px (JPG, 80–85 % quality); use PNG for line art.
- CAD & printables live under
/hardware/with a top-level README.