这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【let'sdo|2026年第3期】02开发板的应用-任务二(传感器的驱动)

共1条 1/1 1 跳转至页

【let'sdo|2026年第3期】02开发板的应用-任务二(传感器的驱动)

高工
2026-10-27 09:55:04     打赏

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

efacf780-8b78-4754-9664-199ee74f28fe.png

        Grove - 三轴数字加速度计 (LIS3DHTR) 是一款低成本的三轴加速度计,属于 Grove 产品系列。它基于 LIS3DHTR 芯片,提供多种量程和接口选择。你可能难以相信,这样一个小巧的三轴加速度计竟然支持 I2C、SPI 和 ADC GPIO 接口,这意味着你可以选择任何一种方式与开发板连接。此外,这款加速度计还可以监测周围的温度,以校正由温度引起的误差。不过针对于这个模块的接口,实际上只支持I2C,不然就只能通过飞线来实现其他接口了。

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

bf6aa194-da98-4ee2-9931-e357e3c09fce.png

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

c3f1183c-0224-434b-93b8-947d9a895e91.png

        我们可以找一下通用的驱动还是挺多的,然后首先实现三轴数据的读取,可以看到变化的数据(移动传感器):b93d7017-fcd4-448f-bd0b-70da36452327.png

        接下来我们要循环采集传感器的数据并根据符合训练AI的格式组成训练集,这里我们需要暂定下训练集的格式,暂定一个状态有100组数据,每组256个数据进行训练(每组共计256*3),这里我们就需要配置三轴传感器的FIFO了,我们需要连续读取,但是还不能每次都读取,三轴是需要设置一定刷新速率,这里我们设置成400Hz,也就是说采集需要一定周期,使用FIFO才能满足,要不100K的I2C速度吃不消。我们给出一个配置给到大家参考。传感器配置(运行时)通过 I²C 写入 LIS3DHTR 各寄存器,最终稳态如下(一次 init,运行时不再变更):
寄存器值含义
CTRL_REG1 (0x20)0x70 + 0x07 = 0x77ODR=0111 (400 Hz), Xen/Yen/Zen=1
CTRL_REG2 (0x21)0x00高通滤波器全 bypass
CTRL_REG3 (0x22)0x00不产生中断(关 INT1/INT2)
CTRL_REG4 (0x23)0xA8HR=1 (高分辨率 12-bit), FS=11 (±8 g), BDU=1
CTRL_REG5 (0x24)0x40FIFO_EN=1(其余位 0)
FIFO_CTRL_REG (0x2E)0x42FM=10 (Stream), FTH=8(watermark 8 样本)
关键参数:
项值
工作模式High Resolution (HR)
输出数据率 (ODR)400 Hz(每 2.5 ms 一帧)
量程 (FS)±8 g
灵敏度12 mg / LSB(HR 模式 12-bit 满量程 ±8 g)
数据格式16-bit 左对齐,4 LSB 为 0
原始数据HR >>4 后 int16,范围 −2048..+2047
FIFO 模式Stream(持续写入,新样本覆盖最旧)
FIFO 容量31 样本(器件内部)
FIFO watermark8(轮询读取,不依赖中断)
轴X / Y / Z 全开
BDU开(MSB/LSB 一起锁存)
器件 I²C 地址0x19(SA0=HIGH)
WHO_AM_I 期望值0x33
数据采集与打印规则

触发

  • 按键触发: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)。

整行长度上限(最坏情况):256 × ("-2048 -2048 -2048 " (17 chars)) + "\n"  =  4353 字节115200 bps 下约 0.38 s 发送一整行。

控制流时序

[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 数据集要求对照下表对照 NanoEdge AI Studio 训练/推理数据集规格与本工程的实际输出。

训练数据集规格(来自 NanoEdge AI Studio "Signal file example")

规格项NE AI 要求本工程实现
信号文件 buffer 大小3 × 256 = 768 数值每行 768 个 int16(256×3)
轴数3 轴(X/Y/Z)X/Y/Z 三轴
字段分隔符空格空格 ' '
字段类型数值(支持 int 与 float 两种,本工程用 int)十进制 int16
单行样本数256(每轴)256
信号文件行数100(与本工程一致)100
时序1D(time series)1D,列序 = 同一时刻的 X/Y/Z

数据格式适配情况

  • 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 端推荐)

  1. 启动串口工具(115200 8N1, 接收按行缓冲);

  2. 按一次 USER 按钮 → 等待 64 s 收 100 行;

  3. 切到下一姿态,重复按 USER 按钮;

  4. 把每 100 行保存为一个 .csv 或 .txt:

    • 文件首行:<类别标签>(如 normal / vibration_5Hz / impact);

    • 后续 100 行:即串口接收到的原始 100 行数据;

  1. 同一姿态的多个文件可合并成 NE AI 的训练目录。

注意事项

项要求本工程
采样连续性不能在数据流中间断主循环 1 ms 内连续拉取
训练 / 推理步长训练 256 点不重叠;推理 128 点 50% 重叠训练步长 = 256 固定,推理步长 50% 重叠未启用
数据标签每个文件对应一种姿态由 PC 端按"按 USER 时机"打标
文件命名数字或类别名用户自定
信号文件数量≥ 100 / 类别(建议)用户每姿态按 1 次 = 100 行 = 1 个 signal file





关键词: 传感器     驱动          应用     任务     开发    

共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]