Engee 文档
Notebook

MPU6050Stm32f4位置传感器操纵杆

本演示示例考察了Engee模型,该模型用于使用卡尔曼滤波器读取轴向旋转角度,转换生成的角度,并将有限旋转角度传输到串行端口。

导言

基于Engee模型的项目 stm32_mpu6050.engee,执行以下任务:
-通过I2C控制器接收STM32F446RE传感器沿三个旋转轴的加速度和旋转速度MPU6050;
-这些值转换成轴向旋转-滚动,俯仰,偏航与卡尔曼滤波器;
-接收离散信号"固定"、"刻度切换";
-将轴向旋转转换为操纵杆法向量在笛卡尔坐标系中的坐标的偏差;
-将坐标偏差转换为角度 以球坐标转动操纵杆;
-获得的角度的限制 因此;
-变量输出:角度 ,"固定","切换刻度"到通用接收器-发射器(USART)。

元素和环境:
*调试板:NUCLEO-F446RE
*微控制器:STM32F446RE
*输入通道:I2C,2
*输出通道:USART(COM)
*三轴加速度计-陀螺仪传感器:MPU6050(GY-521)
*开发环境:Engee->VS Code1.92.1+PlatformIO6.1.15
*框架平台:stm32duino

使用的框架PlatformIO-stm32duino是由于可用现成的调试插件文件,用于处理MPU6050传感器和Arduino微控制器的卡尔曼滤波器。

项目文件

文件浏览器中的项目目录:

joystick_path.png
  • for_PlatformIO -包含PlatformIO项目文件的文件夹:
    • include -带有可插拔文件的文件夹:
      • I2Cdev.h -I2C接口的头文件;
      • Kalman.h -卡尔曼滤波器的头文件(也包含在模型中!);
      • MPU6050.h -传感器头文件MPU6050也包含在模型中!);
      • stm32_mpu6050.h -生成Engee模型的头文件;
    • source -带有C/C++源文件的文件夹:
      • I2Cdev.cpp -I2C接口源文件;
      • main.cpp -主用户程序文件;
      • MPU6050.cpp -传感器源文件MPU6050;
      • stm32_mpu6050.cpp -重新命名Engee模型的生成源文件;
  • joystick_description.ngscript -当前Engee脚本;
  • stm32_mpu6050.engee -本项目的Engee模型。

我们将添加一些文件和文件夹的路径和名称,用于团队管理建模,代码生成和处理文件。

In [ ]:
Pkg.add(["FilePathsBase"])
In [ ]:
имя_модели = "stm32_mpu6050";
папка_проекта = "$(@__DIR__)/";
путь_модели = папка_проекта * имя_модели * ".engee";
путь_генератора_кода = папка_проекта * "model_code/";
путь_platformIO_CPP = папка_проекта * "for_PlatformIO/src/";
путь_platformIO_H = папка_проекта * "for_PlatformIO/include/";

模型描述

模型 stm32_mpu6050.engee 这个项目可以分为以下功能组块:
*用于转换轴向旋转角度的块,
*与微控制器外围设备的交互块。

joystick_model.png

子系统实现的计算 EulersToDecart 沿着由卡尔曼滤波器获得的轴的旋转角度的值被转换成源自原点的操纵杆的法向量的笛卡尔坐标中的偏差:

子系统 DecartToSpheric 实际上,它执行反向变换。:

在将接收到的信号转换为操纵杆旋转角度后,它们将按照指定的范围进行限制。

外围块

项目模型包含4个使用块实现的微控制器外围单元 C Function:

  • I2C1_MPU6050_Kalman -要初始化I2C_1接口,请从MPU6050接收数据,并按旋转轴过滤角度;
  • GPIO10_INPUT -将PB6触点初始化为数字输入,以获取其状态;
  • GPIO11_INPUT -将触点PA7初始化为数字输入,以获取其状态;
  • USART2_ToSerial -要初始化USART_2接口并以9600波特的速度通过串行端口传输,请将值数组输出到串行端口。

为了在代码生成结果文件中包含I2C、MPU6050和卡尔曼滤波器的现成代码,这些文件和它们的路径在块中指定 C_Function "I2C1_MPU6050_Kalman":

joystick_include.png

也是街区 C Function "I2C1_MPU6050_Kalman"在仿真过程中生成传感器围绕Y和Z轴的旋转角度的变化。

来自块的代码如何工作的详细描述 C Function 在他的评论中给出。

模型工作的结果

要模拟旋转角度值的变换,请加载并运行模型 stm32_mpu6050.engee:

In [ ]:
if имя_модели in [m.name for m in engee.get_all_models()]
    m = engee.open(имя_модели);
else
    m = engee.load(путь_модели);
end

данные = engee.run(m);

从获得的模拟数据中,我们提取用于构建信号的变量。:

  • KalmanY -绕Y轴的模拟旋转角度,
  • KalmanZ -绕Z轴的模拟旋转角度,
  • SatTheta -计算角度 ,
  • SatPhi -计算角度 .
