设备介绍
配备超低功耗 Syntiant ® NDP101神经决策处理器™,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍。Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。
主要特点
- 神经决策处理器使用NDP101,连接了两个传感器
- BMI160 6轴运动传感器
- SPH0641LM4H麦克风
- 主机处理器:SAMD21 Cortex-M0+ 32位低功耗48MHz ARM MCU
- 内置256KB FLASH和32KB SRAM,
- 5个数字I/O,与Arduino MKR系列板兼容
- 其中包含1路UART接口和1路I2C接口(包括在数字I/O引脚中)
- 2MB板载串行闪存
- 一个用户定义的RGB LED
- uSD卡插槽
- 电路板可使用5V micro-USB或3.7V LiPo电池供电
实现思路
先是使用 Edge Impulse 进行数据收集,然后处理特征,最后进行训练并生成模型。通过调用库实现灯的闪烁状态切换。
实现步骤
1. Edge Impulse 数据收集
进入页面,点击 `Data acquisition` ,然后点击右上角 `Connect using WebUSB`,此时需要确保板子插入电脑且已经正常安装驱动。浏览器会自动跳转到数据采集页面并进行录音。
2. 创建设计
根据箭头一步步选择处理块和训练块。注意:必须选择 `Audio(Syntiant)`,否则导出选项中不会出现此次板卡。
3. 特征处理
点击 `Syntiant`,然后拖动窗口位置。我录制了一段2秒钟的音频,但是处理时仅能处理1秒。如果后半段为噪声可以把窗口拖到最前。
4. 开始训练
默认情况下不需要修改网络架构,因为网络只支持 Dense Layer 和 Dropout 层,不支持 conv 层。而且默认网络架构表现相当不错,足够胜任本次任务。
5. 下载模型
下载模型需要选择 C++ 库,这样可以方便我们后期部署修改。
6. 创建 Arduino 工程
克隆示例项目 GitHub - edgeimpulse/firmware-syntiant-tinyml: Edge Impulse firmware for Syntiant TinyML board ,直接将下载的内容解压进去覆盖原文件即可。操作在视频中有详细讲解,这边就不以文字形式展现。
7. 配置 LED 灯
默认情况下官方并没有给出 LED 灯的引脚位置,可以通过原理图查看 LED 灯的位置。
#define B_PIN 19
#define G_PIN 20
#define R_PIN 32
#define B_HIGH() digitalWrite(B_PIN, HIGH)
#define B_LOW() digitalWrite(B_PIN, LOW)
#define B_TOGGLE() digitalWrite(B_PIN, !digitalRead(B_PIN))
#define G_HIGH() digitalWrite(G_PIN, HIGH)
#define G_LOW() digitalWrite(G_PIN, LOW)
#define G_TOGGLE() digitalWrite(G_PIN, !digitalRead(G_PIN))
#define R_HIGH() digitalWrite(R_PIN, HIGH)
#define R_LOW() digitalWrite(R_PIN, LOW)
#define R_TOGGLE() digitalWrite(R_PIN, !digitalRead(R_PIN))
同样不要忘记使能 IO 输出模式。这一步需要修改原 `setup` 函数。
void setup(void)
{
pinMode(B_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(R_PIN, OUTPUT);
B_LOW();
G_LOW();
R_LOW();
syntiant_setup();
}
下面编写自定义的 LED 动作。
void sos(void) {
B_LOW();
G_LOW();
R_LOW();
delay(100);
R_TOGGLE();
delay(1000);
R_TOGGLE();
delay(500);
R_TOGGLE();
delay(1000);
R_TOGGLE();
delay(500);
R_TOGGLE();
delay(1000);
R_TOGGLE();
delay(500);
R_TOGGLE();
delay(200);
R_TOGGLE();
delay(200);
R_TOGGLE();
delay(200);
R_TOGGLE();
delay(200);
R_TOGGLE();
delay(1000);
R_TOGGLE();
delay(500);
R_TOGGLE();
delay(1000);
R_TOGGLE();
delay(500);
R_TOGGLE();
delay(1000);
R_TOGGLE();
delay(500);
}
void huxi(void) {
B_LOW();
G_LOW();
R_LOW();
delay(1000);
B_HIGH();
delay(1000);
B_LOW();
delay(1000);
B_HIGH();
delay(1000);
B_LOW();
}
void offlight(void) {
B_HIGH();
G_HIGH();
R_HIGH();
delay(1000);
B_LOW();
G_LOW();
R_LOW();
}
void onlight(void) {
B_LOW();
G_LOW();
R_LOW();
delay(1000);
B_HIGH();
G_HIGH();
R_HIGH();
delay(3000);
}
void closeLight(void) {
B_LOW();
G_LOW();
R_LOW();
}
void shanshuo(void) {
B_LOW();
G_LOW();
R_LOW();
delay(200);
B_HIGH();
G_HIGH();
R_HIGH();
delay(200);
B_LOW();
G_LOW();
R_LOW();
delay(200);
B_HIGH();
G_HIGH();
R_HIGH();
delay(200);
B_LOW();
G_LOW();
R_LOW();
}
8. 绑定识别事件
识别事件是通过一个回调函数实现的,可以直接修改 `on_classification_changed` 函数。
/**
@brief Called when a inference matches 1 of the features
@param[in] event The event
@param[in] confidence The confidence
@param[in] anomaly_score The anomaly score
*/
void on_classification_changed(const char *event, float confidence, float anomaly_score) {
// here you can write application code, e.g. to toggle LEDs based on keywords
if (strcmp(event, "huxi") == 0) {
huxi();
}
if (strcmp(event, "offlight") == 0) {
offlight();
}
if (strcmp(event, "onlight") == 0) {
onlight();
}
if (strcmp(event, "shanshuo") == 0) {
shanshuo();
}
if (strcmp(event, "sos") == 0) {
sos();
}
closeLight();
}
9. 编译下载
可以看到说出特定关键字后LED灯亮起。
结尾
Syntiant TinyML Board 扩展性非常强大,体积又相当小巧,可以以很低的门槛实现AI识别,在此感谢硬禾团队的技术支持。