测评1: 【MAX78000FEATHERBOARD】开箱与Eclipse环境搭建
测评2:【MAX78000FEATHERBOARD】TFT屏幕驱动
测评3: 【MAX78000FEATHERBOARD】语音关键词训练
(1)项目介绍
项目的出发点是想体验一下MAX78000,尤其是如何训练一两个简单的关键词,达到简单的控制小台灯的效果。MAX78000板载了数字麦克风,测评2也扩展了屏幕,测评3对开关灯进行了训练。本次展示一下最终的项目原型:
(2)硬件介绍(包含方案核心器件介绍)
主控模块MAX78000FTHR# 是由 Analog Devices Inc./Maxim Integrated 推出的一款基于 MAX78000 微控制器的 Feather 兼容型评估板。该开发板融合了 低功耗 Arm® Cortex®-M4 处理器 与 CNN(卷积神经网络)加速器,为边缘 AI 和嵌入式视觉处理任务提供强大的支持,适合用于语音识别、人脸识别、物体检测等人工智能应用。
显示模块是分辨率240*320的电阻屏,SPI接口,ILI9341芯片。
控制LED灯管的是MOS开关,参数为:20A50A100A大功率MOS触发开关驱动模块 场效应管 PWM调节开关控制
此外,还有锂电池充电模块。
(3)整体设计思路/功能效果(包含功能框图、软件流程图、具体思路)
(4)关键代码介绍
在main.c中,添加训练的关键词:
/* Set of detected words */ const char keywords[NUM_OUTPUTS][10] = { "UP","GuanDeng","LEFT","RIGHT","STOP","KaiDeng", "YES","NO","ON","OFF","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","ZERO","Unknown" };
初始化CNN网络:
int cnn_init(void) { *((volatile uint32_t *) 0x50001000) = 0x00000000; // AON control *((volatile uint32_t *) 0x50100000) = 0x00100008; // Stop SM *((volatile uint32_t *) 0x50100004) = 0x0000040e; // SRAM control *((volatile uint32_t *) 0x50100008) = 0x00000009; // Layer count *((volatile uint32_t *) 0x50500000) = 0x00100008; // Stop SM *((volatile uint32_t *) 0x50500004) = 0x0000040e; // SRAM control *((volatile uint32_t *) 0x50500008) = 0x00000009; // Layer count *((volatile uint32_t *) 0x50900000) = 0x00100008; // Stop SM *((volatile uint32_t *) 0x50900004) = 0x0000040e; // SRAM control *((volatile uint32_t *) 0x50900008) = 0x00000009; // Layer count *((volatile uint32_t *) 0x50d00000) = 0x00100008; // Stop SM *((volatile uint32_t *) 0x50d00004) = 0x0000040e; // SRAM control *((volatile uint32_t *) 0x50d00008) = 0x00000009; // Layer count return CNN_OK; }
之后加载训练完成后的网络权重:
cnn_load_weights(); /* Configure state machine */ cnn_configure();
判断是否识别到“开灯”“关灯”
/* Treat low confidence detections as unknown*/ if (!ret || out_class == NUM_OUTPUTS - 1) { PR_DEBUG("Detected word: %s", "Unknown"); } else { PR_DEBUG("MGC-Detected word: %s (%0.1f%%)", keywords[out_class], probability); if(out_class == 5){ LED_On(LED1); MXC_GPIO_OutClr(lamp_control_pin.port, lamp_control_pin.mask); } if(out_class == 1){ LED_Off(LED1); MXC_GPIO_OutSet(lamp_control_pin.port, lamp_control_pin.mask); } #if 0 switch (out_class) { case 8: LED_On(LED1); MXC_GPIO_OutClr(lamp_control_pin.port, lamp_control_pin.mask); break; case 9: LED_Off(LED1); MXC_GPIO_OutSet(lamp_control_pin.port, lamp_control_pin.mask); break; default: ; //printf("UNKNOWN CLOCK SOURCE \n"); }//end of Switch-Case #endif }//end of else
(5)功能展示(包含成果视频,或GIF文件)
视频已经发布在b站: 终版-语音控制台灯 https://www.bilibili.com/video/BV12BMQzoEgc/?vd_source=06b417808f9325071f39e5fd55985221
(6)技术难点与解决方案/心得体会
数据的准备是稍微费时间的,这次完成制作是在官方的kws20项目基础上。如果从0开始,难度会比较大。后续会慢慢深入学习,理解AI边缘计算的更多知识。