一、所选主题和项目介绍
1.1 项目背景
糖画是中国传统民间艺术,通过熔化的糖液在平板上绘制各种图案。传统糖画制作依赖手工技艺,难以实现复杂图案的精确复制。本项目使用 M5Stack CoreS3 主控堆叠 GRBL Module 13.2 步进电机驱动模块,实现一款糖画3D打印机控制系统,通过精确控制 XY 双轴步进电机,实现糖画图案的自动化绘制。Z 轴在初始化时固定到挤出高度,运行期间保持不动。
1.2 项目目标
本项目使用 M5Stack CoreS3 主控堆叠 GRBL Module 13.2 三轴步进电机驱动模块,实现糖画3D打印机控制系统,主要功能如下:
- XY轴联动控制:控制 X、Y 两个步进电机,实现平面运动
- G-code指令支持:支持标准 GRBL G-code 指令集
- 圆形绘制功能:内置圆形绘制函数,分段直线逼近实现平滑圆弧
- 状态监控:实时获取电机状态、位置信息
- 软归零定位:无物理限位开关,使用 G92 设定坐标系原点
- 紧急停止:支持紧急停止功能,保障设备安全
1.3 创新点
- I2C通信控制:通过 I2C 总线 (address:0x70) 控制 GRBL 模块,CoreS3 堆叠连接无需额外接线
- 连续路径规划:利用 GRBL 的环形缓冲区实现 look-ahead 连续运动,绘制平滑流畅
- 无开关软归零:无限位开关硬件下,使用 G92 实现坐标系设定
- 缓冲区间歇排空:每 8 段排水一次,防止缓冲区溢出同时保持连续运动
- 实时状态显示:TFT 屏幕实时显示设备状态和初始化进度
二、硬件介绍
2.1 主控设备
M5Stack CoreS3 (SKU: K128)
M5Stack CoreS3 是 M5Stack 第三代核心控制器,搭载 ESP32-S3 双核 Xtensa LX7 处理器,集成 2.0 寸 LCD 电容触摸屏,配备可堆叠的 PORT.A/C 接口,可通过堆叠方式与 GRBL Module 13.2 连接,无需杜邦线。
核心参数
参数 | 规格 |
|---|---|
型号 | K128 (CoreS3) |
主控芯片 | ESP32-S3 (双核 Xtensa LX7, 240MHz) |
屏幕 | 2.0寸 LCD 电容触摸屏 (320×240) |
PSRAM | 8MB |
Flash | 16MB |
通信接口 | I2C / SPI / UART |
供电 | USB-C 5V 或外部电源 |
堆叠兼容 | 支持 M5Stack 标准堆叠模块 |
M5Stack GRBL Module 13.2 (SKU: M035)
Module13.2 GRBL 是 M5Stack 堆叠模块系列中的一款三轴步进电机驱动模块,采用 ATmega328P-AU 控制器搭配三组 DRV8825PWPR 步进电机驱动芯片控制方案,能够同时驱动三台双极步进电机联动。
核心参数
参数 | 规格 |
|---|---|
型号 | M035 (Module13.2 GRBL) |
控制器芯片 | ATmega328P-AU |
电机驱动芯片 | DRV8825PWPR × 3 |
通信接口 | I2C @ 0x70, 0x71 |
单通道最大驱动电流 | 1.5A |
支持最大步进细分 | 1/32 |
电源输入 | DC 9 ~ 24V |
供电说明
GRBL Module 13.2 需要单独的外部供电驱动步进电机。项目使用 12V DC 电源适配器 连接到 GRBL Module 的 VIN/GND 端子。CoreS3 通过 USB-C 接口独立供电(5V)。两者供电独立,确保电机大电流工作时不影响主控稳定性。
关键经验:12V 供电对于 NEMA17 42步进电机是最佳平衡点。9V 时扭矩偏低,大负载下可能丢步;24V 时扭矩过大会导致电机发热严重。12V 下 1.2A 额定电流时,电机可长时间稳定运行。
产品特点
- ATmega328P-AU 控制器
- 三轴 DRV8825PWPR 步进电机驱动器
- 驱动电流可达 1.5A
- 适用于双极步进电机
- 最大 1/32 模式 STEP 细分
- 限位开关接口 (低电平有效)
- 堆叠式设计,直接插接在 CoreS3 下方
2.2 步进电机
42步进电机 (NEMA17)
参数 | 规格 |
|---|---|
步距角 | 1.8° |
额定电流 | 1.2A |
保持转矩 | 0.4 N·m |
轴径 | 5mm |
供电电压 | 12V DC |
2.3 硬件连接
堆叠连接方式:CoreS3 与 GRBL Module 13.2 通过 M5Stack 标准堆叠接口直接插接,I2C总线通过堆叠引脚自动连通,无需额外接线。
外部接线:
接线对象 | CoreS3/GRBL端子 | 说明 |
|---|---|---|
CoreS3 供电 | USB-C | 5V 供电,用于主控逻辑运行 |
GRBL VIN | 12V DC 电源正极 | 步进电机驱动电源 |
GRBL GND | 12V DC 电源负极 | 电源地 |
X轴电机 A+ | GRBL A+ 端子 | X轴步进电机线圈A正 |
X轴电机 A- | GRBL A- 端子 | X轴步进电机线圈A负 |
X轴电机 B+ | GRBL B+ 端子 | X轴步进电机线圈B正 |
X轴电机 B- | GRBL B- 端子 | X轴步进电机线圈B负 |
Y轴电机 | GRBL B+/B- 端子 | Y轴步进电机(同理) |
2.4 硬件框图

