内容介绍
1 实现的功能
自带的麦克风,搭建机器学习模型,控制板卡上的蓝色LED灯根据中文语音指令(打开灯、关了灯、闪起来)呈现出开灯、关灯、闪烁的效果。
2 主要代码介绍
在这个项目中代码仅在官方源代码上加上了自己的控制函数,其他部分代码均未改变。
打开官网给的Arduino工程后可以看到名为on_classification_changed的函数,当识别到关键词后将会调用这个函数,可以改变这个函数来实现自己想要的功能。等下介绍这个函数。我们先看一下函数被调用时传入的变量,在\src\ei_setup.cpp中有个名为ei_classification_output的函数(如下方代码),该函数实现的功能是当识别到关键词后在串口输出识别到的关键词类型(如下图所示)和调用on_classification_changed函数。其中ei_classifier_inferencing_categories[matched_feature]为识别到的关键词的类型字符串,后面为可信度与分数,这里我们只用到了类型。
/**
* @brief Called from the ndp101 read out. Print classification output
* and send matched output string to user callback
*
* @param[in] matched_feature
*/
void ei_classification_output(int matched_feature)
{
if (ei_run_impulse_active()) {
ei_printf("\nPredictions:\r\n");
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf(" %s: \t%d\r\n", ei_classifier_inferencing_categories[ix],
(matched_feature == ix) ? 1 : 0);
}
on_classification_changed(ei_classifier_inferencing_categories[matched_feature], 0, 0);
}
}
接下来判断识别到的关键词是哪一个再执行相应的操作。因为每次只是识别到后执行一次这个函数,想要实现闪烁功能就不能单纯置位就能实现。所以这里定义了一个变量mod,当识别到关键词后改变mod的值,之后在主循环中判断mod并执行相应操作。入下方代码所示,将my_loop放入\src\syntiant.cpp中的syntiant_loop函数while(1)中即可。
char mod = 0;//LED灯效果模式
void on_classification_changed(const char *event, float confidence, float anomaly_score) {
if (strcmp(event, "dakaideng") == 0) {
mod = 1;//设置功能为打开灯
}
if (strcmp(event, "guanledeng") == 0) {
mod = 2;//设置功能为关了灯
}
if (strcmp(event, "shanqilai") == 0) {
mod = 3;//设置功能为闪起来
}
}
void my_loop(void) {
if (mod == 1)
digitalWrite(LED_BLUE, HIGH);//设置蓝色LED引脚为高电平
if (mod == 2)
digitalWrite(LED_BLUE, LOW);//设置蓝色LED引脚为低电平
if (mod == 3){
digitalWrite(LED_BLUE, !digitalRead(LED_BLUE));//翻转蓝色LED引脚电平
delay(200);
}
}
3 功能展示及说明
功能比较简单就是在读出关键词(打开灯、关了灯、闪起来)时实现相应的现象(点亮蓝色LED、熄灭蓝色LED、蓝色LED闪烁)。
读出打开灯指令:
读出关了灯指令:
读出闪起来指令后以2.5Hz的频率在上面两个状态转换
4 心得体会
这次项目并没有用到很多的编程知识,主要是使用EDGE IMPULSE进行训练模型。之前有使用OPENMV训练过图片的模型,但只是跟着教程做过一遍,通过这次项目完整的熟悉了EDGE IMPULSE训练模型的过程。非常感谢硬禾学堂的这次活动!!!!