基于ZigBee的分布式彩灯控制系统研发

2021-11-05 03:25廖映华
关键词:灯组亮色彩灯

皮 浩,石 艳,刘 康,胥 云,廖映华

(四川轻化工大学机械工程学院,四川 宜宾 644000)

引 言

四川的自贡灯会、南京的秦淮灯会、江西的全丰灯会等,不仅是宝贵的非物质文化遗产,更是国家文化软实力的象征,起着重要的对外文化输出作用。传统灯组采用静态方式控制光源,即用单色灯泡,将它们统一挂载在电源总线上,放置于灯组轮廓内部位置;灯组接通电源后,光源单色灯泡一并发光,光亮透过蒙皮,将彩灯艺人设计的灯组造型轮廓烘托出来,给游客视觉体验。但是随着时代进步,灯会产业也要与时俱进和发展创新,彩灯设计者需要更灵活、更好用的彩灯控制系统,以满足彩灯艺术原始意图,设计更精美的灯组来吸引游客[1-2]。

对此,国内外学者开展了一些相关研究。电子科技大学的王谊[3]进行了μCOS-Ⅱ在51 系列单片机上的移植工作,成功实现了控制单颗RGB LED 变色的功能。李美华[4]使用μCOS-Ⅱ进一步控制了多颗RGB LED 变色。北京工业大学的赵新安[5]提出“输出阵列”这一概念,为RGB LED 亮色方案向RGB LED 亮色转码提供了一种解决思路,使得RGB LED 亮色方案能够简单便捷地生成RGB LED 亮色编码。柳春青等人[6]与四川九洲电器联合开发了一套基于DMX512 协议的智能灯光控制系统,该系统使用ARM 架构的M3 系列芯片作为主控,具备上位机控制、文件传输等功能。西安电子科技大学的王硕强[7]进行了彩灯配色方案无线发送器的研究,为高楼、距离较远等情况下的彩灯控制方案提供了借鉴。新加坡南洋理工大学能源研究所Wang、Tan 团队[8]开发了一个基于神经网络映射模型的LED 系统,达到节能和满足用户不同照度偏好的目的。Moon 等人[9]提出了一种基于智能手机的LED 照明系统方案,这个特点可以借鉴到彩灯灯组的智能化,增加传感器模块和移动设备模块联系,实现与游客互动的功能。Wojiech 等人[10],使用ZigBee无线网络传感器实现了对一盏可编程灯具的控制。总的说来,以上研究在芯片选型、亮色方案编码、μCOS 任务设计、系统功能设计角度提供了借鉴。其中,Wang[8]设计的光源节能模型,能为灯组控制系统耗电优化提供思路;Moon[9]的方案则结合了手机终端控制和智能模块,互动性更强。但中国传统灯会灯组,在光源分布距离、光通量调节、颜色切换以及工作时间设置上,不同于其他照明系统[11-16],在光通量调节、颜色切换、控制距离等方面,应有更高的要求,以满足彩灯设计者意图,对此类彩灯控制系统需要进一步研究和设计。

1 总体方案设计

为实现灯组光源光通量可调、颜色可切换以及工作时间可设置的目的,将彩灯控制系统分为3 层,不同层级内完成不同功能,并通过指令逐层传递。其中终端节点负责光通量调节、颜色切换功能,协调器实现工作时间设置,统一控制所有节点工作。这种设计的优越性在于系统的稳定性高,即当一条链路出现问题,整个系统仍然能继续工作,不会对彩灯灯组展示效果造成严重的损坏。此外,这种设计的接口清晰,升级换代以及规模拓展更为容易。设计的分布式彩灯控制系统如图1所示。

图1 分布式彩灯控制系统方案

1.1 硬件工作层

该层负责彩灯灯组中光源的驱动工作,主要由终端控制节点和光源两部分组成。其主要任务是从ZigBee无线局域网络中,接收来自协调器的控制指令,并根据指令驱动光源进行颜色切换、光通量调节以及工作时间控制。在硬件工作层,每个终端节点存储着各自被控光源所有的颜色方案,即存在一个节点指令表,使得节点号与节点的方案号保持着对应关系。因此,对于整个分布式彩灯控制系统,硬件工作层的每个节点都有一个节点指令表,共同实现灯组系统光源的所有变化。

1.2 ZigBee网络层

