Engee 文档
Notebook

Arduino支持包:快速启动

该系列的第一个例子是从Engee开始使用Arduino微控制器,而无需深入了解代码。 该示例逐步解释了如何在控制器上设置连接,构建和运行第一个模型。

导言

Engee模型到嵌入式系统(包括Arduino)的自动传输已经实现了很长时间。 在早期的项目中,您可以找到几个将模型转移到代码并在Arduino上执行它的基本示例,这些示例具有不同程度的用户沉浸在低级编程中。 这些示例主要用作掌握将模型转移到嵌入式系统的场景的说明。 以下是之前介绍的场景:

  1. "算法导出"(example) :
    *用户在模型中开发算法
    *C代码是从模型自动生成的
    *用户下载文件
    *文件将添加到外部IDE中的项目中
    *用户集成了算法代码和微控制器外设代码
    *用户对控制器进行编程
  2. "外围单位"[(例子)](https://engee.com/helpcenter/stable/ru/interactive-scripts/codegen/arduino_traffic_lights.html ):
    *用户在模型中开发算法
    *用户传输外围代码
    *C代码是从模型自动生成的
    *用户下载文件
    *文件将添加到外部IDE中的项目中
    *用户对控制器进行编程

当用户还没有准备好放弃已经用于嵌入式系统的工具链,并且Engee用于在模型中开发算法或自动集成算法和外围代码时,这样的场景很方便。

为了避免沉浸在C代码中,Engee用户可以使用嵌入式系统支持包。 他们正在开辟[两个全新的场景](https://engee.com/helpcenter/stable/ru/engee-hardware/target-hardware.html ):

  1. "独立执行"
    *用户在模型中开发算法
    *用户从微控制器支持包中添加专用块
    *控制器编程自动启动
  2. "互动执行"
    *用户在模型中开发算法
    *用户从微控制器支持包中添加专用块
    *控制器编程自动启动
    *用户可以控制微控制器上运行的模型,更改其参数并可视化模型信号。

在[Arduino微控制器]上准备和操作这些场景(https://engee.com/helpcenter/stable/ru/engee-hardware/arduino-support-package.html ),并将进一步涵盖。

步骤1:Arduino及其工具链

对于这个例子,我们将需要:

  1. Arduino微控制器(Uno,Mega或其他带有AVR芯片的)
  2. USB电缆
  3. 安装在PC上的微控制器驱动程序
  4. 工具链Arduino-ArduinoCLI

将Arduino连接到PC,确保安装了驱动程序,PC识别微控制器。 在这个阶段,我们将立即确定微控制器连接的端口。:

img1.png

在我们的例子中,这是COM10端口上的Arduno Uno R3。

下载[ArduinoCLI](https://github.com/arduino/arduino-cli )-将来,该工具将从Engee自动调用以对微控制器进行编程。 将其放在特定目录中会最方便。 在此和随后的示例的情况下,其路径被定义为 "D:\targets\arduino-cli.exe". 让我们记住它以备将来参考。

我们将使用ArduinoCLI获得我们董事会的全名。 为此,请转到其目录,在其中打开一个终端并调用例如PowerShell中的命令 .\arduino-cli.exe board list

img10.png

这样,我们将获得COM连接设备的列表。 从命令行输出可以看出,一个全称为(FBQN)的Arduino Uno板连接到COM10 arduino:avr:uno -我们还将进一步需要它。

可用的FQBN可以获得,例如,通过调用命令 .\arduino-cli.exe board listall

![img11.png](附件:img11.png)

第2步:Engee平台。综合服务

目标设备与PC之间的连接已建立,现在[建立连接](https://engee.com/helpcenter/stable/ru/engee-hardware/engee-integrations.html )在Engee和PC之间。 要做到这一点,我们需要:

  1. 安装/安装Engee.Интеграции
In [ ]:
# engee.package.install("Engee-Device-Manager")
  1. 从客户端程序下载存档,解压缩并运行它。 在本示例的情况下,客户端程序方便地位于与ArduinoCLI相同的目录中。:

    ![img2.png](附件:img2.png)

  1. 在Engee和PC之间建立连接。 您需要将以前收到的链接插入到客户端程序中,然后单击连接:
img3.png

PC和Engee之间的连接已经建立,您可以直接进行微控制器的模型和编程的开发。

此外,如果您愿意,可以获取/更新[examples文件夹](https://engee.com/helpcenter/stable/ru/feature/engee-package-functions.html#engee.package ...getdemos),您可以在其中找到与外部设备,外围设备和微控制器一起工作的测试用例。

In [ ]:
engee.package.getdemos("Engee-Device-Manager")
Out[0]:
"/user/Engee-Device-Manager-demos"

步骤3:示例模型

"你好世界!"对于Arduino,这是一个LED闪烁程序。 这就是它在Engee模型中的外观:

img4.png

该模型的算法由一个块,脉冲发生器。 其设置:

脉冲类型-基于计算步骤;振幅-1;周期(计算步骤数)-50;脉冲宽度(计算步骤数)-25;第一脉冲之前的延迟(计算步骤数)-0,采样周期-0.02。

该块形成一个频率为1Hz且D=50%的蜿蜒器。

信号 LED 块的输出端,传送到控制器的外围单元。 [Arduino-digitalWrite](https://engee.com/helpcenter/stable/ru/hardware-arduino/arduino-digitalwrite.html )是GPIO13的数字输出。 在模型计算的每个步骤中,块调用写入数字输出的标准函数 digitalWrite() 从Arduino库。

引脚13是调试板上内置LED连接的输出。

[EDM-Target-Arduino]块(https://engee.com/helpcenter/stable/ru/hardware-arduino/edm-target-arduino.html )是必要的,以建立与微控制器及其工具链的通信。 这是当前示例中块设置的定义方式:

img5.png

*Port是我们的微控制器连接到的串行端口的名称。 它可以定义如下:

  • COM10 -对于Windows,这是我们在示例中为微控制器获得的值。
  • /dev/tty/USB0 -linux的串行端口名称示例。
  • <auto> -如果连接了一个微控制器,Engee将独立确定其端口。

*董事会的全名是我们之前收到的董事会的FQBN。 这里有可能的选择:

  • arduino:avr:uno / arduino:avr:mega / arduino:avr:leonardo / ... -取决于连接的卡。
  • <auto> -如果连接了一个微控制器,Engee将自行确定其名称。

*路径ArduinoCLI-完整路径ArduinoCLI

  • "D:\targets\arduino-cli.exe" -我们在我们的示例中在Windows资源管理器的上下文菜单中复制了此值。
  • "D:\targets\arduino-cli" / D:\targets\arduino-cli.exe / D:\targets\arduino-cli -在Windowa中指定路径的也可接受的选项
  • /home/Targets/Arduino/arduino-cli -在Linux中指定ArduinoCLI路径的选项
  • <auto> -在这种情况下,Engee将根据以下优先级自动搜索ArduinoCLI:
    *添加到环境变量的路径 PATH;
    *客户端程序的当前目录;
    • C:\Program Files\;
    • C:\Program Files (x86)\.

*模型目录-带有草图的文件夹位置的路径 .ino 这些模型相对于客户端程序的位置。 在我们的例子中,这是 .\arduino_examples,此文件夹将自动创建,最终文件夹结构 targets 此示例将如下所示:

``'bash
PS D:\targets>树/f
文件夹结构
卷序号:4040-B539
D:。
│arduino-cli。exe文件
│engee-设备管理器。exe文件

├───arduino_examples
├───arduino_quick_start
arduino_quick_start。井野


步骤4:建模

示例模型已经组装好,在将其上传到微控制器之前,当然必须通过在Engee中建模进行测试。 这既可以在图形界面中完成,也可以在使用[软件管理]的脚本中自动化。 моделированием](https://engee.com/helpcenter/stable/ru/modeling/programmatic-modeling-simulation.html).

In [ ]:
cd(@__DIR__)
name = "arduino_quick_start"
try
    engee.close(name, force=true) # 关闭模型
catch err # 如果没有模型关闭和engee。close()不执行,它将在catch之后加载。
    m = engee.load(name*".engee") # 加载模型
end;
try
    engee.run(m) # 启动模型
catch err # 如果模型没有加载和engee。run()不执行,catch后最下面的两行将被执行。
    m = engee.load(name*".engee") # 加载模型
    engee.run(m) # 启动模型
end
Out[0]:
SimulationResult(
    run_id => 29,
    "LED" => WorkspaceArray{Float64}("arduino_quick_start/LED")

)

在仿真过程中,通过在工作区中记录"LED"信号获得了仿真的结果。 我们将获得信号的时间和值,并绘制其图形,以便对算法的操作进行可视化验证。:

In [ ]:
data = collect(simout[name*"/LED"])
t = data.time
LED = data.value

gr(format=:png)

plot(t, LED; label = :none)
Out[0]:
No description has been provided for this image

该图显示了一个频率为1Hz,D=50%,振幅=1的弯曲。 Engee中的仿真阶段已成功完成,添加了支持包中的模块,并建立了与微控制器的连接。 现在,您可以根据两个计划场景继续执行模型。

第五步:独立执行

首先,我们将切换[目标平台](https://engee.com/helpcenter/stable/ru/feature/interface-description.html ):而不是Engee在下拉列表中,选择目标硬件:

gif1.gif

点击**"按钮在一个独立的启动режиме"。这将导致独立于Engee**在目标平台上生成和运行独立的实时应用程序。 有关模型组装和加载的信息在[诊断窗口]中可见(https://engee.com/helpcenter/stable/ru/tutorial/model-diagnosis.html )。

在模型组装过程中,您可以观察Engee如何自动启动ArduinoCLI来构建项目,编译它并将其上传到微控制器。 Arduino板上RX/TX Led的闪烁也表明启动过程的进展。 板上L LED的闪烁表示模型已完成。

在Arduino上以这种模式运行会导致从模型生成的实时应用程序独立于Engee在微控制器上运行。 在Engee中启动应用程序后,我们只看到有关代码生成和上传到设备所花费时间的信息,以及有关模型启动的通知。

步骤6:交互式执行

在[互动式фиме](https://engee.com/helpcenter/stable/ru/engee-hardware/target-hardware.html#режим-запустить-модель-на-железе )实现了目标硬件和工程师之间的双向数据交换。 要在此模式下运行模型,请单击按钮。"在硬件上运行模型"-还会发生ArduinoCLI调用,应用程序加载,相应的消息显示在模型诊断窗口中。

但是,在启动应用程序后,您可以立即看到模型正在Arduino上运行,并且信号变化显示在Engee中的图表上。 从微控制器到Engee的数据传输由板上TX LED的周期性闪烁指示,并且可以在信号可视化窗口中观察到记录信号的图形。

此外,仍然可以控制Arduino上的应用程序-在正确的时刻,例如,您可以停止在硬件上执行模型。

为了方便监控模型,您可以增加时间-在这种模式下,模型运行100秒而不是10秒。 对于无限的执行时间,您可以在模拟间隔结束时的行中输入 Inf.

在这种模式下工作的另一个有趣和重要的特征是动态更改模型参数。 这在[继续的例子]中有更详细的描述(https://engee.com/community/ru/catalogs/projects/arduino-meniaem-parametry-na-letu )。

补充:数据检查员

用于监控从Arduino接收的数据的另一个方便工具是内置的Engee应用程序**"[Data Inspector](https://engee.com/helpcenter/stable/ru/guide/data-inspector.html"。**以交互方式打开应用程序:

借助此工具,即使在模型执行期间,也可以分析模型各种运行中的信号。

增编:一揽子支援计划的结果

此外,您可以关注支持包的结果。 启动独立/交互模式后,从模型生成一个代码,Engee放置在文件夹中 /user/codegen_target/ 文件浏览器。 我们将获取最近创建的文件夹的名称和内容:

In [ ]:
path = "/user/codegen_target"
folders = filter(f -> isdir(joinpath(path, f)), readdir(path))
if !isempty(folders)
    latest_folder = last(sort(folders, by=f -> stat(joinpath(path, f)).ctime))
    println("最后创建的文件夹:\n"*latest_folder)
end
println("\其他内容:")
readdir(joinpath(path,latest_folder)) .|> println;
Последняя созданная папка: 
0eb920ef-a28a-4037-9630-6ff17de8908a

Её содержимое:
arduino_quick_start.c
arduino_quick_start.h
codeinfo.json
main.c

在此文件夹中:

  • .h,。c文件是C中的模型代码,可以下载并在代码导出脚本中使用。
    *codeinfo文件。json是对JSON格式的模型代码接口的描述。 这里提供了函数、数据结构、状态、可配置参数和模型元数据的名称。

下面是这个文件的内容在我们的情况下。:

In [ ]:
for line in eachline(joinpath(path,latest_folder,"codeinfo.json"))
    println(line)
end
{
    "entrypoints": [
        {
            "type": "INIT",
            "name": "init",
            "cname": "arduino_quick_start_init"
        },
        {
            "type": "STEP",
            "name": "step",
            "cname": "arduino_quick_start_step",
            "sample_time": "0.02",
            "inputs": [],
            "outputs": [],
            "states": [
                {
                    "cname": "arduino_quick_start_S",
                    "ctype": "Ext_arduino_quick_start_S",
                    "fields": []
                }
            ],
            "timings": []
        },
        {
            "type": "TERMINATE",
            "name": "term",
            "cname": "arduino_quick_start_term"
        }
    ],
    "tunable_params": null,
    "logging_signals": {
        "cname": "arduino_quick_start_B",
        "ctype": "Ext_arduino_quick_start_B",
        "fields": [
            {
                "name": "Pulse Generator",
                "cname": "LED",
                "ctype": "double",
                "mtype": "double",
                "dims": [],
                "uuid": "1ee02607-0cf8-4001-9989-3751fa191965",
                "sample_time": "0.02"
            }
        ]
    },
    "metadata": {
        "codegen_version": "release-1.1.30",
        "model_uuid": "",
        "model_name": "arduino_quick_start",
        "target": "c",
        "model_config": {
            "Codegen": {
                "EnableMultiTasking": false,
                "GenerateComments": true,
                "CreateCFunction": false,
                "DefaultParameterBehavior": "Inlined",
                "TargetHardware": "C"
            },
            "Solver": {
                "AbsTol": "auto",
                "FixedStep": "0.02",
                "InitialStep": "auto",
                "MaxStep": "auto",
                "MinStep": "auto",
                "OutputOption": "false",
                "OutputTimes": "1e-2",
                "RelTol": "auto",
                "SolverName": "Euler",
                "SolverType": "fixed-step",
                "StartTime": "0.0",
                "StopTime": "100",
                "SaveSignalsAtEvents": true,
                "ZcThreshold": "1e-10",
                "MaxConsecutiveMinStep": "10"
            },
            "SimulationMode": "normal",
            "RITM": {
                "ritmDetectOverruns": true,
                "ritmOVRMode": "Terminate",
                "ritmOVRtoignore": 1,
                "ritmCalculateTET": true,
                "ritmProfile": false,
                "ritmProfilePoints": 400,
                "ritmCompilerFastRun": false,
                "ritmExtModeNoWait": false
            },
            "DataSource": {
                "DataSourceType": "BaseWorkspace",
                "DataDictionary": null,
                "HasAccessToBaseWorkspace": true
            }
        }
    }
}

使用ArduinoCLI生成的应用程序的源文件可以在路径沿线的目录中找到:

C:\Users\<username>\AppData\Local\arduino\sketches\<sketch_id> -将有与文件夹中相同的文件。 /user/codegen_target/ Engee文件浏览器。

我们之前在"EDM-Target-Arduino"块中设置的路径"模型目录"现在将包含该文件夹

D:\targets\arduino_examples\arduino_quick_start,包含示例草图 arduino_quick_start.ino.

结论

在这个例子中,我们已经掌握了Engee中Arduino支持包的入门:我们经历了在Arduino上建立连接,准备环境,开发模型以及以独立和交互模式执行模型的过程中的步骤。