1. STM32写字机器人项目概述
去年冬天,我花了整整两个月时间折腾出一个基于STM32的写字机器人。这个项目从零开始,经历了硬件选型、PCB设计、机械结构搭建、代码编写和调试的全过程。主控芯片选用了STM32F103C8T6这款性价比极高的MCU,72MHz主频加上丰富的外设资源,完全能够满足两个42步进电机的驱动需求。
这个写字机器人的核心功能是通过XY轴运动控制,实现自动书写和绘图。整个系统包含机械结构、电路控制和上位机软件三个部分。机械部分采用十字滑台设计,X轴使用光轴+直线轴承,Y轴采用丝杆传动;电路部分以STM32为核心,搭配A4988步进电机驱动模块;软件部分则实现了运动轨迹插补算法和G代码解析功能。
提示:对于想要复现这个项目的朋友,建议先准备好以下工具:STM32开发环境(Keil或STM32CubeIDE)、Altium Designer或立创EDA用于PCB设计、SolidWorks或Fusion 360用于机械结构设计。
2. 硬件设计与实现
2.1 机械结构搭建
机械部分是整个项目的基础,我采用了模块化设计思路,便于后期维护和升级。X轴使用直径8mm的光轴配合直线轴承,确保运动平稳;Y轴则选择了T8丝杆,导程为2mm,这样每转一圈可以精确移动2mm。
滑台框架使用3mm亚克力板激光切割而成,这里有个重要经验:所有安装孔位必须留出0.5mm的装配余量。我第一次设计时没有考虑这一点,结果组装时各种卡顿,不得不重新切割框架。步进电机选用了从旧光驱拆机的28BYJ-48型,虽然扭矩不大,但对于写字这种轻负载应用完全够用,而且成本几乎为零。
2.2 电路设计要点
电路部分的核心是STM32F103C8T6最小系统和两个A4988步进电机驱动模块。相比常见的ULN2003驱动方案,A4988支持微步控制,能提供更平滑的运动效果。原理图设计时有几个关键点:
-
电源部分:电机驱动模块的VMOT电源端并联了470uF电解电容,实测能有效抑制电机启停时的电压波动。我在PCB底层铺了整块铜皮接GND,既改善了散热,又增强了抗干扰能力。
-
PWM信号连接:将STM32的TIM1_CH1和TIM1_CH2分别连接到两个A4988的STEP引脚,DIR引脚则连接到普通GPIO。这样可以利用硬件PWM生成精确的脉冲信号,减轻CPU负担。
-
限位开关接口:设计了三个限位开关接口(X+、X-、Y-),使用STM32的外部中断功能实现原点定位。限位开关建议选用机械式而非光电式,成本更低且更可靠。
3. 软件设计与算法实现
3.1 运动控制核心算法
写字机器人的核心是运动轨迹插补算法。我实现了一个基于Bresenham算法的直线插补器,全部使用整数运算以避免STM32浮点性能不足的问题。算法核心代码如下:
c复制void Line(int x1, int y1, int x2, int y2) {
int dx = abs(x2 - x1);
int dy = abs(y2 - y1);
int sx = x1 < x2 ? 1 : -1;
int sy = y1 < y2 ? 1 : -1;
int err = dx - dy;
while(1) {
StepperMoveTo(x1, y1);
if(x1 == x2 && y1 == y2) break;
int e2 = 2 * err;
if(e2 > -dy) {
err -= dy;
x1 += sx;
}
if(e2 < dx) {
err += dx;
y1 += sy;
}
HAL_Delay(2); // 速度控制
}
}
对于圆弧插补,我采用了改进的中点画圆算法,通过开启TIM1的自动重载功能(ARR预装载)解决了画圆时的锯齿问题:
c复制htim1.Instance->CR1 |= TIM_CR1_ARPE; // 开启自动重载预装载
3.2 G代码解析与执行
为了实现更复杂的绘图功能,我增加了G代码解析模块。通过串口接收来自上位机(如Inkscape)生成的G代码,使用环形缓冲区处理数据流:
c复制#define BUF_SIZE 256
char cmd_buffer[BUF_SIZE];
uint8_t buf_head = 0, buf_tail = 0;
void USART1_IRQHandler(void) {
if(USART1->SR & USART_SR_RXNE) {
cmd_buffer[buf_head++] = USART1->DR;
if(buf_head >= BUF_SIZE) buf_head = 0;
}
}
串口设置为115200bps,配合DMA传输可以稳定处理复杂的绘图指令。G代码解析器支持基本的G0(快速移动)、G1(直线插补)和G2/G3(圆弧插补)指令。
4. 调试经验与优化技巧
4.1 机械结构优化
在调试过程中,我发现以下几个机械方面的优化点:
-
滑台平行度调整:使用千分表测量两个光轴的平行度,误差控制在0.1mm以内。如果平行度不佳,会导致运动阻力增大和精度下降。
-
丝杆预紧力调整:Y轴丝杆的螺母需要适当预紧,太松会有回程间隙,太紧则会增加摩擦。我通过测试找到了最佳预紧力 - 用手转动丝杆时能感觉到轻微阻力但又能顺畅转动。
-
笔架设计:笔夹采用弹簧加载结构,确保笔尖与纸面保持恒定压力。压力过大容易划破纸张,过小则会出现断墨现象。
4.2 电路调试技巧
电路调试时遇到的主要问题是电机干扰导致的系统复位。通过以下措施解决了这个问题:
-
电源隔离:为MCU和电机驱动使用独立的电源,或者在共电源时加入π型滤波电路。
-
信号线处理:PWM信号线尽量短,必要时加入33Ω电阻进行阻抗匹配。
-
接地优化:采用星型接地策略,数字地、模拟地和电机地最终在一点汇合。
4.3 软件参数调优
软件方面有几个关键参数需要根据实际硬件调整:
-
步进电机细分设置:A4988驱动模块支持1/16微步,但实际使用中发现1/8微步在速度和精度之间取得了更好平衡。
-
运动速度控制:通过调整HAL_Delay的参数控制写字速度。对于0.9°的步进电机,2ms的延时能产生流畅的笔迹。
-
加速度曲线:实现简单的梯形加速度控制,避免电机启动时失步。加速度值需要根据负载情况调整。
5. 项目扩展与改进方向
目前的写字机器人已经能够完成基本的绘图和书写功能,但还有几个值得改进的方向:
-
Z轴压力控制:增加第三个步进电机控制笔的抬落,实现更复杂的绘图效果,特别是毛笔字的书写。
-
无线控制:加入蓝牙或WiFi模块,摆脱线缆束缚,方便远程控制。
-
视觉反馈:集成摄像头实现闭环控制,可以自动校正位置误差。
-
多笔切换:设计多笔架机构,支持自动更换不同颜色的笔。
在机械结构方面,可以考虑使用更专业的直线导轨替代光轴,虽然成本会增加,但运动精度和寿命会显著提高。另一个思路是改用CoreXY结构,可以减少运动部件的质量,提高运动速度。
电路方面,可以升级到STM32F4系列芯片,获得更高的运算性能和更丰富的外设资源。或者尝试使用 Trinamic的TMC系列驱动芯片,它们提供更先进的微步控制和静音技术。
软件层面,计划增加以下功能:
- 实现更复杂的轨迹规划算法
- 添加SD卡本地存储功能
- 开发更友好的上位机软件
- 支持更多文件格式直接导入
这个项目最让我满意的不是最终成品,而是整个开发过程中积累的经验。从机械设计到电路调试,从算法实现到参数优化,每一个环节都遇到了各种预料之外的挑战,而解决这些问题的过程正是工程师最大的乐趣所在。