This project contains an open source low-cost, easy-to-build motorized XYZ Micro-Manipulator motion control platform achieving submicron precision. It's designed for applications such as optical alignment, probing electronic components, and microscopy.
Check out the YouTube video for more information about the device and how it is built:
Thanks to its parallel kinematic structure and miniature ball joints, it achieves good mechanical stiffness and a large range of motion. The motors are off the shelf stepper motors driven by a 30 kHz closed loop controller and a very precise PWM signal. A 'magnetic gearing' approach increases the resolution of the low-cost magnetic rotary encoders by a factor of 30 allowing for steps down to 50nm (Please mind the difference between resolution and accuracy. The absolute accuracy is significantly worse.
The device can be controlled via simple G-Code commands over a USB serial interface and is thus easily integrated into other projects. The firmware implements a complete motion planning stack with look-ahead for smooth and accurate path following capabilities.
Below is a list of high level steps you can follow if you want to replicate the project. If you have questions or problems with the build or just want to discuss subjects related to the project, joint the projects community Discord Server.
- Read this Document and watch the linked videos
- Get the parts listed in Bill of Materials
- Build the device and electronics
- Change the hardware configuration according to your build hw_config.h
- Upload firmware using VSCode with PlattformIO plugin
- Calibrate axis
Also check out the setup guide for new devices: Setup Guide
A new version of the hardware has been released, fixing several issues with the previous design:
- Self collision during homing fixed.
- Connection of ball joint block with screws only was not well constrained and could rotated a bit.
- No reliable way to ensure consistent linkage rod length
- Unnecessary ball joint friction
- Accurate ball position heavily dependet on print quality and corner rounding
- Rubber bands could not be changed or removed once glued in.
A video about the improved ball joint and linkage manufactoring process can be found on YouTube: Better Ball Joints for the Open Micro-Manipulator Also the FreeCAD model was restructured and improved and now includes all pins and fasteners. It now provides a reference for all required mechanical parts.
WARNING: BOM is not updated yet...
To make testing and using the Open-Micro Manipulator easy and convenient a python control program with a graphical user interface is provided here: Open Micro-Manipulator GUI. It has simple controlls to move the device around, while also displaying a live camera feed (e.g. from a microscope camera). Additional features, include a simple g-code runner and realtime mouse control (e.g. for Biology applications).
The lightweight Python API handles all serial communication and provides convenient command execution and debug message printing. The interface includes functions to home, move, and calibrate the device, as well as to query device information. Simply copy the open_micro_stage_api.py file into your project (also install the dependencies in requirements.txt), and you’re ready to get started.
from open_micro_stage_api import OpenMicroStageInterface # create interface and connect oms = OpenMicroStageInterface(show_communication=True, show_log_messages=True) oms.connect('/dev/ttyACM0') # run this once to calibrate joints # for i in range(3): oms.calibrate_joint(i, save_result=True) # home device oms.home() # move to several x,y,z positions [mm] oms.move_to(0.0, 0.0, 0.0, f=10) oms.move_to(3.1, 4.1, 5.9, f=26) oms.move_to(0.0001, 0.0, 0.0, f=10) # wait for moves to finish oms.wait_for_stop()
connect(port, baud_rate=921600) disconnect() set_workspace_transform(transform) get_workspace_transform() home(axis_list=None) calibrate_joint(joint_index, save_result) move_to(x, y, z, f, move_immediately, blocking, timeout) set_tool_output(tool_idx, output_value, immediate) set_pose(x, y, z) dwell(time_s, blocking, timeout) enable_motors(enable) wait_for_stop(polling_interval_ms, disable_callbacks) set_max_acceleration(linear_accel, angular_accel) set_servo_parameter(pos_kp, pos_ki, vel_kp, vel_ki, vel_filter_tc)
Firmware 1.0.4 comes with many smaller improvements and bugfixes and a great new feature as well:
-
Tools: Tool usage (for example for laser engraving) is now supported on the two GPIO pins of J5 on the pcb. Tools are integrated into the planner and run fast and with correct timing when executing g-code. The tools support PWM (using the PIO feature to squeeze out extra channels without relying on software PWM).
Example usage:
M3 T0 S0.7 // set pwm output of tool 0 to 70% G4 S0.001 // dwell command (or any other motion command) - necessary to apply the tools output -
Calibration: Calibration has now some addition error checks to improve error reporting of potential problems like encoder alignment.
-
Kinematic Model Parameter: Initialization code has been cleaned up and better comments where added to the parameters. Parameters are preset for HW v4.0 but you can toggle back to the old HW-v3.0 parameters if necessary.
-
Bugfixes: smaller bugfixes
IMPORTANT: If you have Hardware Version v3.0 you need to switch back to the old kinematic parameters in the kinematic_model_delta3d.cpp file (there is an #define for that at the top).
This update improves calibration, homing, logging, and adds several new G-Code commands.
- Homing: parallel homing support, higher repeatability, more accurate geometric reference
- Joint calibration: refined procedure, persistent flash storage (no recalibration after reboot)
- Logging: clearer and more detailed output
G28— Home joints (supports homing multiple axis simultanously for faster startup)G24— Set pose command (directly sets servo targets, bypassing motion controller)M17/M18— Enable/Disable motors (with pose recovery from encoders on enable)M51— Read encoder valuesM55— Set servo loop parametersM56— Joint calibration (with save-to-flash option)M57— Read various information about the device stateM58— Read firmware version
All CAD models are made in FreeCAD to allow everyone to view and modify the design without subscribing or paying for a proprietary CAD solution. Note that most components are already designed with the goal to make them easily machinable on a 3-Axis CNC-Mill. You can also 3D-Print the parts but have to live with thermal drift (carbon filled filaments can reduce this problem).