分布式彩灯控制系统ZigBee 网络采用星型拓扑结构,由各终端节点和协调器组成。系统的ZigBee 网络层能自动识别、自动组织加入的终端节点。ZigBee 模块在广播模式下工作,并通过内部宏定义进行节点间识别。协调器布置在灯组内部中心位置处。终端控制结点群与各自被控光源临近,布置在灯组轮廓内部需要光源的地方。

1.3 Internet网络层

在Internet 网络层,协调器与客户端通过TCP/IP 通信协议进行信息传递。协调器工作在彩灯灯组现场,客户端既可以通过MQTT 远程控制,也可以在现场工作,控制彩灯灯组的运行。

2 系统方案实现

2.1 终端节点

本方案采用STM32F103C8T6 单片机作为终端节点主控核心,使用CC2530 为主控的DL-20 模块进行组网。每片STM32F103C8T6 成本5 元,DL-20 成本20 元,对应普通灯组的控制规模,系统硬件成本约800 元,并能回收使用。相比之下,传统静态控制方式的光源系统用后即弃造成浪费。

2.1.1 节点硬件

终端控制节点的主要任务是驱动RGB LED 工作和接收协调器指令。常见的RGB LED 的驱动协议,其时序码0、1、RESET 为纳秒级别的,很容易受到干扰[17],因此驱动信号与干扰信号要隔离开。按照“高频电路布中间、干扰信号放外围”的原则[18],终端节点PCB设计如图2所示。

图2 终端节点PCB

ZigBee 模块通过串口接口,与主控核心进行数据透传,主控核心也为ZigBee 提供电源。终端节点的通用引脚都可以作为RGB LED 的驱动引脚,可以根据灯组控制需要进行裁剪。终端节点构成如图3所示。

图3 终端节点实物图

2.1.2 节点软件

在Keil uVision5 环境下,将μCOS-Ⅲ源码移植至终端节点工程,并以创建任务模块的形式对指令接收、协议解析、亮色方案模块进行代码组织。终端节点主要包括指令接收、协议解析、方案任务3大模块。

程序通过以下宏定义进行跳转和判断,见表1,并在主函数中对METH_NUM进行轮询。

表1 开关控制变量

稳定性是彩灯控制系统的核心内容。为提高分布式彩灯控制系统的ZigBee 网络的稳定性,利用“单次发射数据量与误码率成正比”的原理,将每次发送的指令,拆分成以一个字节为单位,依次发送。指令最终在各终端节点通过队列完成拼接,即“分段接收,队列存储”机制。本次系统的指令由两个字节组成。在设备位数为8的情况下,本协议最大容量为256个节点。

由于每次发送的数据短小,ZigBee 模块的工作载荷压力小,信号在ZigBee 网络中能够维持足够的强度,提高了终端节点接收的准确率,从而达到提高系统稳定性的目的。系统的指令大小为2 字节,而每次接收到的字节存储在队列中,直到队满,进而触发协议解析、节点识别以及光源亮色方案模块。

2.1.3 光源亮色方案

光源亮色方案任务是分布式控制系统进行光源颜色控制、光通量控制的底层具体实现。其数据码值由4个字节组成,第一个字节为地址编号,后3 个字节为被控RGB LED亮色方案码值。

方案任务工作时,将数据码值的亮色方案码值按地址顺序更新到显示缓存区,然后调用RGB LED 的驱动函数,根据显示缓存区中的内容,在指定管脚,输出相应的0 码、1 码和RESET 信号。亮色方案码值与RGB LED的颜色控制及光源光通量控制的关系如下:

(1)颜色控制方面。3 字节的数据码值可以组合出256 × 256 × 256 = 16 777 216 种颜色,理论上能够产生红、绿、蓝、青、黄等颜色,满足了灯组颜色控制需求。

(2)光通量控制方面。等比例对WS2812 光源的数据码值进行整体缩放,WS2812 光源就会发出相应强度光亮,从而达到光通量控制目的。通俗地说,光源光通量越大,人眼感受越刺眼。

2.2 协调器

协调器是连接ZigBee 网络与Internet 网络层的桥梁。在ZigBee 局域网中,协调器发送广播指令,统一控制系统所有终端节点,按灯组所需亮色方案工作。在Internet 中,协调器接收客户端发送的指令,满足现场调试或远程调试功能。

2.2.1 协调器硬件

树莓派以功能丰富且价格便宜而著称[19]。本次设计选用树莓派4B+作为协调器,整体装置如图4所示。

