OpenHarmony开源开发者成长计划“万能遥控器”项目开发者。
效果展示
如图是开发板GPIO输出到红外发射器的波形和空调遥控器输出波形的对比,可以看到波形的变化规律基本一致。
图1 波形图对比
图 2 设备展示
作品构思
红外遥控以其简单、稳定、可靠等优势,一直以来都是家电控制中重要的组成部分。将红外遥控融入到智能家居的网络中,不仅能拓宽智能家居的范围,同时,用户不需要更换新型设备,也能在原有的设备上体验到物联网带来的生活便利。
OpenHarmony是由开放原子开源基金会孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。其创新性的分布式软总线,能够有效解决底层通信协议的差异,使得分布式应用开发更加方便。
于是我们决定利用OpenHarmony在物联网的优势,推动红外遥控设备融入在家电网络,使两者的融合使用能达到1+1>2的效果。
实践过程
小熊派Micro
在硬件平台方面,我们选择新出的小熊派Micro开发板,小熊派开发板搭载了STM32MP157芯片,搭配了4.3寸LCD电容式触摸屏,并有WIFI电路及标准的E53接口。
在软件生态上,该开发板已完成OpenHarmony 3.0小型系统的移植,并提供了丰富的教程,同时,ST公司还开放了芯片手册,SDK包等开发工具,非常适合学生们了解学习计算机系统。ST(意法半导体)是知名的半导体公司,其芯片在覆盖工业控制、消费电子等领域,其设计的STM32系列芯片在工业控制、教育等领域占有重要的地位。
在拿到开发板后,我们首先跟着小熊派的教程搭建软件开发环境,下载编译OpenHarmony源码,然后烧录固件到开发板,终于把心心念念的OpenHarmony系统给运行起来了:
图3 OpenHarmony桌面
接着我们跟着教程,分别学习了OpenHarmony的应用开发和驱动开发。当屏幕出现hello world的字样时,我就知道我们的开发已经成功了一半。
最后的教程是开发一个控制LED的应用,通过这个例程,我们学会了如何从底层软件、中间层、到应用层的全栈开发范式,对OpenHarmony操作系统的架构有了实际的认识。这为我们后面开发红外遥控应用打下了坚实的基础。
图4 LED应用
红外遥控原理
在初步认识了小熊派和OpenHarmony后,要开发红外遥控功能,就需要了解红外遥控的原理。我们通过网上搜集资料来了解红外协议的组成的理论知识。这里我们尝试简单说明一下红外遥控的原理:
如下图所示,以空调遥控为例。遥控器发送给空调的信息其实就是一个二进制的数组,例如:1001 1010……,数组特定位上01的组合依据协议内容有特定的含义,例如bit4和bit5为10时,表示空调风速为一级风速。
那么这个数组应该如何从遥控器到达空调呢?红外发射器可以向四周发射红外线,由于自然光中也存在红外光,所以发射器必须对红外线编码,加上38KHZ的载波。这样,接收器就只要识别38KHZ的红外光,就能确定其是由遥控器发射的,从而滤除了自然光的干扰。
下图中,发射器发射载波信号时,接收器会识别并输出低电平信号,相反,则输出高电平信号。通过控制方波的高电平时长,来表示逻辑0或1.将0和1组合起来,就构成了红外协议里的数组。
图5 红外遥控原理
实践是检验理论的标准。我们决定利用身边的支持红外遥控设备,来研究其实际的协议内容。手机的万能遥控器就是一个完美的发射设备,于是我们使用一个红外接收电路,一个逻辑分析仪,来分析遥控器发出的红外信号:
图6 逻辑分析仪和接收电路
有了以上工具,我们就可以在电脑端查看红外信号波形:
图7 红外波形图
经过以上的实践,我们的理论知识与实践经验相符合,方案的可行性得到证实,那么就可以开始软件的开发了。
PWM驱动
我们将红外发射电路接入小熊派开发板,并将其信号引脚连接到GPIOA_5。接下来就是要在这个引脚上产生特定的脉冲序列。
由前文可知,我们需要在GPIOA_5上产生一个38KHZ的载波信号。这一点可以利用STM32的TIM2实现,将TIM2的Channel1设置为PWM输出模式,设置周期为26us和占空比为50%就能实现。
难点在于,在OpenHarmony中开发驱动不像我们在stm32f1上开发驱动一样,直接使用库函数就可以。在大型的操作系统中,都会有一套驱动开发的框架,规定了某一特定的驱动的编程规范。我们要开发PWM的驱动,就要遵循OpenHarmony的HDF PWM驱动开发框架的规定。
在之前的学习中,我们已了解了HDF驱动框架的开发流程。对于PWM驱动,我们参考了OpenHarmony官网的PWM开发文档以及ST的驱动HAL库,实现了符合HDF框架的PWM驱动。如图是PWM输出38KHZ的方波:
图8 38KHZ载波
IR驱动
有了载波,接下来就需要能控制载波的产生、关闭,以及持续时间(决定了逻辑值)。载波的开关在PWM驱动中已经实现了。那么问题就在于如何控制载波的持续时间。
在红外遥控中,电平的时间最低一般是600us,要实现微妙级别的计时,熟悉STM32的小伙伴很容易就会想到使用TIM定时器。是的,在这里我们使用TIM3来实现对载波定时控制的功能。
为此,我们设计了一个IR驱动,他是一个标准的HDF驱动模块,其实现的功能有:
•对应用层提供驱动服务:接收应用层下发的数组。
•控制PWM的开关时间:根据数组元素值,控制载波的时间。
我们假设应用层下发的数组是这样的格式:其元素的值表示的是电平时间,例如[500,600]的组合表示逻辑0,[500,1600]表示逻辑1.
[500,600,500,600,500,1600,...]
IR驱动获得该数组后,将数组值设为定时值,并开启定时器中断,在中断中开/关PWM、更新下一次定时时间,就能实现对载波时间的控制。
红外码库的移植
经过以上两个驱动的开发,我们能确保底层的实现是正常的,接下来就是应用的开发了。
首先要思考的就是如何得到我们想要的红外信号。每一种设备,其红外协议的物理层虽然相同,但在编码的含义上却有很大差异。要实现万能遥控的功能,不可能把所有的协议都写入代码,需要一个码库来支持。幸运的是,我们找到了这样一个开源的码库,irext。
irext分为两个部分:码库文件和解码算法。在程序中,使用解码算法,对特定的码库文件进行解码,就能得到所需的信号数组。这个数组就可以直接传递给IR驱动进行发送。解码后得到的数组如下所示:
[8967,4499,598,598,598,598,598,598,598,598,598,……]
我们在OpenHarmony的JS Engine中添加了一个JS 接口:AC_Control,在这个接口里,我们接收上层JS应用的命令,使用irext的解码算法和码库文件,将命令转换为信号数组,然后将这个数组发送给IR驱动,从而触发红外信号的产生。
应用程序开发
1、界面设计
在开始北向应用程序开发之前,我们要先把整个页面的UI布局以及样式先起一个大概的草稿,因为这样在写界面的时候效率会翻倍。根据南向的驱动想好功能及交互,设计好UI布局后,下一步就是寻找或者制作符合产品风格的图标。这两步做完后,我们就可以正式开始码代码了。
最终呈现出如下图效果:
图9 APP 界面
2、交互逻辑设计
在了解了南向的具体驱动功能之后,我们再根据界面样式设计交互逻辑,比如监听用户点击温度升高,接着调用注册号的JS驱动接口,将调节温度命令发送给南向接口。其他比如开关,制冷等交互逻辑都是类似的处理逻辑。
理清楚交互逻辑之后,然后就将南向驱动自定义的JS接口在@system.app.d.ts中进行注册,注册完之后在js页面导入该文件,然后我们就可以开始编写业务逻辑了,其中有很多重复的接口逻辑,可以进行封装,使代码简洁明了,可读性也比较强。
图10 APP操作演示
项目收获
通过本项目初期的学习和实践,我们由浅入深地学习了OpenHarmony的应用以及HDF驱动开发,特别是对OpenHarmony的整个系统架构,包括内核、驱动框架、系统服务以及应用程序框架有了一个清晰的认识。也让我们更深刻地理解了OpenHarmony的分层设计、一次开发多端部署、分布式系统这些概念,使我们对OpenHarmony的未来发展充满兴趣与期望。
未来展望
目前我们只实现了红外遥控的应用,对于物联网来说这远远不够,接下来我们还需要考虑如何与其他OpenHarmony设备组网的问题。
当前小熊派团队正在移植OpenHarmony软总线,所以我们未能实现组网的功能。未来软总线能实现的话,就可以其他OpenHarmony设备进行组网,到时候OpenHarmony的万物互联的技术优势将得到充分的体现,OpenHarmony正在发展中,我们需要耐心以及积极地参与。
除了软总线,我们还有Plan B,例如可以选择MQTT等传统的物联网协议,来实现设备与手机之间的通信。
评论
查看更多