4、数据采集基础:使用Arduino连接传感器(如麦克风、加速度计、光敏电阻),通过串口或Edge Impulse CLI采集数据
在Edge Impulse的完整工作流中,数据采集是决定模型性能上限的基石。无论后续使用何种算法(MFCC、频谱分析或FFT),模型只能从你提供的数据中学习。本章聚焦于最基础的硬件链路搭建与数据获取方法:如何将麦克风、加速度计、光敏电阻等传感器正确连接到Arduino开发板,并通过两种主流路径——串口监视器(Serial Monitor)与Edge Impulse CLI(命令行工具)——将原始传感数据转化为可用于训练的样本数据集。我们将从硬件连接原理出发,逐步深入到采样参数配置、数据标注与质量验证,确保你采集到的数据既能反映真实物理世界,又符合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系列,它们支持更高采样率。
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个样本)。操作步骤如下:
- 编写Arduino固件:在setup()中初始化串口(如Serial.begin(115200)),在loop()中读取传感器值并通过Serial.print()输出。输出格式建议为CSV,例如:
Serial.println(micValue);或Serial.print(ax); Serial.print(","); Serial.println(ay); - 打开串口监视器:在Arduino IDE中,选择正确的端口和波特率(115200),点击“串口监视器”。
- 手动记录数据:当传感器数据稳定后,点击“串口绘图器”可查看实时波形。若需保存数据,可复制串口输出内容,粘贴到文本编辑器中保存为CSV文件。
- 导入Edge Impulse:在Edge Impulse的“Data Acquisition”页面,选择“Upload data”,将CSV文件上传,并标注类别(如“正常”、“异常”)。
4.2.2 路径B:Edge Impulse CLI自动采集
对于需要大量样本(如每个类别1000个以上)或需要实时标注的场景,推荐使用Edge Impulse CLI。它通过USB串口与Arduino通信,自动将数据转发至Edge Impulse云端,并支持在采集过程中实时标注。安装与配置步骤如下:
- 安装CLI工具:在终端执行
npm install -g edge-impulse-cli,或使用Python安装pip install edge-impulse-cli。 - 编写兼容固件:Arduino固件需遵循Edge Impulse的串口协议。最简单的方式是使用Edge Impulse提供的示例固件(在Arduino库管理器中搜索“Edge Impulse”),或手动实现:在loop()中,以固定频率(如50Hz)读取传感器,并通过
Serial.write()发送二进制数据(而非文本)。 - 启动数据转发器:在终端运行
edge-impulse-data-forwarder,它会自动检测连接的Arduino端口,并提示你选择设备类型和传感器名称。 - 配置采样参数:在Edge Impulse网页端,设置采样频率(如50Hz)、窗口长度(如2秒)和类别标签。CLI会实时显示数据流,并允许你点击“Start sampling”开始采集。
- 批量采集与标注:在采集过程中,你可以通过网页按钮或键盘快捷键(如空格键)为当前数据段添加标签。CLI会自动将数据切分为固定长度的样本,并上传至云端。
4.3 采样参数配置与数据质量验证
无论使用哪种路径,采样参数直接决定模型性能。以下参数需根据传感器特性和物理事件持续时间来设置:
- 采样频率(Hz):根据奈奎斯特定理,采样频率至少为信号最高频率的2倍。语音信号最高频率约8kHz,故采样率需≥16kHz;加速度计信号频率通常低于20Hz,50Hz采样率已足够。
- 窗口长度(ms):指一个样本的时间跨度。对于声音事件(如“是”字发音),窗口长度设为1-2秒;对于手势识别,设为2-3秒;对于光强变化,可设为5秒。
- 样本重叠(%):在连续采集时,相邻样本之间可设置重叠(如50%),以增加样本数量并捕捉事件边界。
数据质量验证是容易被忽视的环节。在采集完成后,应在Edge Impulse的“Data Explorer”页面检查数据分布:
- 检查数据平衡:每个类别的样本数量应大致相等,避免模型偏向多数类。
- 查看波形完整性:随机抽取几个样本,确认波形无截断、无饱和(即信号未达到ADC上限)。
- 检查时间戳一致性:确保样本之间的时间间隔均匀,无缺失数据。
4.4 案例拆解:基于Arduino Nano 33 BLE Sense的“拍手识别”数据采集
下面通过一个完整案例,演示从硬件连接到数据上传的全过程。该案例的目标是采集“拍手”和“背景噪声”两类声音数据,用于训练一个简单的二分类模型。
背景与约束: 使用Arduino Nano 33 BLE Sense(内置PDM麦克风),采样率设为16kHz,窗口长度1秒。需要采集200个“拍手”样本和200个“背景噪声”样本。由于拍手声音持续时间短(约0.2秒),窗口长度1秒可完整包含事件。
初始现象与目标: 直接使用串口监视器输出文本数据时,发现数据速率过高(16kHz),串口监视器无法实时显示,且手动复制数据不现实。因此改用Edge Impulse CLI自动采集。
关键操作步骤:
- 固件编写:使用Arduino IDE,加载Edge Impulse示例固件“nano_33_ble_sense_microphone”。该固件以16kHz采样率读取PDM麦克风,并通过USB串口以二进制格式发送数据。
- 启动CLI:在终端运行
edge-impulse-data-forwarder,选择设备“Arduino Nano 33 BLE Sense”,传感器类型选择“Microphone”。 - 配置采样参数:在Edge Impulse网页端,设置采样频率为16000Hz,窗口长度为1000ms,类别标签为“clap”和“noise”。
- 采集“拍手”样本:点击“Start sampling”,在1秒窗口内拍手一次。重复此操作200次,每次间隔5秒,避免样本重叠。
- 采集“背景噪声”样本:保持环境安静,点击“Start sampling”,等待1秒自动完成。重复200次。
- 数据验证:在Data Explorer中,检查“clap”样本的波形是否在0.2秒处有明显振幅峰值,而“noise”样本波形平缓。若发现部分“clap”样本振幅过低,可能是拍手力度不足,需重新采集。
结果对比与复盘: 采集完成后,共获得400个样本,数据平衡。在后续训练中,模型准确率达到95%以上。复盘发现,初始使用串口监视器时,由于文本输出占用大量CPU时间,导致采样率不稳定。改用CLI后,数据流通过二进制传输,CPU负载降低,采样率稳定在16kHz。此外,在采集“拍手”样本时,建议在安静环境中进行,避免混入其他声音干扰。
4.5 常见误区与总结复盘
在数据采集阶段,初学者常犯以下错误,导致后续训练效果不佳:
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 采样率设置过高,超出Arduino处理能力 | 数据丢失、波形失真 | 根据传感器特性选择合理采样率,必要时降低分辨率 |
| 样本类别不平衡(如“正常”样本远多于“异常”) | 模型偏向多数类,少数类识别率低 | 采集时确保每个类别样本数量接近 |
| 忽略数据标注一致性 | 模型学习到错误特征 | 制定标注规范,如“拍手”必须包含完整声音事件 |
| 未检查数据饱和(信号达到ADC上限) | 波形削顶,特征失真 | 调整传感器增益或Arduino参考电压 |
总结: 数据采集是Edge Impulse项目中最耗时但最关键的环节。本章的核心要点可归纳为:① 根据传感器输出类型选择正确的Arduino引脚与通信协议;② 小样本用串口监视器,大样本用CLI;③ 采样频率、窗口长度需根据物理事件特性设置;④ 采集后务必进行数据质量验证。掌握这些基础,你就能为后续的模型训练提供高质量的数据基础。