1. 项目概述:基于STM32F103C8T6的DIY写字机器人
去年在实验室角落发现几个闲置的42步进电机,萌生了做个写字机器人的想法。作为电子工程师,我更关注如何用最低成本实现稳定可靠的书写功能。最终方案选用STM32F103C8T6作为主控,配合A4988驱动模块和光驱拆机步进电机,整套硬件成本控制在200元以内。这个项目特别适合有一定嵌入式基础的Maker练手,涉及电机控制、运动算法、机械结构设计等多个实用技能点。
2. 硬件设计详解
2.1 核心器件选型
主控选择STM32F103C8T6主要基于三点考量:
- 72MHz主频足够处理两轴插补运算
- 内置硬件PWM可直接驱动步进电机
- 10万次擦写寿命的Flash适合频繁调试
电机驱动模块从ULN2003升级到A4988的关键原因:
- 支持1/16微步进(最小步距角0.1125°)
- 最大2A驱动电流(带电流调节电位器)
- 内置MOSFET过热保护
实测发现:A4988的VMOT供电必须与逻辑电源隔离,否则电机启停时会导致MCU复位
2.2 关键电路设计
电源部分采用两级滤波设计:
plaintext复制12V输入 → 100μF电解电容 → LC滤波 → 470μF固态电容 → A4988 VMOT
↓
AMS1117-3.3 → 100nF陶瓷电容 → MCU
PWM信号布线要注意:
- TIM1_CH1/CH2走线等长(误差<5mm)
- 信号线距电机电源线至少3mm
- 驱动模块STEP/DIR引脚接100Ω电阻防振铃
2.3 PCB布局技巧
四层板堆叠方案:
- Top层:信号走线
- Inner1:完整地平面
- Inner2:电源网络
- Bottom层:大电流路径
散热处理方案:
- 在A4988底部开6个0.5mm过孔到地平面
- 底层铺铜面积≥5cm²
- 电机电源线线宽≥1mm
3. 机械结构实现
3.1 十字滑台搭建
X轴采用光轴+直线轴承方案:
- 直径8mm镀铬光轴(长度400mm)
- SC8UU直线轴承(预紧力可调)
- 同步带传动(GT2-6mm宽)
Y轴使用丝杆传动的优势:
- 消除反向间隙
- 0.01mm级重复定位精度
- 自锁特性防止掉笔
光驱电机改装要点:拆除原有齿轮组,用3D打印联轴器直接连接丝杆
3.2 框架制作工艺
亚克力板加工注意事项:
- 钻孔直径=螺丝直径+0.2mm
- 沉头孔需先用3mm钻头开引导孔
- 激光切割速度8mm/s(功率60%)
装配公差控制:
- 导轨平行度≤0.1mm/300mm
- 丝杆轴向窜动≤0.05mm
- 滑块预压弹簧压缩量2mm
4. 核心算法解析
4.1 运动控制实现
改进版Bresenham算法优化点:
- 用位移增量替代浮点运算
- 引入误差累积补偿机制
- 动态调整步进频率
关键代码段解析:
c复制void StepperMoveTo(int x, int y) {
static int last_x, last_y;
int steps_x = (x - last_x) * STEPS_PER_MM;
int steps_y = (y - last_y) * STEPS_PER_MM;
// 生成PWM脉冲序列
TIM1->CCR1 = steps_x > 0 ? 50 : 0; // 占空比50%
TIM1->CCR2 = steps_y > 0 ? 50 : 0;
TIM1->ARR = MAX(abs(steps_x), abs(steps_y)); // 自动重载值
last_x = x;
last_y = y;
}
4.2 轨迹平滑处理
圆弧插补优化方案:
- 将圆弧离散为多段切线
- 采用四点贝塞尔曲线拟合
- 速度前瞻控制算法
消除锯齿的关键配置:
c复制// TIM1初始化片段
htim1.Instance->CR1 |= TIM_CR1_ARPE; // 开启预装载
htim1.Instance->CR2 |= TIM_CR2_MMS_1; // 主模式输出
htim1.Instance->PSC = 71; // 1MHz计数频率
5. 软件系统设计
5.1 G代码解析器
实现功能:
- 支持G00/G01/G02/G03指令
- 加速度规划(S曲线算法)
- 运动缓冲区管理
环形缓冲区实现要点:
c复制#define BUF_SIZE 512 // 必须为2的幂次
typedef struct {
char data[BUF_SIZE];
volatile uint16_t head;
volatile uint16_t tail;
} ring_buffer_t;
// 原子操作实现
uint8_t buf_put(ring_buffer_t* buf, char c) {
uint16_t next = (buf->head + 1) & (BUF_SIZE-1);
if(next == buf->tail) return 0;
buf->data[buf->head] = c;
buf->head = next;
return 1;
}
5.2 上位机通信协议
自定义协议格式:
code复制[HEADER][LEN][CMD][DATA][CRC]
0x55AA 2B 1B N*1B 2B
波特率自适应方案:
- 发送同步字符0x55
- 测量脉冲宽度计算波特率
- 自动重配置USART
6. 调试经验实录
6.1 典型问题排查
现象1:画圆出现多边形失真
- 检查TIM1的ARR预装载是否启用
- 验证步进脉冲频率≤20kHz
- 调整微步进细分设置
现象2:书写断墨
- 增加Z轴抬笔延时(建议≥50ms)
- 检查笔架弹簧压力(推荐50-100g)
- 降低XY轴移动速度
6.2 性能优化技巧
-
电机发热控制:
- 将A4988的VREF调至0.8V(约1A电流)
- 启用空闲时自动半流模式
-
运动平滑性提升:
c复制// 在插补循环中加入加速度控制 for(int i=0; i<steps; i++) { delay = max_delay - (max_delay-min_delay)*i/steps; HAL_Delay(delay); } -
耗材选择建议:
- 笔类:樱花针管笔(0.3mm)
- 纸张:120g以上铜版纸
- 替换笔尖:陶瓷球珠更耐磨
7. 扩展功能设想
后续升级方向:
- 压力感应笔座(FSR传感器)
- 视觉定位系统(OpenMV模块)
- 无线控制(ESP-01S WiFi模块)
毛笔字实现要点:
- 采用伺服电机控制Z轴压力
- 增加墨汁供给系统
- 开发毛笔轨迹特殊算法
这个项目最让我惊喜的是光驱电机的表现——虽然额定扭矩只有0.1N·m,但在1/16微步模式下完全能满足日常书写需求。建议初次尝试时先用Inkscape生成简单图形的G代码,逐步过渡到复杂汉字书写。所有设计文件已开源,包含SolidWorks装配图和Altium Designer工程,GitHub仓库里的3D打印文件建议用PETG材料制作,比PLA更耐磨损。
