This is a stm32 project for 2024 robogame using archlinux + vscode + pyocd
Find a file
2025-11-26 13:43:35 +08:00
Drivers chore: init commit 2025-06-25 16:27:16 +08:00
Middlewares chore: init commit 2025-06-25 16:27:16 +08:00
User chore: init commit 2025-06-25 16:27:16 +08:00
compile_commands.json chore: init commit 2025-06-25 16:27:16 +08:00
LICENSE Initial commit 2025-06-25 16:25:51 +08:00
Makefile chore: init commit 2025-06-25 16:27:16 +08:00
pid.txt chore: init commit 2025-06-25 16:27:16 +08:00
pinMap.txt chore: init commit 2025-06-25 16:27:16 +08:00
README.md docs: update README 2025-11-26 13:43:35 +08:00
serial.txt chore: init commit 2025-06-25 16:27:16 +08:00
startup_stm32f407xx.s chore: init commit 2025-06-25 16:27:16 +08:00
stm32f407zgtx_flash.ld chore: init commit 2025-06-25 16:27:16 +08:00
vofa+.cmds.json chore: init commit 2025-06-25 16:27:16 +08:00
vofa+.tabviews.json chore: init commit 2025-06-25 16:27:16 +08:00

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

硬件连接

  1. 通过 SWD 接口连接调试器 (ST-Link/J-Link/DAPLink)
  2. 连接串口至 PC (用于调试和指令发送)
  3. 确保电源供电充足

编译与烧录

编译项目

# 清理旧的编译文件
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轴1000Y轴500Z轴-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+ 软件进行实时调试:

  1. 硬件连接

    • ESP8266 TX <--> STM32 RX
    • ESP8266 RX <--> STM32 TX
    • 共地连接 (GND)
    • 配置波特率115200
  2. 软件架构

    • VOFA+:运行在 PC 端,提供可视化调试界面
    • ESP8266:作为 Wi-Fi 透传模块
      • 通过串口与 STM32 通信
      • 通过 TCP 连接与 VOFA+ 通信
      • 实时转发双向数据
  3. VOFA+ 配置

    • 连接方式TCP 客户端模式
    • 目标地址ESP8266 的 IP 地址
    • 端口:通常为 8080 或自定义端口
    • 协议:无,仅作为中间人进行数据转发
  4. 调试流程

    • 启动 VOFA+,通过 TCP 连接到 ESP8266
    • 在 VOFA+ 界面实时显示电机速度曲线
    • 通过 VOFA+ 发送 SET 指令调整 PID 参数
    • 发送 MTR 指令测试电机响应
    • 观察速度曲线,评估 PID 效果:
      • 检查是否有超调
      • 观察稳态误差
      • 分析响应速度
    • 迭代调整参数直至满意
    • 使用 GET 指令确认并保存最终参数
  5. VOFA+ 优势

    • 实时可视化速度曲线
    • 直观观察 PID 控制效果
    • 支持多通道同时显示X/Y/Z 三轴)
    • 可保存调试数据用于分析
  6. 调试技巧

    • 初始化参数:

      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             # 查看实际速度
      

其他功能调试(树莓派)

日常控制和功能调试通过树莓派上位机进行:

  1. 硬件连接

    • 树莓派通过 USB 转串口模块或 GPIO 串口连接 STM32
    • 配置波特率115200
  2. 上位机程序

    • 树莓派运行控制程序
    • 发送运动控制指令MTR、ARM、THR 等)
    • 实时接收状态反馈
  3. 典型调试场景

    • 机械臂动作测试
    • 底盘移动控制
    • 发射机构调试
    • 完整流程演示
  4. 备用调试方法

    如需直接通过 PC 调试,可使用串口工具:

    • 连接串口工具 (minicom, screen, 或串口助手)
    • 配置波特率 115200
    • 发送指令进行测试

调试与监控

LED 状态指示

  • LED0 以 1Hz 频率闪烁表示系统正常运行

调试架构

本项目采用双控制器架构:

  • ESP8266:专用于 PID 参数调试,通过串口与 STM32 通信
  • 树莓派:作为主控上位机,负责机器人运动控制和功能调试

硬件连接

  1. STM32 ↔ ESP8266PID 调试)

    • ESP8266 TX → STM32 RX
    • ESP8266 RX → STM32 TX
    • 共地连接 (GND)
    • 波特率115200
  2. STM32 ↔ 树莓派(主控)

    • 通过 USB 转串口或 GPIO 串口连接
    • 波特率115200

PID 调试流程ESP8266

  1. ESP8266 通过 Wi-Fi 接收 PID 参数调整指令
  2. 发送 SET 指令设置 PID 参数
  3. 发送 MTR 指令启动电机测试
  4. 使用 SPD 指令实时监控速度反馈
  5. 根据响应迭代优化参数
  6. 使用 GET 指令保存确认最终参数

功能调试流程(树莓派)

  1. 树莓派运行控制程序
  2. 发送运动控制指令测试各项功能:
    • 底盘移动MTR 指令)
    • 机械臂操作ARM/PIC 指令)
    • 发射机构THR 指令)
  3. 监控响应码和状态反馈
  4. 进行完整流程联调### 常见问题

问题 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

问题 2: 烧录失败

  • 检查调试器连接
  • 确认目标芯片型号: pyocd list
  • 尝试擦除后重新烧录: make erase && make load

问题 3: 电机不转或转速不稳定

  • 检查 PID 参数是否合理
  • 确认编码器连接正常
  • 检查电源供电是否充足

问题 4: 串口无响应

  • 检查串口波特率配置
  • 确认 TX/RX 引脚连接正确
  • 查看 LED 是否闪烁 (判断系统是否运行)

开发指南

添加新功能

  1. Drivers/BSP/Inc/ 添加头文件
  2. Drivers/BSP/Src/ 实现功能
  3. User/Src/main.c 中集成
  4. 重新编译并测试

修改 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 文件