文档详情

远程控制-红外线控制

桔****
实名认证
店铺
DOCX
133.34KB
约8页
文档ID:411510149
远程控制-红外线控制_第1页
1/8

控制功能-红外控制一、 用途我们家里很多电器都是红外线控制,比如:空调、电视、机顶盒、风扇等等,而 每个电器都会配一个遥控器,一大堆遥控器放在面前,实在麻烦,如果能用 控制红外线,就同时控制所有电器了二、 原理红外接收头的引脚与连线,红外接收头有三个引脚如下图:D为数据输出,GND为电源地,VCC为电源正要想对某一遥控器进行解码必须要了解该遥控器的编码方式,本节中使用的遥控器的编码方式为:NEC协议下面就介绍一下NEC协议:•NEC协议介绍:特点:(1) 8位地址位,8位命令位(2) 为了可靠性地址位和命令位被传输两次(3) 脉冲位置调制(4) 载波频率38khz(5)每一位的时间为1.125ms或2.25ms•逻辑0和1的定义如下图:•按键按下立刻松开的发射脉冲:1 00 1 101010 01101001 1 0 1 000 011010 0 0■ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIILSBMSBLSBMSBLSBMS&LSB<4 5ms>:^ Address- < Address ・[^—Command ・ 1 ♦ Command ►MS&上面的图片显示了 NEC的协议典型的脉冲序列。

注意:这是首先发送LSB (最低 位)的协议在上面的脉冲传输的地址为0x59命令为0x16一个消息是由一个 9ms的高电平开始,随后有一个4.5ms的低电平,(这两段电平组成引导码) 然后由地址码和命令码地址和命令传输两次第二次所有位都取反,可用于对 所收到的消息中的确认使用总传输时间是恒定的,因为每一点与它取反长度重 复如果你不感兴趣,你可以忽略这个可靠性取反,也可以扩大地址和命令, 以每16位!•按键按下一段时间才松开的发射脉冲:一个命令发送一次,即使在遥控器上的按键仍然按下当按键一直按下时,第一 个110ms的脉冲与上图一样,之后每110ms重复代码传输一次这个重复代码 是由一个9ms的高电平脉冲和一个2.25ms低电平和560q的高电平组成•重复脉冲2.25m$注意:脉冲波形进入一体化接收头以后,因为一体化接收头里要进行解码、信号 放大和整形,故要注意在没有红外信号时,其输出端为高电平,有信号时为低电 平,故其输出信号电平正好和发射端相反接收端脉冲大家可以通过示波器看到, 结合看到的波形理解程序三、器材介绍我们需要的器材包括:红外线模块、I/O扩展板、arduino控制板、风扇模块、LED 模块。

四、实例我们首先需要进行遥控器的红外解码:利用Arduino自带的IRremote库,进行解码,连接如下:代码如下:#inelude int RECV_PIN = 7; //红外接收头连接到数字口 7IRrecv irrecv(RECV_PIN);decode^results results;void setup(){Serial.begin(9600);irrecv.enablelRInf);}void loop() {if (irrecv.decode(&results)) {Serial.printlnfresults.value, HEX);irrecv.resume();}}这样按键的红外编码就以16进制的形式返回到串口监视器中经过解码,需要用到的按键编码值以及相应的功能如下:遥控器字符键值遥控器字符键值红色按钮OxffOO1OxeflOVOL+OxfeOl2OxeellFUNC/STOPOxfdO230xedl2左2个三角0xfb0440xebl4暂停键0xfa0550xeal5右2个三角0xf90660xe916向下三角0xf70870xe718VOL-0xf60980xe619向上二角OxfSOa90xe51aEQ0xf20d00xf30cST/REPTOxflOe我们获取了遥控器的键值之后就可以继续下面的操作了。

在下面的例子中我们将用红外來控制蜂鸣器和LED灯,示例代码如下#define BUZZER 9〃蜂鸣器 接数字11 9#define LED_RED 7〃红色 LED 灯接数字 I I 7#define IR_IN 8 〃红外接收连接到接I丨8int Pulse_Width=O;//存储脉宽int ir_code=OxOO;〃 命令值void timerljnit(void)//定时器初始化函数{TCCR1A = 0X00;TCCR1B = 0X05;//给定时器时钟源TCCR1C = 0X00;TCNT1 = 0X00;TIMSKl = 0X00; 〃禁止定时器溢出中断}void re m ote_de a I (vo i d)//执行译码结果函数{switch(ir_code){case OxffOO://停止digitalWrite(LED_RED,LOW); 〃红灯不亮 digitalWrite(BUZZER,LOW);// 蜂鸣器不响 break;case Oxfe01://VOL+digitalWrite(LED_RED,HIGH);// 红灯亮break;case 0xf609://VOL-digitalWrite(BUZZER,HIGH);// 蜂鸣器响break;}}char logic_value()//判断逻辑值“0”和 T 子函数{while(!(digitalRead (8))); 〃低等待Pulse_Width 二 TCNT1;TCNT1=O;if(Pulse_Width>=7&&Pulse_Width<=10)//低电平 560us{while(digitalRead(8));〃 是高就等待Pulse_Width=TCNTl;TCNT1=O;if(Pulse_Width>=7&&Pulse_Width<=10)//接着高电平 560us return 0;else if(Pulse_Width>=25&&Pulse_Width<=27) //接着高电平 1.7msreturn 1;}return -1;}void pulse_deal()〃接收地址码和命令码脉冲函数{int i;〃执行8个0for(i=0; i<& i++){if(logic_value() != 0) 〃不是 0return;}〃执行6个1for(i=0; i<6; i++){if(logic_value()!= 1) 〃不是 1return;}〃执行1个0if(logic_value()!= 0) //不是 0return;〃执行1个1if(logic_value()!= 1) //不是 1return;〃解析遥控器编码中的command指令ir_code=OxOO;〃 清零for(i=0; i<16;i++){if(logic_value() == 1){ir_code |=(l«i);}}}void remote_decode(void)//译码函数{TCNTl=0X00;whilefdigitalRead (8))//是高就等待{if(TCNTl>=1563) 〃当高电平持续时间超过100ms,表明此时没有按键按下{ir_code = OxffOO;return;}}〃如果高电平持续时间不超过100msTCNTl=0X00;while) SfdigitalRead (8))); 〃低等待Pulse_Width 二 TCNT1;TCNT1=O;if(Pulse_Width>=140&&Pulse_Width<=141)//9ms{while(digitalRead(8));// 是高就等待Pulse_Width=TCNTl;TCNT1=O;if(Pulse_Width>=68&&Pulse_Width<=72)//4.5ms{pulse_deal();return;}else if(Pulse_Width>=34&&Pulse_Width<=36)//2.25ms{while(!(digitalRead(8)));// 低等待Pulse_Width=TCNTl;TCNT1=O;if(Pulse_Width>=7&&Pulse_Width<=10)//560usreturn;}}}void setup(){unsigned char i;pinMode(LED_RED,OUTPUT);//设置与红灯连接的引脚为输出模式pinMode(BUZZER,OUTPUT);//设置与蜂鸣器连接的引脚为输出模式 pinMode(IRJNJNPUT);//设置红外接收引脚为输入}void loop(){timerl_init();//定时器初始化while(l){remote_decode(); 〃译码remote_deal(); 〃执行译码结呆}}五、扩展通过上面的学习,人家可能猜到了我们的用心,就是可以用一个遥控器来控制我们所有家 电,但是只能开关设备显然不能满足我们的要求,怎么实现细微的调整呢?如果我们要同时 控制好几个家电,遥控器上的开关显然不够用?怎么办?我们可以简单的设想一下,可以用 数字键来选择设备,选择设备之后进行设备子程序,功能键进行设备控制。

按电源键可以退 出子程序,重新选择设备。

下载提示
相似文档
正为您匹配相似的精品文档