三、方案框图和项目设计思路
3.1 系统架构

关键设计决策:
- CoreS3 主控:相比基础版 M5Stack Core,CoreS3 配备 ESP32-S3 双核处理器和 8MB PSRAM,可以更高效处理图形运算和 I2C 通信,触摸屏也为后续交互扩展提供空间
- 12V 外部供电:GRBL Module 需要 9~24V 外部电源驱动步进电机,12V 是 NEMA17 电机的推荐工作电压
- 堆叠连接:M5Stack 的堆叠设计使 CoreS3 和 GRBL Module 之间通过排针排母直接连接,I2C 总线自动连通,可靠性远高于杜邦线
3.2 程序执行流程

3.3 步进细分配置
通过拨码开关调节电机步进细分:
MODE2 | MODE1 | MODE0 | STEP模式 |
|---|---|---|---|
0 | 0 | 0 | Full step (71% current) |
0 | 0 | 1 | 1/2 step |
0 | 1 | 0 | 1/4 step |
0 | 1 | 1 | 1/8 step |
1 | 0 | 0 | 1/16 step |
1 | 0 | 1 | 1/32 step |
实践经验:本项目使用 1/16 步进细分(MODE0=0, MODE1=0, MODE2=1),在运动平滑度和扭矩之间取得最佳平衡。细分越高运动越平滑,但扭矩会相应降低。
3.4 步进电机参数校准
步进电机的步数/毫米参数来源于原 S20 打印机固件 (Marlin 2.0.8.1) 的配置:
X_STEPS_PER_MM = 80 # 源自 Marlin: DEFAULT_AXIS_STEPS_PER_UNIT {80, 80, 400, 87}
Y_STEPS_PER_MM = 80
Z_STEPS_PER_MM = 400
四、原理图和PCB展示及介绍
4.1 硬件连接原理图
本项目使用 M5Stack 官方硬件,CoreS3 与 GRBL Module 采用堆叠连接方式,外部仅需连接步进电机和 12V 电源。

供电回路说明:
USB-C (5V) ──► CoreS3 ──► 堆叠I2C ──► GRBL Module (逻辑供电)
12V DC ──► GRBL Module VIN ──► DRV8825 ──► 步进电机 (驱动供电)
两种供电互不干扰:5V 通过堆叠接口为 GRBL Module 提供逻辑电平,12V 直接驱动电机线圈。
4.2 I2C地址配置
Switch | Address |
|---|---|
0 | 0x70 |
1 | 0x71 |
4.3 原理图与PCB
为了便于连接 I2C 外设传感器,本项目使用KICAD设计了一款 I2C 适配转接板。该板提供两个 HY2.0-4P 接口,将 CoreS3 的 I2C 总线引出以连接外部传感器设备。
电路原理:两个 HY2.0-4P 连接器之间采用直通设计,对应引脚(SCL、SDA、+5V、GND)直接相连。其中 SCL 和 SDA 信号线与 CoreS3 堆叠接口的 I2C 总线联通,+5V 从堆叠接口取电,GND 共地。这种设计使得 CoreS3 可以通过 I2C 协议与挂载在总线上的多个外设通信,各设备的地址需设置为不同值以避免冲突。

PCB 布局:适配板采用 2 层板设计,顶层(F.Cu)走 I2C 信号线,底层(B.Cu)走电源和地线,实现信号与电源的有效隔离。板边框标注了各引脚的丝印标识,便于接线时快速识别。

