之前我们有介绍过如何利用STM32F103使用NanoEdge AI训练MPU6050的数据实现静止和振动判断。
不过这是一个非常简单的Demo测试,本期我们在此基础上,使用MPU6050实现小风扇的运行模式检测。
文末有部署到STM32F103并串口输出的视频!
准备工作
本期依旧是一个MPU6050用来检测震动数据,STM32利用USB实现和上位机通讯。
将MPU6050用胶带粘贴到小风扇上,这个风扇总共有三档风速调节。
因此我们打算训练一个多分类识别网络,可以判断出风扇是静止、低风速、中风速、高风速状态。
数据上传
for(int i = 0;i<128-1;i++){MPU6050_Read_All(&hi2c2, &mpu_data);memset(s,0,sizeof(s));sprintf(s,"%f %f %f ",mpu_data.Ax,mpu_data.Ay,mpu_data.Az);CDC_Transmit_FS(s,strlen(s));Data[i*3+0] = mpu_data.Ax;Data[i*3+1] = mpu_data.Ay;Data[i*3+2] = mpu_data.Az;HAL_Delay(1);}sprintf(s,"%f %f %frn",mpu_data.Ax,mpu_data.Ay,mpu_data.Az);Data[127*3+0] = mpu_data.Ax;Data[127*3+1] = mpu_data.Ay;Data[127*3+2] = mpu_data.Az;CDC_Transmit_FS(s,strlen(s));
数据上传部分非常简单,将XYZ轴的数据格式化为字符串,每组数据之间用空格隔开,最后一组数据发送完后添加换行符号。(最后一组数据的最后不需要空格)
打开NanoEdge AI,选择多分类模型。
设置Flash和RAM大小,选择我们的芯片系列(F103),选择传感器类型,这里我们选用三轴加速度传感器。
添加数据,并选用USB输入,然后开始上传每一组别的数据。
依次获取了四组数据,分别是对应了四个工作模式。
模型训练和验证
选择这四组数据开始训练,这里需要等待一段时间等待训练结束。
训练完可以查看我们的模型指标,例如准确率,RAM和Flash大小。
选择模型进行验证。
获取并保存我们的模型到工作目录。
这里主要就是需要这三个文件。
CubeIDE中添加.a文件和它的路径(不需要lib和后缀)
接着我们看一下NanoEdgeAI.h的内容。
包含了初始化和调用NanoEdgeAI进行预测的函数。下面我们将介绍如何在main.c中使用。
#include "NanoEdgeAI.h"#include "knowledge.h"//需要包含两个头文件float Data[3*128];float output_class_buffer[CLASS_NUMBER]; // Buffer of class probabilitiesconst char *id2class[CLASS_NUMBER + 1] = { // Buffer for mapping class id to class name"unknown","高风速","中风速","低风速","静止",};int Index;
main.c内容
首先需要包含头文件的内容,存放输入数组,输出数组(各个分类的预测值),分类名以及最大预测值的索引值。
MPU6050_Init(&hi2c2);neai_classification_init(knowledge);
初始化
调用MPU6050和NanoEdgeAI的初始化函数,Knowledge这个数组的定义在knowledge.h中。
for(int i = 0;i<128-1;i++){MPU6050_Read_All(&hi2c2, &mpu_data);memset(s,0,sizeof(s));sprintf(s,"%f %f %f ",mpu_data.Ax,mpu_data.Ay,mpu_data.Az);//CDC_Transmit_FS(s,strlen(s));Data[i*3+0] = mpu_data.Ax;Data[i*3+1] = mpu_data.Ay;Data[i*3+2] = mpu_data.Az;HAL_Delay(1);}sprintf(s,"%f %f %frn",mpu_data.Ax,mpu_data.Ay,mpu_data.Az);Data[127*3+0] = mpu_data.Ax;Data[127*3+1] = mpu_data.Ay;Data[127*3+2] = mpu_data.Az;//CDC_Transmit_FS(s,strlen(s));neai_classification(Data,output_class_buffer,&Index);CDC_Transmit_FS(id2class[Index], strlen(id2class[Index]));HAL_Delay(1);CDC_Transmit_FS("rn", 2);
接着采集我们的数据,调用预测函数并利用串口输出。
2515