锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Arduino红外传感器-IR Receiver Module红外接收模块

时间:2022-11-13 02:30:00 电路板用接近传感器红外遥控接收器模块传感器红外电红外传感器

红外接收头的外观

bd684612b89182970f1ef2dfb48f4bc2.png

介绍红外接收头

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章