- 项目描述
本次项目是硬禾学堂联合Digi-Key发起的Funpack第二季第一期“玩成功就全额退”活动。本次活动所使用的板卡Syntiant TinyML于4月1日上线,购买后大约一个月所有时间到货。在5月20日开始直播讲解活动流程及项目讲解,于6月30日晚上12点前完成任务并上传项目。
所使用的的板卡Syntiant TinyML配备超低功耗Syntiant ® NDP101神经决策处理器™,与传统的MCU相比不仅功耗小,而且系统效率也得到很大提高。另外Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,仅为一个硬币大小,但是一个小型的独立系统,神经决策处理器使用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卡插槽。使用者可以通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。
此次活动参与者需要在以下任务任选其一:
任务一:
用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等;
任务二:
若您针对这个板卡有更好的创意,可自命题完成(难度不能低于任务一)。
我选择的是任务一,项目所完成的是用Syntiant TinyML自带麦克风,使板卡实现开灯、关灯和闪烁三个效果。开发本项目即使觉得很有趣,同时也想了解一下嵌入式机器学习,提高自己动手能力。
另外本项目实现语音控制或运动识别等功能也很有发展前景,例如在一些不方便用手直接控制的地方可以采用语音或运动识别,例如疫情期间电梯按键防止交叉污染,可以采用语音控制;或是对于残障人士不方便的时候,可以用本板卡的功能协助完成。另外Syntiant TinyML 板的体积小,功耗低,效率高,接到其他系统也很方便,不会过多占用系统资源。
在做本次项目时也遇到了很多问题:
- 首先时电脑无法检测到接入的端口。开始我以为是环境没装对,一直到后面才意识到可能是USB线的问题。因为自己之前使用的是无线鼠标的充电线,没有传输数据的功能,后面换了数据线才能检测到端口。
- 下载官方go-stop程序卡顿。我参考了b站简简单单的创意up的教程,可能是所给的参考例程有点问题,下载后一直卡到给板子写程序那块,但却能检测到板卡的串口信息。后来通过文档直接在官方下载程序解决本问题。
- 安装arduino IDE及库文件出错。由于开始报错缺少库文件h,我将源码中的该文件移动,但导致错误越来越多。最后询问up简简单单的创意后按下面方法解决。
- https://github.com/edgeimpulse/firmware-syntiant-tinyml 下载zip;
- 解压后 ,目录名称改为 firmware-syntiant-tinyml;
- 打开命令行,CD到firmware-syntiant-tinyml 中,然后执行update_libraries_windows.bat;
- 双击打开 firmware-syntiant-tinyml.ino ,然后选择 MKRZero板子,编译,就能顺利完成;
- 板子不能烧录程序。在一次烧录模型后,串口突然卡住,能检测到端口,但无法用串口助手连接,也不能用bat文件烧程序,并且板卡上的RGB灯变为常亮的绿灯。最终是在活动群里其他人那里知道解决方法:连按两次复位键进入默认BootLoader,然后就恢复正常。
- 板卡的RGB灯一有声音就会有红灯闪烁,影响项目效果。将中断函数里面的“打开红灯”关闭后不在闪烁。
- 各功能对应的主要代码片段及说明
if (strcmp(event, "close") == 0) {
flag_switch = 0;
// Toggle LED
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
}
代码说明:当传过来的字符串标签为“close”时,执行关闭指令,关闭RGB灯;
if (strcmp(event, "open") == 0) {
// Toggle LED
flag_switch = 1;
//Turn on the white light
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
}
代码说明:当传过来的字符串标签为“open”时,执行开启指令,此时RGB灯为白灯,且后续的RGB灯需要次关键字激活。
if ( (strcmp(event, "red") == 0) && (flag_switch == 1) )
{
//Turn on the red light
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
}
if ( (strcmp(event, "green") == 0) && (flag_switch == 1) )
{
//Turn on the green light
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
}
if ( (strcmp(event, "blue") == 0) && (flag_switch == 1) )
{
//Turn on the blue light
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
}
代码说明:在打开指令的基础基础上,当说出关键字“红灯”、“绿灯”或者“蓝灯”时,板卡会常亮相关灯;
if(strcmp(event, "noise") != 0)
{
strcpy(event_temp, event);
}
if (strcmp(event_temp, "flash") == 0) {
digitalWrite(LED_BLUE, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
delay(200);
digitalWrite(LED_RED, LOW);
delay(200);
}
代码说明:当语音指令为“闪烁”时,RGB灯会闪烁红灯。
- 功能展示及说明
当说出关键字“打开”时,板卡会进入预备状态,RGB灯的颜色为白色;
当在打开状态的基础上说出关键字“红灯”时,板卡红灯常亮;
当在打开状态的基础上说出关键字“绿灯”时,板卡绿灯常亮;
当在打开状态的基础上说出关键字“绿灯”时,板卡绿灯常亮;
当说出关键字“关闭”时,板卡会关闭灯;
当说出关键字“闪烁”时,板卡会红灯闪烁;(展示结果在视频展示)
- 心得体会
本次活动让我收获颇多,不仅提高了我的专业能力,也让我对嵌入式机器学习有了更深的理解。在本次项目中遇到了很多问题,每次遇到问题研究不出来想放弃的时候多和别人交流,问题就得到解决,让我明白和别人交流很有必要,闭门造车行不通。
另外看“说明书”很重要,以前没有看说明书的习惯,都是直接看别人的视频讲解,或者直接自己摸索,但这样有可能走歪路,尤其是自己摸索,本次项目中由于前期这一不好的习惯导致走了很多弯路,后来多亏别人的帮助才走出来。很多问题都是文档里讲解的,而EDGE IMPULSE关于syntiant Tinyml讲解也讲得很细,基本问题都有介绍,还有正确的操作。
本次项目并不复杂,虽然走了一段时间弯路,但明白功能模块分工后也很容易理清思路,而且板卡感觉还有很大的开发空间,可以在后续在基于这款板卡做延伸功能,给我的收获挺多的,以后再去做其他项目也不会像无头苍蝇乱撞。
希望硬禾学堂以后可以出更多这样有趣、实用的活动!以后还会参加。