与往常一样,闪烁的 LED 是学习硬件的最佳方式!该项目将带您一步步组装和编程由五个 RGB LED 模块 (H01R00) 和单个 3.3V DC-DC 模块 (H03R00) 组成的演示 Hexabitz 阵列。
了解如何组装阵列、将固件加载到模块、使用 CLI 以及编写自己的 C 代码。涵盖的主题包括同步和异步消息传递、输入按钮和远程内存访问。
一系列闪烁的 LED 让您习惯于 Hexabitz 硬件和软件工作流程。随时向我们发送任何改进建议或您尝试过且效果良好的替代方法
预计硬件构建时间:10-15 分钟
预计软件开发时间:每个示例 10-15 分钟
在将东西焊接在一起之前,计划总是明智的!通过在所示方向 (P2) 或您喜欢的任何方向上并排对齐模块,暂存项目组件 (P1) 并规划您的阵列设计。
是时候做一些有趣的事情并组装阵列了!首先制作基本的焊点以将模块固定在一起(P3)。这对前进有很大帮助。
然后完成剩余的关节。您不必做所有这些,但最好提供结构支持。不要忘记在底部工作(P4)。
最后添加按钮(P5)(如果您之前没有加载固件,请确保您让工厂引导加载程序编程端口 P2 空闲)。添加您可能需要的任何额外连接器/接头,现在硬件组装完成!(P6)。
。
从 H01R00 代码库复制一个空的 H01Rx 项目,重命名文件夹并打开位于 MDK-ARM 文件夹 (P7) 中的 uVision 项目。您也可以使用随附的 zip 文件夹中的固件。
首先,我们需要添加一个拓扑定义文件来告诉模块它们将如何相互连接。打开“project.h”,取消注释拓扑头文件定义并打开 topology_1.h 头文件。修改此文件以适应阵列,如图所示(P8、P9 和 P10)。更多关于稍后制作拓扑头文件的内容!完成后重新编译项目。
现在是时候根据其在阵列中的位置为每个模块生成个性化的源代码了。单击 Manage Project Items 并添加其他四个目标(如果它们尚不存在)。(P11)。从下拉菜单中选择每个模块,然后单击“目标选项”。 将“C/C++”选项卡中的_module=1修改 为模块编号(1 到 5),并修改“输出”选项卡中的可执行文件名称以匹配模块编号。单击 批量构建>>全选>>重建。
注 1 :有一种方法可以在运行时自动生成阵列拓扑文件。我们将在其他项目中使用它
注2 :本项目有单一类型的可编程模块(H01R00)。如果您有其他类型的可编程模块,请按照相同的步骤下载其源代码并添加相同的拓扑文件。
关键时刻!将输入电压 (5-40V DC) 连接到 H03R00 输入连接器,一旦为阵列供电,您应该会看到绿色的电源正常 LED。您可以使用任何 12V 直流电源适配器(P12 和 P13)。
是时候在这些模块上加载固件了。将 USB-UART 电缆和我们方便的 Kelvin 夹连接到模块 1 的编程端口 P2,并注意 USB-UART 电缆的极性(TXD/顶部 > 黄色,RXD/底部 > 橙色)。也不要忘记在阵列 GND 和电缆 GND(黑色)之间连接一根跳线。
如果模块是新的且为空,则使用 ST Loader Demonstrator加载适当的 hex 文件。如果已经编程,请先在 CLI 中使用更新命令。请查看固件更新文章了解详细步骤。(P14)
根据模块的 ID(P15 和 P16)将固件加载到所有模块,并确保不加载相同的文件!(尽管到目前为止我已经编写了 500 多个模块,但我这样做了很多次 :))
连接到模块 1 CLI 并测试一些命令。如果你想测试广播,禁用响应:
set BOS.response none
然后输入:
all.ping
。
你都准备好了!接下来,我们将开始编写一些实际的 C 代码,以在即将到来的项目日志中执行更复杂的技巧。
准备好采取行动了吗?
这是一个向您展示 C 编码工作流程的简单示例。我们将向所有五个 LED 模块发送广播ping消息,以便它们闪烁红色指示灯 LED。该消息将每 500 毫秒重复一次。
在 main.c 的 FrontEnd 任务中,在无限循环之前编写以下内容:
#if _module == 1 BOS.response = BOS_RESPONSE_NONE; #endif
这在循环内:
#if _module == 1 SendMessageToModule(BOS_BROADCAST, CODE_ping, 0); Delay_ms(500); #endif
重新编译模块 1 并加载。由于dim消息在每个模块上启用了单独的内部计时器,它们最终以一种漂亮的方式不同步:D 请注意,32 位大小的消息参数如何转换为字节宽的参数。
您可以将下面的代码直接复制到User 文件夹中的main.c文件中,或者将main_ex2.c文件重命名为main.c并替换旧的。
广播暗淡(与前 2 完全相同)但完全同步。模块 1 模拟了暗淡功能并以不同的强度广播彩色消息。这样,您可以将计时器保留在单个模块上并保持它们全部同步。循环前的 500ms 延迟是为了确保所有模块在发送第一条消息之前完成启动。
在模块 1 上定义一个按钮并启用其Click事件。此事件用于在事件回调中设置标志。该标志用于生成一些跳舞的灯光。
与 ex 4 相同的概念,但每个按钮上的舞蹈模式不同。代码看起来又长又吓人,但都是重复的相同代码!如那里所示,您可以使用编译器定义:
#if _module == 1
xxxxxxxxxx
#endif
在特定模块内执行特定代码。如果您的所有或部分模块具有相同的部件号,这将为您节省创建单独项目的麻烦。
此示例演示了远程写入 API 的使用。
按钮 1(连接到模块 1)用作所有 LED 的开/关开关。按钮 2 用于循环显示基本颜色 ( WHITE, RED, BLUE, YELLOW, CYAN, MAGENTA, GREEN
)。按钮 4 用于增加强度,按钮 5 用于降低强度(每次单击为 10%)。
所有模块都定义了三个 BOS 变量:一个描述 LED 状态的布尔变量和两个UINT8
描述强度和颜色的变量。它们分别被初始化为ON
, 50
(%) 和WHITE
。
首先,全局变量链接到 BOS 变量,这样我们就可以使用地址 1、2 和 3 来跨数组寻址它们。然后,定义所有四个按钮并启用单击事件。在 click 事件中,每个模块在本地执行其任务(例如,循环显示颜色)然后将 a 广播RemoteWrite
到适当的 BOS 变量。LED 指示灯也会闪烁以显示咔哒声。在无限循环内部,setColor
API 用于根据在阵列中共享的 BOS 变量的值来控制本地 LED。这个例子展示了如何使用RemoteWrite
来控制数组中的所有内容。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !