第三章 硬件平台选型与介绍

做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模型。准备好了吗?