该适配板与 GRBL Module 配合使用:GRBL Module 通过堆叠接口占用 CoreS3 的 I2C 总线(地址 0x70),适配板则扩展出额外的接口供其他 I2C 设备共享同一总线。
五、软件流程和关键代码介绍
5.1 主程序结构
"""
糖画3D打印机控制程序 - 基于 M5Stack CoreS3 + GRBL Module 13.2
功能特性:
1. XY轴步进电机联动控制
2. G-code指令支持
3. 圆形绘制函数 (分段直线逼近)
4. G92 软归零 (无限位开关)
5. 缓冲区管理 (每8段排水一次)
"""
5.2 模块初始化
def setup():
"""
初始化 M5Stack CoreS3 设备和 GRBL 模块
创建 GRBLModule 实例,初始化步进电机参数,
设置绝对坐标模式并解锁电机,G92 软归零,
将 Z 轴固定到挤出高度
"""
global grbl_0
M5.begin()
Widgets.fillScreen(0x222222)
grbl_0 = GRBLModule(address=0x70)
# 初始化步进参数 (步数/mm, 加速度500)
grbl_0.init(X_STEPS_PER_MM, Y_STEPS_PER_MM, Z_STEPS_PER_MM, 500)
# 设置绝对坐标模式
grbl_0.set_mode(GRBLModule.MODE_ABSOLUTE)
# 解锁电机
grbl_0.unlock()
# G92 软归零
grbl_0.g_code("G92 X0 Y0 Z0")
# 固定 Z 轴到挤出高度
grbl_0.turn(None, None, EXTRUDE_Z, DEFAULT_SPEED)
grbl_0.wait_idle()
实践经验:
init()的加速度参数(第4个参数)直接影响运动特性。设为 500 可在快速启停和运动平滑之间取得平衡。值过大会导致电机启停冲击大,值过小会导致加减速过程过长grbl_0.turn(None, None, z, speed)中传None表示该轴不移动,这是 GRBLModule 库的约定用法- 使用
G92 X0 Y0 Z0将当前位置设为原点,不产生任何物理运动,适合无限位开关的场景
5.3 运动控制
def move_to(x, y, speed=DEFAULT_SPEED):
"""
XY轴移动到指定坐标位置
直接以毫米为单位发送 G-Code 移动指令,
不等待完成,利用 GRBL 的 look-ahead 环形缓冲区
实现连续路径规划
Args:
x: X轴目标位置(毫米)
y: Y轴目标位置(毫米)
speed: 移动速度 (mm/min)
"""
global grbl_0
grbl_0.turn(x, y, None, speed)
实践经验:
- 不调用
wait_idle():这是实现平滑运动的关键。GRBL 内部维护了一个命令环形缓冲区,连续下发指令可以让 GRBL 的 look-ahead 规划器自动优化路径速度和加减速 - 直接传毫米:
turn()方法的参数单位是毫米,GRBL 内部会自动根据init()设置的步数/毫米参数转换为步数。不需要手动计算步数转换 - 速度单位是 mm/min(毫米/分钟),300 mm/min ≈ 5 mm/s,是经过测试的平衡值
5.4 图形绘制
def draw_circle(center_x, center_y, radius,
speed=DEFAULT_SPEED, segments=32):
"""
绘制圆形(XY平面)
通过分段直线逼近圆形,段数越多越圆滑。
每8段排水一次防止 GRBL 缓冲区溢出
Args:
center_x: 圆心X坐标
center_y: 圆心Y坐标
radius: 半径
speed: 绘制速度 (mm/min)
segments: 圆的分段数 (默认32段)
"""
global grbl_0
# 移动到圆形起点 (最右侧)
move_to(center_x + radius, center_y, speed)
# 分段绘制圆形
for i in range(1, segments + 1):
angle = 2 * math.pi * i / segments
px = center_x + radius * math.cos(angle)
py = center_y + radius * math.sin(angle)
move_to(px, py, speed)
# 每8段排水一次,防止缓冲区溢出
if i % 8 == 0:
grbl_0.wait_idle()
# 确保最后一段完成
grbl_0.wait_idle()
实践经验:
- 分段数选择:32 段在圆形平滑度和指令数量之间取得良好平衡。段数太少(如16段)圆形有明显的多边形棱角,段数太多(如64段)会快速填满 GRBL 的缓冲区
- 缓冲区管理:GRBL 的环形缓冲区容量有限(约 20-30 条指令),连续下发过多指令会导致缓冲区满后被阻塞。每 8 段排水一次可以稳定地保持连续运动
- 变量命名:使用
px/py而非x/y避免与函数参数或外部变量冲突
5.5 紧急停止
def emergency_stop():
"""紧急停止: 锁定所有电机"""
global grbl_0
if grbl_0 is not None:
try:
grbl_0.lock()
except Exception as e:
print("GRBL lock error:", e)
Widgets.fillScreen(0xFF0000)
Widgets.Label("EMERGENCY STOP", 10, 10, 1.0,
0xFFFFFF, 0xFF0000, Widgets.FONTS.DejaVu18)
print("Emergency Stop Activated!")
六、硬件功能展示图及说明
6.1 显示
6.1.1 启动运行状态
控制台串口输出运行日志:
==================================================
Sugar Art 3D Printer - GRBL Module 13.2
==================================================
Module Message: Grbl 0.8c
Module Status: Idle
Idle State: True
Lock State: False
Soft home set (G92 X0 Y0 Z0)
Initialization Complete!
==================================================
Circle drawn
Circle drawn
Circle drawn
...
6.1.2 紧急停止
(全屏红色背景)
EMERGENCY STOP ← 白色文字
(控制台输出)
Emergency Stop Activated!
6.2 硬件实物连接图