In [ ]:
# из данных модели извлекаем переменные для построения
KalmanY = Base.stack(данные["KalmanXYZ"].value, dims = 1)[:, 2];
KalmanZ = Base.stack(данные["KalmanXYZ"].value, dims = 1)[:, 3];
SatTheta = данные["SatTheta"].value;
SatPhi = данные["SatPhi"].value;
In [ ]:
using Plots;
gr();
plot(
     plot(данные["KalmanXYZ"].time, [KalmanY, KalmanZ];
          label=["Вращение по Y, рад" "Вращение по Z, рад"], lw=1, legend=:bottomright),
     plot(данные["SatTheta"].time, [SatTheta, SatPhi];
          label=["Угол ϑ, рад" "Угол φ, рад"], lw=1, legend=:bottomright);
     layout=(1,2), size=(900,300)
)
Out[0]:

从块形成的图形中可以看出 C Function "I2C1_MPU6050_Kalman"传感器围绕Y和Z轴的旋转角度转换为角度 而不改变值。

代码生成

我们将从模型中生成代码,以便随后将控制算法加载到微控制器中。

In [ ]:
engee.generate_code(путь_модели, путь_генератора_кода); # генерация кода из модели
[ Info: Generated code and artifacts: /user/start/examples/codegen/stm32_mpu6050_joystick/model_code

由于IDEVS Code+PlatformIO中的项目将继续从C++文件构建,因此需要更改扩展才能成功构建。 .c 上生成的文件 .cpp. 首先,转到生成文件的文件夹并查看其内容。:

In [ ]:
cd(путь_генератора_кода);   # переход в директорию
readdir()   # вывод содержимого директории
Out[0]:
3-element Vector{String}:
 "main.c"
 "stm32_mpu6050.c"
 "stm32_mpu6050.h"

这里: stm32_mpu6050.c -由前一个脚本单元格中的代码生成的C文件。 让我们更改新生成的C文件的扩展名。 若要使用现有名称复盖文件,请应用该属性 force = true. 之后,我们将再次显示带有代码生成结果的文件夹内容。

In [ ]:
mv(имя_модели * ".c", имя_модели * ".cpp"; force=true); # изменение расширения сгенерированного файла
readdir()   # вывод содержимого директории
Out[0]:
3-element Vector{String}:
 "main.c"
 "stm32_mpu6050.cpp"
 "stm32_mpu6050.h"

新生成的C文件的扩展名已更改。 在将项目文件添加到IDE之前,仍然需要将接收到的文件传输到文件夹。 srcincludePlatformIO项目。 为此使用库很方便。 FilePathsBase.jl

In [ ]:
## При необходимости раскомментируйте ячейку для скачивания и установки библиотеки
# import Pkg;
# Pkg.add("FilePathsBase")
In [ ]:
using FilePathsBase

# переносим файлы по папкам для проекта PlatformIO
mv(AbstractPath(имя_модели * ".cpp"),
   AbstractPath(путь_platformIO_CPP * имя_модели * ".cpp");
   force = true);
mv(AbstractPath(имя_модели * ".h"),
   AbstractPath(путь_platformIO_H * имя_модели * ".h");
   force = true);

生成的 main.c 它不会在项目中使用,您可以删除该文件及其目录。:

In [ ]:
cd("..") # переходим на уровень выше в файловой браузере
rm(путь_генератора_кода; recursive=true) # удаляем папку и main.c

现在,您可以继续配置硬件并使用IDE。

硬件部分

该项目的硬件部分,由前面提到的元素组成,具有以下连接方案:MPU6050传感器连接到NUCLEO F446RE调试板上的I2C_1接口,用于向GPIO10GPIO11引脚发送离散信

joystick_scheme.png

控制器的编程和通过USART接口读取数据是通过USB进行的。

建设项目

让我们使用以下配置文件设置在VSCode+PlatformIO开发环境的工作区中创建一个项目 platformio.ini:

``'ini
[env:nucleo_f446re]
平台=ststm32
板=nucleo_f446re
框架=arduino



在目录中 includesrc 从当前项目的Engee文件浏览器中添加相应目录中的文件。

joystick_vscode_Proj.png

之后,我们将运行"构建"项目的构建,并确保构建成功。:

image.png

在STM32F4上执行代码

我们将STM32F4控制器与由传感器和两个按钮触点组成的外设连接到串行端口,之后我们将开始将编译的项目代码上传到控制器,并确保下载成功。:

image.png

操纵杆法线的可变倾斜角度的值和锁定和刻度切换信号传送到计算机的串行端口:

serial.gif

该项目使用一个程序来显示来自串行端口的信号图。 SerialPlot.

结论

在本演示中,开发了Engee模型来转换MPU6050位置传感器绕轴的旋转角度。 从模型生成的代码在加载到STM32F446RE微控制器后再现内置功能。

Engee文档中,您可以获得其他帮助,以帮助您处理此项目:
-[模型导向设计]的概念(https://engee.com/helpcenter/stable/ru/core-modeling/mbd.html );
-代码生成器工程师;
-使用[C函数]块(https://engee.com/helpcenter/stable/ru/base-lib-user-defined-function/c-function.html );
-软件控制模型的仿真。