图4 协调器实物图

2.2.2 协调器软件

协调器软件的基础是Linux应用程序编程和网络编程。Linux应用程序编程利用IO系统调用write()和read()函数进行工作。Linux 网络编程作为客户端的服务器,与客户端连接。协调器指令发送前,需要以下几个步骤:

(1)获取ZigBee 的设备描述符。Linux 中一切皆文件,通过串口转USB的ZigBee也是如此。使用open()函数打开ZigBee 模块,并设置波特率、数据位、校验位等信息,返回ZigBee模块的文件描述符资源。

(2)制作指令表。根据控制的规模,使用unsigned char 类型数组,顺序存储待发送指令码。本次设计的是两字节指令,因此偶数位为设备号,奇数位为方案号。

(3)发送指令。调用write()函数,将指令表内的数据写入ZigBee 模块的文件描述符。并根据节点工作的时间关系,合理调用sleep()函数进行控制时间设置。

制作任务驱动模块中的指令表,是本系统下灯组光源调试人员工作的主要工作内容。彩灯调试人员要将灯组的展示效果,转换成一条条的控制指令,在协调器程序运行时,发送这些指令。

协调器接收客户端指令时,与客户端约定端口号进行TCP/IP 通信,并根据客户端发送的消息,对终端节点群发送ZigBee 广播指令,进而对灯组光源进行控制。协调器与客户端之间维持了一个结构体缓存,每次接收到的信息都将刷新这片缓存区。协调器接收到命令后,解析该指令,并根据查询表,开辟相应的线程,运行这个指令所对应的任务。每收到一个客户端指令都将判断并刷新指令。

多线程任务有利于资源共享[20],在协调器段维护的指令表会被所有的线程调用到,相对于多进程方法,无需解决进程间通讯等问题,并可通过互斥锁机制保护临界资源ZigBee套接字。

2.2.3 协调器数据库

彩灯控制系统的数据库用以存储协调器的指令调用记录,并为系统的后续功能开发提供接口。

SQLite3 在协调器上通过apt-get install sqlite3 命令 完成安装[21]。 在协调器的程序代码中,使用sqlite3_open()函数打开数据库后,每次对终端节点发送指令时,调用sqlite3_exec()函数对时间、设备号、指令号信息进行数据库插入、增添和删除等操作。

2.3 客户端

系统使用Qt 应用程序框架进行客户端程序开发。客户端程序使用network 库完成与协调器之间的连接、断开和发送等核心任务。客户端与协调器约定一个通讯结构体,结构如下所示。

这个自定义结构体数据主要功能是存储发送的指令,也可以存储数据库查询记录,用于客户端查询和显示。

客户端界面设计如图5 所示,其属性、名称及功能,见表2。

图5 上位机程序界面

表2 客户端界面上各控件名称、类型及功能

客户端后台的主要功能是发起连接、断开连接、发送协调器指令。

客户端后台逻辑的连接步骤如下:

(1)新建一个公有继承于QObject 的类MyControl,统一处理程序中关于连接、断开、数据发送、数据接收等指令,信号与槽函数写在这个类里。

(2) 将 客 户 端 界 面 上 的 “ 连 接 ” 按 钮pushButton_connect 的信号clicked()绑定处理连接的槽函数,在这个槽函数内部,通过connectToHost()对协调器发起连接请求。

(3)如果连接成功,则emit()连接成功信号,通知客户端界面通过setText()设置pushButton_connect 的新名字为“断开”,并且将“发送”按钮激活setEnabled(true),这意味着客户端已经与协调器建立好TCP/IP连接。

客户端后台逻辑的断开步骤如下:

(1) 将 客 户 端 界 面 上 的 “ 断 开 ” 按 钮pushButton_connect 的信号clicked()绑定处理断开的槽函数,在这个槽函数内部,通过DisconnectToHost()对协调器发起断开请求。

(2)如果断开成功,则emit()相应信号,通知客户端界面通过setText()设置pushButton_connect 的新名字为“连接”,并且将“发送”按钮激活setEnabled(),这意味着客户端处于空闲状态,没有与任何协调器有连接。

客户端界面上的“发送”关联发送信号槽。当点击发送,读取lineEdit 上的数据内容填充至全局缓存,然后通过write()发送。需要注意的是,每次使用完这个全局缓存,要用memset()将缓存清空,否则在使用时会出现上一次消息的数据。

