开放式微操作器(Open Micro-Manipulator)项目包含一个开源、低成本、易搭建的电动 XYZ 微操作器(XYZ Micro-Manipulator)运动控制平台,可达到亚微米级精度,适用于光学对准、电子元件探测和显微观察。得益于并联运动结构与微型球关节,它具备较好的机械刚性和较大运动范围。
正文
开放式微操作器
本项目包含一个开源、低成本、易于搭建的电动 XYZ 微操作器运动控制平台,可实现亚微米级精度。它面向光学对准、电子元件探测和显微操作等应用。
可观看 YouTube 视频了解更多设备信息与搭建过程:An Open Source Motorized XYZ Micro-Manipulator - Affordable sub µm Motion Control
得益于其并联运动结构和微型球关节,它具备良好的机械刚性和较大的运动范围。电机采用现成的步进电机,由 30 kHz 闭环控制器和高精度 PWM 信号驱动。“磁齿轮”方案将低成本磁性旋转编码器的分辨率提高了 30 倍,从而实现低至 50 nm 的步进(请注意分辨率与精度的区别。绝对精度要差得多)。
该设备可通过 USB 串口使用简单的 G-Code 命令控制,因此很容易集成到其他项目中。固件实现了完整的运动规划栈,具备前瞻(look-ahead)功能,可实现平滑、精确的路径跟踪。
开始使用
如果想复刻这个项目,可按照以下高层步骤进行。如果在搭建中有问题或想讨论项目相关话题,可加入项目社区 Discord Server。
- 阅读本文档并观看相关视频
- 获取物料清单中列出的零件
- 搭建设备与电子部件
- 根据你的搭建修改硬件配置 hw_config.h
- 使用带有 PlatformIO 插件的 VSCode 上传固件
- 校准轴
也可查看新设备的设置指南:Setup Guide
新款:硬件版本 4.0
新版本硬件已发布,修复了先前设计中的若干问题:
- 修复了回零过程中的自碰撞。
- 仅用螺丝连接球关节块的方式约束不佳,可能会发生轻微转动。
- 无法可靠保证连杆长度一致。
- 存在不必要的球关节摩擦。
- 精确的球位置严重依赖打印质量和圆角处理。
- 橡胶圈一旦粘上就无法更换或拆除。
关于改进后的球关节和连杆制造工艺的视频可在 YouTube 观看:更好的球关节:开放式微操作器。FreeCAD 模型也经过了重构和改进,现在包含所有销钉和紧固件,可作为全部所需机械零件的参考。

警告:BOM 尚未更新……
开放式微操作器 GUI
为了让开放式微操作器的测试和使用更轻松方便,这里提供了一个带图形用户界面的 Python 控制程序:开放式微操作器 GUI。它带有简单的控制功能来移动设备,同时显示实时相机画面(例如来自显微镜相机)。其他功能包括简单的 G-Code 运行器和实时鼠标控制(例如用于生物学应用)。

Python-API
这个轻量级的 Python API 处理所有串口通信,并提供便捷的命令执行和调试信息打印。接口包含回零、移动、校准设备以及查询设备信息的函数。只需将 openmicrostage_api.py 文件复制到你的项目中(并安装 requirements.txt 中的依赖项),就可以开始使用了。
使用示例
例如,先创建接口并连接:使用 OpenMicroStageInterface(show_communication=True, show_log_messages=True) 创建实例,然后调用 oms.connect('/dev/ttyACM0') 连接串口。首次使用时需校准三个关节(运行 oms.calibrate_joint(i, save_result=True),i 取 0 到 2)。随后调用 oms.home() 回零设备,再用 oms.move_to(x, y, z, f=...) 移动到若干坐标(单位 mm),例如 [0.0, 0.0, 0.0](f=10)、[3.1, 4.1, 5.9](f=26)和 [0.0001, 0.0, 0.0](f=10)。最后用 oms.wait_for_stop() 等待移动结束。
API 函数(仅列出最相关的函数)
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)
固件 v1.0.4
固件 1.0.4 包含许多较小的改进和错误修复,以及一项重要的新功能:
- 工具:现在支持在 PCB 上 J5 的两个 GPIO 引脚上使用工具(例如激光雕刻)。工具已集成到规划器中,在执行 G-Code 时能快速且按时序正确运行。工具支持 PWM(利用 PIO 功能扩展出额外通道,而不依赖软件 PWM)。用法示例:先用
M3 T0 S0.7将工具 0 的 PWM 输出设为 70%,然后用G4 S0.001(或其他运动命令)应用该工具输出,因为新的工具值只会在下一个运动或暂停命令时生效。 - 校准:校准新增了一些错误检查,以改善对编码器对齐等潜在问题的报错。
- 运动学模型参数:初始化代码已清理,并为参数添加了更好的注释。参数已针对硬件 v4.0 预设,但如有需要可切换回旧的硬件 v3.0 参数。
- 错误修复:一些较小的错误修复。
重要提示:如果你使用的是硬件版本 v3.0,需要在 kinematicmodeldelta3d.cpp 文件中切换回旧的运动学参数(文件顶部有一个 #define 用于此目的)。
固件 v1.0.1
此更新改进了校准、回零和日志记录,并新增了若干 G-Code 命令。
改进
- 回零:支持并联回零,重复性更高,几何参考更准确。
- 关节校准:流程更精细,具备持久化闪存存储(重启后无需重新校准)。
- 日志记录:输出更清晰、更详细。
新增 G-Code 命令
G28— 回零关节(支持同时回零多个轴,启动更快)G24— 设置位姿命令(直接设置伺服目标,绕过运动控制器)M17/M18— 启用/禁用电机(启用时从编码器恢复位姿)M51— 读取编码器值M55— 设置伺服环参数M56— 关节校准(可保存到闪存)M57— 读取设备状态的各种信息M58— 读取固件版本
CAD 文件
所有 CAD 模型均使用 FreeCAD 制作,这样每个人都可以查看和修改设计,而无需订阅或付费使用专有 CAD 软件。请注意,大多数组件的设计目标都是便于在 3 轴 CNC 铣床上加工。你也可以 3D 打印这些零件,但必须接受热漂移问题(碳填充线材可以缓解该问题)。

CAD 文件可在此处找到:CAD Models。请注意,使用的是 FreeCAD 1.2.0dev 版本,旧版本可能无法打开这些文件。
用于打印的 STL 文件可在此处找到:STL Files。
运动学模型
运动学模型在此文件中定义:kinematicmodeldelta3d.cpp。请将你搭建的尺寸与构造函数中设置的值进行核对,尤其要确保臂长匹配。
电子部件
重要提示:如果你制作的是 PCB 版本 v1.2(见板上的版本标签),需要钻掉二极管 D1 上一个错位的过孔,该过孔会将 5V 电源轨短接到地(见修复图片)。此问题已在 v1.3 中修复。
电子部件使用 KiCAD 设计,仅使用常见的现成模块(电机驱动板和 MCU 板),并通过一块简单的 PCB 连接。焊接元器件时不需要焊接 SMD,因此搭建更加容易。对于电机通常的绕组电阻,设备应由 5 V - 6 V(2A)供电,以将电流和发热保持在合理水平。


该仓库现在还包含可直接上传到 PCB 制造商的生产文件。
固件
固件使用 C++ 编写,并从 “SimpleFOC” 项目中获得一些灵感。它力求精简、易读、不引入多余复杂度,专注于本项目使用的硬件。它实现了带前瞻的路径规划,并且与许多其他运动控制器项目不同,支持真正的 6DOF 位姿插值和规划,因此已可用于驱动六足运动平台;这可能是也可能不是该项目的下一步方向。
引脚编号、电机类型和其他参数的配置可在 hw_config.h 中找到。上传固件前请检查这些配置。


构建和烧录固件
建议使用 Visual Studio Code(Windows 和 Linux 上均可免费获取)来构建和烧录固件。安装 PlatformIO 插件并打开固件文件夹,即可像其他 PlatformIO 项目一样构建和烧录固件。
G-Code 接口
固件仅支持下列一小部分 G-Code 命令。每条命令都会以 ok 或 error 响应作为确认。
如果某条命令会返回附加信息(例如 get position 命令),该信息会在 ok 消息之前返回。客户端必须等待上一条命令的确认后再发送下一条,否则行为未定义。
| 命令 | 说明 |
| --- | --- |
| G0 X Y Z F | 将末端执行器沿直线移动到指定位置。• X、Y、Z:目标位置 • F:进给速率 |
| G1 X Y Z F | 与 G0 相同。 |
| G4 S/P | 暂停指定时间。• S:秒 • P:毫秒 |
| G24 X Y Z A B C | 直接为伺服环设置当前位姿,可带可选的旋转向量* A、B、C。 |
| G28 A-F | 回零一个或多个关节。• 可选的关节选择 A–F。 |
| M3 | 设置工具输出。• T:工具索引 • S:输出值(0.0..1.0)。注意:新值只会在下一个运动或暂停命令时生效。 |
| M17 | 启用电机,并将当前位姿读取为起始位姿。 |
| M18 | 禁用电机。 |
| M50 | 获取当前内部位姿(此处不读取编码器)。 |
| M51 | 获取当前编码器角度(度)和原始编码器值。 |
| M52 | 获取规划器队列中的项目数。 |
| M53 | 检查所有规划移动是否已完成(1 = 已完成,0 = 未完成)。 |
| M55 A B C D F | 设置伺服环参数。• A、B:位置 PI 控制器增益(P 和 I) • C、D:速度 PI 控制器增益(P 和 I) • F:速度滤波时间常数 |
| M56 J S | 校准关节。• J:关节索引 • S:保存校准结果 |
| M57 | 获取设备和伺服环信息:回零/校准状态、角度、环频率以及文件列表。 |
| M58 | 获取固件版本。 |
| M204 L A | 设置线性和角加速度。• L:线性加速度 • A:角加速度 |
*注意:通信协议使用 3D 向量表示旋转。向量的方向表示旋转轴,向量的长度表示绕该轴旋转的角度。
支持
如果你想支持这个项目,可以考虑以下方式:
- 贡献搭建指南 – 通过提交拉取请求或提出改进建议的 issue,帮助改进或扩展搭建说明。
- 表征典型径向步进电机轴误差运动 – 测量多个 Nema-17 步进电机轴的径向误差运动(有关该主题的更多信息见 Cylos Garage:https://www.youtube.com/watch?v=gt2gK-oxy5s)。
- 反馈搭建体验 – 告诉我们哪些地方顺利、哪些地方不顺利,以及如何让其他人的搭建过程更顺畅。
- 在 Ko-fi 上支持项目 – 如果你觉得这个项目有价值,可以通过 Ko-fi 提供资金支持。
YouTube 视频
![]()
![]()
评论
社区讨论整体偏正面与好奇,并未形成明确对立。关注点集中在推崇作者低调分享高质量自制内容,同时也有人补充同类项目,并对该装置相比 Delta 机器人的运动范围提出疑问。
认为作者低调分享高质量自制内容值得敬佩
- 欣赏作者及其整套制作视频,尤其佩服他把亚微米级自制操纵器默默发到网上、不做任何推广便淡出的做法,认为这种纯粹分享相当罕见。(少数人) > 整套制作视频值得一看,一个普通人默默把亚微米级自制操纵器发到 YouTube 后便消失、毫无推广,堪称传奇。(@option_greek)
认为该装置的运动范围可能不如 Delta 机器人
- 指出 Delta 机器人常用于需要精细分辨率的拾放作业,但其运动范围看起来会比这台装置大得多,因此想弄清两者相比到底如何。(少数人) > 想知道它与 Delta 机器人相比如何,因为后者常用于拾放作业且需要精细分辨率,但 Delta 似乎拥有大得多的运动范围。(@ikidd)
有价值的补充
- RepRapMicron(GitHub 上的开源项目)正在推进类似方向的工作,可作为同类参考。(@RobotToaster)