4. 数据采集基础

在Edge Impulse的完整工作流中,数据采集是决定模型性能上限的基石。无论后续使用何种算法(MFCC、频谱分析或FFT),模型只能从你提供的数据中学习。本章聚焦于最基础的硬件链路搭建与数据获取方法:如何将麦克风、加速度计、光敏电阻等传感器正确连接到Arduino开发板,并通过两种主流路径——串口监视器(Serial Monitor)与Edge Impulse CLI(命令行工具)——将原始传感数据转化为可用于训练的样本数据集。我们将从硬件连接原理出发,逐步深入到采样参数配置、数据标注与质量验证,确保你采集到的数据既能反映真实物理世界,又符合Edge Impulse平台对数据格式的严格要求。

Arduino传感器数据采集链路 传感器组 麦克风 (A0) 加速度计 (I2C) 光敏电阻 (A1) 按钮 (D2) Arduino 开发板 Nano 33 BLE Sense 或 MKR WiFi 1010 USB 串口 (115200) CSV / JSON 数据流 路径A:串口监视器 Arduino IDE 串口绘图器 手动复制/保存数据 路径B:Edge Impulse CLI edge-impulse-data-forwarder 自动标注并上传至云端 Edge Impulse 云端数据集 训练样本(含时间序列) 标注:正常/异常/手势类别 采样频率与窗口长度已配置 采样率建议:麦克风16kHz,加速度计50Hz,光敏电阻10Hz 数据格式:CSV(时间戳+特征值)或 JSON(Edge Impulse 原生格式)

上图展示了从传感器到云端数据集的完整链路。左侧为三种典型传感器,中间为Arduino开发板,右侧分为两条数据采集路径:路径A通过串口监视器手动保存数据,适合小规模验证;路径B通过Edge Impulse CLI自动转发数据,适合批量采集与标注。下方为Edge Impulse云端数据集,所有数据最终汇聚于此进行训练。下面我们将逐一拆解每个环节的具体操作与关键参数。

4.1 传感器选型与硬件连接原理

在开始接线之前,必须明确传感器的输出类型与Arduino引脚的匹配关系。根据信号类型,传感器可分为三类:模拟电压输出(如麦克风模块、光敏电阻分压电路)、数字脉冲输出(如DHT22温湿度)、以及I2C/SPI数字接口(如MPU6050加速度计、BME280环境传感器)。对于Edge Impulse项目,最常用的是模拟输出与I2C接口,因为它们能直接提供连续时间序列数据。

4.1.1 麦克风(模拟输出)

麦克风模块(如MAX9814或ADMP401)输出模拟电压,其幅度与声音响度成正比。连接时,将模块的OUT引脚接Arduino的模拟输入引脚(如A0),VCC接3.3V或5V(根据模块规格),GND共地。关键参数是采样率:语音识别通常需要16kHz采样率,而Arduino Uno的ADC转换速率有限(约10kHz),因此推荐使用Arduino Nano 33 BLE Sense(内置PDM麦克风)或MKR系列,它们支持更高采样率。

注意: 模拟麦克风输出信号微弱(约0.5Vpp),若直接接Arduino ADC,可能无法有效量化。建议使用带自动增益控制(AGC)的模块,或在代码中启用内部参考电压(如AREF)以提高分辨率。

4.1.2 加速度计(I2C接口)

加速度计(如MPU6050或LIS3DH)通过I2C总线通信,只需连接SDA(A4)、SCL(A5)两根数据线,加上VCC和GND。I2C地址通常为0x68或0x69,需在代码中正确指定。加速度计用于运动识别(如手势、跌倒检测),采样率一般设为50Hz-100Hz,因为人体运动频率较低。注意:I2C总线上的上拉电阻(4.7kΩ)通常已集成在模块上,无需额外添加。

4.1.3 光敏电阻(分压电路)

光敏电阻(LDR)本身是可变电阻,需配合固定电阻(如10kΩ)组成分压电路,将电阻变化转换为电压变化。连接方式:LDR一端接5V,另一端接A1引脚并同时通过10kΩ电阻接地。这样,光照增强时LDR阻值下降,A1电压升高。光敏电阻适合环境光强度检测,采样率可低至10Hz,数据变化平缓。

