• 正文
  • 相关推荐
申请入驻 产业图谱

STM32F103如何实现多分类神经网络?使用MPU6050分辨风扇工作状态!

03/31 12:10
2515
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

不过这是一个非常简单的Demo测试,本期我们在此基础上,使用MPU6050实现小风扇的运行模式检测。

文末有部署到STM32F103并串口输出的视频!

准备工作

本期依旧是一个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 %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);

接着采集我们的数据,调用预测函数并利用串口输出。

相关推荐