如何透过Custom CAN ID通讯协议对SmartDisplay执行换页
前言
为了推广 SmartDisplay,我们提供了不同的通讯协议来实现 CAN 通讯,包括 CANopen 和custom CAN ID。CANopen 是一种标准化的协议,定义了不同类型设备的通讯配置文件、设备配置文件以及对象模型。它提供了一种标准化的方法来配置、监控和控制 CAN bus上的设备。 另一方面,当 CAN bus上的设备具有独特的功能或现有的标准协议无法满足时,通常会使用custom CAN ID协议。与标准协议相比,custom CAN ID可以提供更大的灵活性和效率。
说明
本文提供如何透过自定义的CAN ID来控制 Arduino 模块、CAN bus模块和传感器的教学指南。且概述了项目中使用的硬件部件、详细探讨程序编译,并说明如何透过custom CAN ID切换 Smart Display 7"的页面。
无论您是初学者还是经验丰富的开发人员,本文都将帮助您更了解如何使用这些组件来控制设备,以便于进一步使用 Arduino模块、CAN bus模块和custom CAN ID协议来实践更多的项目项目。
系统方块图
本文使用的 Arduino模块搭配的开发环境为Arduino IDE v2.0.4。为了用CANbus接口与SmartDisplay通讯,Arduino主机需搭配一个CAN bus扩充模块,该模块使用 MCP2515 CAN 控制器和 MCP2551 CAN 收发器来与之通讯。
本应用需要以下配件:- 7" Smart Display
- ARDUINO Mega 2560
- CAN bus shield for ARDUINO Mega 2560
- CAN bus Dongle
- Physical Button Sensor
- LED
- Software GUI-Builder v0.4.5 or above
范例分为三个部分:
- 在GUI Builder中设计项目。
- 建立并上传项目
- 编译Arduino 主机
以GUI Builder设计项目
首先,建立一个新项目,输入项目名称,然后选择装置类别,此应用选择7吋的装置。通讯协议选择Custom CAN ID,显示方向为横向模式。接着在UI模板中选择空白模板,最后点选Create按钮,如图所示。
图2
完成上述设定后,将显示下图页面。
图3
根据应用范例,需要新增一个第二个页面。请点击Page按钮,然后点选加号。
图4
背景样式可在Resource页面做修改。
图5
在操作接口右方的background选单中,您可以选择您喜欢的背景样式。
图6
建立并上传项目
在完成布局设计和前面的步骤后,就可以上传项目到SmartDisplay中了。
在"Device Property"对话框中,选择您所需要的鲍率。请确保选择的鲍率与您的装置相同。
单击"Upload"按钮,将此项目上传到您的装置中。上传完成后,您的装置将开始运行该项目。
图7
当项目上传完成后,点击"OK"按钮,如下图所示:
图8
上传完成后,您将在SmartDisplay上看到开机画面。
图9
画面由开机页面跳至操作页面代表项目上传成功:
图10
编程Ardunio主机
Custom CAN ID通讯协议使用的是"mcp2515_can.h"的函式库,另一个名为"SPI.h"的函式库则用于串行外设接口(SPI)通讯。 mcp2515_can.h 函式库用于与 MCP2515 CAN(控制区域网)控制器进行接口,该控制器是嵌入式系统中广泛使用的 CAN 控制器。
该库提供了一些功能,用于初始化 MCP2515,设置 CAN 通讯设置(例如比特率、过滤器和屏蔽设置),传送和接收 CAN 讯息,以及检查错误。在 Arduino IDE 程序中,所有所需的注册地址都定义在下图所示的程序代码中。此程序代码初始化各种全局变量、常数和数组,以及它们对应的数据类型,这些数据类型稍后会在程序代码中使用。
图11
此段程序代码是 setup() 函数,在程序开始时仅调用一次。使用 Serial.begin() 初始化串行埠监视器(Ardunio ->PC),鲍率为 115200。使用 pinMode() 将内置 LED 配置为输出。使用 pinMode() 配置物理按钮脚位为输入。使用 while 循环来初始化 MCP2515 CAN 控制器。使用 CAN.begin() 函数, 将CAN_250KBPS 作为鲍率参数(250K)。
图12
changePageFunction() 函式向 MCP2515 发送命令为显示模式之间进行切换。它透过发送特定数据字节的讯息来进行切换。函式首先发送“device mode”命令,将 MCP2515 切换到配置模式,然后使用想要切换的页码进行“page change”的命令,最后再发送一个“device mode”命令以将 MCP2515 切换回显示模式。
图13
此函式为 loop() 函数,在使用 setup() 函数后会反复执行。
它使用 analogRead() 读取实体按钮的电压值,并将其储存在 buttonValue 变量中。如果 buttonValue 大于 THRESHOLD 值,则表示实体按钮已按下。在这种情况下,函式将 nowPage 变量增加 1,并使用 sprintf() 和 Serial.println() 将当前的 nowPage 值传输到串行监视器中。
然后,函式将目前的 nowPage 值使用 changePageFunction() 来切换到所需的显示页面。如果 nowPage 值不为 0,则使用 digitalWrite() 打开位于脚位 13 的内置 LED。否则,LED 将关闭。 lastDebounce 变量使用 millis() 更新当前时间,以储存上次按下按钮的时间。该函数透过在 while 循环中连续读取 buttonValue 来等待实体按钮被释放。
最后,在循环结尾使用 delay(100)来做一个延迟,使 CAN bus讯息可以用一个合理的区间来传送。
图14
如需更多详细数据,请参考 Arduino 程序代码。需要注意连接主机与SmartDisplay的地址。如果您想了解更多关于主机和SmartDisplay之间的通讯,请参考 GUI builder 通讯栏。
使用 Arduino IDE 成功验证并上传程序后,就可以透过按时体按钮来切换页面。当屏幕显示第一页时,LED 将关闭。按下实体按钮会切换到第二页并且打开LED,如下图所示:
图15
恭喜!完成了一个项目!
请参考 GitHub 的连结 https://bit.ly/3oT0o5M 下载上述程序、示范影片,以及更多详细信息。实际的硬件设置如下图:
图16
结语
使用 Arduino 开发板和 MCP2515 CAN 控制器,我们可以用实体按钮来控制 SmartDisplay。本文示范了如何向 MCP2515 发送命令以在显示模式之间进行切换,以及如何读取实体按钮的电压以触发这些命令。此系统可以扩展其他功能,例如按键、传感器或其他部件。 MCP2515 和 Arduino 开发板提供了一个灵活且易于使用的平台,可用于各种应用,例如汽车、工控或智能家电。