实验二十:红外遥控

库文件下载链接:ArduinoCode20-红外遥控库代码.zip
注意:把 IRremote 文件夹放到 编译器安装目录下的\Arduino\libraries里。不然编译不过。
例如我的:C:\Program Files\Arduino\libraries

一、什么是红外接收头?
红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调。

二、工作原理
内置接收管将红外发射管发射出来癿光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制、带通滤波、解调变、波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输入到电器上的编码识别电路。

三、红外接收头的引脚与连线
红外接收头有三个引脚如下图:
用的时候将VOUT接到模拟口,GND接到实验板上的GND,VCC接到实验板上的+5v。

实验器材清单

  1. 红外遥控器 1个
  2. 红外接收头 1个
  3. M5直插LED灯 6个
  4. 220欧姆直插电阻 6个
  5. 面包板 1个
  6. 面包板跳线 1扎

实验接线

首先将板子连接好;接着将红外接收头按照上述方法接好,将VOUT接到数字11口引脚,将LED灯通过电阻接到数字引脚2,3,4,5,6,7。返样就完成了电路部分的连接。

实验原理

要想对某一遥控器进行解码必须要了解该遥控器的编码方式。本产品使用的控器的码方式为:NEC协议。下面就介绍一下NEC协议:
NEC协议介绍:特点:
(1)8位地址位,8位命令位
(2)为了可靠性地址位和命令位被传输两次
(3)脉冲位置调制
(4)载波频率38khz
(5)每一位癿时间为1.125ms戒2.25ms
逻辑 0和1的定义如下图
协议如下:

按键按下立刻松开的发射脉冲:

上面图片显示了NEC的协议典型的脉冲序列。注意:这首先发送LSB(最低位)的协议。在上面癿脉冲传输的地址为0x59命令为0x16。一个消息是由一个9ms的高电平开始,随后有一个4.5ms的低电平,(返两段电平组成引寻码)然后由地址码和命令码。地址和命令传输两次。第二次所有位都取反,可用于对所收到的消息中的确认使用。总传输时间是恒定的,因为每一点与它取反长度重复。如果你不感兴趣,你可以忽略这个可靠性取反,也可以扩大地址和命令,以每16位!

按键按下一段时间才松开的发射脉冲:

一个命令发送一次,即使在遥控器上的按键仍然按下。当按键一直按下时,第一个110ms癿脉冲与上图一样,之后每110ms重复代码传输一次。返个重复代码是由一个9ms的高电平脉冲和一个2.25ms低电平和560μs癿高电平组成。

重复脉冲

注意:脉冲波形进入一体化接收头以后,因为一体化接收头里要迕解码、信号放大和整形,故要注意:在没有红外信号时,其输出端为高电平,有信号时为低电平,故其输出信号电平正好和发射端相反。接收端脉冲大家可以通过示波器看到,结合看到的波形理解程序。

实验接线图


