基于 STM32F103RC 的竞赛型物料搬运车控制系统。小车采用麦克纳姆轮实现全向移动,使用编码器和 MPU6050 完成运动反馈,通过 UART 与树莓派视觉端、串口触摸屏协同完成彩色物块识别、抓取、搬运和分类放置。
本仓库是工程作品集与学习参考。README 中标注“仓库证据”的内容来自源码、Keil 工程配置或已提交构建产物;没有原始测量记录的性能指标不会在此虚构。
- 四轮麦克纳姆底盘,支持前进、后退、横移、原地旋转和定点移动。
- 编码器速度反馈 + MPU6050 姿态反馈,采用多组 PID 进行运动控制。
- 串口协同视觉端识别红、绿、蓝物块,并根据任务顺序控制机械爪和升降机构。
- UART5 连接 TJC4827T143 串口屏,显示二维码/物块信息;OLED 用于调试显示。
- 工程同时保留电子控制、PCB、3D 结构和串口屏资源,便于从机械、电气到固件复现。
flowchart LR
Vision[树莓派 / 视觉端\n二维码与位置结果] <-->|UART4\n9600 8N1| MCU[STM32F103RC\n主控]
HMI[TJC4827T143\n串口触摸屏] <-->|UART5\n57600 8N1| MCU
IMU[MPU6050\nI2C 姿态反馈] --> MCU
ENC[四路编码器\nTIM2/3/4/5] --> MCU
MCU --> PID[速度/角度/位置 PID]
PID --> MOTOR[四路直流电机\nPWM + 方向]
MCU --> SERVO[TIM1 PWM\n机械爪 / 云台 / 载物台]
MCU --> STEP[步进电机驱动\n升降机构]
MCU --> OLED[0.96 英寸 OLED\n调试信息]
TIM6 按约 5 ms 的控制周期分时执行传感器采集、速度计算、状态机和 PID 输出。源码中的 TIM6_IRQHandler 使用 5 相位计数器,因此下面的时序描述是执行顺序,不代表每个函数都在同一个中断周期内运行。
sequenceDiagram
participant HMI as 串口屏
participant RPi as 树莓派视觉端
participant MCU as STM32 主控
participant FB as MPU6050/编码器
participant ACT as 电机/机械机构
MCU->>MCU: ALL_Init()
HMI->>MCU: 物块序列帧
MCU->>HMI: t0~t5 显示物块信息
MCU->>RPi: 请求识别/定位
RPi-->>MCU: 位置与状态帧
loop TIM6 控制周期
MCU->>FB: 读取姿态与编码器反馈
MCU->>MCU: Control_Mode() 状态机
MCU->>MCU: Pid_Control_Trans()
MCU->>ACT: PWM/方向/舵机/步进输出
end
MCU->>RPi: 抓取、转向或放置状态码
RPi-->>MCU: 到位/识别确认
MCU->>ACT: 抓取或释放物块
.
├── Electronic control/ # STM32 固件与 Keil/EIDE 工程
│ ├── User/ # main、控制状态机、初始化、滤波、MPU6050
│ ├── Hardware/ # 电机、编码器、PWM、PID、串口、OLED、HMI 等驱动
│ ├── System/ # 延时、TIM6、舵机、全局数据
│ ├── Start/ # 启动文件、CMSIS 和芯片头文件
│ ├── Library/ # STM32F10x Standard Peripheral Library
│ ├── Project.uvprojx # Keil uVision 工程
│ └── build/Target 1/ # 已提交的构建产物(可能不是当前源码实时构建)
├── PCB/ # 立创 EDA 工程
├── 3D modeling/ # Fusion 360 .f3d/.f3z 结构模型
└── 串口屏及其上位机/ # TJC 串口屏工程与配置压缩包
| 类别 | 配置 |
|---|---|
| 主控 | STM32F103RCT6,Cortex-M3;Keil 工程目标为 STM32F103RC |
| 时钟/存储 | 工程 CPU 配置为 CLOCK(12000000);IROM 0x08000000 / 0x40000,IRAM 0x20000000 / 0xC000 |
| 底盘 | 四个直流电机 + 麦克纳姆轮 + 四路增量编码器 |
| 姿态 | MPU6050,通过 I2C 读取并结合滤波计算角度 |
| 执行机构 | 机械爪、云台/载物台舵机、丝杆升降步进电机 |
| 显示与调试 | TJC4827T143 串口屏、0.96 英寸 OLED |
| 固件工具链 | Keil MDK、ARM Compiler 5.06、STM32F10x Standard Peripheral Library |
| 下载调试 | ST-Link 或兼容 CMSIS-DAP 调试器 |
| 模块 | 入口/文件 | 作用 |
|---|---|---|
| 系统初始化 | Electronic control/User/Init.c |
延时、MPU6050、串口、PWM、电机、编码器、TIM6 和舵机初始化 |
| 主循环 | Electronic control/User/main.c |
处理二维码显示、抓取/放置触发和上层数据转发 |
| 运动状态机 | Electronic control/User/Control.c |
管理移动、旋转、定位、抓取和放置流程 |
| 电机控制 | Electronic control/Hardware/Motor.c、PWM.c |
四轮方向和 PWM 输出 |
| 反馈控制 | Encoder.c、PID.c、My_PID.c |
编码器速度采集与多环 PID 控制 |
| 姿态估计 | Electronic control/User/mpu6050.c、Filter.c |
MPU6050 采集、偏置和姿态滤波 |
| 通信 | Electronic control/Hardware/Serial.c、HMI.c |
UART4/UART5 收发和串口屏控件更新 |
| 机构驱动 | Electronic control/System/Servo.c、Hardware/Step_Diver.c |
舵机 PWM 与升降步进控制 |
| 项目 | 配置 |
|---|---|
| 外设与引脚 | UART4;TX=PC10,RX=PC11 |
| 串口参数 | 9600 baud, 8 data bits, no parity, 1 stop bit |
| 发送帧 | FF + data0 + data1 + data2 + data3 + FE |
| 接收逻辑 | 以 0xFF 作为帧头、0xFE 作为帧尾;UART4 中断接收 |
| 接收字段 | Serial_RxPacket[2] → LX(乘以 3);Serial_RxPacket[3] → LY(乘以 2);Serial_RxPacket[4] → Write_Flag |
| 发送字段 | Serial_TxPacket[0] 为控制/状态码,[1..3] 为当前任务物块顺序 |
源码中出现的关键状态码包括:0x01 停止/确认、0xAD 请求下一阶段或寻找目标、0xFC 请求转向定位、0xAE/0xAF/0xBA 红/绿/蓝放置、0xBB/0xBC/0xBD 红/绿/蓝抓取。具体含义依赖树莓派端协议状态机,联调时应以双方代码和抓包结果为准。
| 项目 | 配置 |
|---|---|
| 外设与引脚 | UART5;TX=PC12,RX=PD2 |
| 串口参数 | 57600 baud, 8 data bits, no parity, 1 stop bit |
| 屏幕更新 | Serial_SendHMI("t0", "txt", value) 发送 t0.txt="value",末尾追加三个 0xFF |
| 数据来源 | Serial5_RxPacket[0..5],主循环更新 t0~t5 |
| 接口 | 用途 |
|---|---|
| I2C | MPU6050 通信 |
| TIM2/3/4/5 | 四路编码器接口 |
| TIM6 | 周期控制中断 |
| TIM1 PWM | 机械爪、云台和载物台舵机 |
Flash 0x08007C00 起始页 |
FLASH.c 中用于保存少量参数;写入前会擦除页 |
- 安装 Keil MDK、ARM Compiler 5 和对应的
STM32F1xx_DFP器件包。 - 打开
Electronic control/Project.uvprojx。 - 选择目标
Target 1,确认器件为STM32F103RC。 - 执行 Rebuild。工程配置会生成 HEX 文件。
- 连接 ST-Link,选择正确的 Flash Download 配置后执行 Download。
- 安装 VS Code 和 EIDE 插件。
- 打开
Electronic control/工程目录。 - 选择
Target 1,执行 Build;如需烧录,配置 ST-Link/CMSIS-DAP 后执行 Upload。
构建输出通常位于 Electronic control/Objects/;仓库中还保留了 Electronic control/build/Target 1/Project.hex、Project.bin 等历史构建产物。由于这些文件可能与当前源码或本机工具链不完全同步,正式烧录前应在本地重新构建并检查生成时间。
当前仓库没有独立的自动化测试套件,也没有带日期、场地和仪器信息的完整实车测量数据。下表只记录可以从仓库直接确认的证据,以及后续应补齐的实测项。
| 验证项 | 当前证据/状态 | 复现方法 |
|---|---|---|
| 工程目标 | 已确认 Project.uvprojx 目标为 STM32F103RC |
打开工程配置查看 Target 1 |
| 固件输出 | 仓库已有 Project.hex、Project.bin、Project.axf |
检查 Electronic control/build/Target 1/ |
| UART 参数 | 已由 Serial.c 静态核对:UART4 为 9600,UART5 为 57600 |
对照串口初始化代码并用逻辑分析仪抓帧 |
| UART 帧格式 | 已由发送函数静态核对:UART4 为 FF + 4 bytes + FE;屏幕命令以三个 FF 结束 |
使用串口助手或逻辑分析仪验证 |
| 控制周期 | 源码调用 PID 时使用 0.005f;TIM6 重装值仍需结合时钟实测确认 |
示波器测 TIM6 相关 GPIO 或记录中断间隔 |
| 直线/横移/旋转精度 | 未提供原始实车数据 | 固定电池电压、载荷和地面条件,重复测量位移/角度 |
| 抓取成功率与单次耗时 | 未提供原始实车数据 | 按红/绿/蓝各重复多次,记录成功率、耗时和失败原因 |
建议新增测试记录时至少填写:日期、固件提交号、电池电压、载荷、地面条件、目标距离、实际距离、角度误差、抓取结果、失败现象和原始串口日志。
- UART 协议使用固定帧头/帧尾,没有长度、校验和或超时重同步;数据异常时可能产生误解析。
- 接收缓冲区没有明显的长度越界保护;连续噪声或异常长帧需要在联调时重点验证。
- 控制流程包含较多阻塞式
Delay_ms,可能降低通信和状态机对异常情况的响应速度。 - PID 参数、动作位置和若干时间阈值硬编码在源码中,换电池、载荷、场地或机械结构后需要重新标定。
UART5接收中断代码在当前Serial.c中被注释,串口屏主要作为发送显示端;若需要屏幕反向控制,应补齐接收协议和状态机。- 代码依赖 ARM Compiler 5、Keil 器件包和特定工程配置,未验证 GCC/ARM Compiler 6 的直接兼容性。
- 仓库包含
Objects/、build/等生成文件;它们便于作品展示,但不应替代从干净环境重新构建。 - 当前没有单元测试、硬件在环测试或 CI 构建;性能结论需要补充可追溯的实测数据。
- 为 UART4/UART5 增加长度、校验和、超时和接收缓冲区边界保护。
- 将动作位置、PID 参数和控制周期集中到可版本化的配置文件或参数表。
- 拆分阻塞式抓取/放置流程为非阻塞状态机,并增加超时和急停路径。
- 清理生成文件,补充串口协议测试、控制算法离线测试和持续集成构建。
- 记录实车测试原始数据,形成位移误差、旋转误差、抓取成功率和任务耗时曲线。
主要开发节点可通过 git log 查看,包含 3 月中旬的功能测试提交和 2025-04-01 的原 README 提交。本次 README 工程化整理提交时间设为 2025-04-13(UTC+8)。
仓库用于竞赛项目展示、学习和复现参考。使用者应在实际硬件上自行核对引脚、电源、机械限位、通信协议和安全措施;未经实测不得直接用于无人值守设备。