1. 项目概述
这个项目让我想起了去年参加大学生电子设计竞赛时的场景。当时我们团队花了整整两周时间,从零开始搭建了一台能够自主灭火的智能小车。这种结合了传感器技术、自动控制和机械设计的项目,特别适合电子工程专业的学生练手,也常出现在各类科创比赛中。
单片机灭火避障小车本质上是一个集环境感知、决策控制和执行机构于一体的微型智能系统。它需要实时检测火源位置,规划避障路径,并准确完成灭火操作。听起来简单?实际操作中会遇到各种意想不到的问题:传感器误报、电机响应延迟、灭火装置效率低下等等。
2. 核心功能设计
2.1 系统架构设计
一个完整的灭火小车系统通常包含以下几个核心模块:
-
感知层:
- 火焰传感器阵列(通常使用红外接收管)
- 超声波/红外避障传感器
- 温度传感器(可选)
-
控制层:
- 主控单片机(常见选择:STC89C52、STM32F103)
- 电机驱动模块(L298N是最经济的选择)
- 电源管理模块
-
执行层:
- 直流减速电机(带编码器为佳)
- 灭火装置(风扇或微型水泵)
- 状态指示LED
2.2 传感器选型要点
火焰检测是项目的核心难点。经过多次实测,我发现以下配置方案最可靠:
- 红外火焰传感器:使用3-5个TSOP1838红外接收管呈扇形排列,检测角度约60度
- 避障方案:HC-SR04超声波模块(前方)+红外对管(两侧)
- 辅助验证:DS18B20温度传感器(防止误判)
重要提示:火焰传感器极易受日光灯干扰!建议在传感器前加装850nm带通滤光片,并做好电路屏蔽。
3. 硬件实现细节
3.1 电路设计避坑指南
电源部分最容易出问题。我们的血泪教训是:
- 电机驱动隔离:必须为电机驱动单独供电(建议7.4V锂电池),并通过光耦隔离PWM信号
- ADC参考电压:如果使用单片机内置ADC,务必外接精密基准源(如TL431)
- 传感器供电:火焰传感器对电压波动敏感,建议使用AMS1117-3.3稳压后供电
典型接线示意图:
plaintext复制+---------------+
| 12V电源输入 |
+-------┬-------+
│
+-------▼-------+ +-----------------+
| L298N驱动模块 |←─→| 单片机PWM输出 |
+-------┬-------+ +-----------------+
│
+-------▼-------+
| 直流减速电机 |
+---------------+
3.2 机械结构优化
车体设计直接影响灭火效率。经过5次迭代,我们总结出以下经验:
- 重心分配:电池应置于车体后部,灭火装置前置
- 传感器布局:火焰传感器安装高度建议8-12cm,俯角15-20度
- 灭火装置:小型风扇(4028规格)比水泵更易控制,但射程较短
4. 软件算法实现
4.1 主控制流程图
核心算法采用状态机设计:
c复制void main() {
while(1) {
switch(state) {
case SEARCH_MODE:
rotate_search();
if(detect_fire()) state = APPROACH_MODE;
break;
case APPROACH_MODE:
move_to_fire();
if(obstacle_detected()) state = AVOID_MODE;
if(fire_near()) state = EXTINGUISH_MODE;
break;
// 其他状态处理...
}
}
}
4.2 关键算法解析
火焰定位算法:
采用加权平均法计算火焰方向:
code复制direction = (s1*0° + s2*30° + s3*60° + s4*90° + s5*120°) / (s1+s2+s3+s4+s5)
其中s1-s5为各传感器读数归一化值
避障策略:
我们开发了三级避障策略:
- 轻微偏离(障碍物距离>30cm):微调行进方向
- 中度避让(10-30cm):45度转向后继续前进
- 紧急制动(<10cm):后退+90度转向
5. 调试与优化
5.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 误报火警 | 环境光干扰 | 加装滤光片,调整阈值 |
| 电机抖动 | PWM频率不当 | 调整至1-3kHz |
| 定位不准 | 传感器偏移 | 重新校准安装角度 |
| 响应延迟 | 循环周期过长 | 优化代码结构 |
5.2 性能优化技巧
-
传感器滤波:采用移动平均滤波(窗口大小5-7)
c复制#define FILTER_SIZE 5 int filter_buffer[FILTER_SIZE]; int moving_average(int new_val) { static int index = 0; filter_buffer[index] = new_val; index = (index+1) % FILTER_SIZE; int sum = 0; for(int i=0; i<FILTER_SIZE; i++) { sum += filter_buffer[i]; } return sum/FILTER_SIZE; } -
电源管理:在搜索模式下降低PWM占空比(30-40%),接近火源时提升至80%
-
路径记忆:实现简单的回环检测,避免在同一区域反复搜索
6. 进阶改进方向
对于想进一步提升项目水平的同学,可以考虑:
- 多机协作:通过无线模块实现多车协同搜索
- 视觉辅助:添加OV7670摄像头进行二次验证
- 智能充电:设计自动回充功能
- 云平台:通过ESP8266上传数据到物联网平台
在实际比赛中,我们曾尝试过基于nRF24L01的组网方案,两辆小车分别负责搜索和灭火,效率提升了约40%。不过这会显著增加代码复杂度,建议先完善单机版本。
最后分享一个实用技巧:在车体四周贴上反光条,用光电传感器检测墙壁反射,可以实现低成本的位置校正。这个方法在去年省赛中帮助我们获得了定位精度的加分项。