Skip to content

Latest commit

 

History

42 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

STM32 全向物料搬运车

基于 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调试信息]
Loading

任务时序

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: 抓取或释放物块
Loading

仓库结构

.
├── 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.cPWM.c 四轮方向和 PWM 输出
反馈控制 Encoder.cPID.cMy_PID.c 编码器速度采集与多环 PID 控制
姿态估计 Electronic control/User/mpu6050.cFilter.c MPU6050 采集、偏置和姿态滤波
通信 Electronic control/Hardware/Serial.cHMI.c UART4/UART5 收发和串口屏控件更新
机构驱动 Electronic control/System/Servo.cHardware/Step_Diver.c 舵机 PWM 与升降步进控制

接口说明

UART4:树莓派/视觉端

项目 配置
外设与引脚 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:串口屏

项目 配置
外设与引脚 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

  1. 安装 Keil MDK、ARM Compiler 5 和对应的 STM32F1xx_DFP 器件包。
  2. 打开 Electronic control/Project.uvprojx
  3. 选择目标 Target 1,确认器件为 STM32F103RC
  4. 执行 Rebuild。工程配置会生成 HEX 文件。
  5. 连接 ST-Link,选择正确的 Flash Download 配置后执行 Download

方式二:VS Code + EIDE

  1. 安装 VS Code 和 EIDE 插件。
  2. 打开 Electronic control/ 工程目录。
  3. 选择 Target 1,执行 Build;如需烧录,配置 ST-Link/CMSIS-DAP 后执行 Upload。

构建输出通常位于 Electronic control/Objects/;仓库中还保留了 Electronic control/build/Target 1/Project.hexProject.bin 等历史构建产物。由于这些文件可能与当前源码或本机工具链不完全同步,正式烧录前应在本地重新构建并检查生成时间。

测试与验证记录

当前仓库没有独立的自动化测试套件,也没有带日期、场地和仪器信息的完整实车测量数据。下表只记录可以从仓库直接确认的证据,以及后续应补齐的实测项。

验证项 当前证据/状态 复现方法
工程目标 已确认 Project.uvprojx 目标为 STM32F103RC 打开工程配置查看 Target 1
固件输出 仓库已有 Project.hexProject.binProject.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 构建;性能结论需要补充可追溯的实测数据。

后续改进方向

  1. 为 UART4/UART5 增加长度、校验和、超时和接收缓冲区边界保护。
  2. 将动作位置、PID 参数和控制周期集中到可版本化的配置文件或参数表。
  3. 拆分阻塞式抓取/放置流程为非阻塞状态机,并增加超时和急停路径。
  4. 清理生成文件,补充串口协议测试、控制算法离线测试和持续集成构建。
  5. 记录实车测试原始数据,形成位移误差、旋转误差、抓取成功率和任务耗时曲线。

版本记录

主要开发节点可通过 git log 查看,包含 3 月中旬的功能测试提交和 2025-04-01 的原 README 提交。本次 README 工程化整理提交时间设为 2025-04-13(UTC+8)

许可证与使用说明

仓库用于竞赛项目展示、学习和复现参考。使用者应在实际硬件上自行核对引脚、电源、机械限位、通信协议和安全措施;未经实测不得直接用于无人值守设备。

About

工巡赛物流搬运

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages