传感器基础:常见传感器类型的工作原理、输出格式与适用场景

TinyML 系统的数据质量直接决定模型推理的上限。无论你使用 Arduino Nano 33 BLE Sense、ESP32 还是 STM32 开发板,传感器都是物理世界与数字模型的唯一桥梁。理解每种传感器的物理原理、输出格式与适用边界,是设计采样策略、完成数据预处理和特征工程的前提。本章将系统梳理 TinyML 中最常用的八类传感器,从工作原理到工程落地细节逐一拆解。

TinyML 传感器数据采集链路 物理世界 加速度/角速度/磁场 温度/湿度/气压/光/声 传感器层 MEMS 加速度计/陀螺仪 磁力计/温湿度/气压 光敏/麦克风 I2C/SPI/模拟/PDM 信号调理 放大/滤波/去直流 ADC 采样/量化 FIFO 缓冲 采样率/分辨率/量程 MCU ARM Cortex-M DMA 传输 中断处理 TinyML 推理 输出格式与数据接口 I2C 寄存器读取 int16/float SPI 突发读取 多字节帧 模拟电压输出 ADC 量化 PDM 数字音频 脉冲密度调制 关键参数 采样率(Hz) 分辨率(bit) 量程(±g/±dps/±µT) TinyML 数据流水线 原始数据采集 固定采样率/窗口 预处理 去均值/归一化/滤波 特征提取 时域/频域/统计特征 模型推理 TinyML 推理引擎 输出 分类/回归

2.1 惯性传感器:加速度计、陀螺仪与磁力计

惯性传感器是 TinyML 应用中最常见的传感器类型,广泛用于姿态识别、跌倒检测、步数计数和手势识别。它们基于 MEMS(微机电系统)技术,将机械运动转化为电信号。

核心原理

加速度计测量物体在三个轴(X/Y/Z)上的线性加速度,单位通常为 g(9.8 m/s²)。其内部结构包含一个悬臂梁上的质量块,当设备加速时,质量块因惯性产生位移,通过电容变化或压阻效应转化为电压信号。静止时,加速度计输出重力分量,可用于计算设备倾角。

陀螺仪测量绕三个轴的角速度,单位为 dps(度/秒)。它利用科里奥利力效应——当质量块在旋转参考系中振动时,会产生垂直于振动方向的位移,该位移与角速度成正比。陀螺仪对旋转运动敏感,但存在零偏漂移问题。

磁力计测量三个轴上的磁场强度,单位为 µT(微特斯拉)。它基于磁阻效应或霍尔效应,用于电子罗盘和航向角计算。磁力计容易受到环境磁场干扰,需要定期校准。

输出格式与接口

传感器输出单位典型量程接口数据格式
加速度计g 或 m/s²±2g ~ ±16gI2C/SPIint16 或 float
陀螺仪dps±125 ~ ±2000 dpsI2C/SPIint16 或 float
磁力计µT 或 Gauss±49 µT ~ ±1200 µTI2Cint16

以常见的 MPU6050(六轴)和 LSM9DS1(九轴)为例,I2C 地址通常为 0x68 或 0x6B。读取时需先配置量程和采样率寄存器,然后连续读取 6 个或 9 个 16 位寄存器。原始值需要乘以灵敏度系数才能转换为物理单位:例如,加速度计在 ±2g 量程下,灵敏度为 16384 LSB/g,则实际加速度 = 原始值 / 16384 g。

工程经验:在 TinyML 项目中,建议直接使用原始 int16 值进行模型训练,而不是转换为物理单位。因为模型学习的是数据分布模式,单位转换只会增加计算开销且不改变信息量。但需注意不同设备的量程配置必须一致,否则数据分布会偏移。

适用场景与选型建议

  • 加速度计:活动识别(走路/跑步/静止)、跌倒检测、设备方向判断。采样率 25-50 Hz 足够覆盖人体运动频率(0.5-10 Hz)。
  • 陀螺仪:手势识别、旋转运动检测、导航辅助。采样率建议 50-100 Hz,因为角速度变化更快。
  • 磁力计:航向角计算、室内定位辅助、金属探测。采样率 10-20 Hz 即可。
常见误区:陀螺仪数据不能直接积分得到角度,因为零偏漂移会导致积分误差快速累积。在 TinyML 中,通常使用加速度计和陀螺仪融合(互补滤波或 Madgwick 算法)来获得稳定的姿态角,或者直接将原始数据输入神经网络让模型自动学习特征。

2.2 环境传感器:温度、湿度与气压

环境传感器在智能农业、气象监测、室内环境质量评估等 TinyML 场景中扮演重要角色。它们通常输出缓慢变化的模拟或数字信号,采样率要求较低,但精度和校准至关重要。

核心原理与输出

温度传感器常见类型包括热敏电阻(NTC/PTC)、热电偶和半导体温度传感器(如 LM75、DHT22)。半导体传感器利用 PN 结正向电压与温度的线性关系,输出数字信号。精度通常在 ±0.5°C 以内,分辨率 0.01°C。

湿度传感器通常采用电容式原理——高分子薄膜吸收水分子后介电常数变化,导致电容值改变。典型型号如 SHT30、DHT22,输出相对湿度(%RH),精度 ±2%RH。湿度传感器对凝结水敏感,需要避免在结露环境中使用。

气压传感器基于压阻效应或电容式 MEMS 膜片,测量气压,单位为 hPa(百帕)。典型型号 BMP280、LPS22HH,精度 ±1 hPa。气压随海拔变化约 0.12 hPa/m,可用于高度估计。

数据读取与校准

// SHT30 温湿度传感器读取示例(I2C)
uint8_t data[6];
Wire.beginTransmission(0x44);
Wire.write(0x2C);  // 单次测量命令高字节
Wire.write(0x06);  // 单次测量命令低字节(高重复性)
Wire.endTransmission();
delay(50);
Wire.requestFrom(0x44, 6);
for (int i = 0; i < 6; i++) data[i] = Wire.read();
uint16_t rawTemp = (data[0] << 8) | data[1];
uint16_t rawHum  = (data[3] << 8) | data[4];
float temp = -45.0f + 175.0f * rawTemp / 65535.0f;
float hum  = 100.0f * rawHum / 65535.0f;

环境传感器通常需要校准偏移量。例如,温度传感器在 PCB 上会因芯片自热产生 0.5-2°C 的偏差,可在静止 10 分钟后与参考温度计对比,计算偏移量并在代码中补偿。

适用场景与采样策略

  • 温度/湿度:温室大棚监控、冷链物流、数据中心热管理。采样率 0.1-1 Hz 足够,因为环境变化缓慢。
  • 气压:楼层检测(室内定位辅助)、气象站、无人机高度控制。采样率 1-10 Hz。
部署建议:环境传感器应远离发热元件(如 MCU、电源芯片)和通风口,避免局部微气候影响测量准确性。在户外部署时,需要加装防辐射罩和通风结构。

2.3 光敏传感器与麦克风

光敏传感器和麦克风分别将光信号和声波信号转换为电信号,在智能照明、声音事件检测、语音唤醒等 TinyML 应用中广泛使用。

光敏传感器

常见的光敏元件包括光敏电阻(LDR)、光电二极管和数字环境光传感器(如 BH1750、OPT3001)。LDR 输出模拟电阻值,需要配合分压电路和 ADC 读取;数字传感器则直接输出照度值(单位 lux)。

BH1750 的 I2C 读取流程:发送测量命令(如 0x10 连续高分辨率模式),等待 120ms 后读取 2 字节数据,照度值 = (数据高字节 << 8 | 数据低字节) / 1.2。量程可达 65535 lux,分辨率 1 lux。

麦克风

TinyML 中常用的麦克风有两种:模拟麦克风(如 MAX9814)和数字 PDM 麦克风(如 MP34DT05)。模拟麦克风输出模拟电压,需要 MCU 的 ADC 以 16 kHz 以上采样率采集;PDM 麦克风输出 1-bit 脉冲密度调制信号,需要 MCU 的 PDM 外设或软件解码。

PDM 解码原理:PDM 信号通过抽取滤波器(CIC 滤波器)转换为 PCM 数据。以 16 kHz 输出采样率为例,PDM 时钟通常为 2.4 MHz,抽取因子为 64。解码后的数据为 16-bit 有符号整数,表示声压级。

// PDM 麦克风数据采集(使用 Arduino PDM 库)
#include <PDM.h>
#define SAMPLE_RATE 16000
#define BUFFER_SIZE 512
char sampleBuffer[BUFFER_SIZE];
void onPDMdata() {
  int bytesRead = PDM.available();
  PDM.read(sampleBuffer, bytesRead);
  // 处理音频数据
}
void setup() {
  PDM.onReceive(onPDMdata);
  PDM.begin(1, SAMPLE_RATE);
}

适用场景对比

传感器输出类型采样率需求典型应用注意事项
光敏电阻模拟电阻1-10 Hz光线强度检测响应慢,需校准
数字光传感器I2C lux1-10 Hz屏幕亮度调节方向性敏感
模拟麦克风模拟电压16-48 kHz声音事件检测需放大电路
PDM 麦克风PDM 数字流16-48 kHz语音唤醒/关键词识别需 PDM 外设

2.4 传感器数据采集的工程实践

在 TinyML 项目中,传感器数据采集不仅仅是读取寄存器值,还涉及采样率选择、时间同步、数据缓冲和功耗管理等多个维度。

采样率选择原则

根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍。但实际工程中,建议采样率为信号最高频率的 5-10 倍,以获得足够的波形细节。人体运动信号最高频率约 10 Hz,因此 IMU 采样率 50 Hz 即可;音频信号最高频率 8 kHz(语音),采样率需 16 kHz 以上。

多传感器时间同步

当同时使用加速度计和陀螺仪时,需要确保两组数据在时间上对齐。常见做法是使用传感器 FIFO 中断或 MCU 定时器触发同步采样。如果使用 I2C 顺序读取,每次读取间隔应小于采样周期的 10%,否则需要插值对齐。

数据缓冲与 DMA

高频采样(如音频 16 kHz)会产生大量数据,直接在主循环中读取会阻塞 CPU。推荐使用 DMA(直接内存访问)将传感器数据直接传输到内存缓冲区,当缓冲区满时触发中断通知 CPU 处理。例如,STM32 的 I2S + DMA 可以无 CPU 干预地采集音频数据。

案例拆解:可穿戴跌倒检测系统
背景:为老年人设计一款基于 TinyML 的跌倒检测手环,使用 MPU6050 六轴传感器,要求在 200 ms 内识别跌倒并发送警报。
关键参数:加速度计量程 ±16g(跌倒时冲击可达 8-12g),采样率 100 Hz,窗口长度 2 秒(200 个采样点)。
实现步骤:
1. 配置 MPU6050:量程 ±16g,陀螺仪 ±2000 dps,数字低通滤波 44 Hz。
2. 使用 FIFO 模式,每 10 ms 读取一次数据,计算合加速度 magnitude = √(ax² + ay² + az²)。
3. 检测逻辑:当 magnitude 超过 3g 且持续 50 ms,判定为疑似跌倒;随后检查 1 秒内是否出现静止(magnitude 接近 1g),确认跌倒后触发警报。
4. 模型优化:使用 TinyML 神经网络替代阈值判断,输入为 2 秒窗口的 6 轴数据,输出为跌倒/日常活动/静止三分类。
结果:阈值方法准确率约 85%,神经网络方法提升至 95%,但模型大小仅 12 KB,推理时间 8 ms。
复盘:阈值方法在剧烈运动(如跳跃)时误报率高,神经网络能学习到跌倒的时序特征(先冲击后静止),显著降低误报。

常见误区与总结

  • 误区一:采样率越高越好。高采样率增加功耗和存储开销,且超出信号带宽的采样只会引入噪声。应根据应用场景选择合适采样率。
  • 误区二:忽略传感器校准。加速度计和磁力计存在零偏和尺度因子误差,不校准会导致数据分布偏移,影响模型泛化能力。
  • 误区三:直接使用原始数据训练模型而不做预处理。虽然深度学习可以自动提取特征,但去均值、归一化等预处理能加速收敛并提高精度。
  • 误区四:忽视传感器放置位置。同一传感器在不同位置(如手腕 vs 腰部)输出的数据分布差异巨大,训练和推理时必须保持一致。

传感器选型与数据采集是 TinyML 项目的基础工程。理解每种传感器的物理原理、输出格式和适用场景,能够帮助你在项目初期做出正确的硬件选型决策,并为后续的数据预处理、特征工程和模型训练奠定坚实基础。在实际部署中,务必通过实验验证采样率、量程和滤波参数,确保数据质量满足模型需求。