1.介绍
1.1syntiant tinyml开发板介绍
本次活动使用的开发板为syntiant tinyml开发板,这款开发板搭载了SAMD21的MCU以及NDP101的神经决策处理器,具有低功耗、体积小、易开发的特点。NDP101芯片可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍,实现了超低功耗运行。整个开发板的尺寸仅有24 毫米 x 28 毫米的规格,相当于一枚一元硬币的大小。开发板的示意图如下所示:
在图中,我们可以看到开发板主要组成部分为一个SAMD21MCU芯片和与其通过SPI总线连接的NDP101芯片。SAMD21芯片的程序,我们可以直接使用Arduino进行烧录,而NDP101中的模型则需要利用arduino-cli结合批处理文件进行烧录。
1.2开发环境介绍
- edge impulse:用于收集数据和训练模型,并将模型直接生成为二进制文件便于烧录
- arduino:用于烧录SAMD21的程序以及显示输出信息,判断类别变化
- vs code:用于修改.c和.h文件,实现MCU的控制逻辑
2. 实现功能描述
2.1本期任务
任务一:用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
2.2实现功能
在本项目中,我利用板载数字麦克风,实现了中文语音控制开灯,关灯,闪烁,报警的操作。为了实现上诉功能,我们在训练时选择对应的命令关键词分别为打开灯,关闭展示(关闭),闪烁,紧急报警。
3.代码实现与分析
本次活动是一次低代码量的活动,更加关注机器学习模型的训练。可以利用一个状态机来描述整个项目,如下图所示
整个状态机一共具有4个基本状态,分别为灯灭,绿灯亮,绿灯闪,红灯闪,对应于代码中的state=0,1,2,3,对应的跳转指令分别为关闭展示,打开灯,闪烁,紧急报警,而对应的管脚信息可以在syntiant_tinyml_tutorial中找到,我们这里选取D15和D7作为输出,对应与syntaint.h中定义的宏OUT_1_PIN和OUT_2_PIN。
3.1 状态变化触发部分
/**
* @brief 当检测到对应命令时,改变状态
*
* @param[in] event 触发的关键词
* @param[in] confidence 置信度//未使用
* @param[in] anomaly_score 异常分数//未使用
*/
void on_classification_changed(const char *event, float confidence, float anomaly_score)
{
// 根据检测到的命令设置state变量,便于控制
if (strcmp(event, "stop") == 0) {
//检测到"关闭展示"
state = 0;
}
if (strcmp(event, "light") == 0) {
//检测到"打开灯"
state = 1;
}
if (strcmp(event, "blink") == 0) {
//检测到"闪烁"
state = 2;
}
if (strcmp(event, "sos") == 0) {
//检测到"紧急报警"
state = 3;
}
}
注意:为了便于修改,我将该函数移动至syntiant.cpp中
3.2 执行LED控制操作
if(loopNUM == 300)
{
switch(state){
case 0://"关闭展示"
digitalWrite(OUT_1_PIN, LOW);//关闭绿灯
digitalWrite(OUT_2_PIN, LOW);//关闭红灯
ledOut = LOW;
sosOut = LOW;
break;
case 1://"打开灯"
if (sosOut != HIGH){//当没有报警时,才可以打开绿灯
digitalWrite(OUT_1_PIN, HIGH);
ledOut = HIGH;
}
break;
case 2://"闪烁"
digitalWrite(OUT_1_PIN, !ledOut);//绿灯闪烁
ledOut = !ledOut;//免去调节GPIO为输入以及读GPIO的过程
break;
case 3://"紧急报警"
digitalWrite(OUT_2_PIN, !sosOut);//红灯闪烁
sosOut = !sosOut;
}
loopNUM = 0;
}
loopNUM++;
注意:在syntiant.cpp中对应的管脚需要开启,具体方法为在syntiant_setup()中添加下面两行代码。
pinMode(OUT_1_PIN, OUTPUT);
pinMode(OUT_2_PIN, OUTPUT);
3.3批处理文件修改
在烧录时经常需要修改arduino导出的二进制文件名称,较为麻烦,因此直接修改arduino文件名称为firmware并更改批处理文件的第72行为
CALL arduino-cli upload -p %COM_PORT% --fqbn arduino:samd:mkrzero --input-file firmware.ino.mkrzero.bin
4.活动总结
在本次活动中,我了解到了机器学习于嵌入式交叉领域的新技术tinyml,并尝试自己基于edge impulse平台完成了一个语音命令识别的小作品。在和群友的交流中也补充了自己的不足,感谢硬禾学堂提供的这一次机会,祝活动越办越好