学习型红外遥控器设计(0) 摘要 (1) 绪论 (2) 方案设计 (3) 遥控解码 (4) 编码还原 (5) 硬件实现 (6) 总结展望
如方案设计所述,制作万能学习型红外遥控器,该遥控器至少具有红外编码学习和还原功能,采用触屏和按键两种方式操作,彩色液晶屏显示,能够替代SAA3010遥控器使用。
5.1 基本原理
5.1.1 触屏校准
触屏操作处于绝对坐标系统(与当前位置坐标相关)。操作触摸屏时,触点坐标通过AD采样得到,同一点触摸多次采样数据会有偏差,这是触摸屏经常出现的问题:漂移。
对于触屏漂移最有效的办法是:系统启动后,进入应用程序前,执行校准程序,LCD中的点坐标是以像素为单位,触屏中读出的是点的物理坐标,由触屏坐标系到LCD坐标系的转化公式如下:
Xt = Kx × Xl + Ax
Yt = Ky × Yl + Ay
变量说明如表5.1所示:
表5.1 变量列表
变量 | 说明 |
Xt | 触摸采样获得的横坐标 |
Kx: | X方向比例因子 |
Xl: | LCD的横坐标 |
Ax: | X方向偏移量 |
Yt: | 触摸采样获得的纵坐标 |
Ky: | Y方向比例因子 |
Yl: | LCD的纵坐标 |
Ay: | Y方向偏移量 |
触屏校准的过程就是使用待定系数法确定XY方向的比例因子和偏移量,实验过程如下:
1、在LCD屏上显示四个定点,这四个定点的像素坐标分别为:
0(1,1)、1(1,176)、2(220,1)、3(220,176)。如图5.1所示:
2、触屏得到定点的触屏坐标,如表5.2所示:
表5.2 触屏测试数据列表
0 | 1 | 2 | 3 | ||||
x | y | x | y | x | y | x | y |
218 | 3590 | 3829 | 3573 | 422 | 524 | 3794 | 501 |
242 | 3500 | 3837 | 3580 | 422 | 525 | 3816 | 520 |
255 | 3569 | 3865 | 3576 | 422 | 600 | 3730 | 513 |
241 | 3560 | 3848 | 3574 | 419 | 523 | 3731 | 517 |
270 | 3552 | 3844 | 3592 | 364 | 524 | 3757 | 499 |
249 | 3534 | 3840 | 3602 | 424 | 524 | 3741 | 520 |
235 | 3558 | 3813 | 3613 | 368 | 539 | 3731 | 516 |
228 | 3560 | 3844 | 3592 | 398 | 523 | 3770 | 510 |
215 | 3585 | 3820 | 3601 | 422 | 470 | 3782 | 503 |
211 | 3573 | 3810 | 3594 | 421 | 524 | 3786 | 509 |
280 | 3582 | 3830 | 3601 | 417 | 522 | 3765 | 516 |
243 | 3538 | 3837 | 3589 | 394 | 519 | 3784 | 509 |
3、采用待定系数法确定触屏参数,本文利用matlab参数估计lsqcurvefit函数求得校正参数如表5.3所示,同时更新默认参数,达到校准目的:
表5.3 触屏校正参数
Kx | 20.17045 | Ax | 250 |
Ky | 13.90909 | Ay | 516 |
5.1.2 彩屏显示
计算机表示颜色使用二进制。16位色的发色总数是65536色;24位色被称为真彩色,发色数是1677万多色。32位色是1677万多色,增加了256阶颜色的灰度,各种RGB格式如表5.4所示:
表5.4 各种RGB格式对照[8]
RGB565 | 使用16位(一个字)表示一个像素,这16位中的5位用于R,
6位用于G,5位用于B。 |
高字节 低字节 R R R R R G G G G G G B B B B B | |
RGB555 | 使用16位(一个字)的RGB格式,RGB分量都用5位表示
(剩下的1位不用)。 |
高字节 低字节
X R R R R G G G G G B B B B B (X表示不用,可以忽略) | |
RGB24 | 使用24位来表示一个像素,RGB分量都用8位表示,
取值范围为0-255。 |
通常可以使用RGBTRIPLE数据结构来操作一个像素,
它的定义为: typedef struct tagRGBTRIPLE { BYTE rgbtBlue; // 蓝色分量 BYTE rgbtGreen; // 绿色分量 BYTE rgbtRed; // 红色分量 } RGBTRIPLE; | |
RGB32 | 使用32位来表示一个像素,RGB分量各用去8位,
剩下的8位用作Alpha通道或者不用。 |
通常可以使用RGBQUAD数据结构来操作一个像素,
它的定义为: typedef struct tagRGBQUAD { BYTE rgbBlue; // 蓝色分量 BYTE rgbGreen; // 绿色分量 BYTE rgbRed; // 红色分量 BYTE rgbReserved; // 保留字节 } RGBQUAD。 |
本设计选用液晶屏为2.0inch 176×220 65K色TFT LCD带触摸屏[9],该彩色液晶屏由国内知名的LCM模组提供商信利(Truly)提供。
采用创易电子提供的彩色图像转换软件Image2LCD_29得到图片logo的16位RGB格式数据如表5.5所示:
表5.5 R5G6B5数据
图片:logo | 数据:R5G6B5 |
| 高八位在前:低八位在后,
XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0X9F,0XE7,0X9F,0XE7,0X9F,0XE7,0X9F,0XEF,0XBF,0XEF,0XBF,0XEF,0XBF,0XEF,0XBF,0XEF,0XBF,0XF7,0XDF,0XF7,0XDF,0XEF,0XDF,0XEF,0XDF,0XEF,0XBF,0XEF,0XBF,0XEF,0XDF,0XE7,0X9F,0XE7,0X9F,0XE7,0X9F,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XE7,0XBF,0XEF,0XBF,0XEF,0X9F,0XEF,0X9F,0XEF,0X9F,0XEF,0XBF,0XEF,0X9F,0XEF,0X9F,0XEF,0XBF,……. 总共77440字节,将这些数据送至LCD模块数据线,配合控制总线,就可以显示图片。 |
5.2 万能学习型遥控器实现
由于本设计选用触屏仅支持BMP格式的16位真彩图片,一张176*220图片将会占用75.765K字节程序存储器,而STC89C52RC单片机用于程序存储的容量仅为8K字节,虽然可以采取外部扩展存储区的方式加载图片,但会造成较大的浪费,加大了系统设计的复杂度和成本,为此本文尝试设计一种适合本系统的图片压缩方式。
5.2.1 16位RGB图片压缩
如本章基本原理所述,每个像素对应一个16位双字节(R5G6B5),原有BMP数据是一个176*220数组,像素行列位置对应于元素在数组的行列位置,为此考率将相邻的相同颜色的像素合并:定义格式为:RGB+重复个数(小于256),实验过程如下:
选取五张BMP格式彩图,如表5.6所示:
表5.6 测试图片列表
![]() | ![]() | ![]() | |
![]() | ![]() | ||
2、按照本文设计的压缩方式压缩,得到的压缩数据如表5.7所示:
表5.7 压缩数据列表
序号 | 部分数据列举(前18个数) |
1 | 11077 1 4769 1 4544 1
21189 1 21254 1 19236 1 23397 1 21317 1 15171 1 |
2 | 10533 1 10565 2 10532 1
8452 1 8419 1 6371 2 8419 1 10532 1 10565 2 |
3 | 55069 1 50876 1 52957 2
50877 5 50876 7 50844 1 50876 1 50844 1 50876 2 |
4 | 59327 32 59295 1 61375 2
61407 3 63455 1 63487 1 61407 2 61375 2 61407 1 |
5 | 65535 255 65535 255 65535 255
65535 255 65535 255 65535 255 65535 255 65535 70 65534 2 |
3、压缩效果对比,如表5.8所示:
表5.8 压缩效果对比
序号 | 1 | 2 | 3 | 4 | 5 |
原有大小 | 72.6KB | 72.6KB | 72.6KB | 72.6KB | 72.6KB |
压缩后大小 | 104.5KB | 101.1KB | 74.6KB | 79.5KB | 36.0KB |
由于本压缩方式保留了原有图像的全部信息,所以仅有序号为5的图片压缩效果比较理想,为此可以采取一定的策略,设计更为复杂的压缩方式,简要表述如下:由于图片176*220个像素,假设各个像素颜色各不相同,仍然能空余26816种颜色,可以把这些空余颜色对应的RGB字符定义为命令字(注意命令字是根据不同图片动态分配的),赋予不同的意义,这里仅提供一种压缩格式定义,格式如下:
压缩方式字 | 区位标志字 | 复制命令字 | 区起始命令字 | 区结束命令字 | ……….. | 数据 | ………. |
5.2.2 遥控仿真面板制作
通过图片压缩部分的实验发现,采用51系列8位的单片机控制彩色图像显示显然存在数据量大的问题,为此本文将遥控器的外观模拟部分通过PC机实现,结合matlab GUI编程,制作了遥控器仿真面板,主要用于显示遥控器的相关信息。下面按照两种方式操作面板:
1、控制码变化对照,按照RC-5协议编码要求,每按键一次,控制位就会反转,以开关键为例,连续两次按下,测试结果如表5.9所示:
表5.9 控制码变化对照表
2、指令码对照,本仿真面板设计了两种状态显示方法:数字和图形,按照RC-5协议要求,按键与编码格式中的指令码一一对应,以按键1、2为例,测试如表5.10所示:
表5.10 指令码变化对照表
由于SAA3010遥控器最主要的编码特点为:同一按键连按两次或者不同按键相继按下,编码格式的控制码(第2位)会反转;不同按键相继按下,编码格式的指令码(最后6位)会改变,故同一按键多次按下和不同按键相继按下会出现如表5.9、表5.10所示的情况。
5.2.3 红外编码还原实现:
本设计的红外学习硬件部分在第3章红外接收解码已经实现,红外编码硬件部分在第4章红外编码发射部分已经实现,触屏显示部分就是单片机控制触屏数据线和控制线,硬件部分比较简单(对应IO口相连),主要在于程序实现,软件流程如图5.2、图5.3所示:
1、虚拟按键操作与物理按键基本相同,却别仅在于判断按键类型时,物理按键通过单片机引脚判断,而虚拟按键需要判断通过触摸点坐标所在区域来判断。
2、触屏可视区仅有2.2inch,单片机的片程序存储器仅有8K,故系统仅设计上下左右四个方向键和一个确认键,通过设定全局变量来记录当前发射键的信息。
5.3 系统性能检测
在系统性能检测之前,先给出万能学习型红外遥控器实物图,如图5.4所示:
1、红外发射;2、LED检测;3、5V稳压电源;4、触摸屏;5、AT89C2051;6、STC89C52RC;7、功能键。
利用本章触屏校验得到的参数作为默认值,采用了两种方法来进行验证:
1、规定五个按键所在区域为有效区,有效区以外的操作均被忽略,按键按下时显示按下状态,弹起时显示弹起状态。
2、虚拟双数码管,如图5.3所示,方向键被按下时更新双数码管状态,需要注意的是,方向键采取循环方式改变双数码管状态,例如左键表示左数码管当前数值减一操作,假若当前值为1,则循环减一操作得到9。
经过反复测试,按键区域中心操作有效,按键边界操作灵敏度在5个像素以内,完全满足实用性。
红外发射接收在前述章节已经检验过,这里配合触屏操作再次校验,除红外发射精度略待提高以外,其他性能良好。