3 系统测试

3.1 基本功能测试

基本功能测试的目的在于检验终端节点、协调器、客户端三者之间能否完成工作,指令能否在各层之间传递和流动。本次测试采用5 个终端节点,它们直接受协调器的指令控制,间接受客户端发送的指令控制,按照设定发出相应颜色的光。测试步骤如下:

(1)分配节点号

根据要求,将每个终端节点的设备设定为不唯一。在Keil uVision5 环境下,将1 号节点的MY_NUM 设定为1,依次类推。

(2)制作方案数据码值

此次测试的5个被控光源都是12像素,其各自节点都存储了红、绿、蓝、青、黄、紫等常见颜色的数据码值。其中,红色方案码值见表3,其余颜色只需调节数据码值的RGB占比即可。

表3 节点红色方案码值

(3)制作指令表

在协调器程序上,制作5 个节点需要完成的指令表。

(4)搭建工作环境

为5 个终端节点,连接配置好的ZigBee 模块,连接各自的被控光源,并为它们接通电源;搭建好协调器工作环境,配置好协调器ZigBee 模块,连接上WIFI 局域网,在协调器上运行编写的线程服务器;在PC 上运行客户端程序,对协调器发起连接,建立TCP/IP通信。

(5)发送指令

在打开的客户端数据输入框内,输入指令“zigbeework”,并点击发送。

(6)观察结果

观察终端节点的光源能否按照想要的方式点亮。各终端节点的光源,能根据指令发出相应颜色的光亮,测试效果如图6 所示。此时光源像素为12,每颗像素30 lm,光源总光通量为12×30 lm×100%=360 lm。

图6 各节点控制结果

以上测试结果说明,指令能在系统的Internet 网络层、ZigBee 网络层以及硬件工作层之间传递,Internet 网络层的客户端程序能够控制光源按照设定方式工作。

3.2 切换时间测试

切换时间测试,是测试节点每次接收到完整的有效指令后,节点方案切换时间是否满足性能要求,检验光源亮色方案任务模块设计是否合理。测试步骤如下:

(1)终端节点接通电源,并连接串口调试助手。

(2)打开Keil uVision5 软件,将ST-LINK 连接到终端节点硬件,点击“start Debug Session”按钮,建立仿真连接。

(3)通过串口助手发送指令,使用ST-Link并在每个方案开始位置记录时间。

仿真后的结果表明,光源亮色方案切换时间约为0.211 s,人眼难以察觉,可以满足灯组需要。

3.3 组网距离测试

组网距离测试实验,是为了检验ZigBee 局域网中ZigBee 模块的通信能力是否满足灯组控制的距离需要。测试步骤如下:

(1)将终端控制节点布置在1 m、5 m、100 m范围内,测试控制效果。

(2)将数据通过ZigBee 送入一个终端控制节点,运行无线灯带测试系统。

(3)将测试方案对应的方案码值,烧录进一个测试用终端控制节点。

(4)将测试终端节点连接至光源,并接通电源,等待指令。

(5)观察被控节点有无按照指令变化。测试结果表明,系统稳定性好,100 m 范围内无遮挡下能稳定工作,节点的指令接收模块有效。并建议系统的节点分布范围,在协调器周围50 m内最佳。

4 结束语

使用ZigBee 无线传感器技术对灯组光源组网,在减少布线麻烦的同时增强光源位置的灵活性,使光源可以放置于灯组内部所需位置。此外,该系统在光通量调节上裁剪性好,光源可控颜色多,光源颜色切换时间短。

分布式彩灯控制系统能对光源光通量以30 lm 为单元进行裁剪,并在0~255 范围内按需调节;光源亮色方案切换时间短,能在0.2 s左右完成切换,人眼无法察觉;系统在100 m 范围内,正常遮挡环境下没有出现误码,“分段接收,队列存储”机制有效;系统的指令协议支持255个终端节点组网,且能按需裁剪组网规模;系统装置可以回收和反复使用。

猜你喜欢
灯组亮色彩灯
基于Python的车灯动画效果数据化技术
彩灯
《一带一路》灯组、《瓷器宫灯王》灯组
亮色
荒原童话
元宵佳节点彩灯
灯会庙市嘉年华 欢乐共享中国年
缤纷童趣
浅析彩绘与自贡彩灯的关系
车展不再冷冰冰 卡车文化成为展会一抹“亮色”