这是一个基于STM32F103C8T6微控制器的智能循迹小车项目,集成了红外寻迹、姿态感知、电机闭环控制和蓝牙通信等功能。小车能够自主循迹行驶,同时支持蓝牙遥控和状态监控。
- 双电机PID速度闭环控制
- 陀螺仪辅助角度控制
- 四路红外寻迹传感器
- 状态机控制的循迹算法
- MPU6500:六轴姿态传感器(I2C接口)
- 实时获取姿态角(Yaw、Pitch、Roll)
- 加速度和角速度数据
- 互补滤波姿态解算
- 红外寻迹传感器:4路ADC采样
- 加权误差计算
- 黑线检测与状态判断
- 十字路口/弯道识别
- 蓝牙通信(USART2,38400bps)
- 支持上位机指令控制
- 实时数据回传
- 参数远程配置
- 循迹模式:自动跟随黑线行驶
- 遥控模式:蓝牙指令控制
- 定点行驶:设置目标距离自动停止
- 角度保持:设定偏航角自动维持
- STM32F103C8T6
- 配置详见.ioc文件
- TB6612FNG双路电机驱动
- 左轮:TIM4_CH4(PB9),方向控制BIN1/BIN2
- 右轮:TIM1_CH1(PA8),方向控制AIN1/AIN2
- 编码器:TIM2(右轮),TIM3(左轮)
- MPU6500:I2C1(PB10-SCL,PB11-SDA)
- 红外传感器:ADC1通道6-9(PA6-PA7,PB0-PB1)
- 蓝牙模块:USART2(PA2-TX,PA3-RX),38400bps
- DMA传输:双缓冲区接收,避免数据丢失
- IDE:STM32CubeIDE
- 编译器:arm-none-eabi-gcc
- 固件库:STM32 HAL库
- 打开STM32CubeIDE
- 导入项目文件夹
- 配置正确的芯片型号(STM32F103C8T6)
- 编译项目
- ST-Link V2编程器
- SWD接口连接
- SWDIO:PA13
- SWCLK:PA14
- GND
- 3.3V
#<指令ID>:<参数>
或
#<指令ID>
| 指令ID | 功能 | 参数示例 | 说明 |
|---|---|---|---|
| 1 | 设置速度 | 30 或 30,28 | 设置左右轮速度 |
| 2 | 直行 | 30 | 设置直行速度 |
| 3 | 左转 | 无 | 开始左转 |
| 4 | 右转 | 无 | 开始右转 |
| 5 | 停止转向 | 无 | 停止转向 |
| 10 | 停止 | 无 | 停止所有电机 |
| 11 | 启动 | 无 | 启动电机控制 |
| 12 | 设置PID | L,10,0,1 | 设置左轮PID参数 |
| 17 | 设置偏航角 | 45.0 | 设置目标偏航角 |
| 19 | 切换循迹模式 | 无 | 开启/关闭循迹 |
#<消息ID>|<长度>:<内容>
| 消息ID | 类型 | 说明 |
|---|---|---|
| 0 | LOG | 普通日志信息 |
| 1 | DEBUG | 调试信息 |
| 2 | ERROR | 错误信息 |
| 4 | SPEED | 速度数据 |
| 5 | GYROSCOPE | 陀螺仪数据 |
上电后小车会自动:
- 初始化MPU6500并进行陀螺仪校准
- 启动红外传感器ADC采样
- 初始化PID控制器
- 发送指令
#19进入循迹模式 - 将小车放在循迹赛道上
- 小车会自动检测黑线并跟随
- 使用蓝牙发送速度指令,如
#1:30 - 发送转向指令,如
#3左转 - 发送
#10停止
- PID参数:
#12:L,10,0,1(设置左轮PID) - 寻迹阈值:
#18:3800(设置黑线检测阈值)
#define PLUS_PER_CYC 830 // 编码器每圈脉冲数
#define R_TIRE 0.0325f // 轮胎半径(米)
#define PWM_MAX 999 // PWM最大值// 速度环PID
PID_Init(&pid_L, 10.0f, 10.0f, 3.0f, 999.0f, -999.0f, 400.0f);
PID_Init(&pid_R, 10.0f, 10.0f, 3.0f, 999.0f, -999.0f, 400.0f);
// 偏航角PID
PID_Init(&pid_yaw, 1.0f, 0.0f, 0.0f, 10.0f, -10.0f, 400.0f);
// 循迹PID
PID_Init(&pid_trace, 0.5f, 0.0f, 0.05f, 10.0f, -10.0f, 400.0f);#define TRACE_CHANNELS 4 // 传感器数量
uint16_t black_threshold = 3790; // 黑线检测阈值小车循迹采用4状态状态机:
| 状态 | 说明 | 行为 |
|---|---|---|
| STATE_INIT | 初始化状态 | 等待检测到黑线 |
| STATE_TRACKING | 正常跟踪 | PID控制循迹 |
| STATE_GAP | 空白段 | 保持直线行驶 |
| STATE_TRANSITION | 过渡状态 | 旋转寻找黑线 |
-
小车不移动
- 检查电机驱动芯片STBY引脚
- 确认PWM输出正常
- 检查编码器接线
-
MPU6500无法读取数据
- 检查I2C接线(SCL/SDA)
- 确认MPU6500电源正常
- 检查I2C地址设置
-
蓝牙无法连接
- 检查串口波特率设置(38400)
- 确认蓝牙模块供电正常
- 检查USART2引脚配置
-
循迹不准确
- 调整黑线检测阈值
- 优化PID参数
- 检查传感器安装高度
- LED灯:用于状态指示
- 蜂鸣器:用于报警提示
- 串口调试:实时输出传感器数据
- 控制周期:10ms
- 速度范围:0-150 脉冲/10ms
- 角度控制精度:±1°
- 循迹速度:可调,典型值8-12脉冲/10ms
- 通信延迟:<50ms
本项目基于STM32 HAL库开发,遵循相应的开源协议。具体使用请参考各模块的许可证声明。
- STMicroelectronics 提供STM32系列芯片和HAL库
- 所有开源社区贡献者
- 项目参考了多篇技术博客和开源项目
如有问题或建议,请通过项目仓库的Issues页面提交。
版本:v1.0
最后更新:2025年
维护者:项目开发者