传感器类型 输出信号 Arduino引脚 典型采样率 应用场景
麦克风 (MAX9814) 模拟电压 (0-3.3V) A0 16kHz 语音命令、声音事件检测
加速度计 (MPU6050) I2C 数字信号 SDA (A4), SCL (A5) 50-100Hz 手势识别、跌倒检测
光敏电阻 (LDR) 模拟电压 (分压) A1 10Hz 环境光强度分类

4.2 数据采集的两种路径:串口与CLI

数据从Arduino输出后,需要进入Edge Impulse平台。根据项目阶段和样本量需求,可以选择手动或自动两种方式。以下分别介绍操作流程与适用场景。

4.2.1 路径A:串口监视器手动采集

这是最直接的方法,适合快速验证传感器是否工作正常,或采集少量样本(如每个类别20个样本)。操作步骤如下:

  1. 编写Arduino固件:在setup()中初始化串口(如Serial.begin(115200)),在loop()中读取传感器值并通过Serial.print()输出。输出格式建议为CSV,例如:Serial.println(micValue); 或 Serial.print(ax); Serial.print(","); Serial.println(ay);
  2. 打开串口监视器:在Arduino IDE中,选择正确的端口和波特率(115200),点击“串口监视器”。
  3. 手动记录数据:当传感器数据稳定后,点击“串口绘图器”可查看实时波形。若需保存数据,可复制串口输出内容,粘贴到文本编辑器中保存为CSV文件。
  4. 导入Edge Impulse:在Edge Impulse的“Data Acquisition”页面,选择“Upload data”,将CSV文件上传,并标注类别(如“正常”、“异常”)。
适用场景: 当样本量小于100个、类别少于3类时,手动采集足够。但需注意,串口监视器可能因缓冲区溢出而丢失数据,建议在代码中增加延时(如delay(10))控制数据速率。

4.2.2 路径B:Edge Impulse CLI自动采集

对于需要大量样本(如每个类别1000个以上)或需要实时标注的场景,推荐使用Edge Impulse CLI。它通过USB串口与Arduino通信,自动将数据转发至Edge Impulse云端,并支持在采集过程中实时标注。安装与配置步骤如下:

  1. 安装CLI工具:在终端执行 npm install -g edge-impulse-cli,或使用Python安装 pip install edge-impulse-cli。
  2. 编写兼容固件:Arduino固件需遵循Edge Impulse的串口协议。最简单的方式是使用Edge Impulse提供的示例固件(在Arduino库管理器中搜索“Edge Impulse”),或手动实现:在loop()中,以固定频率(如50Hz)读取传感器,并通过 Serial.write() 发送二进制数据(而非文本)。
  3. 启动数据转发器:在终端运行 edge-impulse-data-forwarder,它会自动检测连接的Arduino端口,并提示你选择设备类型和传感器名称。
  4. 配置采样参数:在Edge Impulse网页端,设置采样频率(如50Hz)、窗口长度(如2秒)和类别标签。CLI会实时显示数据流,并允许你点击“Start sampling”开始采集。
  5. 批量采集与标注:在采集过程中,你可以通过网页按钮或键盘快捷键(如空格键)为当前数据段添加标签。CLI会自动将数据切分为固定长度的样本,并上传至云端。
经验提示: CLI方式的最大优势是自动同步与标注。例如,采集“拍手”声音时,你可以连续拍手10次,CLI会生成10个独立的样本,每个样本都带有“拍手”标签,无需手动分割。

4.3 采样参数配置与数据质量验证

无论使用哪种路径,采样参数直接决定模型性能。以下参数需根据传感器特性和物理事件持续时间来设置:

  • 采样频率(Hz):根据奈奎斯特定理,采样频率至少为信号最高频率的2倍。语音信号最高频率约8kHz,故采样率需≥16kHz;加速度计信号频率通常低于20Hz,50Hz采样率已足够。
  • 窗口长度(ms):指一个样本的时间跨度。对于声音事件(如“是”字发音),窗口长度设为1-2秒;对于手势识别,设为2-3秒;对于光强变化,可设为5秒。
  • 样本重叠(%):在连续采集时,相邻样本之间可设置重叠(如50%),以增加样本数量并捕捉事件边界。

