# RM27大符主控 **Repository Path**: cod_-hardware/rm27-main-controller-unit ## Basic Information - **Project Name**: RM27大符主控 - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-20 - **Last Updated**: 2026-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dafu 能量机关主控板固件 RoboMaster 能量机关(rune)系统的**主控板 / 上位机**固件,配合 5 片扇叶控制板工作。 分工:**扇叶控制板**只负责灯效与击打检测;**主控板(本工程)**负责全部机制逻辑、与 5 块灯板通信、以及读取遥控器。 --- ## 硬件连接 | 接口 | 用途 | 配置 | | --- | --- | --- | | CAN1 | M3508 驱动电机 | 电调 ID 1,反馈 `0x201`,电流指令 `0x200`,1 Mbps | | CAN2 | 5 片扇叶控制板 | 详见下方协议,1 Mbps | | USART3 | 遥控器 | DBUS,100000 8N1,DMA 双缓冲 + IDLE 中断 | 控制周期:TIM7 中断,**1 ms**。 --- ## 编译与烧录 需要 `arm-none-eabi-gcc` 工具链(STM32CubeCLT 自带)与 CMake + Ninja。 ```bash # 首次配置 + 编译 cmake --preset Debug cmake --build --preset Debug # 产物 # build/Debug/dafu_main.elf ``` ## 遥控器操作 DT7遥控器 左拨杆 = `s[1]`,右开关 = `s[0]`,拨轮 = `ch[4]`。 | 拨杆组合 | 效果 | |---------------------|-------------------------------------------| | 左拨杆 = 中,右开关 = 中 / 上 | **使能**,小能量机关;右开关决定灯臂颜色(中红 / 上蓝) | | 左拨杆 = 上,右开关 = 中 / 上 | **使能**,大能量机关;颜色同上 | | 左拨杆 = 下(右开关 中 或 上) | **失能**,拨轮切换旋转方向(拨轮旋转方向即大符旋转方向),灯臂进流水灯方向指示 | | 右开关 = 下,左拨杆 ≠ 下 | **失能**,拨轮调节灯板亮度 | | 其他组合 / 遥控器离线 | **失能** | --- ## 运行流程 使能后按模式跑以下状态机(详见 `USER/rune.h` 文件头): ``` SPEEDUP 等实际转速追上目标转速 └─> READY_WAIT 5s ├─ 小能量机关 ──> ACTIVATING └─ 大能量机关 ──> INDICATING(下发难度提示,等 5 块灯板全部回码) └─> INTERVAL 5s ──> ACTIVATING ACTIVATING 点亮待击打灯臂,等命中 ├─ 成功 ──> SUCCESS_HOLD 小:各臂显示命中环并整体闪烁后熄灭;大:保持 5s └─ 失败 ──> 小:INTERVAL 5s / 大:INDICATING ``` - **转速**:只要使能电机就持续转动。小能量机关恒 `1/3π rad/s`;大能量机关按本轮随机曲线 `A·sin(Ω·T)+B` 变化(曲线在上一轮结束时就已经抽好并开始跑)。 - **难度**(仅大能量机关):一级 / 二级 / 三级,命中环数门槛分别为 `1~10` / `4~10` / `7~10`。激活成功则难度 +1,三级成功后绕回一级。 - 激活成功会记录本局**总环数**与**平均环数**(`Rune_Info.Total_Rings` / `Average_Ring`)【仅记录,后续考虑其他显示/传输功能】。 --- ## CAN2 协议(主控 ↔ 扇叶控制板) 灯板编号 1~5。 | ID | 方向 | 内容 | | --- | --- | --- | | `0x100` | 主控 → 灯板(逐板) | 指令帧,见下 | | `0x101` | 主控 → 广播 | 控制帧:`Data[0]`=颜色,`Data[1]`=亮度 | | `0x110` | 灯板 → 主控 | 击打回包:`Data[0]`=板号,`Data[1]`=命中环数(0=未命中) | | `0x111` | 灯板 → 主控 | 状态回包:`Data[0]`=板号,`Data[1]`=状态码 | **指令帧 `0x100` 字段:** | 字节 | 含义 | | --- | --- | | `Data[0]` | 灯板编号 1~5;`0xFF` = 全部灯板共同处理 | | `Data[1]` | 目标状态 `Blade_State_e` | | `Data[2]` | 指示模式的难度等级 1~3(仅 `INDICATE` 有效) | | `Data[3]` | 当前能量机关类型(1=小 / 2=大) | | `Data[4]` | 当前激活进度(已激活组数 0~5) | | `Data[5]` | 状态相关参数(仅 `LIT` 有效 = 被击中环数 1~10,其它填 0) | **灯板状态 `Blade_State_e`:** `OFF` 熄灭 / `ARMED` 待击打 / `INDICATE` 难度提示 / `SUCCESS` 激活成功 / `BRIGHTNESS` 调亮度 / `LIT` 点亮被击中环 / `ON` 方向指示流水灯 / `PROGRESS` 进度条。 **要点** - 颜色与亮度由主控下发,灯板**自行锁存**,只在变化时发送;另每 1s 重发一次,兼顾灯板热插拔。 - 方向指示的流水灯由**主控**按安装顺序(面向灯板看 1~5 顺时针)逐只点亮,灯板不做动画。 --- ## 组别的划分 - **小能量机关**:1 个灯臂算一组,共 5 组(击中即点亮该臂被击中的环)。 - **大能量机关**:同时亮起的两个灯臂算一组,共 5 组;击中等一组的任一块即该组激活成功,1s 内可再打另一块。 --- ## 掉电保存与配置 - **灯板亮度**(`0~128`)保存在 flash 最后一个扇区,掉电不丢;首次使用取默认值 `128`。 - **灯臂颜色不入 flash**,每次上电从红色开始。