红外遥传感器分为两部分:红外接收模块、红外遥控模块
红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。
发射机一般由指令键(或操作杆)、指令编码系统、调制电路、驱动电路、发射电路等几部分组成。当按下指令键或推动操作杆时,指令编码电路产生所需的指令编码信号,指令编码信号对载波进行调制,再由驱动电路进行功率放大后由发射电路向外发射经调制定的指令编码信号。
接收电路一般由接收电路、放大电路、调制电路、指令译码电路、驱动电路、执行电路(机构)等几部分组成。接收电路将发射器发出的已调制的编码指令信号接收下来,并进行放大后送解调电路,解调电路将已调制的指令编码信号解调出来,即还原为编码信号。指令译码器将编码指令信号进行译码,最后由驱动电路来驱动执行电路实现各种指令的操作控制(机构)。
红外接收模块:
参数表:
红外接收模块中采用的是VS1838B红外线接收头,该接收头内含高速高灵敏PIN光电二极管和低功耗、高增益前置放大IC,采用环氧树脂封装外加外屏蔽抗干扰设计、能抵挡环境干扰。
VS1838B红外接收头同时还具备一下特定:
宽工作电压,2.7-5.5V;
低功耗,宽角度及长距离接收;
输出匹配TTL、CMOS电平,低电平有效。
因此,该红外接收头主要应用在视听器材(音箱,电视,DVD,卫星接收机等)、家庭电器(空调,电风扇,灯饰等)以及其他红外线遥控产品。
详细参数如下:
光电参数(T = 25℃ Vcc = 5.0V f0=38KHZ):
红外接收模块原理图:
红外遥控模块:
红外遥控模块可由键盘电路、红外编码芯片、电源和红外发射电路组成。
红外遥控的编码方式目前广泛使用的是:PWM(脉冲宽度调制)的NEC协议和Philips PPM(脉冲位置调制)的RC-5协议的。目前大部分遥控器使用的是NFEC协议,其特征如下:
1,8位地址和8位指令长度;
2,地址和命令2IC传输(确保可靠性)
3,PWM脉冲款第调制,以发射红外载波的占空比代表“0”和“1”;
4,载波频率位38Khz;
5,位时间为1.125ms或2.25ms;
6,一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us低 + 1680us高),一个逻辑0的传输需要1.125ms(560us低 + 560us高)。
7.NEC遥控指令的数据格式为:同步码、地址码、地址反码、控制码、控制反码。
8,同步码由一个9ms的低电平和一个4.5ms的高电平组成;
9,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。
10,连发码:由97.94ms的高电平组成、9ms的低电平、2.5ms的高电平、0.56ms的低电平;
示例代码:
#include <IRremote.h>
#define RECV_PIN 12
#define R_ZERO 0x00FF6897 //红外传感器的解码值
#define R_ONE 0x00FF30CF
#define R_TWO 0x00FF18E7
#define R_THREE 0x00FF7A85
#define R_FOUR 0x00FF10EF
#define R_FIVE 0x00FF38C7
#define R_SIX 0x00FF5AA5
#define R_SEVEN 0x00FF42BD
#define R_EIGHT 0x00FF4AB5
#define R_NINE 0x00FF52AD
#define R_Previous 0x00FF22DD
#define R_LAST 0x00FF02FD
IRrecv irrecv(RECV_PIN); //Set an example of IRrecv
decode_results results; //Set an example of decode_results, Results is used to save the decoding results
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
irrecv.enableIRIn();
delay(1500);
}
int CheckButton(uint32_t code)
{
int ret;
switch (code) {
case R_ZERO:
ret = 0;
break;
case R_ONE:
ret = 1;
break;
case R_TWO:
ret = 2;
break;
case R_THREE:
ret = 3;
break;
case R_FOUR:
ret = 4;
break;
case R_FIVE:
ret = 5;
break;
case R_SIX:
ret = 6;
break;
case R_SEVEN:
ret = 7;
break;
case R_EIGHT:
ret = 8;
break;
case R_NINE:
ret = 9;
break;
case R_Previous:
ret = -2;
break;
case R_LAST:
ret = -3;
break;
default:
ret = -1;
break;
}
return ret;
}
void loop()
{
int n;
if (irrecv.decode(&results)) // 如果有接收到数据
{
n = CheckButton(results.value);
Serial.println(n);
irrecv.resume();
}
delay(200);
}
串口打印: