之前我们有介绍过如何利用STM32F103使用NanoEdge AI训练MPU6050的数据实现静止和振动判断。

不过这是一个非常简单的Demo测试,本期我们在此基础上,使用MPU6050实现小风扇的运行模式检测。
本期依旧是一个MPU6050用来检测震动数据,STM32利用USB实现和上位机通讯。
因此CubeMX只需要一组I2C和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 %f\r\n",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 probabilities
const 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 %f\r\n",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("\r\n", 2);
接着采集我们的数据,调用预测函数并利用串口输出。


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!