logo
Kurashizu Blogwhere ideas flow
  • Home
  • News
  • Blog
  • About
  • Home
  • News
  • Blog
  • About

© 2026 Kurashizu. All rights reserved.

Admin·New Post·Service Status
Powered by Cloudflare·30.10.26
← Back to news

Open MicroManipulator – A sub-micrometer 3D motion control plattform

Original article
github.com|127 points|10 comments|by _Microft|Oct 18, 2026

Open MicroManipulator: A Sub-Micrometer 3D Motion Control Platform

Project Avatar

The Open Micro-Manipulator is an open-source, budget-friendly, and accessible motorized XYZ platform designed to achieve sub-micron precision. This system is ideal for high-precision tasks such as:

  • Microscopy
  • Probing electronic components
  • Optical alignment

🛠 Technical Architecture

The device utilizes a parallel kinematic structure combined with miniature ball joints, which ensures a high degree of mechanical rigidity while maintaining a generous range of motion.

Control & Precision

The system is powered by standard, off-the-shelf stepper motors. These are managed by a closed-loop controller operating at 30 kHz30\text{ kHz}30 kHz using a highly precise PWM signal.

To push the limits of low-cost hardware, the project employs a "magnetic gearing" technique. This method amplifies the resolution of standard magnetic rotary encoders by a factor of 30, enabling incremental steps as small as 50 nm50\text{ nm}50 nm.

[!IMPORTANT] Note: It is critical to distinguish between resolution (the smallest detectable change) and accuracy (how close the position is to the true value).

Software Stack

The platform is controlled via G-Code commands transmitted through a USB serial interface, making it highly compatible with existing automation workflows. The internal firmware features a sophisticated motion planning stack with look-ahead capabilities to ensure paths are followed smoothly and accurately.


🚀 Getting Started

If you are looking to replicate this build, follow the workflow outlined below:

Build Checklist

  • Review the primary documentation and tutorial videos.
  • Purchase all components listed in the Bill of Materials.
  • Construct the physical frame and electronic circuits.
  • Adjust the hw_config.h file to match your specific build.
  • Upload the firmware using the PlatformIO plugin in VSCode.
  • Perform the axis calibration.

Struggling with the build? Join the community on the project's Discord Server.


✨ Hardware Evolution: Version 4.0

The latest hardware iteration (v4.0) addresses several shortcomings of the previous design:

Feature/IssuePrevious Version (v3.0)Hardware v4.0 Improvement
HomingOccasional self-collisionCollision-free homing sequence
StabilityBall joint block could rotateSecurely constrained screw connections
ConsistencyInconsistent linkage rod lengthsReliable method for uniform length
FrictionUnnecessary ball joint frictionOptimized for smooth movement
Print QualityDependent on corner roundingRobust design regardless of print quality
MaintenanceGlued rubber bands (permanent)Easily replaceable rubber bands

Additionally, the FreeCAD model has been overhauled to include all fasteners and pins, serving as a comprehensive mechanical reference.


💻 Software & Integration

Graphical User Interface (GUI)

A dedicated Python-based GUI is available to simplify operation. It features:

  1. Manual Controls: Easy movement of the manipulator.
  2. Visual Feedback: Integrated live camera stream.
  3. Automation: A built-in G-code runner.
  4. Intuitive Input: Real-time control via mouse.

🐍 Python API

For developers, a lightweight API (open_micro_stage_api.py) handles all serial communication. After installing the requirements.txt dependencies, you can integrate the stage into your own code.

Implementation Example:

from open_micro_stage_api import OpenMicroStageInterface

# Initialize interface and establish connection
oms = OpenMicroStageInterface(show_communication=True, show_log_messages=True)
oms.connect('/dev/ttyACM0')

# Calibrate the three joints
for i in range(3):
    oms.calibrate_joint(i, save_result=True)

# Home the device and move to coordinates (x=0.1mm, y=0, z=0) at feedrate 10
oms.home()
oms.move_to(0.0001, 0.0, 0.0, f=10)

# Block execution until movement is complete
oms.wait_for_stop()

Key API Reference

FunctionDescription
connect(port, baud_rate=921600)Opens serial communication.
home(axis_list=None)Returns specified axes to home position.
move_to(x, y, z, f, ...)Moves to absolute coordinates at feedrate f.
calibrate_joint(joint_index, save_result)Calibrates a specific joint.
set_servo_parameter(...)Adjusts PID gains (kp, ki) and filter time constants.

⚙️ Firmware v1.0.4 Updates

The latest firmware release introduces significant bug fixes and a powerful new feature: Tool Support.

Using the two GPIO pins on the J5 connector of the PCB, users can now integrate tools (e.g., a laser for engraving). These tools are fully integrated into the motion planner for precise timing. The system utilizes the PIO (Programmable I/O) feature to provide hardware-level PWM without taxing the CPU.

Example G-Code for Tool Control:

M3 T0 S0.7  ; Set Tool 0 PWM output to 70%
G4 S0.001   ; Dwell for 0.001 seconds