摘要:消费类娱乐设备的红外线(IR)遥控器所造成的混乱状况似乎已经成为全球每个家庭所关注的问题。利用MAXQ2000微控制器和一些便宜的元器件,可以构建一个能够“学习”其它遥控器代码,并根据需要回放这些代码的遥控器。
但是随处可见的IR遥控器也导致了一个问题,绝大多数家庭的桌子可能都堆放着三个、四个甚至更多的遥控器。一个用于电视机、一个用于DVR、另一个用于VCR,此外还有用于音响及其它设备的,而且,这里还没有列出机顶盒或卫星接收机、分配开关、DVD刻录机及其它受我们支配的设备。
解决这种由遥控器引发的混乱现象的一个方法是:使用可以学习其它遥控器代码的学习型遥控器。将学习型遥控器设置到“学习”模式,由第二个遥控器“教导”学习型遥控器如何发送命令,比如如何提高音量。然后,每当按下正确的按键,学习型遥控器就会发送学到的命令。
本应用笔记介绍如何围绕MAXQ2000微控制器构建这样一个学习型遥控器,MAXQ2000属于Maxim公司的MAXQ RISC微控制器产品。但在开始设计之前,需要了解一些背景知识。
查看大图(PDF, 388kB)
随着半导体器件价格越来越便宜,应用范围的普及,IR红外光取代超声成为遥控设备的选择。最简单的IR遥控系统由发射红外光调制信号的终端和接收IR调制信号的基座部分组成,基座电路进行解调,通常是执行某个操作命令。但是,考虑到工程实施的便利性、体积要求以及市场需求等因素,具体实现时并不简单。
一个很现实的问题是:我们的周围充满了IR辐射,要在充满辐射干扰源的环境中接收一个普通调制信号显然不现实。任何发热的物体也会产生IR辐射,比如白炽灯发出的IR光就高于可见光。人体本身也会产生IR辐射。考虑到这些原因,大部分IR遥控器在发射数据之前会以低频载波(通常在28kHz到60kHz)调制红外光信号。
在一个典型的家居环境中,用固定频率调制光信号可以使其在所有IR辐射干扰中更容易检测到。通过一个简单的带通滤波器,可以提取出IR信号并对其解码。有很多廉价的集成电路都包含实现这一功能的IR光电二极管和带通滤波器。
产生这样一个调制光很容易。红外发射LED器件比较普遍,也很便宜,简单地利用一个振荡器驱动IR LED即可产生调制光。调制、接收IR调制数据的电路如图1所示。
图1. 电信号被转换成IR调制光信号,然后又被恢复为电信号。为了扩展发射范围,采用PNP驱动器。根据所选IR LED可以调整元器件值
当具备LED光源调制和工作在同一频率的接收IC后,就构成了一个遥控系统的雏形。当LED电路工作在接收范围内时,接收器输出有效。如果这就是所有控制的要求(对外围电路的简单开关控制),任务就算完成了。
但是,简单的开关控制还不能满足实际应用的需求,即使很简单的遥控器也需要发送不同的命令,比如音量的增、减,频道选择,输入源选择以及可能的数字输入。考虑到这个原因,还需要添加其他它电路:可以进一步“调制”光信号。这使整个设计变得有趣。
当IR遥控器的使用不断普及后,生产商都采用自己的方式调制光信号。虽然都是数字控制(也就是说,调制光信号代表数字位“1”或“0”),不同设计之间却有很大差异。有些设计采用简单的非归零(NRZ)调制,有些则采用脉宽调制(PWM)形式,用长脉冲代表一种状态,短脉冲代表另一种状态。还有一些设计采用两相调制,从开到关的跳变代表一种状态,从关到开的跳变代表另一种状态。这种混乱状况一直持续到现在,构建一个能够配合任何厂家设备工作的通用型遥控器面临巨大的挑战。
另一种比特格式采用固定“光”脉冲,但脉冲之间的间隔是变化的。有些Matsushita (Panasonic®)设备发射800µs的固定脉冲,但脉冲间隔为2,400µs时代表“1”,脉冲间隔为800µs时代表“0”。
Philips的RC-5码是一种最常用的编码系统。这种编码中,每一比特由889µs的调制光脉冲和889µs的间隔组成。如果一个比特表现为“光”脉冲加上一个“无光”周期,则被认为是比特“1”;如果由一个“无光”周期加上一个“光”脉冲组成,则认为是比特“0”。在RC-5系统中,通过强制每帧的两位起始位为“1”来保证位同步。图2所示为不同的比特格式。
图2. 可以用于IR遥控系统的几种比特格式,所有格式都用载波调制光信号,然后用某种方式调制载波
有些编码在一帧中发送两次信息:一次为常规格式,另一次为比特反转。通过这种方式可以在某种程度上实现初级的误码检查。如果两次信息不一致,这个命令就被视为无效。
一帧数据发送完毕后,该命令通常会不断地重复发送。一般帧重复速率在每秒10到20帧。有一些协议只发送一次代码,然后不断重复“按键按下”的代码。由于假定每个重复帧都包含数据和定制代码,所以本文介绍的系统不处理这些协议。
最后,有些协议,包括RC-5,会在每次按键操作时反转比特。这有助于识别是否由于信号丢失造成接收间断,比如,有人正好位于遥控器和基座之间,或者是否真的出现第二次按键操作。本项目中没有包含这一功能。
因此对于本项目,我们实际上不用关心比特格式或帧格式。因为系统只是简单记录并回放它检测到的一切。保持系统工作的未知性就可以实现真正的通用性。
光电晶体管工作在饱和状态会产生一个问题。光电晶体管工作速度不高,从完全导通到完全关闭的恢复时间远远超过大部分系统的比特周期。因此,如果光信号太强,光电晶体管就会饱和,造成载频丢失,只能跟随调制波形的包络。但是,如果信号太弱,将无法识别波形。图3显示了这些条件。
图3. 在接收IR信号时,信号强度必须合适。如果信号强度太大,光电晶体管就会饱和,此时只能检测到信号的低频部分。如果信号强度太弱,载波频率将无法达到检测门限
因此,很重要的一点是将主遥控器和学习遥控器放置在适当的距离内。但是距离多少合适呢?为了确定距离,学习遥控器的内置软件会进行预采样,以此确定距离是否合适。进行记录之前,学习遥控器(比如,MAXQ2000微控制器)在输入通道上对采样信号进行转换。如果没有信号,遥控器假定信号电平太低,并点亮相应的LED。但是,如果微控制器检测到输入通道的转换信号,只是没有100µs或更小的脉冲(载频可以假定为大于10kHz),则假定信号电平太高并点亮另一个LED。最后,如果微控制器检测到以“关断”周期为间隔的高速脉冲串,则假定信号电平合适,即位于所谓的“最佳点”。学习遥控器的代码由此转换到记录状态。
记录状态期间必须完成几个操作。遥控器的微控制器必须确定载波的输入频率。由于微控制器工作在16MHz,载波频率(最大)为60kHz,可以精确测量到载频。从后沿到后沿累计进行四次采样,然后将结果除以8,以此确定高低电平的周期时间。
然后,接收器开始搜寻大于10ms的传输间隔。每个协议都会在重复发送同一编码之间加入一个间隔,而且任何协议都不容许一个编码内部存在大于1ms的间隔。找到发送间隔后,接收器可以找到一个编码序列的开始。由此可以开始记录。
为了记录代码,遥控器的微控制器会累计载波存在的时间。当检测到载波丢失时,遥控器会累计载波消失的时间。由此可以得到一个通断时间向量,在需要的时候它可以用来重建信号。
由于这是一个演示设计,并非最终产品,这些通断时间向量存储在易失RAM中。在实际产品中,通过软件例程可以将这些向量复制到非易失存储器(比如EEPROM)。
按下按键后,CPU被唤醒并且开始扫描其输入引脚,以此确定哪一个键被按下。然后它会指向RAM中的向量,RAM中存放有如何执行与此按键相关的指令。
RAM向量由以下部分组成:包含通断周期计数的报头,代表载频的数值以及代表每个通断周期导通和关断时间的数值序列。第一个报头数值即通断周期值存储在循环计数寄存器(LC1)中。将此值保存在计数寄存器中可以方便地循环任何周期。
报头中的第二个值即载波周期,换算后进行存储。发射IR光时,这个数值被载入另一个循环计数寄存器(LC0)。因为MAXQ2000是单周期核,程序的循环定时非常可靠。通过执行四个循环指令就可以产生载波的高电平,然后执行四个循环指令产生低电平。继续重复这个过程即执行一个导通周期和随后的关断周期。
如果没有定时器,程序会一直照此进行,在一个周期内导通IR LED,然后再另一个周期关断,以此产生载波。实际上每半个位周期,向量中包含的一个值就会写入MAXQ2000的一个定时通道。定时器工作在除32模式,所以定时器的精度大概为2µs。
在每个半比特周期的开始,定时器载入该周期的持续时间。然后,当程序代码使IR LED导通或关断(在导通周期内)或简单地使IR LED关断(在关断周期内)时,连续检测定时器就可以确定位周期是否结束。
在超出半个位周期后,循环计数寄存器(LC1)递减并检测是否为零。如果不是零,那么就仍有比特要发送,分支程序会回到循环的顶部,否则就要检测是否按键仍然被按下。如果按键还是有效,那么整个周期(从向量中读取初始值并重新初始化计数器)再次开始。否则,CPU会回到睡眠模式直到按下另一个按键。
图4. 增加额外的按键功能,按键操作必须中断处理器。在睡眠模式,所有列通过软下拉电阻保持低电平,所有行驱动至高电平。按下按键时,列被拉至高电平,唤醒处理器并且开始行扫描过程
另一项改进是利用MAXQ2000的定时时钟外设,在特定时刻唤醒CPU并执行IR命令的编程序列。定时时钟为低功耗外设,可以在电池供电情况下长期工作。当MAXQ2000处于关闭高频时钟的休眠模式时,定时时钟可继续工作。这个时钟可以按照某个时刻要求或时间间隔产生中断,唤醒CPU。例如,定时时钟可以唤醒CPU,然后遥控器可以将指令发送到电缆或卫星机顶盒,接着发送指令到VCR或PVR,开始录制节目。节目结束后,CPU可以再次唤醒,以结束录制。
第三种可能性是将MAXQ2000与个人计算机连接。在这种情况下,PC可以当作节目站,从网络上下载节目信息,并自动将其载入通用型遥控器。
由此可见,仅仅利用几个外围元器件和少量软件,功能强大的MAXQ2000微控制器就变成了一个通用的学习型遥控器核。
类似文章发表于2007年12月刊的Circuit Cellar。
概述
在众多家庭中,一个简单的红外(IR)遥控器可能占据非常关键的地位,这一点也很容易理解。有了遥控器,人们就可以命令现代家庭必备的各种娱乐设备。可以在舒适的房间里,随心所欲地收看来自全球各地的不同节目,听到不同渠道传播的音乐,可以播放音视频媒体播放器,甚至可以保存节目以便在晚些时候观看。但是随处可见的IR遥控器也导致了一个问题,绝大多数家庭的桌子可能都堆放着三个、四个甚至更多的遥控器。一个用于电视机、一个用于DVR、另一个用于VCR,此外还有用于音响及其它设备的,而且,这里还没有列出机顶盒或卫星接收机、分配开关、DVD刻录机及其它受我们支配的设备。
解决这种由遥控器引发的混乱现象的一个方法是:使用可以学习其它遥控器代码的学习型遥控器。将学习型遥控器设置到“学习”模式,由第二个遥控器“教导”学习型遥控器如何发送命令,比如如何提高音量。然后,每当按下正确的按键,学习型遥控器就会发送学到的命令。
本应用笔记介绍如何围绕MAXQ2000微控制器构建这样一个学习型遥控器,MAXQ2000属于Maxim公司的MAXQ RISC微控制器产品。但在开始设计之前,需要了解一些背景知识。
查看大图(PDF, 388kB)
光控
第一个电视遥控器是Zenith® Space Commander。它在工作时通过一个机械结构产生某个特定频率的超声波。类似于音叉,通过击打可以在一个固定可预测的频率上振动。从理论上讲,音叉发出的声波可以被接收下来,然后转换成一个执行命令。因为这个最早的遥控装置完全是机械式装置,它不需要电池供电。但它只有三个命令,电视开关,频道号的增、减。随着半导体器件价格越来越便宜,应用范围的普及,IR红外光取代超声成为遥控设备的选择。最简单的IR遥控系统由发射红外光调制信号的终端和接收IR调制信号的基座部分组成,基座电路进行解调,通常是执行某个操作命令。但是,考虑到工程实施的便利性、体积要求以及市场需求等因素,具体实现时并不简单。
一个很现实的问题是:我们的周围充满了IR辐射,要在充满辐射干扰源的环境中接收一个普通调制信号显然不现实。任何发热的物体也会产生IR辐射,比如白炽灯发出的IR光就高于可见光。人体本身也会产生IR辐射。考虑到这些原因,大部分IR遥控器在发射数据之前会以低频载波(通常在28kHz到60kHz)调制红外光信号。
在一个典型的家居环境中,用固定频率调制光信号可以使其在所有IR辐射干扰中更容易检测到。通过一个简单的带通滤波器,可以提取出IR信号并对其解码。有很多廉价的集成电路都包含实现这一功能的IR光电二极管和带通滤波器。
产生这样一个调制光很容易。红外发射LED器件比较普遍,也很便宜,简单地利用一个振荡器驱动IR LED即可产生调制光。调制、接收IR调制数据的电路如图1所示。
图1. 电信号被转换成IR调制光信号,然后又被恢复为电信号。为了扩展发射范围,采用PNP驱动器。根据所选IR LED可以调整元器件值
当具备LED光源调制和工作在同一频率的接收IC后,就构成了一个遥控系统的雏形。当LED电路工作在接收范围内时,接收器输出有效。如果这就是所有控制的要求(对外围电路的简单开关控制),任务就算完成了。
但是,简单的开关控制还不能满足实际应用的需求,即使很简单的遥控器也需要发送不同的命令,比如音量的增、减,频道选择,输入源选择以及可能的数字输入。考虑到这个原因,还需要添加其他它电路:可以进一步“调制”光信号。这使整个设计变得有趣。
当IR遥控器的使用不断普及后,生产商都采用自己的方式调制光信号。虽然都是数字控制(也就是说,调制光信号代表数字位“1”或“0”),不同设计之间却有很大差异。有些设计采用简单的非归零(NRZ)调制,有些则采用脉宽调制(PWM)形式,用长脉冲代表一种状态,短脉冲代表另一种状态。还有一些设计采用两相调制,从开到关的跳变代表一种状态,从关到开的跳变代表另一种状态。这种混乱状况一直持续到现在,构建一个能够配合任何厂家设备工作的通用型遥控器面临巨大的挑战。
设计参数
在设计一个通用学习型遥控器时,必须要考虑三个参数:载波频率、比特格式和帧格式。载波频率
载波频率就是用来调制光信号的频率。它与实际比特率没有任何关系。对于给定系统它是一个固定频率,频率范围在28kHz到60kHz之间,大部分工作在36kHz到38kHz之间。比特格式
比特格式是系统辨别比特“1”和比特“0”的方法,不同厂家会采用完全不同的方法。有时“光”脉冲的宽度是决定因素。有些Sony®设备中利用1,100µs的“光”脉冲代表“1”,用550µs的“光”脉冲代表“0”。脉冲之间的间隔始终是550µs。另一种比特格式采用固定“光”脉冲,但脉冲之间的间隔是变化的。有些Matsushita (Panasonic®)设备发射800µs的固定脉冲,但脉冲间隔为2,400µs时代表“1”,脉冲间隔为800µs时代表“0”。
Philips的RC-5码是一种最常用的编码系统。这种编码中,每一比特由889µs的调制光脉冲和889µs的间隔组成。如果一个比特表现为“光”脉冲加上一个“无光”周期,则被认为是比特“1”;如果由一个“无光”周期加上一个“光”脉冲组成,则认为是比特“0”。在RC-5系统中,通过强制每帧的两位起始位为“1”来保证位同步。图2所示为不同的比特格式。
图2. 可以用于IR遥控系统的几种比特格式,所有格式都用载波调制光信号,然后用某种方式调制载波
帧格式
一旦确定了比特格式,设计者必须确定帧格式。很多情况下,由同步脉冲(通常比普通脉冲更宽的脉冲)以及具有特定格式的数据位组成。通常数据由两部分组成:用来传达所要实现的功能的“数据”和用来与受控设备通信的“定制”数据。因此,用于某个设备的数据内容可能对于另一设备而言代表完全不同的含义。有些编码在一帧中发送两次信息:一次为常规格式,另一次为比特反转。通过这种方式可以在某种程度上实现初级的误码检查。如果两次信息不一致,这个命令就被视为无效。
一帧数据发送完毕后,该命令通常会不断地重复发送。一般帧重复速率在每秒10到20帧。有一些协议只发送一次代码,然后不断重复“按键按下”的代码。由于假定每个重复帧都包含数据和定制代码,所以本文介绍的系统不处理这些协议。
最后,有些协议,包括RC-5,会在每次按键操作时反转比特。这有助于识别是否由于信号丢失造成接收间断,比如,有人正好位于遥控器和基座之间,或者是否真的出现第二次按键操作。本项目中没有包含这一功能。
通用性研究
从上述讨论可以看出,通用学习型遥控器为了完成操作需要知道所有的比特格式。如果需要考虑最终的数据组的尺寸,可以注意这个事实:典型的IR遥控器信息只有几十位。而且目前存储器价格相对比较便宜,可以仅采样输入比特流并记录这些采样值。因此对于本项目,我们实际上不用关心比特格式或帧格式。因为系统只是简单记录并回放它检测到的一切。保持系统工作的未知性就可以实现真正的通用性。
接收与记录
接收电路本身很简单。一个上拉至VDD的光电晶体管即可构成输入电路,而且可以直接与MAXQ2000微控制器的输入引脚相连。实际上,并不需要特殊的接收IC。虽然不需要考虑接收范围,但却需要记录任何载频的调制包络。光电晶体管工作在饱和状态会产生一个问题。光电晶体管工作速度不高,从完全导通到完全关闭的恢复时间远远超过大部分系统的比特周期。因此,如果光信号太强,光电晶体管就会饱和,造成载频丢失,只能跟随调制波形的包络。但是,如果信号太弱,将无法识别波形。图3显示了这些条件。
图3. 在接收IR信号时,信号强度必须合适。如果信号强度太大,光电晶体管就会饱和,此时只能检测到信号的低频部分。如果信号强度太弱,载波频率将无法达到检测门限
因此,很重要的一点是将主遥控器和学习遥控器放置在适当的距离内。但是距离多少合适呢?为了确定距离,学习遥控器的内置软件会进行预采样,以此确定距离是否合适。进行记录之前,学习遥控器(比如,MAXQ2000微控制器)在输入通道上对采样信号进行转换。如果没有信号,遥控器假定信号电平太低,并点亮相应的LED。但是,如果微控制器检测到输入通道的转换信号,只是没有100µs或更小的脉冲(载频可以假定为大于10kHz),则假定信号电平太高并点亮另一个LED。最后,如果微控制器检测到以“关断”周期为间隔的高速脉冲串,则假定信号电平合适,即位于所谓的“最佳点”。学习遥控器的代码由此转换到记录状态。
记录状态期间必须完成几个操作。遥控器的微控制器必须确定载波的输入频率。由于微控制器工作在16MHz,载波频率(最大)为60kHz,可以精确测量到载频。从后沿到后沿累计进行四次采样,然后将结果除以8,以此确定高低电平的周期时间。
然后,接收器开始搜寻大于10ms的传输间隔。每个协议都会在重复发送同一编码之间加入一个间隔,而且任何协议都不容许一个编码内部存在大于1ms的间隔。找到发送间隔后,接收器可以找到一个编码序列的开始。由此可以开始记录。
为了记录代码,遥控器的微控制器会累计载波存在的时间。当检测到载波丢失时,遥控器会累计载波消失的时间。由此可以得到一个通断时间向量,在需要的时候它可以用来重建信号。
由于这是一个演示设计,并非最终产品,这些通断时间向量存储在易失RAM中。在实际产品中,通过软件例程可以将这些向量复制到非易失存储器(比如EEPROM)。
回放
当完成按键编程后,CPU进入休眠模式。在这个模式下,依然保持寄存器和RAM值,但会停止CPU时钟。只有中断(或复位)可以唤醒CPU。按下按键后,CPU被唤醒并且开始扫描其输入引脚,以此确定哪一个键被按下。然后它会指向RAM中的向量,RAM中存放有如何执行与此按键相关的指令。
RAM向量由以下部分组成:包含通断周期计数的报头,代表载频的数值以及代表每个通断周期导通和关断时间的数值序列。第一个报头数值即通断周期值存储在循环计数寄存器(LC1)中。将此值保存在计数寄存器中可以方便地循环任何周期。
报头中的第二个值即载波周期,换算后进行存储。发射IR光时,这个数值被载入另一个循环计数寄存器(LC0)。因为MAXQ2000是单周期核,程序的循环定时非常可靠。通过执行四个循环指令就可以产生载波的高电平,然后执行四个循环指令产生低电平。继续重复这个过程即执行一个导通周期和随后的关断周期。
如果没有定时器,程序会一直照此进行,在一个周期内导通IR LED,然后再另一个周期关断,以此产生载波。实际上每半个位周期,向量中包含的一个值就会写入MAXQ2000的一个定时通道。定时器工作在除32模式,所以定时器的精度大概为2µs。
在每个半比特周期的开始,定时器载入该周期的持续时间。然后,当程序代码使IR LED导通或关断(在导通周期内)或简单地使IR LED关断(在关断周期内)时,连续检测定时器就可以确定位周期是否结束。
在超出半个位周期后,循环计数寄存器(LC1)递减并检测是否为零。如果不是零,那么就仍有比特要发送,分支程序会回到循环的顶部,否则就要检测是否按键仍然被按下。如果按键还是有效,那么整个周期(从向量中读取初始值并重新初始化计数器)再次开始。否则,CPU会回到睡眠模式直到按下另一个按键。
增强遥控功能
到目前为止我们已经得到了一个基本的学习型遥控器,但它只有两个按键。改善这个设计的显著需求是增加更多的按键功能。增加按键很简单,仅需增加少量的硬件电路。当CPU空闲时,所有的行驱动器将输出置为逻辑“1”,每一列的软下拉(即高阻)使得这些输入在空闲状态时为低电平。当用户按下任意按键时,相应列被驱动至高电平,唤醒CPU (图4)。CPU可以将每一行置为高电平,每次一行,由此判断按键所在的行和列。图4. 增加额外的按键功能,按键操作必须中断处理器。在睡眠模式,所有列通过软下拉电阻保持低电平,所有行驱动至高电平。按下按键时,列被拉至高电平,唤醒处理器并且开始行扫描过程
另一项改进是利用MAXQ2000的定时时钟外设,在特定时刻唤醒CPU并执行IR命令的编程序列。定时时钟为低功耗外设,可以在电池供电情况下长期工作。当MAXQ2000处于关闭高频时钟的休眠模式时,定时时钟可继续工作。这个时钟可以按照某个时刻要求或时间间隔产生中断,唤醒CPU。例如,定时时钟可以唤醒CPU,然后遥控器可以将指令发送到电缆或卫星机顶盒,接着发送指令到VCR或PVR,开始录制节目。节目结束后,CPU可以再次唤醒,以结束录制。
第三种可能性是将MAXQ2000与个人计算机连接。在这种情况下,PC可以当作节目站,从网络上下载节目信息,并自动将其载入通用型遥控器。
由此可见,仅仅利用几个外围元器件和少量软件,功能强大的MAXQ2000微控制器就变成了一个通用的学习型遥控器核。
类似文章发表于2007年12月刊的Circuit Cellar。
评论
查看更多