红外接收头的外观
介绍红外接收头
1.什么是红外接收头?
红外遥控器发出的信号是一系列二进制脉冲码。
在无线传输过程中,为了避免其它红外信号的干扰,通常首先在特定的载波频率上调制, 然后通过红外发射二极管发射,红外接收装置过滤其他杂波,只接收特定频率的信号,恢复为二进制脉冲代码,即解调.
2、工作原理
内置接收管将红外发射管发出的光信号转换为微弱的电信号,通过IC放大内部放大器,然后通过自动增益控制、带滤波、解调变、 波形整形后,还原为遥控器发出的原始编码,通过接收头的信号输出脚输入到电器上的编码识别电路。
3.红外接收头的引脚和连接
如下图所示,红外接收头有三个引脚:
D为数据输出
GND为电源地
VCC为电源正
红外遥控实验
1、实验器件 红外遥控器 1个 IR Receiver Module 1个 数字传感器连接线 1根
2、实验原理 如果你想解码遥控器,你必须了解遥控器的编码方法己知彼,百战不殆 。本产品使用的遥控器编码方法如下:NEC协议下面介绍一下。NEC协议:
NEC协议介绍
特点:
(1)地址位8位,命令位8位
(2)两次传输可靠地址和命令位
(3)调制脉冲位置
(4)载波频率38khz
(5)每个1.125ms或2.25ms
逻辑0和1的定义如下图所示:
协议如下:
按键按下立刻松开的发射脉冲:
上图显示NEC典型的脉冲序列协议。注:这是第一次发送LSB(最低)协议。上述脉冲传输地址为0x59命令为0x16。一个消息是由一个9组成的ms的高电平开始,随后有一个4.5ms的低电平, (引导码由这两段电平组成)然后由地址码和命令码组成。两次传输地址和命令。第二次所有位置都取反,可用于确认收到的信息。总传输时间是恒定的,因为每一点都与它重复。假如你不感兴趣, 每16位可以忽略这种可靠性取反,或者扩大地址和命令!
按键释放发射脉冲一段时间:
即使遥控器上的按钮仍然按下一个命令发送一次。当按钮一直按下时,第一个110ms的脉冲与上图一样,之后每110ms重复代码传输一次。这个重复代码是由一个9ms高电平脉冲和2.25ms低电平和560μs高电平组成。
重复脉冲
注:脉冲波形进入集成接收头后,由于集成接收头应进行解码、信号放大和整形手术,因此在没有红外信号的情况下,应注意输出端为高电平,有信号时为低电平,因此输出信号电平与发射端正好相反。通过示波器可以看到接收端脉冲,并结合波形理解程序。
本实验编程思想
根据NEC本实验将接收端的波形分为四部分:引导码(9ms和4.5ms脉冲)、16位地址代码(包括8位地址位和8位地址取反)、16位命令代码(包括8位命令位和8位命令位取反)、重复代码(9ms、2.25ms、560us脉冲组成)。 根据测量时间,使用定时器测量接收到的波形高电平段和低电平段:逻辑0、逻辑1、引导脉冲和重复脉冲。只要判断引导码和地址码是正确的脉冲,就不需要存储,但命令码必须存储,因为每个按钮的命令码是不同的, 根据命令码执行相应的动作。遥控器上设置了几个按钮VOL :控制LED灯亮的;VOL-:控制蜂鸣器响;
实例代码
程序功能:解码遥控器发解码遥控器发射的编码脉冲。按下"VOL "红灯亮,松开红灯灭;按下"VOL-"蜂鸣器响,松开蜂鸣器停止响;这样你就可以用遥控器遥控你的器件,让它听你的指挥。其他按钮的解码方法与这些按钮相同。只要您用示波器测量自己的波形,了解自己的命令码,并在执行解码结果的函数中写下相应的命令码和要执行的动作。
#define BUZZER 10//蜂鸣器
#define LED_RED 11//红灯
#define IR_IN 8 ///红外接收
int Pulse_Width=0.//存储脉宽
int ir_code=0x00;///命令值
void timer1_init(void)//定时器初始化函数
{
TCCR1A = 0X00;
TCCR1B = 0X05.//给定时器时钟源
TCCR1C = 0X00;
TCNT1 = 0X00;
TIMSK1 = 0X00; //禁止定时器溢出中断
}
void remote_deal(void)///执行译码结果函数
{
switch(ir_code)
{
case 0xff00://停止
digitalWrite(LED_RED,LOW);///红灯不亮
digitalWrite(BUZZER,LOW);///蜂鸣器不响
break;
case 0xfe01://VOL
digitalWrite(LED_RED,HIGH);//红灯亮
break;
case 0xf609://VOL-
digitalWrite(BUZZER,HIGH);///蜂鸣器响
break;
}
}
char logic_value()//判断逻辑值0和1子函数
{
while(!(digitalRead(8))); //低等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=7&&Pulse_Width<=10/低电平560us
{
while(digitalRead(8)
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=7&&Pulse_Width<=10)//然后高电平560us
return 0;
else if(Pulse_Width>=25&&Pulse_Width<=27) //然后高电平1.7ms
return 1;
}
return -1;
}
void pulse_deal()//接收地址码和命令码脉冲函数
{
int i;
//执行8个0
for(i=0; i<8; i )
{
if(logic_value() != 0) //不是0
return;
}
//执行6个1
for(i=0; i<6; i )
{
if(logic_value()!= 1) //不是1
return;
}
//执行1个0
if(logic_value()!= 0) //不是0
return;
//执行1个1
if(logic_value()!= 1) //不是1
return;
//解析遥控器编码中的command指令
ir_code=0x00;//清零
for(i=0; i<16;i )
{
if(logic_value() == 1)
{
ir_code |=(1<
}
}
}
void remote_decode(void)///翻码函数
{
TCNT1=0X00;
while(digitalRead(8)
{
if(TCNT1>=1563) //当高电平持续时间超过1000时ms,这表明此时没有按钮
{
ir_code = 0xff00;
return;
}
<>}//如果高电平持续时间不超过100ms
TCNT1=0X00;
while(!(digitalRead(8))); //低等待
Pulse_Width=TCNT1;
TCNT1=0;
if(Pulse_Width>=140&&Pulse_Width<=141)//9ms
{
while(digitalRead(8));//是高就等待
Pulse_Width=TCNT1;
TCNT1=0;
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=TCNT1;
TCNT1=0;
if(Pulse_Width>=7&&Pulse_Width<=10)//560us
{
return;
}
}
}
}
void setup()
{
unsigned char i;
pinMode(LED_RED,OUTPUT);//设置与红灯连接的引脚为输出模式
pinMode(BUZZER,OUTPUT);//设置与蜂鸣器连接的引脚为输出模式
pinMode(IR_IN,INPUT);//设置红外接收引脚为输入
}
void loop()
{
timer1_init();//定时器初始化
while(1)
{
remote_decode(); //译码
remote_deal(); //执行译码结果
}
}
遥控器键值附表
Arduino库文件
本文整理于DFRobot wiki