2、传感器数据基础与采集:常见传感器类型、数据格式、采样率与精度、数据采集工具
好,咱们正式开始动手前的第一课。很多同学一上来就急着调模型,结果数据采集环节就埋了雷。我见过太多项目,模型在实验室跑得飞起,一到现场就崩——十有八九是数据采集的底子没打好。这一章,咱们就把传感器数据采集这件事彻底聊透。
2.1 常见传感器类型:你大概率会遇到的三种
嵌入式AI部署,说白了就是跟传感器打交道。我这些年经手的项目里,出现频率最高的就是下面这三类。你想想看,不管是智能家居、工业监测还是可穿戴设备,基本都绕不开它们。
2.1.1 温度传感器
温度传感器是最基础的传感器之一。常用的有DS18B20、DHT22、BME280这些。它们输出的数据格式很直观,就是浮点数,单位是摄氏度或华氏度。
我个人习惯用DS18B20做原型验证,因为它走的是单总线协议,一根线就能传数据,接线简单。但要注意,单总线对时序要求很严格,我曾经在STM32上移植驱动时,因为延时函数不精确,读出来的数据全是85℃——那是芯片的默认上电值,说明通信根本没建立起来。
关键参数:
- 测量范围:-55℃ ~ +125℃(DS18B20)
- 精度:±0.5℃(-10℃ ~ +85℃范围内)
- 分辨率:9~12位可配置
2.1.2 加速度传感器
加速度传感器在姿态检测、振动分析、计步器里用得特别多。MPU6050、ADXL345、LIS3DH是常见的型号。它们输出的是三轴(X、Y、Z)的加速度值,单位通常是g(重力加速度)或m/s²。
这里有个坑——原始数据是整数。比如MPU6050输出的是16位有符号整数,范围-32768到32767。要转换成实际的g值,你得除以灵敏度系数。比如±2g量程下,灵敏度是16384 LSB/g,那原始值除以16384才是真实加速度。
我曾经遇到过一位同事,直接把原始整数喂给模型训练,结果模型死活不收敛。后来发现,不同量程下灵敏度不一样,数据没归一化。所以,采集加速度数据时,一定要先做单位换算。
2.1.3 麦克风(音频传感器)
麦克风在语音识别、声纹识别、异常声音检测里是核心传感器。常见的数字麦克风有INMP441、SPH0645LM4H等,输出的是PCM(脉冲编码调制)音频数据。
音频数据跟温度、加速度不太一样。它是一维时序信号,采样率通常在8kHz到48kHz之间。每个采样点是一个16位或24位的有符号整数。说白了,就是一连串的数字,代表声波在时间轴上的振幅变化。
嗯,这里要注意:麦克风采集的数据量很大。比如16kHz采样率、16位精度、单声道,每秒就是32KB数据。如果连续采集10秒,就是320KB。对于嵌入式设备来说,这个量级需要认真考虑存储和传输。
2.2 数据格式:原始数据长什么样?
传感器输出的数据格式,说白了就两种:文本格式和二进制格式。
| 格式类型 | 特点 | 常见场景 |
|---|---|---|
| 文本格式(CSV/JSON) | 人类可读,调试方便,但体积大 | 原型验证、低速传感器(温度、湿度) |
| 二进制格式 | 体积小,解析快,但肉眼不可读 | 高速传感器(加速度、音频)、量产产品 |
我建议在开发阶段先用文本格式,方便用Excel或Python直接查看。等调试稳定了,再切到二进制格式,节省带宽和存储。
举个例子,一个三轴加速度传感器的CSV数据长这样:
timestamp, acc_x, acc_y, acc_z
1623456789.123, 0.12, -0.98, 9.81
1623456789.124, 0.13, -0.97, 9.80
1623456789.125, 0.11, -0.99, 9.82
而二进制格式呢?就是连续的一串字节。比如每个轴用2字节(16位有符号整数),时间戳用4字节(uint32),那一条数据就是10字节。解析的时候按固定长度切分就行。
2.3 采样率与精度:这两个参数决定数据质量
采样率和精度,是传感器数据采集的两个核心参数。很多新手容易搞混,我简单说清楚。
2.3.1 采样率
采样率就是每秒钟采集多少个数据点,单位是Hz(赫兹)。根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍,才能无失真地还原信号。
举个例子:
- 温度变化很慢,1Hz采样率就够用了
- 人体运动频率一般在0~20Hz,加速度传感器设50~100Hz就行
- 音频信号最高20kHz,所以CD音质用44.1kHz采样率
实战经验:采样率不是越高越好。采样率越高,数据量越大,MCU的处理负担也越重。我在一个电池供电的项目里,把加速度采样率从200Hz降到50Hz,续航直接翻了一倍。所以,够用就好,别盲目追求高采样率。
2.3.2 精度与分辨率
这两个概念经常被混用,其实不一样。
- 分辨率:ADC能分辨的最小变化。比如12位ADC,分辨率是满量程的1/4096。
- 精度:测量值与真实值的偏差。精度受温度漂移、噪声、非线性误差等影响。
说白了,分辨率是理论上的最小刻度,精度是实际准不准。一个16位ADC,分辨率很高,但如果电路噪声大,精度可能还不如一个12位的。
我记得有一次做工业温度监测,用了16位ADC的传感器,结果数据跳得厉害。后来发现是电源纹波太大,加了滤波电容后,数据就稳了。所以,精度问题很多时候是硬件设计的问题,不是传感器本身的问题。
2.4 数据采集工具:Python + PySerial
好了,理论说完了,咱们来点实际的。怎么把传感器的数据弄到电脑上?我最常用的组合就是Python + PySerial。
2.4.1 硬件连接
传感器通过串口(UART)跟电脑通信。一般用USB转串口模块,比如CH340或CP2102。接线就是三根线:TX、RX、GND。注意交叉连接——传感器的TX接模块的RX,传感器的RX接模块的TX。
避坑指南:我曾经因为忘记共地,折腾了整整一个下午。传感器和电脑的GND必须连在一起,否则电平参考点不一致,数据全是乱码。嗯,这是新手最容易犯的错误之一。
2.4.2 PySerial基本用法
PySerial是Python操作串口的标准库。安装很简单:
pip install pyserial
下面是一个完整的采集脚本示例。这个脚本会从串口读取数据,并保存到CSV文件中:
import serial
import csv
import time
# 配置串口参数
ser = serial.Serial(
port='COM3', # Windows下是COM口,Linux下是/dev/ttyUSB0
baudrate=115200, # 波特率,跟传感器端保持一致
timeout=1 # 超时时间,单位秒
)
# 打开CSV文件准备写入
with open('sensor_data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['timestamp', 'value1', 'value2', 'value3'])
# 连续采集10秒
start_time = time.time()
while time.time() - start_time < 10:
# 读取一行数据(假设传感器以换行符结尾)
line = ser.readline().decode('utf-8').strip()
if line:
# 假设数据格式:12.34,56.78,90.12
values = line.split(',')
timestamp = time.time()
writer.writerow([timestamp] + values)
print(f"{timestamp}: {values}")
ser.close()
2.4.3 常见问题与调试技巧
写串口程序时,你大概率会遇到下面这些问题:
- 乱码:波特率不匹配,或者接线有问题。先检查波特率,再检查接线。
- 读不到数据:可能是串口号错了,或者传感器没上电。用串口助手(比如Putty)先手动测试一下。
- 数据丢帧:Python处理速度跟不上。可以加缓冲区,或者用多线程。
我的小技巧:调试阶段,先用串口助手确认传感器能正常发数据。确认无误后,再写Python脚本。这样能快速定位问题是出在硬件还是软件上。
2.5 本章小结
这一章我们聊了传感器数据采集的四个核心点:
- 传感器类型:温度、加速度、麦克风,各有各的数据特点
- 数据格式:文本格式方便调试,二进制格式适合量产
- 采样率与精度:采样率够用就好,精度受硬件影响大
- 采集工具:Python + PySerial是最实用的组合
下一章,我们会把这些数据拿来做预处理。你想想看,原始数据里全是噪声和冗余,直接扔给模型肯定不行。到时候我会教你几招实战中总结出来的滤波和特征提取方法。
好,今天就到这里。有问题随时交流。