我们这次的主题是端侧的AI的应用,主要探索的是基于单片机的小型AI识别,在这个目标的基础上,我们还是需要对一些基础硬件的驱动进行前期实现,也就是小模型的训练集,实际上即使各种行为动作或者传感器的数据。这次我们要进行电机状态的检测,用的是一款三轴加速度计-LIS3DHTR,使用的是GROVE接口的模块。

我们通过I2C1接口进行连接:

我们在前期规划一下,我们先实现三轴数据的采集,在去满足AI训练数据采集的要求。这里我们配置的是I2C1接口:

我们可以找一下通用的驱动还是挺多的,然后首先实现三轴数据的读取,可以看到变化的数据(移动传感器):
触发
按键触发:USER 按钮按下 → 启动一次采集 run。
run 长度:固定 100 个 signal。
LED 指示:
IDLE 时 LED 灭;
采集过程中 LED 亮;
100 个 signal 全部输出完成 → LED 灭。
3.2 Signal 定义
1 个 signal = 256 个时间步 × 3 轴 = 768 个 int16。
数据顺序:X₀ Y₀ Z₀ X₁ Y₁ Z₁ ... X₂₅₅ Y₂₅₅ Z₂₅₅。
步长:固定 256 样本,不重叠(无训练样本切窗重叠)。
每个 signal 时间长度:256 / 400 Hz = 0.64 s。
串口协议(VCP / USART1 / 115200 8N1)
每行 = 1 个 signal:X0 Y0 Z0 X1 Y1 Z1 X2 Y2 Z2 ... X255 Y255 Z255\n格式规则:字段分隔符:单个空格 ' ';
字段类型:十进制 int16(无前导零、无 +、负数带 -);
每个字段宽度可变(最短 2 字符 12,最长 5 字符 -2047);
行尾:\n(LF,无 \r)。
控制流时序
[IDLE] ──按下USER──> [ARM] ──> [CAPTURING] ──100行完成──> [IDLE] │ │ │ ├── 主循环每 ~25ms 拉 8~16 样本 │ ├── 每个样本 printf("%d %d %d ", x, y, z) │ ├── 第 256 个样本 printf("%d %d %d\n", x, y, z) + fflush │ └── 100 行后 LED 灭、回 IDLE │ └── flush_and_arm_fifo() 在主循环中执行: 读 FIFO_SRC_REG,burst 弹出所有残留样本 (不切换 FIFO 模式,Stream 持续保持)按键与 run 的关系:run 期间再次按 USER:内部检测到 g_arm_pending,会清零 g_signal_count 与 g_sample_in_line + flush 残留,视为新一轮;
run 完成后 LED 灭,再次按下 USER 启动下一次 run。
训练数据集规格(来自 NanoEdge AI Studio "Signal file example")
数据格式适配情况
NE AI 输入类型:NanoEdge AI Studio 同时支持 int 和 float 数据;本工程选用 int(即 12-bit 寄存器 raw),与器件输出一致、不引入量化误差。
数据语义:
+0512 → X 轴当前加速度 +0512 × 12 mg = +6.144 g;
-2048 → -2048 × 12 mg = -24.576 g(实际量程受 FS=±8g 限制为 −666..+666 LSB,对应 ±8 g);
数据未做单位换算、滤波、去重力处理;可直接当作 raw 12-bit 数值喂给 NE AI。
列方向:每行内字段顺序固定为 X₀ Y₀ Z₀ X₁ Y₁ Z₁ ...(交错),符合 NE AI Studio "Sample 1, Sample 2, ..., Sample 256" 的列布局。
数据采集流程(PC 端推荐)
启动串口工具(115200 8N1, 接收按行缓冲);
按一次 USER 按钮 → 等待 64 s 收 100 行;
切到下一姿态,重复按 USER 按钮;
把每 100 行保存为一个 .csv 或 .txt:
文件首行:<类别标签>(如 normal / vibration_5Hz / impact);
后续 100 行:即串口接收到的原始 100 行数据;
同一姿态的多个文件可合并成 NE AI 的训练目录。
我要赚赏金
