Arduino红外遥控实验

白癜风的注意事项 http://pf.39.net/bdfyy/zjft/150604/4634171.html

一、实验目的

1熟悉红外遥控发射、接收模块的基本的原理;

2理解红外遥控器的编码原理;

3编写红外遥控发射、接收程序;

4实现LED灯的红外遥控功能。

二、实验设备与环境

ArduinoUNO套件、计算机、红外遥控器、红外接收头、LED灯、欧电阻等

三、实验重点

1红外遥控发射、接收模块原理;2红外遥控发射、接收程序与按键编码测定;3红外遥控LED灯的显示

四、实验原理

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。

红外光按波长范围分为,近红外、中红外、远红外、极红外4类。红外线遥控是利用近红外光传送遥控指令,波长为0.76um~1.5um。用近红外作为遥控光源,是因为红外发射器件(红外发光管)与红外接收器件(光敏二极管、三极管及光电池)的发光与受光峰值波长一般为0.8um~0.94um,在近红外光波段内,二者的光谱正好重合,能够很好地匹配,可以获得较高的传输效率及较高的可靠性。

红外遥控主要由红外发射和红外接收两部分组成。

红外发射和接收的信号是一串二进制脉冲码,高低电平按照一定的时间规律变换来传递相应的信息。为了使其在无线传输过程中免受其他信号的干扰,信号在调制在38K红外载波上,通过红外发射二极管发射出去,而红外接收端则要将信号进行解调处理,还原成二进制脉冲码进行处理。

⑴红外信号发射

红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波。

原始信号就是我们要发送的一个数据“0”位或者一位数据“1”位,载波频率为38K方波信号,调制后信号就是最终我们发射出去的波形。用原始信号来控制38K载波,当信号是数据“0”的时候,38K载波毫无保留的全部发送出去,当信号是数据“1”的时候,不发送任何载波信号。

红外遥控信号编码(NEC协议)

NEC协议特点:

①8位地址位,8位命令位;②为了可靠性地址位和命令位被传输两次;③脉冲位置调制;④载波频率38khz;⑤每一位的时间为1.ms-2.25ms

⑵红外信号接收

红外接收电路由红外接收二极管、三极管或硅光电池组成,将红外发射器发射的红外线转换为相应的电信号。红外信号接收端对接收到的信号进行放大、滤波、解调等一系列电路处理,然后输出数字数据信号。红外通信接收头HSB,把基本处理电路集成到一起,只要接收到发射端发出的红外信号,就可以直接输出索要的数字信号。

当HS监测到有38K的红外信号时,就在OUT引脚输出低电平,当没有38K的时候,OUT引脚就会输出高电平。

把OUT引脚接到Arduino的IO口上,通过编程获取红外发射端发过来的数据。

2.红外遥控

红外遥控工作时,向红外接收头发射红外信号,红外接收头接收到信号后,经过分析解码发射信号,得到遥控发射器按键的键值编码,主程序根据收到按键的键值编码作出相应的反应控制。红外遥控器是家居常用来控制电视、空调、风扇、音响等家电的控制装置。

⑴遥控器(红外信号发射)

红外遥控器一般由指令键,指令编码系统、调制电路、驱动电路、红外发射电路灯及部分组成。当按下指令键时,指令编码电路产生所需的指令编码信号,指令编码信号对载波进行调制,由驱动电路进行功率放大后,由发射电路向外发射经调制定的指令编码信号。

⑵接收头(红外接收)

接收电路将发射器发出的已调制的编码指令信号接收下来,并进行放大后送解调电路,解调电路将已调制的指令编码信号解调出来,即还原为编码信号。

3.红外库函数IRemote()

红外遥控类库IRremote是第三方库,支持多种红外协议,如NEC、SonySIRC、PhilipsRC5等。当Arduino主板连接红外遥控发射、接收模块,可以实现红外遥控功能。

使用红外遥控,源程序中先包含IRremote.h头文件。

红外接收IRrecv库库函数

IRrecvmyIRrecv(recvPin)//创建红外接收实例对象,recvPin接收头引脚

decode_resultsresults;//声明接收编码信息存储的结构体对象

成员函数:

myIRrecv.enableIRIn();//初始化红外解码

IRrecv.decode(results);//检查接收红外编码,解码信息存入decode_results结构对象results

IRrecv.resume();//接收下一个编码

result.value();//收到的编码数据信息

注:获取的红外遥控器键值是一个16进制字符串。

类红外发射类IRsend库函数

IRsendmyIRsend()创建一个红外发射实例对象

IRsend库成员函数:

myIRsend.sendNEC(data,nbits)以NEC编码格式发送指定值

myIRsend.sendRaw(buf,len,hz)以原始编码格式发送信号

实验内容

电路图:

原理图:

实验一:红外遥控按键编码测试

代码://红外遥控按键编码测试

/**IRremote:IRrecvDemo-demonstratesreceivingIRcodeswithIRrecv*

AnIRdetector/demodulatormustbeconnectedtotheinputRECV_PIN.*

Version0.1July,,CopyrightKenShirriff.*/

#includeIRremote.h

intrecvPin=11;//红外接收器连接11号引脚

IRrecvmyIRrecv(recvPin);

decode_resultsresults;//用于存储接收红外编码信息的结构体对象

voidsetup(){

Serial.begin();//初始化串口通信

myIRrecv.enableIRIn();//初始化红外解码

}

voidloop(){

if(myIRrecv.decode(results)){//检查是否接收到编码信息

Serial.print("thekeycodeis:");

Serial.println(results.value,HEX);

myIRrecv.resume();//接收下一个编码

}

}

表红外遥控器按键与按键编码信息表

实验二:红外遥控控制LED灯的开、关;

程序流程图:

代码://2、红外遥控控制LED灯的开、关

#includeIRremote.h

constintrecvPin=11;

constintLED=13;

IRrecvmyIRrecv(recvPin);

decode_resultsresults;

voidsetup(){

pinMode(LED,OUTPUT);

digitalWrite(LED,LOW);

Serial.begin();

Serial.println("begin");

myIRrecv.enableIRIn();

}

voidloop(){

if(myIRrecv.decode(results))

{

Serial.println(results.value,HEX);

if(results.value==0XFFA)//+键

{

digitalWrite(LED,HIGH);

delay();

}

elseif(results.value==0XFFE01F)//-键

{

digitalWrite(LED,LOW);

delay();

}

//恢复接受下一个红外遥控信号

myIRrecv.resume();

}

delay();

}

实验三:红外遥控实现LED灯开、关控制,用+键、-键

程序流程图:

代码:

#includeIRremote.h

constintrecvPin=11;

constintLED=13;

IRrecvmyIRrecv(recvPin);

decode_resultsresults;

voidsetup(){

pinMode(LED,OUTPUT);

digitalWrite(LED,LOW);

Serial.begin();

Serial.println("begin");

myIRrecv.enableIRIn();

}

voidloop(){

if(myIRrecv.decode(results))

{

Serial.println(results.value,HEX);

if(results.value==0XFFA)//+键

{

digitalWrite(13,HIGH);

}

elseif(results.value==0XFFE01F)//-键

{

digitalWrite(13,LOW);

}

//恢复接受下一个红外遥控信号

myIRrecv.resume();

}

delay();

}

实验四:开灯条件下,按键控制LED灯光变亮、变暗

代码:

//4、开灯条件下,按键控制LED灯光变亮、变暗

#includeIRremote.h

constintrecvPin=11;

constintLED=13;

IRrecvmyIRrecv(recvPin);

decode_resultsresults;

voidsetup(){

pinMode(LED,OUTPUT);

digitalWrite(LED,HIGH);

Serial.begin();

Serial.println("begin");

myIRrecv.enableIRIn();

}

voidloop(){

if(myIRrecv.decode(results))

{

Serial.println(results.value,HEX);

myIRrecv.resume();//接收下一个编码

}

delay();

if(results.value){

if(results.value==0xFFA25D)//CH-键

{

digitalWrite(13,HIGH);

results.value=0;

if(results.value==0xFF30CF)//1键

{

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

results.value=0;

}

if(results.value==0xFF18E7)//2键

{

for(inti=0;i2;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF7A85)//3键

{

for(inti=0;i3;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF10EF)//4键

{

for(inti=0;i4;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF38C7)//5键

{

for(inti=0;i5;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF5AA5)//6键

{

for(inti=0;i6;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF42BD)//7键

{

for(inti=0;i7;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF4AB5)//8键

{

for(inti=0;i8;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

if(results.value==0xFF52AD)//CH+键

{

for(inti=0;i9;i++){

digitalWrite(LED,HIGH);

delay();

digitalWrite(LED,LOW);

delay();

}

results.value=0;

}

}

if(results.value==0xFFD)//CH键

{

digitalWrite(13,LOW);

}

}

}

六、实验结果

实验1.

实验2.

实验3.

七、实验结论:

1.基本熟悉红外遥控发射、接收模块的基本的原理和理解红外遥控器的编码原理;编写红外遥控发射、接收程序;也了解实现LED灯的红外遥控功能。




转载请注明:http://www.aierlanlan.com/rzdk/2375.html