| Drivers | ||
| Middlewares | ||
| User | ||
| compile_commands.json | ||
| LICENSE | ||
| Makefile | ||
| pid.txt | ||
| pinMap.txt | ||
| README.md | ||
| serial.txt | ||
| startup_stm32f407xx.s | ||
| stm32f407zgtx_flash.ld | ||
| vofa+.cmds.json | ||
| vofa+.tabviews.json | ||
STM32 RoboGame Project (Linux)
这是 USTC RoboGame 2024 冰淇凌烤布蕾队的基于 STM32 系列单片机的机器人控制系统。该项目实现了包括麦克纳姆轮底盘、机械臂、电动推杆和摩擦轮在内的完整机器人控制功能。
目录
项目简介
本项目是一个完整的 STM32 嵌入式机器人控制系统,主要功能包括:
- 基于麦克纳姆轮的全向移动底盘控制
- 机械臂抓取与放置控制
- 电动推杆升降控制
- 摩擦轮发射机构控制
- 基于 PID 的电机速度闭环控制
- 串口指令解析与执行
硬件配置
主控制器
- MCU: STM32F407ZGTx (Cortex-M4, 168MHz)
- Flash: 1MB
- RAM: 192KB
- FPU: 硬件浮点单元 (FPV4-SP-D16)
电机系统
- 数量: 3 个带编码器的直流减速电机 (X, Y, Z 轴)
- 编码器分辨率: 500 线 (四倍频 2000 CPR)
- 减速比: 1:27
- 控制方式: PWM + 方向控制 + 编码器反馈
- 轮子周长: 398.98 mm
执行机构
- 机械臂: 4 自由度舵机控制 (下抓、上抓、上放、下放)
- 电动推杆: 双向驱动控制
- 摩擦轮: PWM 调速控制
接口
- 控制接口: UART 串口通信
- 调试/编程接口: SWD
功能特性
1. 全向移动控制
- 支持三轴独立速度控制
- PID 闭环速度控制,精确调速
- 实时速度反馈 (基于编码器)
- 速度范围: ±2000 (PWM 占空比单位)
2. 机械臂控制
- 预定义动作:
arm_reset(): 复位到初始位置arm_down_open(): 下降并打开爪子arm_down_close(): 下降并关闭爪子arm_up_close(): 上升并保持关闭arm_up_open(): 上升并打开爪子arm_pick(): 完整抓取流程arm_place(): 完整放置流程
3. 发射机构
- 电动推杆控制发射角度
- 摩擦轮提供发射动力
- 支持自动发射流程
4. PID 控制系统
- 三轴独立 PID 控制器
- 支持在线参数调整
- 10Hz 控制频率 (100ms 周期)
- 实时速度反馈与调节
项目结构
stm32-robogame-project-linux/
├── Makefile # 编译配置文件
├── LICENSE # MIT 许可证
├── startup_stm32f407xx.s # 启动文件
├── stm32f407zgtx_flash.ld # 链接脚本
├── compile_commands.json # C/C++ 智能提示配置
├── User/ # 用户代码
│ ├── Inc/
│ │ ├── stm32f4xx_hal_conf.h # HAL 库配置
│ │ └── stm32f4xx_it.h # 中断处理
│ └── Src/
│ ├── main.c # 主程序
│ └── stm32f4xx_it.c # 中断实现
├── Drivers/
│ ├── BSP/ # 板级支持包
│ │ ├── Inc/
│ │ │ ├── arm.h # 机械臂控制
│ │ │ ├── motor.h # 电机驱动
│ │ │ ├── mctrl.h # 电机 PID 控制
│ │ │ ├── wheel.h # 摩擦轮控制
│ │ │ ├── lifter.h # 推杆控制
│ │ │ ├── serial.h # 串口通信
│ │ │ ├── led.h # LED 指示
│ │ │ └── callback.h # 回调函数
│ │ └── Src/ # BSP 实现文件
│ ├── CMSIS/ # ARM CMSIS 库
│ ├── STM32F4xx_HAL_Driver/ # STM32 HAL 库
│ └── SYSTEM/ # 系统级驱动
└── Middlewares/ # 中间件
环境搭建
Linux 开发环境
必需工具
Arch Linux:
# 安装 ARM GCC 工具链和 newlib
sudo pacman -Sy arm-none-eabi-gcc arm-none-eabi-newlib
# 安装 Make 工具
sudo pacman -S make
# 安装 PyOCD (用于烧录和调试)
pip install pyocd
Debian/Ubuntu:
# 安装 ARM GCC 工具链
sudo apt-get install gcc-arm-none-eabi
# 安装 Make 工具
sudo apt-get install make
# 安装 PyOCD (用于烧录和调试)
pip install pyocd
验证安装
arm-none-eabi-gcc --version
make --version
pyocd --version
硬件连接
- 通过 SWD 接口连接调试器 (ST-Link/J-Link/DAPLink)
- 连接串口至 PC (用于调试和指令发送)
- 确保电源供电充足
编译与烧录
编译项目
# 清理旧的编译文件
make clean
# 编译项目
make
# 编译成功后会生成:
# - build/target.elf (带调试信息)
# - build/target.hex (HEX 格式)
# - build/target.bin (二进制格式)
烧录程序
# 烧录二进制文件到芯片
make load
# 或使用 pyocd 手动烧录
pyocd load -t stm32f407zgtx build/target.bin
擦除芯片
make erase
编译选项
可以在 Makefile 中修改:
DEBUG = 1: 启用调试信息OPT = -Og: 优化级别 (调试用 -Og,发布用 -O2/-O3)
串口通信协议
通信参数
- 波特率: 115200
- 数据位: 8
- 停止位: 1
- 校验位: 无
- 流控: 无
指令格式
指令采用文本格式,以冒号 : 分隔参数,以换行符结束。
响应码
RDY- 系统就绪YYY- 指令执行成功HHH- 中间状态提示NNN- 指令执行失败
支持的指令
1. 复位指令
RST
动作:
- 停止所有电机
- 机械臂复位
- 关闭摩擦轮
2. 机械臂控制指令
简单动作
ARM:<group>
参数说明:
0: 复位1: 下降并打开2: 下降并关闭3: 上升并保持关闭4: 上升并打开
示例:
ARM:1 # 机械臂下降并打开
复杂动作
PIC:<part>
参数说明:
1: 仅执行抓取动作2: 仅执行放置动作3: 仅复位- 其他: 完整抓取-放置流程
示例:
PIC:0 # 完整流程
PIC:1 # 仅抓取
3. 电机速度控制指令
MTR:<speedx>:<speedy>:<speedz>
参数说明:
speedx: X 轴速度 (-2000 ~ 2000)speedy: Y 轴速度 (-2000 ~ 2000)speedz: Z 轴速度 (-2000 ~ 2000)
示例:
MTR:1000:500:-800 # X轴1000,Y轴500,Z轴-800
MTR:0:0:0 # 停止所有电机
5. 发射控制
THR:<stage>
参数说明:
1: 推杆上升准备2: 完整发射流程 (摩擦轮+推杆)
示例:
THR:2 # 执行发射
6. PID 参数设置
SET:<motor>:<param>:<value>
参数说明:
motor: 电机编号 (1=X轴, 2=Y轴, 3=Z轴)param: 参数类型 (1=Kp, 2=Ki, 3=Kd)value: 参数值 (浮点数)
示例:
SET:1:1:2.5 # 设置 X 轴 Kp = 2.5
SET:2:2:0.1 # 设置 Y 轴 Ki = 0.1
SET:3:3:0.05 # 设置 Z 轴 Kd = 0.05
7. 查询 PID 参数
GET:<motor>
参数说明:
motor: 电机编号 (1=X轴, 2=Y轴, 3=Z轴)
响应格式:Kp Ki Kd
示例:
GET:1 # 查询 X 轴 PID 参数
# 响应: 2.500000 0.100000 0.050000
8. 查询实时速度
SPD
响应格式:speedx speedy speedz (单位: mm/s)
示例:
SPD
# 响应: 150.234 -80.567 200.123
9. 完整流程演示
PAS
演示所有功能:
- 机械臂完整动作序列
- 摩擦轮启动
- 推杆上升/下降
PID 参数调试
PID 控制原理
系统采用增量式 PID 算法进行速度控制:
\Delta u = K_p (e_k - e_{k-1}) + K_i \cdot e_k + K_d (e_k - 2 e_{k-1} + e_{k-2})
其中:
e_k: 当前误差e_{k-1}: 上一次误差e_{k-2}: 上上次误差
调试步骤
PID 参数调试(ESP8266 + VOFA+)
PID 参数调试使用 ESP8266 单片机配合 VOFA+ 软件进行实时调试:
-
硬件连接
- ESP8266 TX <--> STM32 RX
- ESP8266 RX <--> STM32 TX
- 共地连接 (GND)
- 配置波特率:115200
-
软件架构
- VOFA+:运行在 PC 端,提供可视化调试界面
- ESP8266:作为 Wi-Fi 透传模块
- 通过串口与 STM32 通信
- 通过 TCP 连接与 VOFA+ 通信
- 实时转发双向数据
-
VOFA+ 配置
- 连接方式:TCP 客户端模式
- 目标地址:ESP8266 的 IP 地址
- 端口:通常为 8080 或自定义端口
- 协议:无,仅作为中间人进行数据转发
-
调试流程
- 启动 VOFA+,通过 TCP 连接到 ESP8266
- 在 VOFA+ 界面实时显示电机速度曲线
- 通过 VOFA+ 发送 SET 指令调整 PID 参数
- 发送 MTR 指令测试电机响应
- 观察速度曲线,评估 PID 效果:
- 检查是否有超调
- 观察稳态误差
- 分析响应速度
- 迭代调整参数直至满意
- 使用 GET 指令确认并保存最终参数
-
VOFA+ 优势
- 实时可视化速度曲线
- 直观观察 PID 控制效果
- 支持多通道同时显示(X/Y/Z 三轴)
- 可保存调试数据用于分析
-
调试技巧
-
初始化参数:
SET:1:1:1.0 # Kp = 1.0 SET:1:2:0.0 # Ki = 0.0 SET:1:3:0.0 # Kd = 0.0 -
调节 Kp:逐步增大直到出现振荡,然后减小至稳定值的 60%-80%
-
调节 Ki:从小开始增加,消除稳态误差,过大会导致超调
-
调节 Kd:适当增加减少超调,过大会对噪声敏感
-
验证效果:
MTR:1000:0:0 # 设置目标速度 SPD # 查看实际速度
-
其他功能调试(树莓派)
日常控制和功能调试通过树莓派上位机进行:
-
硬件连接
- 树莓派通过 USB 转串口模块或 GPIO 串口连接 STM32
- 配置波特率:115200
-
上位机程序
- 树莓派运行控制程序
- 发送运动控制指令(MTR、ARM、THR 等)
- 实时接收状态反馈
-
典型调试场景
- 机械臂动作测试
- 底盘移动控制
- 发射机构调试
- 完整流程演示
-
备用调试方法
如需直接通过 PC 调试,可使用串口工具:
- 连接串口工具 (minicom, screen, 或串口助手)
- 配置波特率 115200
- 发送指令进行测试
调试与监控
LED 状态指示
- LED0 以 1Hz 频率闪烁表示系统正常运行
调试架构
本项目采用双控制器架构:
- ESP8266:专用于 PID 参数调试,通过串口与 STM32 通信
- 树莓派:作为主控上位机,负责机器人运动控制和功能调试
硬件连接
-
STM32 ↔ ESP8266(PID 调试)
- ESP8266 TX → STM32 RX
- ESP8266 RX → STM32 TX
- 共地连接 (GND)
- 波特率:115200
-
STM32 ↔ 树莓派(主控)
- 通过 USB 转串口或 GPIO 串口连接
- 波特率:115200
PID 调试流程(ESP8266)
- ESP8266 通过 Wi-Fi 接收 PID 参数调整指令
- 发送 SET 指令设置 PID 参数
- 发送 MTR 指令启动电机测试
- 使用 SPD 指令实时监控速度反馈
- 根据响应迭代优化参数
- 使用 GET 指令保存确认最终参数
功能调试流程(树莓派)
- 树莓派运行控制程序
- 发送运动控制指令测试各项功能:
- 底盘移动(MTR 指令)
- 机械臂操作(ARM/PIC 指令)
- 发射机构(THR 指令)
- 监控响应码和状态反馈
- 进行完整流程联调### 常见问题
问题 1: 编译错误 arm-none-eabi-gcc: command not found
- 解决方案: 安装 ARM GCC 工具链
- Arch Linux:
sudo pacman -Sy arm-none-eabi-gcc arm-none-eabi-newlib - Debian/Ubuntu:
sudo apt-get install gcc-arm-none-eabi
- Arch Linux:
问题 2: 烧录失败
- 检查调试器连接
- 确认目标芯片型号:
pyocd list - 尝试擦除后重新烧录:
make erase && make load
问题 3: 电机不转或转速不稳定
- 检查 PID 参数是否合理
- 确认编码器连接正常
- 检查电源供电是否充足
问题 4: 串口无响应
- 检查串口波特率配置
- 确认 TX/RX 引脚连接正确
- 查看 LED 是否闪烁 (判断系统是否运行)
开发指南
添加新功能
- 在
Drivers/BSP/Inc/添加头文件 - 在
Drivers/BSP/Src/实现功能 - 在
User/Src/main.c中集成 - 重新编译并测试
修改 PID 控制周期
在 mctrl.h 中修改:
#define MCTRL_ARR (10000 - 1) // 自动重载值
#define MCTRL_PSC (840 - 1) // 预分频系数
// 频率 = 84MHz / (PSC+1) / (ARR+1)
修改电机 PWM 频率
在 motor.h 中修改:
#define MOTORX_ARR (6000 - 1) // 自动重载值
#define MOTORX_PSC (7 - 1) // 预分频系数
// 频率 = 168MHz / (PSC+1) / (ARR+1)
许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件