数据质量验证是容易被忽视的环节。在采集完成后,应在Edge Impulse的“Data Explorer”页面检查数据分布:

  1. 检查数据平衡:每个类别的样本数量应大致相等,避免模型偏向多数类。
  2. 查看波形完整性:随机抽取几个样本,确认波形无截断、无饱和(即信号未达到ADC上限)。
  3. 检查时间戳一致性:确保样本之间的时间间隔均匀,无缺失数据。
风险提示: 若采样频率过高而Arduino无法及时处理,会导致数据丢失(表现为波形出现“毛刺”)。此时应降低采样率或优化固件代码(如使用DMA传输)。

4.4 案例拆解:基于Arduino Nano 33 BLE Sense的“拍手识别”数据采集

下面通过一个完整案例,演示从硬件连接到数据上传的全过程。该案例的目标是采集“拍手”和“背景噪声”两类声音数据,用于训练一个简单的二分类模型。

背景与约束: 使用Arduino Nano 33 BLE Sense(内置PDM麦克风),采样率设为16kHz,窗口长度1秒。需要采集200个“拍手”样本和200个“背景噪声”样本。由于拍手声音持续时间短(约0.2秒),窗口长度1秒可完整包含事件。

初始现象与目标: 直接使用串口监视器输出文本数据时,发现数据速率过高(16kHz),串口监视器无法实时显示,且手动复制数据不现实。因此改用Edge Impulse CLI自动采集。

关键操作步骤:

  1. 固件编写:使用Arduino IDE,加载Edge Impulse示例固件“nano_33_ble_sense_microphone”。该固件以16kHz采样率读取PDM麦克风,并通过USB串口以二进制格式发送数据。
  2. 启动CLI:在终端运行 edge-impulse-data-forwarder,选择设备“Arduino Nano 33 BLE Sense”,传感器类型选择“Microphone”。
  3. 配置采样参数:在Edge Impulse网页端,设置采样频率为16000Hz,窗口长度为1000ms,类别标签为“clap”和“noise”。
  4. 采集“拍手”样本:点击“Start sampling”,在1秒窗口内拍手一次。重复此操作200次,每次间隔5秒,避免样本重叠。
  5. 采集“背景噪声”样本:保持环境安静,点击“Start sampling”,等待1秒自动完成。重复200次。
  6. 数据验证:在Data Explorer中,检查“clap”样本的波形是否在0.2秒处有明显振幅峰值,而“noise”样本波形平缓。若发现部分“clap”样本振幅过低,可能是拍手力度不足,需重新采集。

结果对比与复盘: 采集完成后,共获得400个样本,数据平衡。在后续训练中,模型准确率达到95%以上。复盘发现,初始使用串口监视器时,由于文本输出占用大量CPU时间,导致采样率不稳定。改用CLI后,数据流通过二进制传输,CPU负载降低,采样率稳定在16kHz。此外,在采集“拍手”样本时,建议在安静环境中进行,避免混入其他声音干扰。

经验总结: 对于高频传感器(如麦克风),务必使用CLI或二进制串口协议,避免文本格式带来的性能损耗。同时,样本采集应尽量覆盖真实场景的多样性(如不同拍手力度、不同距离),以提高模型泛化能力。

4.5 常见误区与总结复盘

在数据采集阶段,初学者常犯以下错误,导致后续训练效果不佳:

误区 后果 正确做法
采样率设置过高,超出Arduino处理能力 数据丢失、波形失真 根据传感器特性选择合理采样率,必要时降低分辨率
样本类别不平衡(如“正常”样本远多于“异常”) 模型偏向多数类,少数类识别率低 采集时确保每个类别样本数量接近
忽略数据标注一致性 模型学习到错误特征 制定标注规范,如“拍手”必须包含完整声音事件
未检查数据饱和(信号达到ADC上限) 波形削顶,特征失真 调整传感器增益或Arduino参考电压

总结: 数据采集是Edge Impulse项目中最耗时但最关键的环节。本章的核心要点可归纳为:① 根据传感器输出类型选择正确的Arduino引脚与通信协议;② 小样本用串口监视器,大样本用CLI;③ 采样频率、窗口长度需根据物理事件特性设置;④ 采集后务必进行数据质量验证。掌握这些基础,你就能为后续的模型训练提供高质量的数据基础。