上一期我们介绍了使用MPU6500替代MPU6050制作了一个陀螺仪,价格便宜、性能强大。
本期我们就使用这个陀螺仪配合NanoEdge AI软件在STM32F103C8T6中做异常检测,目的是检测并识别到我敲击键盘的数据。
1、NanoEdge AI介绍
NanoEdge AI是意法半导体(ST)推出的一款边缘机器学习工具,专门为STM32系列微控制器设计,主打轻量级、低资源消耗的AI模型部署。它的核心优势在于能在极小的Flash和RAM占用下实现高效的异常检测或分类任务,甚至在M0这类低端芯片上也能流畅运行。
NanoEdge AI最强大的优势,就是对性能要求极低!!而且操作非常的简单。
?2、NanoEdge AI使用
首先在NanoEdge中创建一个新项目,项目类型选择异常检测,异常检测可以随着设备学习正常情况来区分正常情况和异常情况。
项目配置中,修改一下项目名称,将传感器类型选择为三轴加速度计。
芯片选择中,选择我们要使用的芯片,这里我选择STM32F1系列。
在第二个步骤添加我们要训练的信号,上图导入的是这次作为正常数据的,静止状态下的陀螺仪三轴输出数据。
输入完数据之后,将数据保存导入到NanoEdge中,NanoEdge会分析数据。
同样的方式,导入异常情况下的数据,之后就可以开始进行模型训练了。
在训练任务中,新建训练任务,选择需要参与训练的正常数据和异常数据即可开始进行训练。
训练过程中,NanoEdge AI提供了可视化的训练过程,NanoEdge AI会遍历它的模型库,寻找最适合的模型以调节准确率,RAM和Flash大小。
在使用过程中不一定要等待运行结束,我们可以在验证界面选择模型来进行验证。
在验证界面,我们依旧可以通过串口上传数据来实现模型验证。
训练完成后,我们就可以保存我们的模型,保存的模型为.ZIP格式,里面有静态库.a文件还有.h文件。
3、NanoEdge AI模型部署和使用
在STM32CubeIDE中,将.h文件和.a文件添加到工程目录中,这里只需要这两个文件即可。
在路径设置中,添加libneai.a静态库,这里需要额外注意的是,我们的命名成neai(真实的文件名叫做libneai.a)但是在库文件里面叫做neai。
NanoEdge AI总共有三个接口函数,首先是Neai初始化函数,这个在使用前需要初始化,其次是neai学习函数,用于我们使用中进行动态学习。
最后就是neai预测函数,传入我们的数据,得到预测值。
? staticint datanum =?0;
??if?(MPU6500_ReadData(&hmpu, &sensor_data) == HAL_OK)
? {
? ??if?(MPU6500_ConvertData(&hmpu, &sensor_data) == HAL_OK)
? ? {
? ? ??Data[datanum*3] = sensor_data.accel_x_g;
? ? ??Data[datanum*3+1] = sensor_data.accel_y_g;
? ? ??Data[datanum*3+2] = sensor_data.accel_z_g;
? ? ? datanum++;
? ? }
? }
??if(datanum ==?128)
? {
? ? datanum =?0;
? ? ? neai_anomalydetection_detect(Data, &predictscore);
? ? ??if(predictscore<80)
? ? ? {
? ? ? ? HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin,?1);
? ? ? ? HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,?0);
? ? ? }
? ? ??else
? ? ? {
? ? ? ? HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin,?0);
? ? ? ? HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,?1);
? ? ? }
? }
在定时器中断回调函数中,我们每10ms采集一次数据,当采集满128次(需要和训练的时候保持一致),将其放入预测函数中得到预测值。
之后根据预测值来亮灭对应的LED灯。
有一说一,这两年来,NanoEdge AI的变化挺大的,在我印象中就有三次巨大的改动。这次改动之后,发现模型训练时间比以前花的时间变得好长,将近一个小时了,但是效果还挺不错的。