第三章 硬件平台选型与介绍
做TinyML项目,第一步就是选硬件。这步走对了,后面事半功倍。走错了?嗯,我见过不少团队在硬件上栽跟头,最后不得不返工。
今天咱们就聊聊市面上主流的TinyML硬件平台,以及怎么给项目挑最合适的传感器。我会结合自己踩过的坑,给你一些实在的建议。
3.1 主流TinyML硬件平台对比
先看一张对比表,心里有个大概印象:
| 平台 | MCU/处理器 | RAM | Flash | AI加速 | 典型功耗 | 参考价格 |
|---|---|---|---|---|---|---|
| Arduino Nano 33 BLE Sense | nRF52840 (Cortex-M4F) | 256KB | 1MB | 无(纯CPU) | ~15mA | ~$35 |
| ESP32 | Xtensa LX6 双核 | 520KB | 4MB | 无(纯CPU) | ~80mA(WiFi开) | ~$5 |
| STM32(以F4系列为例) | Cortex-M4F | 192KB | 1MB | 可选STM32Cube.AI | ~50mA | ~$10-$30 |
| Raspberry Pi Pico | RP2040 (Cortex-M0+) | 264KB | 2MB(外挂) | 无 | ~25mA | ~$4 |
| K210(Sipeed Maix系列) | RISC-V 双核 + KPU | 8MB | 16MB | KPU神经网络加速器 | ~300mA | ~$15 |
3.1.1 Arduino Nano 33 BLE Sense
这块板子我用的最多。为什么?因为它集成了太多传感器了——麦克风、加速度计、陀螺仪、磁力计、温湿度、气压、光线、颜色传感器……几乎一板搞定。
它的核心是nRF52840,带蓝牙BLE 5.0。如果你做可穿戴设备、手势识别、声音分类这类项目,它很合适。
我的经验: 这块板子的RAM只有256KB,跑TinyML模型时,模型大小最好控制在100KB以内。我曾经硬塞了一个150KB的模型,结果系统频繁死机。后来用TensorFlow Lite Micro的模型量化工具,把模型压到80KB,才稳定运行。
小技巧: 用Arduino IDE开发时,记得选"Arduino Nano 33 BLE"板型,别选成普通Nano。我第一次就选错了,折腾了半天才发现。
3.1.2 ESP32
ESP32是性价比之王。5美元就能买到双核240MHz的处理器,还带WiFi和蓝牙。说实话,这个价格太香了。
但要注意,ESP32没有硬件AI加速器。跑模型全靠CPU硬算。我测试过,一个20KB的语音唤醒模型,推理时间大约30ms,勉强够用。再大就吃力了。
避坑指南: 我曾经用ESP32做图像分类项目,模型只有50KB,但推理一次要200ms。后来发现是图像预处理太慢——把320x240的图片缩放到64x64,用纯软件做双线性插值,耗时占了一大半。建议用硬件缩放功能,或者直接降低输入分辨率。
3.1.3 STM32
STM32是工业级的选择。它的生态系统非常成熟——STM32CubeMX、HAL库、FreeRTOS支持,还有官方的STM32Cube.AI工具链,能把训练好的模型直接转换成C代码。
我个人习惯用STM32F4系列做原型验证。它的Cortex-M4F带FPU,浮点运算快。而且ST官方提供了很多TinyML的示例工程,上手很快。
关键点: STM32Cube.AI支持量化感知训练(QAT)和权重量化。我用它把一个语音识别模型从1.2MB压缩到120KB,精度只掉了不到2%。这个工具值得花时间研究。
3.1.4 Raspberry Pi Pico
Pico用的是RP2040芯片,Cortex-M0+内核。说实话,它的算力在TinyML里算偏弱的。但它的优势是便宜(4美元)、功耗低、而且有PIO(可编程I/O)功能。
PIO能模拟各种外设协议。我做过一个项目,用PIO模拟I2S接口接麦克风,效果出奇的好。如果你需要自定义外设接口,Pico是个好选择。
小提示: Pico的MicroPython生态很活跃。如果你不想写C,用MicroPython做TinyML原型验证也挺快的。但生产环境还是建议用C。
3.1.5 K210(Sipeed Maix系列)
K210是专门为AIoT设计的芯片。它内置了KPU(神经网络处理器),能硬件加速卷积运算。跑MobileNet V1只需要30ms,这个速度在MCU里算顶尖了。
但K210也有短板——它的通用计算能力一般,RISC-V内核主频只有400MHz。而且开发工具链不如ARM生态成熟。我刚开始用K210时,光是搭建开发环境就花了两天。
注意: K210的KPU只支持特定的网络结构。比如,它要求卷积层的输入输出通道数必须是8的倍数。我有个项目用了5通道的输入,结果KPU不支持,只能改网络结构。设计模型时一定要先看KPU的约束条件。
3.2 传感器选型
传感器是TinyML项目的"眼睛"和"耳朵"。选对了,数据质量高,模型效果好。选错了,后面怎么调都没用。
3.2.1 麦克风
做语音唤醒、关键词识别、声音事件检测,都需要麦克风。
主流选择:
- MEMS麦克风(如MP34DT05): 体积小、功耗低、数字输出(PDM接口)。Arduino Nano 33 BLE Sense上集成的就是这颗。
- 模拟麦克风(如MAX9814): 需要外接ADC,但信噪比更高。适合对音质要求高的场景。
我建议新手用MEMS数字麦克风。PDM接口直接用MCU的PDM模块就能读,省去模拟电路设计的麻烦。
我的经验: 麦克风的采样率一般设16kHz就够了。我见过有人用44.1kHz采样,数据量翻了三倍,模型精度却没提升。对于语音识别,16kHz是黄金采样率。
3.2.2 加速度计
加速度计用于运动检测、手势识别、跌倒检测等。
常用型号:
- LSM9DS1(6轴): 加速度+陀螺仪,Arduino Nano 33 BLE Sense集成。
- MPU6050(6轴): 经典款,资料多,便宜。
- ADXL345(3轴): 超低功耗,适合电池供电设备。
小技巧: 做手势识别时,采样率设50-100Hz就够了。太高反而增加数据量,模型训练时间变长。我一般用50Hz采样,窗口长度2秒,效果不错。
3.2.3 摄像头
摄像头是TinyML里最"吃"资源的传感器。一张QVGA(320x240)的图片,未经压缩就有150KB,比很多MCU的RAM还大。
常用方案:
- OV2640(200万像素): 支持JPEG输出,能省不少RAM。ESP32-CAM常用这颗。
- OV7670(30万像素): 便宜,但只能输出RAW数据,需要MCU自己处理。
- GC032A(30万像素): 国产替代,性价比高。
避坑指南: 我曾经用OV7670做图像分类,发现帧率只有5fps。后来查资料才知道,OV7670的FIFO只有384KB,而一张QVGA的RAW图有150KB,加上MCU处理时间,帧率自然上不去。建议用带JPEG输出的摄像头,或者用K210这种带硬件图像处理器的芯片。
3.3 开发板外设与引脚功能
选好板子和传感器,接下来就是接线。这块看似简单,但最容易出问题。
3.3.1 常见外设接口
| 接口 | 用途 | 典型引脚数 | 速度 |
|---|---|---|---|
| I2C | 加速度计、温湿度、气压等 | 2(SDA+SCL) | 100-400kHz |
| SPI | 摄像头、显示屏、SD卡 | 4(MOSI+MISO+SCK+CS) | 10-80MHz |
| UART | GPS、蓝牙模块、调试 | 2(TX+RX) | 115200bps-2Mbps |
| I2S | 麦克风、音频编解码 | 3(BCK+WS+SD) | 1-10MHz |
| PDM | MEMS数字麦克风 | 2(CLK+DATA) | 1-4MHz |
3.3.2 引脚功能注意事项
每个开发板的引脚功能都不一样。我总结几个通用原则:
- 电源引脚: 3.3V和5V别接反。我烧过一块ESP32,就是因为接了5V到3.3V引脚。
- ADC引脚: 大部分MCU的ADC输入范围是0-3.3V。如果传感器输出超过这个范围,需要分压电路。
- PWM引脚: 不是所有引脚都支持PWM。用之前查一下数据手册。
- 中断引脚: 加速度计、按键等需要中断的传感器,要接到支持外部中断的引脚上。
我的习惯: 每次做新项目,我都会先画一张引脚分配表。把每个外设用的引脚、功能、电压都列清楚。这样接线时不会乱,排查问题也快。
3.3.3 实际接线示例
以Arduino Nano 33 BLE Sense外接MAX9814麦克风为例:
// MAX9814 -> Arduino Nano 33 BLE Sense
// VDD -> 3.3V
// GND -> GND
// OUT -> A0 (模拟输入)
// GAIN -> GND (固定增益,也可接VDD调增益)
// AR -> 3.3V (自动恢复使能)
void setup() {
Serial.begin(115200);
// 不需要额外配置,直接读模拟值
}
void loop() {
int micValue = analogRead(A0);
Serial.println(micValue);
delay(10);
}
这个例子很简单。但实际项目中,我建议用DMA方式读取ADC数据,避免阻塞CPU。特别是做语音识别时,需要连续采样,用DMA能省很多事。
小提示: 如果你用ESP32,注意它的ADC线性度不太好。我测试过,ESP32的ADC在0-1V范围内比较准,超过1V后误差会变大。建议用外部ADC芯片,或者只使用低电压范围。
3.4 本章小结
硬件选型没有绝对的好坏,关键看项目需求。我个人的建议是:
- 做语音类项目,优先考虑Arduino Nano 33 BLE Sense(传感器集成度高)
- 做图像类项目,K210性价比最高(硬件加速)
- 做工业级产品,STM32最稳妥(生态成熟)
- 做原型验证,ESP32最省钱(WiFi方便调试)
- 做超低功耗设备,Raspberry Pi Pico值得一试(功耗控制好)
下一章,我们会正式开始搭建开发环境。到时候我会手把手教你配置TensorFlow Lite Micro,并在开发板上跑通第一个TinyML模型。准备好了吗?