七、设计中遇到的难题和解决方法
7.1 步进电机参数配置
问题描述:不同步进电机和丝杆组合需要不同的步数/毫米参数,初始配置错误导致运动距离不准确。
解决方案:
- 从原 S20 打印机 Marlin 固件 Configuration.h 中提取步进参数
- 设置可配置的常量定义,方便调试时调整
# 步进电机参数配置(源自 Marlin 固件)
X_STEPS_PER_MM = 80
Y_STEPS_PER_MM = 80
Z_STEPS_PER_MM = 400
经验教训:原 Marlin 固件中的 DEFAULT_AXIS_STEPS_PER_UNIT {80, 80, 400, 87} 前三个值直接对应 XY/Z 轴的步数/毫米,可直接复用。
7.2 GRBL Module API 调用方式
问题描述:初始开发时错误地手动计算步数转换(x_steps = x * X_STEPS_PER_MM / 1.6),导致运动距离放大数十倍。
解决方案:
- 阅读 GRBLModule 库源码,确认
turn()方法已内部封装步数转换 - 直接以毫米为单位传递坐标值
# 错误做法(导致运动距离放大)
x_steps = x * X_STEPS_PER_MM / 1.6
grbl_0.turn(x_steps, y_steps, z_steps, speed)
# 正确做法(毫米直接传入)
grbl_0.turn(x, y, None, speed)
经验教训:GRBLModule 库的 init() 方法已经设置了步数/毫米参数,turn() 内部会使用 G-code G91/G0 进行单位转换。手动再乘一次步数会导致实际移动距离 = 目标值 × 步数/毫米,严重错误。
7.3 运动平滑性优化
问题描述:初始代码在每次 move_to() 后调用 wait_idle(),导致运动变成"走一步停一步",既不流畅又噪音大。
解决方案:
- 移除
move_to()中的wait_idle(),让 GRBL 的 look-ahead 规划器发挥作用 - 仅在每 8 段指令后调用一次
wait_idle()防止缓冲区溢出
# 错误做法(卡顿、不流畅)
def move_to(x, y, speed):
grbl_0.turn(x, y, None, speed)
grbl_0.wait_idle() # 等待完成,打断路径规划
# 正确做法(连续平滑)
def move_to(x, y, speed):
grbl_0.turn(x, y, None, speed) # 不等待,连续下发
def draw_circle(...):
for i in range(1, segments + 1):
move_to(px, py, speed)
if i % 8 == 0:
grbl_0.wait_idle() # 仅周期性排水
经验教训:GRBL 固件的核心优势之一是具备 look-ahead 路径规划能力,它通过分析队列中的多条指令来优化速度和加速度。频繁调用 wait_idle() 会导致队列始终为空,完全浪费了这一能力。正确的做法是连续下发指令,只在必要时排水。
7.4 无限位开关的坐标定位
问题描述:机器没有物理限位开关,无法使用 GRBL 的 $H 归零指令(会无限运动直到撞到限位)。
解决方案:
- 使用 G92 软归零替代物理归零
- 人工将打印头移动到工作空间左下角后执行
def soft_home():
"""软归零:使用 G92 将当前位置设为原点"""
grbl_0.g_code("G92 X0 Y0 Z0")
grbl_0.wait_idle()
print("Soft home set (G92 X0 Y0 Z0)")
7.5 供电稳定性
问题描述:步进电机启动瞬间电流较大,与主控共用电源会导致 CoreS3 复位或 GRBL 通信中断。
解决方案:
- 使用独立的 12V DC 电源适配器为 GRBL Module 的电机驱动供电
- CoreS3 通过 USB-C 独立 5V 供电
- GRBL Module 的逻辑电平由 CoreS3 通过堆叠接口提供(3.3V)
经验教训:虽然 GRBL Module 支持 9~24V 宽范围供电,但 12V 是最适合 NEMA17 电机的平衡点。电压过低(低于 10V)时电机扭矩不足,过高(高于 18V)时电机发热严重。务必注意 GND 共地,否则 I2C 通信会因电平差异不稳定。
7.6 I2C通信稳定性
问题描述:堆叠连接下的 I2C 通信偶尔出现超时或数据错误。
解决方案:
- 使用 M5Stack 官方 GRBLModule 库封装的通信方法,已包含超时处理
- 初始化时检查模块状态确认通信正常
- 紧急停止时添加
None检查和异常保护
try:
grbl_0 = GRBLModule(address=0x70)
print("Module Message:", grbl_0.get_message())
print("Module Status:", grbl_0.get_status())
except Exception as e:
print("GRBL initialization error:", e)
return False
经验教训:M5Stack 的堆叠连接可靠性远高于杜邦线,I2C 总线通过排针排母直连,基本上不会出现接触不良问题。但在大电流电机启动时,电磁干扰可能导致短暂通信异常,良好的供电隔离(独立 12V 电源)可以避免绝大多数此类问题。
八、心得体会
8.1 项目收获
- 步进电机控制:深入理解了步进电机驱动原理和 GRBL 固件的 look-ahead 路径规划机制
- GRBL Module API:掌握了 GRBLModule 库的 I2C 通信协议和方法调用约定
- 连续运动控制:理解了缓冲区管理和队列调度对运动平滑性的影响
- 嵌入式开发:熟悉了 M5Stack CoreS3 + UiFlow2/MicroPython 开发环境
- 参数校准:从原打印机 Marlin 固件提取参数并适配到 GRBL 模块
8.2 技术亮点
- 连续路径规划:利用 GRBL 环形缓冲区特性,实现流畅的圆弧绘制
- 无传感器定位:在无限位开关硬件下,使用 G92 实现坐标系设定
- 缓冲区间歇排水:精确控制排水节奏,兼顾流畅性和稳定性
- CoreS3 堆叠架构:利用 M5Stack 生态的模块化设计,快速搭建原型
8.3 改进建议
- 添加限位开关:安装机械限位开关,实现自动归零和行程保护
- 温度控制:添加糖液加热和温度控制功能
- 图形库扩展:添加星形、心形、文字等多图形绘制
- G-code文件解析:支持从 SD 卡加载标准 G-code 文件
- 触摸交互:利用 CoreS3 触摸屏实现图形选择和参数调整
- WiFi远程控制:通过 CoreS3 WiFi 实现远程监控和控制
- 挤出头控制:实现 Z 轴精确挤出控制,配合 XY 运动完成三维糖画
创意方向关联
本项目的技术成果为以下创意方向提供了广阔的发展空间:
1. 机械臂 / 工业自动化 / 元宇宙
本项目核心的 GRBL 运动控制技术是工业自动化的核心:
- 机械臂控制:多轴联动控制技术可直接应用于机械臂运动控制
- 工业自动化:GRBL 控制系统是 CNC 数控机床的标准方案
- 元宇宙:3D 打印技术是元宇宙虚拟物品实体化的关键制造技术
2. 人工智能在嵌入式系统中的应用
运动控制技术为 AI 应用提供了基础:
- 故障保护:人工智能判断:运动异常检测可发展为 AI 驱动的设备故障预警系统
- 计算机视觉:利用 CoreS3 的扩展能力,结合摄像头实现打印质量监控
- 图像识别:识别打印图案,自动生成打印路径
3. 楼宇自动化
运动控制技术在楼宇自动化中有应用:
- 智能窗帘控制:步进电机控制窗帘开合
- 智能门控制:电机驱动自动门
- 升降设备控制:步进电机控制升降平台
技术迁移价值
本项目开发的技术方案可迁移到:
- 机械臂/自动化:运动控制、CNC系统、3D打印
- 人工智能应用:故障预警、视觉监控
- 楼宇自动化:智能窗帘、自动门、升降控制
致谢
感谢 DigiKey 和 电子森林 提供的 FastBond4 活动支持,本次活动链接:https://www.eetree.cn/page/digikey-fastbond
