1. 项目概述
这个基于STM32单片机的智能图像小车项目,是我在嵌入式系统开发领域的一次综合性实践。项目核心是通过ESP32-CAM模块实现图像采集与传输,结合PWM电机控制、环境感知和自动避障功能,打造一个具备物联网特性的智能移动平台。整套系统包含硬件端的运动控制、环境感知和图像采集,以及手机APP端的数据可视化与远程操控功能。
作为嵌入式开发者,我们经常需要处理传感器数据采集、实时控制和无线通信的协同工作。这个项目恰好涵盖了这些核心技能点:STM32作为主控负责协调各模块工作,ESP32-CAM处理图像采集并通过WiFi传输,手机APP作为远程控制终端。整个开发过程涉及到嵌入式C编程、PWM控制算法、无线通信协议和Android应用开发等多个技术栈的融合。
2. 硬件系统设计
2.1 核心控制器选型
项目采用STM32F103C8T6作为主控制器,这款Cortex-M3内核的MCU具有以下优势:
- 72MHz主频满足实时控制需求
- 丰富的外设接口(3xUSART, 2xSPI, 2xI2C)
- 16KB SRAM和64KB Flash存储空间
- 多达37个GPIO引脚可配置
实际开发中发现,当同时处理图像传输和电机控制时,STM32的RAM资源较为紧张。建议在资源分配上优先保证电机控制的实时性,图像传输可以采用分块缓存的方式处理。
2.2 图像采集模块
ESP32-CAM模块是本项目的视觉核心,其关键特性包括:
- 支持OV2640摄像头(200万像素)
- 内置WiFi和蓝牙4.2
- 图像传输速率可达15fps@640x480
- 支持JPEG压缩(节省带宽)
硬件连接示意图:
c复制ESP32-CAM STM32
VCC → 5V
GND → GND
UART_TX → PA10(UART1_RX)
UART_RX → PA9(UART1_TX)
2.3 电机驱动系统
采用L298N双H桥驱动模块控制直流电机,关键参数:
- 驱动电压:5-35V
- 单路持续电流:2A
- 峰值电流:3A
- PWM频率:建议10-20kHz
电机控制代码示例:
c复制// PWM初始化(TIM3 CH1/CH2)
void PWM_Init(uint16_t arr, uint16_t psc) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_CtrlPWMOutputs(TIM3, ENABLE);
}
2.4 环境感知模块
系统集成了多种环境传感器:
-
HC-SR04超声波模块(避障)
- 测距范围:2-400cm
- 精度:0.3cm
- 触发信号至少10μs高电平
-
DHT11温湿度传感器
- 温度范围:0-50℃ ±2℃
- 湿度范围:20-90%RH ±5%
- 单总线通信
-
BH1750光照传感器
- 量程:1-65535 lux
- I2C接口
- 16位分辨率
3. 软件系统架构
3.1 嵌入式端程序设计
采用模块化设计思想,主要任务划分如下:
- 主控制循环(10ms周期)
c复制while(1) {
if(sysTick >= 10) {
sysTick = 0;
Sensor_Update(); // 传感器数据更新
Motor_Control(); // 电机控制
Comm_Process(); // 通信处理
}
}
- 图像传输流程:
- ESP32-CAM采集图像→JPEG压缩→WiFi传输
- STM32通过串口接收控制指令
- 传输协议采用自定义帧格式:
[头(0xAA)][长度][类型][数据][校验和]
- 自动避障算法:
c复制void Avoidance_Algorithm(void) {
float left_dist = Get_Distance(LEFT_SENSOR);
float right_dist = Get_Distance(RIGHT_SENSOR);
if(left_dist < SAFE_DISTANCE && right_dist < SAFE_DISTANCE) {
Move_Backward(SPEED_NORMAL);
Delay_ms(500);
Turn_Right(SPEED_SLOW);
} else if(left_dist < SAFE_DISTANCE) {
Turn_Right(SPEED_SLOW);
} else if(right_dist < SAFE_DISTANCE) {
Turn_Left(SPEED_SLOW);
} else {
Move_Forward(SPEED_NORMAL);
}
}
3.2 手机APP开发
采用Android Studio开发控制APP,主要功能模块:
- 图像显示界面
- SurfaceView实时显示视频流
- 解码JPEG图像帧
- 双缓冲机制避免卡顿
- 控制面板
- 虚拟摇杆控制方向
- 速度调节滑块
- 模式切换按钮(手动/自动)
- 数据监控界面
- 实时曲线显示传感器数据
- 异常状态报警提示
- 数据日志记录
关键通信协议参数:
- WiFi UDP传输
- 图像分辨率:320x240 @ 10fps
- 控制指令格式:$CMD,VAL1,VAL2,VAL3*CS
4. 系统集成与调试
4.1 硬件组装要点
- 电机安装注意事项:
- 确保车轮与电机轴同心
- 使用橡胶垫片减少振动
- 电机电源线与信号线分开走线
- 传感器布局原则:
- 超声波传感器朝向前方
- 避免电磁干扰(远离电机和电源)
- 保持传感器探测面清洁
- 电源系统设计:
- 建议采用两路独立供电:
- 电机驱动:7.4V锂电池
- 控制系统:5V稳压模块
- 总电流需求:
- 静止状态:~300mA
- 运动状态:~1.2A(峰值2A)
4.2 软件调试技巧
- 图像传输优化:
c复制// 分块传输策略
#define BLOCK_SIZE 512
void Send_Image(uint8_t *img_buf, uint32_t img_len) {
uint32_t sent = 0;
while(sent < img_len) {
uint16_t block_len = (img_len - sent) > BLOCK_SIZE ? BLOCK_SIZE : (img_len - sent);
Send_UART(&img_buf[sent], block_len);
sent += block_len;
Delay_ms(5); // 防止缓冲区溢出
}
}
- 电机控制PID调参:
- 先调P(比例)参数,观察响应速度
- 再调I(积分)参数,消除稳态误差
- 最后调D(微分)参数,抑制超调
- 典型参数范围:
- Kp: 0.5-2.0
- Ki: 0.01-0.1
- Kd: 0-0.5
- 无线通信抗干扰措施:
- 设置WiFi信道为不拥挤的频段
- 添加数据重传机制
- 使用前向纠错编码(FEC)
- 关键指令采用应答确认模式
5. 常见问题解决方案
5.1 图像传输卡顿
可能原因及解决方法:
-
WiFi信号强度不足
- 确保ESP32与手机在同一网络
- 添加外置天线增强信号
-
图像分辨率过高
- 降低至QVGA(320x240)
- 减少帧率至10fps
-
缓冲区溢出
- 增加接收缓冲区
- 实现流量控制机制
5.2 电机控制不精确
调试步骤:
- 检查PWM频率是否合适(建议10-15kHz)
- 测量实际输出电压是否匹配占空比
- 校准电机死区电压(通常1-2%占空比)
- 检查机械传动是否顺畅
5.3 自动避障误判
优化方案:
- 增加传感器滤波算法:
c复制#define SAMPLE_NUM 5
float Get_Filtered_Distance(void) {
float sum = 0;
for(int i=0; i<SAMPLE_NUM; i++) {
sum += Get_Distance();
Delay_ms(10);
}
return sum/SAMPLE_NUM;
}
- 设置合理的避障阈值(建议20-30cm)
- 添加多传感器数据融合
- 考虑环境光照干扰因素
6. 项目优化与扩展
6.1 性能优化方向
- 图像传输:
- 采用H.264压缩替代JPEG
- 实现动态码率调整
- 添加QoS质量保障机制
- 运动控制:
- 引入IMU传感器辅助定位
- 实现闭环速度控制
- 添加运动轨迹记录功能
- 能源管理:
- 锂电池电量监控
- 动态功耗调节
- 低功耗待机模式
6.2 功能扩展建议
- 计算机视觉增强:
- OpenCV集成目标识别
- 二维码/条形码扫描
- 人脸检测功能
- 云端数据对接:
- 上传传感器数据到物联网平台
- 远程固件升级(FOTA)
- 多设备协同控制
- 机械结构改进:
- 四轮驱动系统
- 可升降摄像头云台
- 机械臂扩展接口
在实际开发过程中,我发现STM32与ESP32的协同工作是项目的关键难点。特别是在资源有限的情况下,需要精心设计通信协议和任务调度策略。通过这个项目,我深刻体会到嵌入式开发不仅需要扎实的编程基础,更需要系统级的思维方式和解决实际问题的能力。