一、项目概述
本项目围绕电机运行状态识别展开,使用 NUCLEO-H533RE 开发板、Grove LIS3DH 三轴加速度计扩展板以及 ULN2003 步进电机驱动套装,完成电机启停控制和振动数据采集。后续计划借助 NanoEdge AI Studio,构建能够区分“停止”和“运行”两种状态的分类模型,并部署到 STM32。
项目的核心思路是:通过固定安装的加速度计采集电机振动信号,经串口保存数据,在电脑端完成数据整理和模型开发,再将生成的算法库集成到固件,实现本地状态识别及提示。
开发工作分为五个阶段:
搭建开发环境,验证程序下载和串口通信。
驱动电机,实现按钮及串口启停控制。
调通 LIS3DH,采集三轴加速度。
整理停止、运行两类数据,完成模型训练与验证。
部署模型,测试实际识别效果。
目前已完成电机控制、传感器通信和首轮两类数据采集,尚未开展 NanoEdge AI Studio 模型训练与部署。
二、硬件选择与系统框图
器件型号或规格用途| ST 开发板 | NUCLEO-H533RE,STM32H533RE | 外设控制、数据采集及后续模型推理 |
| 三轴加速度计 | Grove LIS3DH,114020121 | 采集 X、Y、Z 三轴加速度 |
| 电机驱动套装 | Seeed 105990072,ULN2003 驱动板与步进电机 | 提供可控制的电机振动源 |
| 调试与下载接口 | 板载 ST-LINK/V3 | 固件下载、调试及虚拟串口通信 |
| LED | 板载 LD2 | 预留作状态指示,当前程序未启用 |
| 蜂鸣器 | 尚未选型、接入 | 后续用于状态切换或异常提示 |
| 电机电源 | 按电机铭牌额定电压配置,实际规格待记录 | 为电机驱动板供电 |
本阶段 LIS3DH 使用 ±2g 量程。该器件提供三轴加速度数据,不包含陀螺仪。
系统结构如下:
电脑 │ USB:下载、串口控制、数据保存 ▼ NUCLEO-H533RE ├─ I²C ← LIS3DH 三轴加速度计 │ ↑ │ 电机机械振动 ├─ GPIO → ULN2003 → 步进电机 ├─ GPIO ← 板载 B1 用户按钮 ├─ GPIO → 板载 LED(预留) └─ PWM → 蜂鸣器(后续接入) 电脑端后续流程: 数据整理 → NanoEdge AI Studio → 算法库 → STM32 固件集成
电机控制指令用于建立采集标签。最终识别结果必须由加速度信号和模型计算得到,不能直接用电机控制变量代替。
三、硬件连接与安装
3.1 LIS3DH 连接
传感器连接到开发板 Arduino 接口中的专用 I²C 引脚。
LIS3DH 接口NUCLEO-H533RE 接口STM32 引脚| SCL | Arduino D15/SCL | PB6 |
| SDA | Arduino D14/SDA | PB7 |
| GND | GND | — |
| VCC | 按扩展板要求连接兼容电源 | 实际接法待记录 |
本阶段程序使用 I²C1,配置总线速率为 400 kHz,检测到的传感器地址为 0x19。
这里的 I²C 接口为 D14/D15,不能直接套用其他 Arduino 开发板将 A4/A5 作为 I²C 的接法。I²C 上拉电压需与 STM32 引脚电平兼容。
3.2 电机驱动板连接
ULN2003 驱动板接口NUCLEO-H533RE 接口STM32 引脚| IN1 | D2 | PC8 |
| IN2 | D3 | PB3 |
| IN3 | D4 | PB5 |
| IN4 | D5 | PB4 |
| GND | GND | — |
| 电源正极 | 电机电源正极 | — |
| 电源负极 | 电机电源负极,并与开发板共地 | — |
| 电机插座 | 连接套装步进电机 | — |
3.3 机械安装
传感器应固定在电机外壳或刚性安装支架上,同时固定线缆,减少线缆晃动造成的干扰。训练采集和部署测试期间,应保持安装位置、轴向及紧固方式一致。
本轮已获得能够反映电机启停差异的真实加速度数据,但传感器具体安装位置、固定方式和电源规格尚未记录,需要在正式采集前补充。
硬件实物图、传感器安装特写及接线照片尚待拍摄归档。
四、开发环境搭建及基础功能调试
本项目当前实际采用 Zephyr RTOS 开发,使用本地 Zephyr 工作区和 SDK 编译,通过板载 ST-LINK 下载程序,利用 ST-LINK 虚拟串口进行控制和数据采集。
项目实际配置| Zephyr 源码版本 | 构建标识 v4.4.0-8295-g0bd807ceeb75 |
| Zephyr SDK | 1.0.1 |
| west | 1.5.0 |
| 目标板 | nucleo_h533re/stm32h533xx |
| 下载工具 | pyOCD,通过板载 ST-LINK |
| 电脑端采集 | Python、pyserial |
| 串口 | 本次为 /dev/ttyACM0,115200、8N1 |
工程已配置以下功能:
GPIO:四路电机驱动输出及 B1 用户按钮输入。
I²C1:读取 LIS3DH。
UART:接收启停命令,输出调试信息和加速度数据。
独立线程:读取传感器,主循环处理电机和控制命令。
本阶段未接入蜂鸣器,也未实现 LED 状态提示。
实际启动日志包含:
Commands: 1=on, 0=off (button still works), s=stream, q=quiet READY,LIS3DH,addr=0x19,200Hz,2g,12bit,units=mg
固件已完成编译、烧录和复位运行。当前版本资源占用如下:
资源使用量| Flash | 21,364 字节 |
| 链接器报告的 RAM 区域 | 7,536 字节 |
以上为采集与电机控制程序的资源占用,不包含后续模型库。
五、电机控制与加速度采集
5.1 电机控制
电机采用八拍半步相序,四路输入按以下状态循环切换:
IN1 IN2 IN3 IN4 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1
初始换相间隔为 4 ms,随后调整为 2 ms,提高运行速度。当前尚未测量实际输出轴转速。
支持两种控制方式:
控制方式行为| B1 用户按钮 | 按住运行,松开停止 |
| 串口发送 1 | 持续运行 |
| 串口发送 0 | 取消串口运行请求 |
按钮与串口运行请求采用“或”逻辑。因此,发送 0 时若仍按住 B1,电机仍会运行。
本项目当前将“停止”定义为:停止换相,并将 IN1~IN4 全部置低,释放线圈。
5.2 LIS3DH 配置
程序检查传感器地址和设备标识后,配置量程、工作模式及输出数据率。通过轮询数据就绪标志读取新样本,避免无条件重复读取输出寄存器。
参数本阶段实际配置| I²C 地址 | 0x19 |
| I²C 总线速率 | 400 kHz |
| 加速度量程 | ±2g |
| 工作模式 | 高分辨率,12 位 |
| 配置输出数据率 | 200 Hz |
| 实测数据输出速率 | 约 196.27 Hz |
| 数据单位 | mg |
| 串口 | 115200、8N1 |
| 模型窗口 | 尚未确定,拟从每轴 256 点开始 |
若采用每轴 256 点的窗口,按本轮实测采样速率,单窗口覆盖时间约为 1.30 秒。
数据包含重力分量,换算关系为:
1000 mg = 1 g 1 mg = 0.00980665 m/s²
5.3 串口协议
发送单个字符即可,无需回车。
命令功能| 1 | 启动电机 |
| 0 | 取消串口运行请求 |
| s | 开始输出加速度数据 |
| q | 停止输出加速度数据 |
当前使用轮询接收命令,自动采集脚本在命令之间保留至少 150 ms 间隔。
数据输出格式为:
D,timestamp_ms,motor_on,ax_mg,ay_mg,az_mg,overrun
字段说明:
字段含义| timestamp_ms | 开发板启动后的毫秒时间戳 |
| motor_on | 固件电机驱动状态,用于采集标签核对 |
| ax_mg、`ay_mg`、`az_mg` | 三轴加速度 |
| overrun | 传感器输出数据覆盖标志 |
motor_on 表示驱动输出状态,不是转速反馈或模型识别结果。
当前通过独立线程及同步串口输出完成初步采集,尚未实现 FIFO、DMA 或批量缓冲传输。本轮未检测到数据覆盖,但仍需在更长时间和更复杂负载下继续验证。
六、采集并整理训练数据
6.1 首轮采集方法
已通过电脑端 Python 脚本自动完成以下流程:
关闭电机和数据输出。
等待 2 秒,采集停止状态数据。
启动电机。
等待 2 秒,避开启转过渡过程。
采集稳定运行状态数据。
关闭电机和数据输出。
采集结束后,重新读取数据核对电机驱动状态,确认输出已关闭。
6.2 首轮采集结果
类别文件有效时间跨度样本数实测速率| STOP | stationary.csv | 30.132 秒 | 5915 | 196.27 Hz |
| RUN | motor_running.csv | 30.132 秒 | 5915 | 196.27 Hz |
两组数据均未检测到传感器数据覆盖,记录中的电机驱动状态与预期标签一致。
三轴加速度标准差如下:
状态X 轴标准差Y 轴标准差Z 轴标准差| STOP | 4.35 mg | 2.91 mg | 7.43 mg |
| RUN | 44.49 mg | 9.19 mg | 46.35 mg |
电机运行时,三个轴的波动均增大,其中 X、Z 轴更明显。这说明当前安装条件下,加速度信号包含可用于区分两种状态的信息;是否能够稳定分类,仍需独立数据和实际模型验证。
6.3 数据整理方案
目前保存的是逐样本原始记录,包含时间戳、驱动状态和覆盖标志。正式导入模型开发工具前,需要生成只包含三轴加速度的窗口文件。
拟采用每轴 256 点、非重叠窗口,按以下顺序排列:
x0,y0,z0,x1,y1,z1,...,x255,y255,z255
每行包含 768 个数值。若采用该方案,本轮每类数据可生成 23 个完整窗口,剩余 27 个样本不纳入完整窗口。
当前原始数据单位为 mg。模型开发可以继续使用 mg,也可统一转换为 g;一旦确定,训练、验证和部署必须保持一致。
本轮仅完成每类一次采集,尚不足以建立可靠的独立训练集和测试集。后续应分别开展多轮采集,记录安装方式、电源、速度及负载,并按采集批次划分训练和测试数据,避免相邻窗口随机拆分造成评估偏高。
七、NanoEdge AI Studio 模型开发与部署
本阶段尚未安装和运行 NanoEdge AI Studio,未生成分类模型或算法库。以下为后续实施方案。
计划采用 N-class classification,建立 STOP、RUN 两个类别,输入为三轴加速度窗口。
主要步骤如下:
安装 NanoEdge AI Studio,核对其对目标 MCU 和导出库配置的支持。
设置三轴输入及窗口长度。
导入整理后的 STOP、RUN 数据。
执行算法搜索,评估分类效果和资源需求。
使用独立采集批次进行验证。
导出算法库、头文件及相关模型资源。
集成到当前 Zephyr 工程,完成编译和板端测试。
集成时需要核对导出库与工程的处理器架构、编译器 ABI、浮点选项及链接要求。模型接口、输入数组布局和类别编号以实际导出文件为准。
部署后的数据流为:
LIS3DH 新样本 ↓ 收集完整三轴窗口 ↓ 按训练时的单位与顺序整理 ↓ 调用模型推理接口 ↓ 输出 STOP / RUN 及可用的置信信息 ↓ 串口、LED 或蜂鸣器提示
模型推理输入仅使用加速度信号。电机控制状态用于测试时核对真值,不参与模型判断。
部署前后应保持量程、采样率、单位、轴顺序和窗口长度一致。由于本阶段实测速率约为 196 Hz,后续应先确定最终采样方案,再采集正式训练数据,避免更改采样配置后继续沿用不匹配的数据集。
八、本阶段记录与后续安排
8.1 已完成工作
确认 NUCLEO-H533RE 的电机及 I²C 引脚映射。
使用本地 Zephyr 环境完成编译和 ST-LINK 烧录。
实现 B1 按住运行、松开停止。
将电机换相间隔由 4 ms 调整为 2 ms。
增加串口启停及数据输出控制。
检测并配置 LIS3DH。
完成 STOP、RUN 两类各约 30 秒的真实数据采集。
核对样本数量、驱动状态及数据覆盖标志。
确认采集结束后电机输出关闭。
8.2 调试问题及处理
问题定位与处理验证结果| 编译缓存目录不可写 | 将 Zephyr 编译缓存改到当前工作区,禁用本次构建的 ccache | 编译通过 |
| 默认工具环境无法访问 USB 调试器及串口 | 使用具备设备访问权限的执行环境 | 成功识别 ST-LINK 和串口 |
| 连续发送多个串口字符时接收不完整 | 当前采用轮询接收,采集脚本改为逐字符发送并保留间隔 | 自动采集流程完成 |
| 实际采样速率与配置值存在差异 | 根据板端时间戳统计输出间隔和实际速率 | 实测约 196.27 Hz |
| 需要确认两类信号是否存在差异 | 比较三轴加速度标准差 | 运行状态振动明显增大 |
8.3 后续安排
补充电机电源规格、传感器安装方式及硬件照片。
固定安装条件,开展多轮独立采集。
完成超量程检查、波形分析和模型窗口文件整理。
安装 NanoEdge AI Studio,完成算法搜索和独立验证。
将导出算法库集成到 Zephyr 工程。
接入 LED,按需要增加蜂鸣器。
开展多轮启停测试,统计误判率、漏判率和状态切换延迟。
整理最终源码、模型、数据集和演示视频。
当前工程已具备可重复的电机控制和真实振动数据采集能力,模型训练及板端识别仍属于下一阶段工作。
我要赚赏金