参考程序代码:
#include <IRremote.h>
int RECV_PIN = 11;
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
long on1 = 0x00FFA25D;
long off1 = 0x00FFE01F;
long on2 = 0x00FF629D;
long off2 = 0x00FFA857;
long on3 = 0x00FFE21D;
long off3 = 0x00FF906F;
long on4 = 0x00FF22DD;
long off4 = 0x00FF6897;
long on5 = 0x00FF02FD;
long off5 = 0x00FF9867;
long on6 = 0x00FFC23D;
long off6 = 0x00FFB047;
IRrecv irrecv(RECV_PIN);
decode_results results;
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
Serial.println(“Could not decode message”);
}
else
{
if (results->decode_type == NEC)
{
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY)
{
Serial.print(“Decoded SONY: “);
}
else if (results->decode_type == RC5)
{
Serial.print(“Decoded RC5: “);
}
else if (results->decode_type == RC6)
{
Serial.print(“Decoded RC6: “);
}
Serial.print(results->value, HEX);
Serial.print(” (”);
Serial.print(results->bits, DEC);
Serial.println(” bits)”);
}
Serial.print(“Raw (”);
Serial.print(count, DEC);
Serial.print(”): “);
for (int i = 0; i < count; i++)
{
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else
{
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(” “);
}
Serial.println(””);
}
void setup()
{
pinMode(RECV_PIN, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
int on = 0;
unsigned long last = millis();
void loop()
{
if (irrecv.decode(&results))
{
// If it’s been at least 1/4 second since the last
// IR received, toggle the relay
if (millis() - last > 250)
{
on = !on;
// digitalWrite(8, on ? HIGH : LOW);
digitalWrite(13, on ? HIGH : LOW);
dump(&results);
}
if (results.value == on1 )
digitalWrite(LED1, HIGH);
if (results.value == off1 )
digitalWrite(LED1, LOW);
if (results.value == on2 )
digitalWrite(LED2, HIGH);
if (results.value == off2 )
digitalWrite(LED2, LOW);
if (results.value == on3 )
digitalWrite(LED3, HIGH);
if (results.value == off3 )
digitalWrite(LED3, LOW);
if (results.value == on4 )
digitalWrite(LED4, HIGH);
if (results.value == off4 )
digitalWrite(LED4, LOW);
if (results.value == on5 )
digitalWrite(LED5, HIGH);
if (results.value == off5 )
digitalWrite(LED5, LOW);
if (results.value == on6 )
digitalWrite(LED6, HIGH);
if (results.value == off6 )
digitalWrite(LED6, LOW);
last = millis();
irrecv.resume(); // Receive the next value
}
}


程序功能

对遥控器发射出来的编码脉冲进行解码,根据解码结果执行相应的动作。返样大家就可以用遥控器遥控你的器件了,让它听你的指挥。

实验截图

程序代码

#include <IRremote.h>
int RECV_PIN = 11;
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
long on1  = 0x00FFA25D;
long off1 = 0x00FFE01F;
long on2 = 0x00FF629D;
long off2 = 0x00FFA857;
long on3 = 0x00FFE21D;
long off3 = 0x00FF906F;
long on4 = 0x00FF22DD;
long off4 = 0x00FF6897;
long on5 = 0x00FF02FD;
long off5 = 0x00FF9867;
long on6 = 0x00FFC23D;
long off6 = 0x00FFB047;
IRrecv irrecv(RECV_PIN);
decode_results results;
void dump(decode_results *results) {int count = results->rawlen;if (results->decode_type == UNKNOWN) {Serial.println("Could not decode message");} else {if (results->decode_type == NEC) {Serial.print("Decoded NEC: ");} else if (results->decode_type == SONY) {Serial.print("Decoded SONY: ");} else if (results->decode_type == RC5) {Serial.print("Decoded RC5: ");} else if (results->decode_type == RC6) {Serial.print("Decoded RC6: ");}Serial.print(results->value, HEX);Serial.print(" (");Serial.print(results->bits, DEC);Serial.println(" bits)");}Serial.print("Raw (");Serial.print(count, DEC);Serial.print("): ");for (int i = 0; i < count; i++) {if ((i % 2) == 1) {Serial.print(results->rawbuf[i]*USECPERTICK, DEC);} else  {Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);}Serial.print(" ");}Serial.println("");}void setup(){pinMode(RECV_PIN, INPUT);   pinMode(LED1, OUTPUT);pinMode(LED2, OUTPUT);pinMode(LED3, OUTPUT);pinMode(LED4, OUTPUT);pinMode(LED5, OUTPUT);pinMode(LED6, OUTPUT);  pinMode(13, OUTPUT);Serial.begin(9600);irrecv.enableIRIn(); // Start the receiver}int on = 0;
unsigned long last = millis();void loop()
{if (irrecv.decode(&results)) {// If it's been at least 1/4 second since the last// IR received, toggle the relayif (millis() - last > 250) {on = !on;
//       digitalWrite(8, on ? HIGH : LOW);digitalWrite(13, on ? HIGH : LOW);dump(&results);}if (results.value == on1 )digitalWrite(LED1, HIGH);if (results.value == off1 )digitalWrite(LED1, LOW); if (results.value == on2 )digitalWrite(LED2, HIGH);if (results.value == off2 )digitalWrite(LED2, LOW); if (results.value == on3 )digitalWrite(LED3, HIGH);if (results.value == off3 )digitalWrite(LED3, LOW);if (results.value == on4 )digitalWrite(LED4, HIGH);if (results.value == off4 )digitalWrite(LED4, LOW); if (results.value == on5 )digitalWrite(LED5, HIGH);if (results.value == off5 )digitalWrite(LED5, LOW); if (results.value == on6 )digitalWrite(LED6, HIGH);if (results.value == off6 )digitalWrite(LED6, LOW);        last = millis();      irrecv.resume(); // Receive the next value}
}

Ardino基础教程 20_红外遥控相关推荐

  1. Ardino基础教程 15_火焰报警器

    实验十五:火焰报警器 认识火焰传感器 火焰传感器(即红外接收三极管)是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏.实物如图: 火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收 ...

  2. Ardino基础教程 19_舵机控制

    实验十九:舵机控制 舵机控制实验Servo库版本的代码参考如下链接:ArduinoCode19-舵机控制Servo库版本代码.ino 舵机是一种位置伺服的驱动器,主要是由外壳.电路板.无核心马达.齿轮 ...

  3. Ardino基础教程 14_倾斜开关

    实验十四:倾斜开关 倾斜开关控制led灯的亮灭 实验器材清单 滚珠开关 1个 LED灯 1个 220欧姆直插电阻 1个 面包板 1个 面包板跳线 1扎 实验接线图 按照Arduino教程将控制板.扩展 ...

  4. Ardino基础教程 2_LED闪烁实验

    实验二:LED 闪烁实验 LED 小灯实验是比较基础的实验之一,上一个" Hello World!"实 验里已经利用到了Arduino 自带的LED,这次我们利用其他I/O 口和 ...

  5. Ardino基础教程 25_8X8LED点阵

    实验二十五:8X8LED点阵 点阵实验另一版本代码参考如下链接下载:ArduinoCode25-8X8LED点阵num.ino 点阵在我们生活中很常见,很多都有用到他,比如LED 广告显示屏,电梯显示 ...

  6. Ardino基础教程 24_RGB全彩LED

    实验二十四:RGB全彩LED 使用三色全彩LED 制造 显示原理,其实原理是在一棵LED 灯里,有三种颜色的灯,红,绿,蓝.每种颜色的灯上的驱动电压不一样,亮度就不一样,它们组合在一起,就形成了各种颜 ...

  7. Ardino基础教程 23_步进电机

    实验二十三:步进电机 步进电机是一种将电脉冲转化为角位移的执行机构.通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角).你可以通过控制脉冲个数来控制 ...

  8. Ardino基础教程 22_PS2摇杆

    PS2摇杆 PS2 摇杆一般可以用来控制小车等等,其构造主要就是两个10K 的电位器,还有一个按键开关.五个端口分别为VCC,X,Button,Y,GND. 实验接线图 以下为参考程序代码: #inc ...

  9. Ardino基础教程 21_最简单最快控制LCD1602

    实验二十一:最简单最快控制LCD1602 实验接线图 下面个摇杆模块,不用接先不忙管. #include <LiquidCrystal.h> LiquidCrystal lcd(12, 1 ...

最新文章

  1. iOS开发中打电话发短信等功能的实现
  2. 类的成员函数可以访问属于该类的任意对象的私有变量
  3. 借助云开发轻松实现后台数据批量导出丨实战
  4. linux系统建立文件系统,linux文件系统的建立
  5. javascript -- 判断是否为某个数据类型
  6. iOS ipv6审核被拒绝的解决方案(已审核通过)
  7. 基于扩展性考虑,不同场景选择的不同方案
  8. 数据库:SQL数据查询(详细、全面)
  9. 爬取豆瓣电影TOP100
  10. 安装CloudReady,体验Chrome OS
  11. 安装IBM HTTP SERVER
  12. ffmpeg视频中提取语音
  13. 知网 - 情感分析用词语集(beta版)- 情感词库
  14. MFC应用程序无法正常启动(0x0150002)。请单击“确定”关闭应用程序
  15. 微信公众号开发-----接送事件推送之关注/取消关注
  16. 个人申请微信支付接口教程(免签约支付)
  17. TO_DATE使用詳解
  18. nx显示服务器,如何从Windows的命令行访问NX服务器?
  19. 【大论文】可扩展机器学习的并行与分布式优化算法综述_亢良伊2017
  20. PHP学习之路(一)——初学PHP

热门文章

  1. Java接口多线程并发测试 (一)
  2. 自定义ToolBar
  3. 测试分析设计工程方法
  4. Python学习 第2天 IDE开发工具
  5. SpringMVC的环境搭建
  6. 使用PostBackUrl与Server.Transfer传递数据
  7. UA MATH564 概率论 标准二元正态分布的性质
  8. 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo
  9. 如何认识TOS----DSCP 对照表
  10. http-关于application/x-www-form-urlencoded等字符编码的解释说明