MicroManipulatorStepper README

The project's README from github.com/0x23/MicroManipulatorStepper. As one markdown file: README.md.

Open Micro-Manipulator

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:
An Open Source Motorized XYZ Micro-Manipulator - Affordable sub µm Motion Control

Image 1 Image 2

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 dr​iven 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.

Getting Started

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.

  1. Read this Document and watch the linked videos
  2. Get the parts listed in Bill of Materials
  3. Build the device and electronics
  4. Change the hardware configuration according to your build hw_config.h
  5. Upload firmware using VSCode with PlattformIO plugin
  6. Calibrate axis

Also check out the setup guide for new devices: Setup Guide

✨NEW: Hardware Version 4.0

A new version of the hardware has been released, fixing several issues with the previous design:

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.

Open Micro-Manipulator GUI

WARNING: BOM is not updated yet...

Open Micro-Manipulator GUI

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).

Open Micro-Manipulator GUI

🐍 Python-API

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.

Usage Example

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()

API Functions (most relevant functions only)

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 v1.0.4

Firmware 1.0.4 comes with many smaller improvements and bugfixes and a great new feature as well:

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).

Firmware v1.0.1

This update improves calibration, homing, logging, and adds several new G-Code commands.

Improvements

New G-Code Commands

⚙ CAD-Files

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).

FreeCAD Model

The CAD files can be found here: CAD Models. Please note that FreeCAD version 1.2.0dev was used, and the files might not work with older versions.

STL files for printing can be found here: STL Files

⚙ Kinematic Model

The kinematic model is defined here: kinematic_model_delta3d.cpp. Please check the dimensions of your build against the values set in the constructor. In particular, make sure the arm length matches.

⚙ Electronics

IMPORTANT: If you fabricated PCB version v1.2 (see version label on the board) you need to drill out a misplaced via on diode D1 that shorts 5V rail to ground (See repair image ). The problem was fixed in v1.3.

The electronics are designed in KiCAD and only commonly available modules (motor drivers and MCU boards) are used and connected by a simple PCB. No SMD soldering is required to populate the board to make the build extra accessible. For usual winding resistance of your motors, the device should be powered by $${\color{lightgreen} 5V-6V }$$ (2A) to keep current and heating to a reasonable level.

Image 1 Image 2

The repository now also contains the fabrication files that can be directly uploaded to the PCB manufacturer.

⚙ Firmware

The firmware is written in C++ and takes some inspiration from the 'SimpleFOC' project. It aims to be streamlined and readable without any extra fuss, focusing on the hardware used in this project. It implements path planning with look-ahead and, unlike many other motion controller projects, supports true 6DOF-Pose interpolation and planning, making it ready for driving hexapod motion platforms; that may or may not be the next step for this project.

You may find configuration for pin numbers, motor type, and other parameters in hw_config.h. Please check them before uploading the firmware.

Image 1 Image 2

Building and Flashing the Firmware

For building and flashing the firmware, Visual Studio Code (available for free on Windows and Linux) is recommended. Install the PlatformIO add-on and open the firmware folder. You can now build and flash the firmware like any other PlatformIO project.

⚙ G-Code Interface

The firmware supports only a small subset of G-Code commands listed below.
Each command is acknowledged with either an ok or error response.

If a command provides additional information (e.g., the get position command), that information is returned before the ok message.
The client must wait for an acknowledgment from the previous command before sending the next one—otherwise, behavior is undefined.

Command Description
G0 X Y Z F Move the end-effector in a straight line to the specified position.
• X, Y, Z: target positions
• F: feed rate
G1 X Y Z F Same as G0.
G4 S/P Dwell/pause for a specified time.
• S: seconds
• P: milliseconds
G24 X Y Z A B C Directly set current pose for servo loops with optional rotation vector* A, B, C.
G28 A-F Home one or more joints.
• Optional joint selection A–F.
M3 Set Tool output.
• T: tool index
• S: output value (0.0..1.0)
Note: new values is only applied on the next motion or dwell command
M17 Enable motors and read current pose as the start pose.
M18 Disable motors.
M50 Get current internal pose. (Encoders are not read here)
M51 Get current encoder angles (in degrees) and raw encoder values.
M52 Get the number of items in the planner queue.
M53 Check if all planned moves are finished (1 = finished, 0 = not finished).
M55 A B C D F Set servo loop parameters.
• A, B: position PI controller gains (P and I)
• C, D: velocity PI controller gains (P and I)
• F: velocity filter time constant
M56 J S Calibrate a joint.
• J: joint index
• S: save calibration result
M57 Get device and servo loop info: homing/calibration state, angles, loop frequencies, and file list.
M58 Get firmware version.
M204 L A Set linear and angular acceleration.
• L: linear acceleration
• A: angular acceleration

*Note: The communication protocol uses 3D vectors for rotations. The direction represents the rotation axis and the length of the vector represents the angle of rotation around the axis.

❤️ Support

If you'd like to support this project, consider the following:

Youtube Video

Watch the video Better Ball Joints for the Open Micro-Manipulator

MicroManipulatorStepper (0x23/MicroManipulatorStepper)

diy
Searching Database…

What is this?It is an open source, low-cost, build-it-yourself motorized XYZ micro-manipulator motion control platform that achieves sub-micrometer precision, intended for optical alignment, probing electronic components, and microscopy.
Is this a piece of software or something I physically build?It is a physical hardware device (stepper motors, PCB, 3D-printed or CNC-milled parts) that you assemble yourself, controlled through onboard firmware plus an optional Python API or GUI over USB serial.
How do I actually build and get this running?Read the docs and watch the build videos, gather the parts from the Bill of Materials, build the mechanics and electronics, edit hwconfig.h for your build, flash the firmware with PlatformIO in VSCode, then calibrate the axes.
What tools do I need to flash and build this?You need Visual Studio Code with the PlatformIO add-on to build and flash the C++ firmware, FreeCAD to view/modify the mechanical CAD model, and KiCAD-made PCB fabrication files for the electronics; the optional GUI/API needs Python.
Does the 50nm resolution mean it's that accurate?No — 50nm is the step resolution gained from the 'magnetic gearing' trick on the encoders, but the README explicitly warns that absolute positioning accuracy is significantly worse than that resolution number.
What precision can this achieve, and is resolution the same as accuracy?The 'magnetic gearing' approach multiplies the resolution of cheap magnetic rotary encoders by 30x, enabling steps down to 50nm, but absolute accuracy is noticeably worse than that figure.
Can I 3D print the mechanical parts instead of CNC milling them?Yes, the parts can be 3D printed, though you'll have to deal with thermal drift; carbon-filled filament can reduce this problem versus CNC-milled components.
Is any SMD soldering required to assemble the electronics?No SMD soldering is needed — the PCB only uses off-the-shelf motor driver and MCU modules that simply plug into the board.
Could this platform be extended to drive a hexapod instead of a simple XYZ stage?Yes, the firmware already supports true 6DOF pose interpolation and motion planning, which the author mentions could be the basis for a future hexapod motion platform.
Creator
0x23
Size
34.2 MB
Stars
2.2K
Updated
CommitOct 11
Age
1y
Commits · 90 Days