传感器基础:常见传感器类型的工作原理、输出格式与适用场景
TinyML 系统的数据质量直接决定模型推理的上限。无论你使用 Arduino Nano 33 BLE Sense、ESP32 还是 STM32 开发板,传感器都是物理世界与数字模型的唯一桥梁。理解每种传感器的物理原理、输出格式与适用边界,是设计采样策略、完成数据预处理和特征工程的前提。本章将系统梳理 TinyML 中最常用的八类传感器,从工作原理到工程落地细节逐一拆解。
2.1 惯性传感器:加速度计、陀螺仪与磁力计
惯性传感器是 TinyML 应用中最常见的传感器类型,广泛用于姿态识别、跌倒检测、步数计数和手势识别。它们基于 MEMS(微机电系统)技术,将机械运动转化为电信号。
核心原理
加速度计测量物体在三个轴(X/Y/Z)上的线性加速度,单位通常为 g(9.8 m/s²)。其内部结构包含一个悬臂梁上的质量块,当设备加速时,质量块因惯性产生位移,通过电容变化或压阻效应转化为电压信号。静止时,加速度计输出重力分量,可用于计算设备倾角。
陀螺仪测量绕三个轴的角速度,单位为 dps(度/秒)。它利用科里奥利力效应——当质量块在旋转参考系中振动时,会产生垂直于振动方向的位移,该位移与角速度成正比。陀螺仪对旋转运动敏感,但存在零偏漂移问题。
磁力计测量三个轴上的磁场强度,单位为 µT(微特斯拉)。它基于磁阻效应或霍尔效应,用于电子罗盘和航向角计算。磁力计容易受到环境磁场干扰,需要定期校准。
输出格式与接口
| 传感器 | 输出单位 | 典型量程 | 接口 | 数据格式 |
|---|---|---|---|---|
| 加速度计 | g 或 m/s² | ±2g ~ ±16g | I2C/SPI | int16 或 float |
| 陀螺仪 | dps | ±125 ~ ±2000 dps | I2C/SPI | int16 或 float |
| 磁力计 | µT 或 Gauss | ±49 µT ~ ±1200 µT | I2C | int16 |
以常见的 MPU6050(六轴)和 LSM9DS1(九轴)为例,I2C 地址通常为 0x68 或 0x6B。读取时需先配置量程和采样率寄存器,然后连续读取 6 个或 9 个 16 位寄存器。原始值需要乘以灵敏度系数才能转换为物理单位:例如,加速度计在 ±2g 量程下,灵敏度为 16384 LSB/g,则实际加速度 = 原始值 / 16384 g。
适用场景与选型建议
- 加速度计:活动识别(走路/跑步/静止)、跌倒检测、设备方向判断。采样率 25-50 Hz 足够覆盖人体运动频率(0.5-10 Hz)。
- 陀螺仪:手势识别、旋转运动检测、导航辅助。采样率建议 50-100 Hz,因为角速度变化更快。
- 磁力计:航向角计算、室内定位辅助、金属探测。采样率 10-20 Hz 即可。
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。
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 lux | 1-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 项目的基础工程。理解每种传感器的物理原理、输出格式和适用场景,能够帮助你在项目初期做出正确的硬件选型决策,并为后续的数据预处理、特征工程和模型训练奠定坚实基础。在实际部署中,务必通过实验验证采样率、量程和滤波参数,确保数据质量满足模型需求。