【Arduino实验14 红外遥控】

  • Post author:
  • Post category:其他



目录


一、实验目的


二、实验设备与环境


三、实验重点


四、实验难点


五、实验内容


5.1实验任务


5.2实验原理


​5.3实验内容


5.4实验结果


5.5思考题


一、实验目的

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

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

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

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

二、实验设备与环境

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

三、实验重点

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

四、实验难点

1 红外遥控编码原理

五、实验内容

5.1实验任务

任务描述:库函数IRemote()的使用;获取红外遥控器按键编码信息;遥控器按键控制LED的开关与亮度。

5.2实验原理

1.红外信号发射、接收原理

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

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

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

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

(1)红外信号发射

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

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

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

NEC协议特点:

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

协议编码脉冲波形:

按下按键,发射脉冲序列(编码):

注:脉冲传输的地址为0x59,命令为0x16

长按按键,代码每隔110ms重复发送:

(2)红外信号接收

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

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

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

2.红外遥控

红外遥控工作时,向红外接收头发射红外信号,红外接收头接收到信号后,经过分析解码发射信号,得到遥控发射器按键的键值编码,主程序根据收到按键的键值编码作出相应的反应控制。

红外遥控器是家居常用来控制电视、空调、风扇、音响等家电的控制装置。

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

红外遥控器一般由指令键,指令编码系统、调制电路、驱动电路、红外发射电路灯及部分组成。

当按下指令键时,指令编码电路产生所需的指令编码信号,指令编码信号对载波进行调制,由驱动电路进行功率放大后,由发射电路向外发射经调制定的指令编码信号。

(2)接收头(红外接收)

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

3.红外库函数IRemote()

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

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

// 红外库函数头文件与实体化对象声明

#include <IRremote.h>int recvPin = 11; //红外接收器连接11号引脚IRrecv myIRrecv(recvPin);// 实例化一个红外接收对象

decode_results results; // 声明一个存储红外编码信息的结构体对象

IRremote类库函数中定义了红外接受类IRrecv、红外发射类IRsend。

红外接收IRrecv库函数

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

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

成员函数:

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

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

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

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

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

红外发射类IRsend库函数

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

IRsend库成员函数

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

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

4.红外遥控控制LED灯组电路


5.3实验内容

1.红外遥控按键编码测试

步骤1:连接电路

步骤2:程序流程图(略)

步骤3:源程序

/*
* IRremote: IRrecvDemo -demonstrates receiving IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009,Copyright 2009 Ken Shirriff.
*/#include <IRremote.h>
int recvPin = 11; //红外接收器连接11号引脚
IRrecv myIRrecv(recvPin);
decode_results results; // 用于存储接收红外编码信息的结构体对象
void setup() {
    Serial.begin(9600); // 初始化串口通信
    myIRrecv.enableIRIn(); // 初始化红外解码
}
void loop() {
    if (myIRrecv.decode(&results)) { //检查是否接收到编码信息
        Serial.print("the keycode is:");
        Serial.println(results.value, HEX);
        myIRrecv.resume(); // 接收下一个编码
    }
}

步骤4:监测串口监视器输出按键值编码,填入下表:


按键


键值编码


按键


键值编码


CH –




FFA25D


CH+




FF30CF


“-”键


FFE01F


1




FF18E7


“+” 键


FFA857


2




FF7A85


◣◣键


FF22DD


3




FF10EF


◥◥键


FF02FD


4




FFE21D


◥Ⅱ键


FFC23D


5




FF38C7


EQ




FF906F


6




FF


100+




FF9867


7




FF42BD


200+




FFB04F


8




FF


0




FF6897


9




FF5

步骤5:程序调试         注:遥控器每个按键都对应不同的编码,不同遥控器使用的编码也不相同。出现“FFFFFFFF”编码,是因为使用的是NEC协议的遥控器,当按住某按键不放时,其会发送一个重复编码“FFFFFFFF”。而其他协议的遥控器,则会重复发送对应的编码。

2. 红外遥控控制LED灯的开、关

步骤1:连接电路

步骤2:画程序流程图

步骤3:编写控制程序

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
#define LEDPIN 8
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(LEDPIN,INPUT);
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
    switch(results.value){
      case 0xFF52AD:
        digitalWrite(LEDPIN,HIGH);
        break;
      case 0xFF42BD:
        digitalWrite(LEDPIN,LOW);
        break;
    }
  }
  delay(100);
}

步骤4:程序调试

3.实验任务扩展:实验任务:(1)红外遥控实现LED灯开、关控制,(2)开灯条件下,按键控制LED灯光变亮、变暗。

步骤1:设置按键功能


按键


键值


功能



+


FFA857


控制LED灯变亮






FFE01F


控制LED灯变暗

步骤2:程序流程图

步骤3:编写程序

#include <IRremote.h>
int RECV_PIN = 11;
int LEDPIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;
int val = 0;
void setup() {
     Serial.begin(9600);
    //初始化接收器
    irrecv.enableIRIn();
    //设定数字IO口的模式,OUTPUT 为输出
    pinMode(LEDPIN, OUTPUT);
}
void loop() {
    if (irrecv.decode(&results)) {
        //按“+”号键
        if (results.value == 16754775 && val < 255) {
          val = val + 10;
        }//按下“-”号键
        else if (results.value == 16769055 && val > 0) {
          val = val - 10;
        }
    irrecv.resume();
    }  
    Serial.println(val);
    analogWrite(LEDPIN, val);
}

步骤4:程序调试

5.4实验结果

结论:通过按键可控制灯的亮灭,按键亮,按键灭。按键可控制灯的开灭,当灯亮时,按“+”键,灯逐渐变亮,按“-”键,灯逐渐变暗。

反思:通过本次实验我学会了很多知识,

熟悉了红外遥控发射、接收模块的基本的原理,理解了红外遥控器的编码原理,能编写红外遥控发射、接收程序,实现LED灯的红外遥控功能。收获了很多知识。

作品:

5.5思考题

1.红外遥控是目前使用最为广泛的一种通信和遥控手段,家用电器通常由红外遥控器实现控制。如果要获取家电遥控器按键编码信息,该怎样实现?



版权声明:本文为m0_50509016原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。