Funpack第二季第一期——Syntiant TinyML Board
用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
标签
嵌入式系统
网络与通信
AI
TinyML
Syntiant
cjmf
更新2022-07-06
中国计量大学
529

设备介绍

配备超低功耗 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`,此时需要确保板子插入电脑且已经正常安装驱动。浏览器会自动跳转到数据采集页面并进行录音。

Fg06zSwqdrkyOEu5JsN1-sUds5WY

2. 创建设计

根据箭头一步步选择处理块和训练块。注意:必须选择 `Audio(Syntiant)`,否则导出选项中不会出现此次板卡。

 

FkDpUx3TKwoqh_0VphCrjOIWTCLk

 

3. 特征处理

点击 `Syntiant`,然后拖动窗口位置。我录制了一段2秒钟的音频,但是处理时仅能处理1秒。如果后半段为噪声可以把窗口拖到最前。

Fvao3CuVmxLXdPMVRzIKhG1UNTGB

4. 开始训练

默认情况下不需要修改网络架构,因为网络只支持 Dense Layer 和 Dropout 层,不支持 conv 层。而且默认网络架构表现相当不错,足够胜任本次任务。

FmbAmJSrCOsBl9ltbFUsBuO2ut62

 

5. 下载模型

 

下载模型需要选择 C++ 库,这样可以方便我们后期部署修改。

 

FlejLRERZWx4K6fxTHU0w6M0GMVB

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灯亮起。

FqtRe_FmLlU7yZpTxkLK1vGuYvyr

 

结尾

Syntiant TinyML Board 扩展性非常强大,体积又相当小巧,可以以很低的门槛实现AI识别,在此感谢硬禾团队的技术支持。

附件下载
firmware-syntiant-tinyml.zip
firmware.ino.bin
团队介绍
中国计量大学
团队成员
cjmf
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号