之前我们有介绍过如何利用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);

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

   

#include&nbsp;NanoEdgeAI.h#
嘉立创PCB

还没有评论,抢个沙发!