你曾经编程过阿杜伊诺吗?您是否曾经担心使用纯 C 编写的复杂控制流?也许你已经听说过状态图和状态机?在本博客文章中,我将向您展示如何在 5 分钟内使用YAKINDU 状态图工具(SCT) 的帮助下,以模型驱动的方式编程 Arduino。
已经几次试图编程阿杜诺与YAKINDUSCT如马可·舒尔蒂塞克或勒内·贝克曼描述。然而,当我试图教如何编程Arduino与YAKINDU SCT在汽车软件工程暑期学校2016年在多特蒙德应用科学和艺术大学,我发现,这是很难理解和实施没有适当的工具。因此,我坐下来,实现了 Arduino 对 YAKINDU SCT 的支持,以生成在 Arduino 上运行状态机所需的大量胶水代码。
Arduino 的 YAKINDU 状态图工具基于 Eclipse、YAKINDU 状态图工具和 Eclipse C/C++开发工具 (CDT)。您可以在该链接下载状态图工具。 它设置一个初始项目,其中包含一个空状态图,您只需要用自己的想法来填充它。您仍然需要自行编程的唯一部分是状态图和硬件之间的连接,即根据状态图的状态初始化和更新硬件状态,反之亦然。
现在,让我们来看看工具。在下面的屏幕截图中,您会发现著名的 Arduino”你好世界”示例 – 闪烁的 LED – 编程为状态图它打开一个空状态图,其中有一个空的接口声明。我将使用此状态图对闪烁的 LED 进行建模,并生成在 Arduino Uno 板上运行的状态机。
LED 有两种状态,即开和关。因此,我声明一个布尔 on
变量,表示其值 true
和 false
接口中的开和关。在状态图中,我创建两个状态 On
和 Off
。一旦部署到 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在五分钟内!
itemis.com/hs-fs/hubfs/blog-files/SCTforArduino_Blink_generatedCode.png?t=1480420636012&width=512&name=SCTforArduino_Blink_generatedCode.png 512x,https://blogs.itemis.com/hs-fs/hubfs/blog-files/SCTforArduino_Blink_generatedCode.png?t=1480420636012&width=1024&name=SCTforArduino_Blink_generatedCode.png 1024x,https://blogs.itemis.com/hs-fs/hubfs/blog-files/SCTforArduino_Blink_generatedCode.png?t=1480420636012&width=1536&名称_SCTforArduino_闪烁_生成代码.png 1536x,https://blogs.itemis.com/hs-fs/hubfs/blog-files/SCTforArduino_Blink_generatedCode.png?t=1480420636012&width=2048&name=SCTforArduino_Blink_generatedCode.png 2048x,https://blogs.itemis.com/hs-fs/hubfs/blog-files/SCTforArduino_Blink_generatedCode.png?t=1480420636012&width=2560&name=SCTforArduino_Blink_generatedCode.png 2560x,https://blogs.itemis.com/hs-fs/hubfs/blog-files/SCTforArduino_Blink_generatedCode.png?t=1480420636012&width=3072&name=SCTforArduino_Blink_generatedCode.png 3072x”宽度=”1024″/}
好了,你说得对,此示例可能以普通 C 实现,并在五分钟内上传到 Arduino。就这么简单但是,你能想象在下图所示的行人过路灯的复杂性下,在普通 C 中开发状态机的努力吗?甚至这个例子也很简单。顺便说一下,您将在 Arduino 环境的 YAKINDU SCT 中找到此示例以及闪烁示例。
在我的GitHub 页面上,您将找到从安装开始的完整演练,包括安装、建模、模拟、代码生成和代码部署。它还集成到雅金杜州图工具的阿杜诺在线帮助。
迄今为止,Arduino 的 YAKINDU SCT 支持制造商和物联网领域的各种流行的微处理器。其中包括广泛采用和众所周知的 Arduino Uno 板使用的 ATmega328 微处理器、Arduino Mega2560 的 ATmega2560 或 ESP8266。大多数 AVR 微处理器提供多个硬件计时器/计数器。雅金杜 SCT 为 Arduino,让我们选择其中之一。即使您的微处理器不在支持的微处理器列表中,您仍可以选择应在每个目标上运行的软件计时器。
更多的功能仍然来,所以请继续关注!