Funpack第二季第一期Syntiant TinyML
本项目基于syntiant tinyml开发板实现了语音控制LED,完成了点亮灯,关闭灯,闪烁,报警灯功能的实现
标签
嵌入式系统
人工智能
Funpack第二季第一期
george_shaw
更新2022-07-06
743

1.介绍

1.1syntiant tinyml开发板介绍

本次活动使用的开发板为syntiant tinyml开发板,这款开发板搭载了SAMD21的MCU以及NDP101的神经决策处理器,具有低功耗、体积小、易开发的特点。NDP101芯片可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍,实现了超低功耗运行。整个开发板的尺寸仅有24 毫米 x 28 毫米的规格,相当于一枚一元硬币的大小。开发板的示意图如下所示:

FtF53e47PKN-vZxe7gmL3KsTPKmX

在图中,我们可以看到开发板主要组成部分为一个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实现功能

在本项目中,我利用板载数字麦克风,实现了中文语音控制开灯,关灯,闪烁,报警的操作。为了实现上诉功能,我们在训练时选择对应的命令关键词分别为打开灯,关闭展示(关闭),闪烁,紧急报警。

Fum3NcTxgL7ENUN-sUaSMCgnCBND

3.代码实现与分析

本次活动是一次低代码量的活动,更加关注机器学习模型的训练。可以利用一个状态机来描述整个项目,如下图所示

FueuUW75HPYFqYW56CfPooafpr2g

整个状态机一共具有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平台完成了一个语音命令识别的小作品。在和群友的交流中也补充了自己的不足,感谢硬禾学堂提供的这一次机会,祝活动越办越好

 

附件下载
version4.4.zip
源代码文件
flash.zip
烧录文件
团队介绍
georgeshaw
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号