你曾经编程过阿杜伊诺吗?您是否曾经担心使用纯 C 编写的复杂控制流?也许你已经听说过状态图和状态机?在本博客文章中,我将向您展示如何在 5 分钟内使用YAKINDU 状态图工具(SCT) 的帮助下,以模型驱动的方式编程 Arduino。

Image title

已经几次试图编程阿杜诺与YAKINDUSCT如马可·舒尔蒂塞克勒内·贝克曼描述。然而,当我试图教如何编程Arduino与YAKINDU SCT在汽车软件工程暑期学校2016年在多特蒙德应用科学和艺术大学,我发现,这是很难理解和实施没有适当的工具。因此,我坐下来,实现了 Arduino 对 YAKINDU SCT 的支持,以生成在 Arduino 上运行状态机所需的大量胶水代码。

Arduino 的 YAKINDU 状态图工具基于 Eclipse、YAKINDU 状态图工具和 Eclipse C/C++开发工具 (CDT)。您可以在该链接下载状态图工具。 它设置一个初始项目,其中包含一个空状态图,您只需要用自己的想法来填充它。您仍然需要自行编程的唯一部分是状态图和硬件之间的连接,即根据状态图的状态初始化和更新硬件状态,反之亦然。

现在,让我们来看看工具。在下面的屏幕截图中,您会发现著名的 Arduino”你好世界”示例 – 闪烁的 LED – 编程为状态图它打开一个空状态图,其中有一个空的接口声明。我将使用此状态图对闪烁的 LED 进行建模,并生成在 Arduino Uno 板上运行的状态机。

SCTforArduino_Blink.png

LED 有两种状态,即开和关。因此,我声明一个布尔 on 变量,表示其值 truefalse 接口中的开和关。在状态图中,我创建两个状态 OnOff 。一旦部署到 Arduino,程序的执行开始通过状态图中描绘的黑点 ( 状态 ) 输入状态 Entry 图。进入状态图后,它会立即通过第一个转换更改其状态 – 它是从 Entry 状态到 On 状态的箭头。进入 On 状态时,布尔变量 on 设置为 true 。500 毫秒后,状态更改为 Off ,变量设置为 on false 。同样,在又过了 500 毫秒后,它将切换回 On 。这一切都在继续……直到你拔下插头

一旦我完成建模,我可能想模拟我的模型与YAKINDU SCT,看看它是否按预期工作。您将在YAKINDU SCT 文档中找到有关建模和仿真的更多详细信息。基于此状态图,我在 C++ 代码中生成状态机,该代码在我的 Arduino 上执行状态图。我还需要做的只是将状态图与硬件连接。我通过编辑 init() 类的 和 方法 来 runCycle() BlinkConnector 执行此操作:

  • init() 方法中,我设置了内置到 Arduino Uno 板中的 LED。在启动程序的执行时调用此方法一次 – 与 setup() 常见 Arduino 草图中的函数类似。
  • 该方法 runCycle()loop() Arduino 草图函数的模拟。它定期调用,在状态图执行的每个周期中调用一次。在这里,我相应地将LED的引脚设置为状态图的布尔 on 变量。

现在,我编译代码并上传到我的 Arduino 板。在那里,一个闪烁的LED在五分钟内!

SCTforArduino_Blink_generatedCode.png好了,你说得对,此示例可能以普通 C 实现,并在五分钟内上传到 Arduino。就这么简单但是,你能想象在下图所示的行人过路灯的复杂性下,在普通 C 中开发状态机的努力吗?甚至这个例子也很简单。顺便说一下,您将在 Arduino 环境的 YAKINDU SCT 中找到此示例以及闪烁示例。

SCTforArduino_PedestrianCrossing.png

在我的GitHub 页面上,您将找到从安装开始的完整演练,包括安装、建模、模拟、代码生成和代码部署。它还集成到雅金杜州图工具的阿杜诺在线帮助。

迄今为止,Arduino 的 YAKINDU SCT 支持制造商和物联网领域的各种流行的微处理器。其中包括广泛采用和众所周知的 Arduino Uno 板使用的 ATmega328 微处理器、Arduino Mega2560 的 ATmega2560 或 ESP8266。大多数 AVR 微处理器提供多个硬件计时器/计数器。雅金杜 SCT 为 Arduino,让我们选择其中之一。即使您的微处理器不在支持的微处理器列表中,您仍可以选择应在每个目标上运行的软件计时器。

更多的功能仍然来,所以请继续关注!

Comments are closed.