1. 项目概述
作为一名嵌入式系统开发者,我最近完成了一个基于STM32的职场清洁机器人项目。这个项目源于我对智能硬件和自动化技术的浓厚兴趣,同时也希望能为办公室环境提供一种高效的清洁解决方案。
职场清洁机器人不同于家用扫地机器人,它需要适应更复杂的环境和更高的可靠性要求。在办公场景中,机器人的工作环境通常包括:
- 不规则的工位布局
- 频繁移动的办公椅
- 各种线缆和临时障碍物
- 需要清洁多种地面材质(地毯、瓷砖等)
基于这些特殊需求,我选择了STM32作为主控芯片,因为它能提供足够的计算能力和丰富的外设接口。整个开发过程历时三个月,从方案选型到硬件设计,再到软件开发和系统调试,每个环节都遇到了不少挑战,也积累了很多宝贵的经验。
2. 主控系统方案设计
2.1 整体架构设计
清洁机器人的系统架构可以分为三个主要部分:
- 感知层:包括红外传感器、超声波模块、碰撞开关等
- 控制层:STM32主控芯片及其外围电路
- 执行层:电机驱动、清扫机构、状态指示灯等
系统的工作流程是:传感器采集环境数据→STM32处理数据并做出决策→驱动电机和清扫机构执行相应动作。这种分层设计使得系统模块化程度高,便于后期维护和功能扩展。
2.2 单片机选型分析
在项目初期,我面临AT89C51和STM32两种方案的选择。经过深入比较,我发现:
AT89C51方案特点:
- 8位架构,处理能力有限
- 外设接口较少,扩展性差
- 开发工具链相对老旧
- 功耗控制不够精细
- 价格低廉,适合简单应用
STM32方案优势:
- 32位Cortex-M内核,计算能力强
- 丰富的外设接口(多达17个定时器)
- 完善的开发工具链和社区支持
- 多种低功耗模式可选
- 性价比高,适合复杂应用
提示:在选择单片机时,不仅要考虑当前需求,还要预留30%的性能余量以应对未来可能的升级。
2.3 最终方案确定
基于以下关键因素,我最终选择了STM32F103C8T6作为主控芯片:
- 需要实时处理多路传感器数据
- 要同时控制多个电机(驱动轮和清扫机构)
- 未来可能增加Wi-Fi/蓝牙连接功能
- 需要精确的PWM控制实现调速
- 低功耗需求(电池供电)
这款芯片具有72MHz主频、64KB Flash和20KB RAM,完全满足项目需求。它的外设资源包括:
- 3个USART接口(可用于调试和通信)
- 2个SPI接口(连接传感器模块)
- 2个I2C接口(扩展其他设备)
- 多达15个PWM通道(控制电机)
- 12位ADC(采集传感器模拟信号)
3. 硬件设计实现
3.1 STM32核心电路设计
STM32最小系统包括以下几个关键部分:
- 电源电路:采用AMS1117-3.3V稳压芯片,将电池的7.4V降压为3.3V
- 复位电路:10kΩ上拉电阻+0.1μF电容构成硬件复位
- 时钟电路:8MHz晶振+两个22pF负载电容
- 调试接口:SWD四线接口(VCC、GND、SWDIO、SWCLK)
- 启动模式选择:BOOT0通过10kΩ电阻接地(从Flash启动)
注意:STM32的VDDA和VSSA必须连接,即使不使用ADC,否则芯片可能工作不稳定。
3.2 电机驱动电路
清洁机器人使用两个直流减速电机驱动,采用TB6612FNG电机驱动芯片,它具有以下优点:
- 双路H桥设计,可同时驱动两个电机
- 最大1.2A持续电流(峰值3.2A)
- 内置过热保护和低压检测
- PWM频率支持高达100kHz
电机驱动电路连接方式:
code复制STM32 PWM1 → TB6612 PWMA
STM32 PWM2 → TB6612 PWMB
STM32 GPIO1 → TB6612 AIN1
STM32 GPIO2 → TB6612 AIN2
STM32 GPIO3 → TB6612 BIN1
STM32 GPIO4 → TB6612 BIN2
3.3 传感器模块设计
机器人配备了多种传感器来实现环境感知:
红外避障传感器:
- 使用TCRT5000反射式红外传感器
- 检测距离可调(2-30cm)
- 数字输出,直接连接STM32 GPIO
超声波测距模块:
- HC-SR04超声波模块
- 测量范围2-400cm
- 精度可达3mm
- 需要5V供电,通过电平转换芯片连接STM32
碰撞检测开关:
- 机械式微动开关
- 安装在机器人四周作为最后一道防线
- 通过10kΩ上拉电阻连接STM32 GPIO
3.4 电源管理系统
考虑到移动设备的特性,电源设计尤为关键:
- 采用7.4V 2000mAh锂电池供电
- 使用TP4056充电管理芯片
- 电池电压通过电阻分压后接入STM32 ADC监测电量
- 各模块独立供电,避免相互干扰
- 添加100μF电解电容和0.1μF陶瓷电容滤波
4. 软件系统设计
4.1 主程序流程图
系统软件采用前后台架构:
- 初始化硬件(时钟、GPIO、定时器等)
- 初始化各功能模块(电机、传感器等)
- 进入主循环:
- 读取传感器数据
- 执行避障算法
- 更新电机控制
- 处理用户输入
- 更新状态显示
4.2 关键算法实现
避障算法流程:
- 前向超声波检测远距离障碍(>50cm)
- 红外传感器检测中距离障碍(10-50cm)
- 碰撞开关检测接触障碍
- 根据障碍位置选择转向方向
- 记录已清洁区域,避免重复
电机控制算法:
c复制void Motor_Control(int left_speed, int right_speed) {
// 限制速度范围
left_speed = constrain(left_speed, -255, 255);
right_speed = constrain(right_speed, -255, 255);
// 设置电机方向
GPIO_Write(MOTOR_L_DIR, left_speed > 0 ? FORWARD : BACKWARD);
GPIO_Write(MOTOR_R_DIR, right_speed > 0 ? FORWARD : BACKWARD);
// 设置PWM占空比
PWM_SetDuty(TIM1, CH1, abs(left_speed));
PWM_SetDuty(TIM1, CH2, abs(right_speed));
}
4.3 多任务处理技巧
虽然STM32没有RTOS,但可以通过定时器中断实现伪多任务:
- 使用SysTick定时器作为系统时基(1ms)
- 设置多个软件定时器实现任务调度
- 关键任务(如电机控制)放在主循环
- 非实时任务(如状态显示)通过标志位触发
示例代码:
c复制volatile uint32_t systick = 0;
void SysTick_Handler(void) {
systick++;
if(systick % 100 == 0) { // 每100ms执行一次
update_sensors_flag = 1;
}
if(systick % 500 == 0) { // 每500ms执行一次
update_display_flag = 1;
}
}
5. 系统调试与优化
5.1 硬件调试经验
在硬件调试过程中,我遇到了几个典型问题:
问题1:电机干扰导致MCU复位
- 现象:电机启动时STM32偶尔会复位
- 原因:电机反向电动势造成电源波动
- 解决:
- 在电机两端并联续流二极管
- 电源线增加磁珠滤波
- 缩短电机驱动线路长度
问题2:红外传感器误触发
- 现象:在明亮环境下传感器误报
- 原因:环境光干扰
- 解决:
- 添加遮光罩
- 调整检测阈值
- 采用软件滤波算法(如滑动平均)
5.2 软件调试技巧
使用Keil MDK进行开发时,有几个实用技巧:
-
逻辑分析仪功能:
- 通过SWD接口实时查看变量值
- 可以图形化显示PWM波形
- 监测任务执行时序
-
断点条件设置:
c复制if(sensor_value > threshold) { // 在此行设置条件断点 // 触发特定条件时暂停 } -
内存监测:
- 实时查看栈使用情况
- 检测内存泄漏
- 优化变量分配
5.3 性能优化记录
通过以下优化手段,系统性能提升了约40%:
-
算法优化:
- 将浮点运算改为定点运算
- 使用查表法替代复杂计算
- 优化避障决策树
-
代码优化:
- 关键函数添加__inline修饰
- 频繁调用的变量声明为register
- 使用位操作替代乘除法
-
功耗优化:
- 空闲时进入STOP模式
- 动态调整传感器采样率
- 根据任务负载调节CPU频率
6. 项目总结与改进方向
经过三个月的开发,这个STM32清洁机器人项目已经实现了基本功能:
- 自主移动与避障
- 自动清扫功能
- 电量监测与低电量返回
- 简单的用户交互界面
在实际测试中,机器人可以在20平方米的办公区域内连续工作约2小时,清扫效率达到人工的60%左右。虽然还存在一些不足,但已经验证了方案的可行性。
未来可以考虑的改进方向包括:
- 增加视觉识别能力(使用OV2640摄像头)
- 实现地图构建与路径规划
- 添加无线遥控和状态监控功能
- 优化清扫机构适应不同地面
- 开发手机APP进行远程控制
这个项目让我深刻体会到嵌入式开发的乐趣与挑战。从芯片选型到电路设计,从算法实现到系统调试,每个环节都需要严谨的态度和创新的思维。特别是在资源受限的嵌入式环境中,如何平衡性能、功耗和成本,是一个需要不断探索的课题。