YFROBOT创客社区

标题: Arduino入门教程—基础实验篇十 红外遥控 [打印本页]

作者: AllBlue    时间: 2013-6-10 10:14
标题: Arduino入门教程—基础实验篇十 红外遥控
本帖最后由 AllBlue 于 2013-8-15 20:22 编辑

红外遥控实验

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

UNO 实验套装(UNO兼容板一块、USB数据线一根、优质面包板一块、彩色面包板线若干 )

红外接收管 一个

mini遥控器 一个

LED 一枚

电阻220欧 一个

我们使用的红外接收管型号为HS0038,它有3个引脚分别为 out(信号输出)、GND(地)、Vcc(电源正极);实物图如下:
[attach]355[/attach]

下图为mini遥控器(使用是将薄膜抽掉,它的作用是绝缘,防止电池工作):
[attach]356[/attach]

红外遥控原理框图:
[attach]357[/attach]

将HS0038 的Vcc 接控制板5V 接口,OUT 接Digital 11 口,GND接负极;LED 灯正极接Digital 10 口,负极通过220 欧电阻接GND;

实验电路如下:
[attach]358[/attach]

实验例程:

  1. /*
  2. 红外遥控实验
  3. */
  4. #include <IRremote.h>

  5. int RECV_PIN = 11; //红外线接收器OUTPUT端接在pin 11
  6. int LED = 10; // 定义LED引脚为11
  7. IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
  8. decode_results results; //解码结果放在decode_results构造的对象results里


  9. void irdisplay(unsigned long value) // 按下按键后,显示本遥控对应的按键
  10. {
  11. switch(value){ //判定按下的是哪个按键,串口显示按钮名称
  12. case 0xFFA25D:
  13. digitalWrite(LED, LOW); //电源键按下,执行关闭LED灯
  14. break;
  15. case 0xFFE21D:
  16. digitalWrite(LED, HIGH); //静音键按下,执行点亮LED灯
  17. break;
  18. }
  19. }

  20. void setup()
  21. {
  22. pinMode(LED,OUTPUT); // 定义LED为输出引脚
  23. Serial.begin(9600); //开启串口通信,并设定波特率为9600
  24. irrecv.enableIRIn(); //启动红外解码
  25. }

  26. void loop() {
  27. if (irrecv.decode(&results))
  28. {//解码成功,收到一组红外线信号
  29. irdisplay(results.value);
  30. irrecv.resume();
  31. }
  32. }
复制代码

我们先用函数irrecv.enableIRIn()启动红外解码后,这时候IRrecv对象会在后台接收红外线信号,接着就可以利用decode()函数持续检查,看看有没有解码成功。irrecv.decode(&results) 解码成功,这个函数会返回true,并把结果放在results 里面,在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号。

将程序上传控制板后,我们用遥控器指向红外接收头,按下绿色静音按钮,LED 灯被点亮,按下红色电源按钮,LED 熄灭。

程序中所调用的库文件:
[attach]359[/attach]
(库文件使用方法:1.解压压缩红外遥控器解码库文件夹中文件:IRremote.rar
2.把解压出来的文件复制到 arduino/libraries 中
3.重新启动arduino IDE就可以编辑了)

程序中:

case 0xFFA25D:

     digitalWrite(LED, LOW); //电源键按下,执行关闭LED灯
            break;

case 0xFFE21D:

    digitalWrite(LED, HIGH); //静音键按下,执行点亮LED灯
            break;
红色字为按钮的值,蓝色字为点亮与熄灭LED;LED的点亮与熄灭语句相信大家再熟悉不过了,但是按钮值是怎么得到的呢?

电路图如下(电路基本没变,只是去掉了LED):

[attach]483[/attach]

下面我们通过一个程序来读出所有按钮的值:

  1. /*
  2. 程序说明:解码红外遥控器
  3. */

  4. #include <IRremote.h>

  5. int RECV_PIN = 11; //红外线接收器OUTPUT端接在pin 11
  6. IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
  7. decode_results results; //解码结果放在decode_results构造的对象results里

  8. void setup()
  9. {
  10. Serial.begin(9600);
  11. irrecv.enableIRIn(); // 启动红外解码
  12. }

  13. void loop() {
  14. if (irrecv.decode(&results)) {

  15. // 解码成功,收到一组红外线信号
  16. Serial.print("irCode: ");
  17. Serial.print(results.value,HEX); // 输出红外线解码结果(十六进制)

  18. //results.value 是unsigned long型,头文件有介绍
  19. delay(100);  //按键消抖
  20. Serial.print(", bits: ");
  21. Serial.println(results.bits); // 红外线码元位数
  22. irrecv.resume();
  23. }
  24. }
复制代码

上传程序后,打开串口监视器,按下MINI遥控器上的各按钮,可以看到:
[attach]361[/attach]
串口监视中看到的值,就是按钮的值!




作者: AllBlue    时间: 2013-9-7 16:34
本帖最后由 AllBlue 于 2013-9-7 16:36 编辑
feel 发表于 2013-9-7 02:33
如果接受偶尔失灵,是遥控的问题还是程序问题?

接受有的时候00?FFF? 后面是0 表示没有。遥控器有可能 ...

误码而已,这是遥控器的构造比较简单,没有中断!
程序中加入消除抖动函数应该会好点吧,还有按按键的时候,一下一下按,要送开之后再去按按键,这样的话,就不会出现这样的情况了!
遥控器如果发送不出去,串口是不会接受到任何数据的哦!(红外的距离有限,距离远了就可能接受不到了)
作者: yankuankuan    时间: 2014-10-9 11:34
亲爱的大哥,我把那个红外库也解压复制进去了为什么每次跑上面的程序都是出现这样的错误那?是我的版本和你的库文件不兼容吗?还是程序有误?
作者: yankuankuan    时间: 2014-10-9 12:07
老是出现这样的提示arduino\arduino-1.0.6\libraries\RobotIRremote\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope
作者: yankuankuan    时间: 2014-10-9 12:09
亲爱的大哥,我把那个红外库也解压复制进去了为什么每次跑上面的程序都是出现这样的错误那?是我的版本和你的库文件不兼容吗?还是程序有误?老是出现: arduino\arduino-1.0.6\libraries\RobotIRremote\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope
作者: AllBlue    时间: 2015-7-2 09:47
yankuankuan 发表于 2014-10-9 12:09
亲爱的大哥,我把那个红外库也解压复制进去了为什么每次跑上面的程序都是出现这样的错误那?是我的版本和你 ...

额,那么久才看到,这个错误之前也遇到过,其实就是库文件冲突了,我们需要使用的IRremote库和官方新版IDE自带的RobotIRremote库冲突!
我之前的解决方法都是换个低版本的IDE,其实就是没有RobotIRremote库的IDE。或者删除IDE中的RobotIRremote库(如果想保留,可以先将其压缩成压缩文件,然后再删除文件夹,用的时候再解压)。
如果你不想换低版本,也不想删除库文件的话。将IRremote库放在"C:\Users\Administrator\Documents\Arduino\libraries "即我的文档 > Arduino文件夹 > libraries文件夹中既可以,编译正常 。
放在安装路径下的libraries,编译错误提示如下:[attach]1000[/attach]
将其复制到C盘中的libraries中,编译无误,提示如下:
[attach]1001[/attach]
arduino IDE优先读取使用c盘中的库文件。

这里也有两个解决方案(我试了下,不知道为什么没成功,版本1.6.4):
http://lamb-mei.com/436/%E4%BD%B ... ared-in-this-scope/

作者: dalaobai1    时间: 2015-10-26 18:28
Arduino:1.6.5 (Windows 7), 板:"Arduino Yún"

C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::mark(int)':
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:172:3: error: 'TCCR2A' was not declared in this scope
   TCCR2A |= _BV(COM2B1); // Enable pin 3 PWM output
   ^
In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
                 from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:88,
                 from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:16,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:13:
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:172:17: error: 'COM2B1' was not declared in this scope
   TCCR2A |= _BV(COM2B1); // Enable pin 3 PWM output
                 ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::space(int)':
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:180:3: error: 'TCCR2A' was not declared in this scope
   TCCR2A &= ~(_BV(COM2B1)); // Disable pin 3 PWM output
   ^
In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
                 from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:88,
                 from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:16,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:13:
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:180:19: error: 'COM2B1' was not declared in this scope
   TCCR2A &= ~(_BV(COM2B1)); // Disable pin 3 PWM output
                   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp: In member function 'void IRsend::enableIROut(int)':
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:207:3: error: 'TCCR2A' was not declared in this scope
   TCCR2A = _BV(WGM20);
   ^
In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
                 from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:88,
                 from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:16,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:13:
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:207:16: error: 'WGM20' was not declared in this scope
   TCCR2A = _BV(WGM20);
                ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:208:3: error: 'TCCR2B' was not declared in this scope
   TCCR2B = _BV(WGM22) | _BV(CS20);
   ^
In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
                 from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:88,
                 from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:16,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:13:
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:208:16: error: 'WGM22' was not declared in this scope
   TCCR2B = _BV(WGM22) | _BV(CS20);
                ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:208:29: error: 'CS20' was not declared in this scope
   TCCR2B = _BV(WGM22) | _BV(CS20);
                             ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:211:3: error: 'OCR2A' was not declared in this scope
   OCR2A = SYSCLOCK / 2 / khz / 1000;
   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:212:3: error: 'OCR2B' was not declared in this scope
   OCR2B = OCR2A / 3; // 33% duty cycle
   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp: In member function 'void IRrecv::enableIRIn()':
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:224:3: error: 'TCCR2A' was not declared in this scope
   TCCR2A = 0;  // normal mode
   ^
In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
                 from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:88,
                 from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:16,
                 from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:13:
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:229:7: error: 'TCCR2B' was not declared in this scope
   cbi(TCCR2B,CS22);
       ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:229:3: note: in expansion of macro 'cbi'
   cbi(TCCR2B,CS22);
   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:229:14: error: 'CS22' was not declared in this scope
   cbi(TCCR2B,CS22);
              ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:229:3: note: in expansion of macro 'cbi'
   cbi(TCCR2B,CS22);
   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:230:14: error: 'CS21' was not declared in this scope
   sbi(TCCR2B,CS21);
              ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:230:3: note: in expansion of macro 'sbi'
   sbi(TCCR2B,CS21);
   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:231:14: error: 'CS20' was not declared in this scope
   cbi(TCCR2B,CS20);
              ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:231:3: note: in expansion of macro 'cbi'
   cbi(TCCR2B,CS20);
   ^
In file included from C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:13:0:
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:43:22: error: 'TCNT2' was not declared in this scope
#define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT2
                      ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:236:3: note: in expansion of macro 'RESET_TIMER2'
   RESET_TIMER2;
   ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp: In function 'void TIMER2_OVF_vect()':
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremoteInt.h:43:22: error: 'TCNT2' was not declared in this scope
#define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT2
                      ^
C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:266:3: note: in expansion of macro 'RESET_TIMER2'
   RESET_TIMER2;
   ^
Multiple libraries were found for "IRremote.h"

Used: C:\Program Files (x86)\Arduino\libraries\IRremote

Not used: C:\Program Files (x86)\Arduino\libraries\RobotIRremote

编译有误。

  报告将会包含更多的信息
  "在编译时,输出详细信息"
  在 文件>首选项 中启用

作者: dalaobai1    时间: 2015-10-26 18:30
请问这是什么情况
作者: AllBlue    时间: 2015-10-27 09:29
dalaobai1 发表于 2015-10-26 18:30
请问这是什么情况

库文件冲突了,试试看7、8楼的方法。
作者: johnny228    时间: 2015-11-12 22:19
额  我想说  如果我用的是mbp自带的os系统  去哪里修改库文件呢。。。。。
作者: AllBlue    时间: 2015-11-13 16:02
johnny228 发表于 2015-11-12 22:19
额  我想说  如果我用的是mbp自带的os系统  去哪里修改库文件呢。。。。。

库文件和计算机系统没有关系吧~~
这里修改库文件是什么意思?
作者: johnny228    时间: 2015-11-21 21:52
AllBlue 发表于 2015-11-13 16:02
库文件和计算机系统没有关系吧~~
这里修改库文件是什么意思?

因为在编译的时候也出现'TKD2' was not declared 这个问题了。。。。。然后看到你们的修改库文件的解决办法  但是在mac系统里面我找不到这个文件。。。。。
作者: AllBlue    时间: 2015-11-23 08:51
johnny228 发表于 2015-11-21 21:52
因为在编译的时候也出现'TKD2' was not declared 这个问题了。。。。。然后看到你们的修改库文件的解决办 ...

没用过MAC系统,不太清楚,你可以找到arduino 库文件的路径吗?找到的话这个文件应该就在那里吧~
作者: johnny228    时间: 2015-11-25 09:24
AllBlue 发表于 2015-11-23 08:51
没用过MAC系统,不太清楚,你可以找到arduino 库文件的路径吗?找到的话这个文件应该就在那里吧~

mac系统里面的Arduino好像就是windows里面游戏的硬盘版一样  就一个audrino的app标志 连安装都没有  唉  顺便想问一下serial monitor里面读取的数据都是前后相连的怎么办啊  好像不能像c里面一样直接加个\n  百度了也么有碰到这种情况的人  唉
作者: AllBlue    时间: 2015-11-27 17:39
johnny228 发表于 2015-11-25 09:24
mac系统里面的Arduino好像就是windows里面游戏的硬盘版一样  就一个audrino的app标志 连安装都没有  唉 ...

Serial.print();
Serial.println();打印换行
作者: johnny228    时间: 2016-4-3 20:02
AllBlue 发表于 2015-11-27 17:39
Serial.print();
Serial.println();打印换行

hahah   好久没登陆现在才看到回复  谢啦
作者: hero_sun    时间: 2016-5-29 13:40
我的就是Mac版啊
作者: 1095630341    时间: 2016-10-23 00:09
本来也是库文件冲突,按照你的方法修改后成了这样:
IRrecvDemo.ino:3:22: fatal error: IRremote.h: No such file or directory

compilation terminated.
这是怎么了啊QWQ
作者: AllBlue    时间: 2016-10-24 08:28
1095630341 发表于 2016-10-23 00:09
本来也是库文件冲突,按照你的方法修改后成了这样:
IRrecvDemo.ino:3:22: fatal error: IRremote.h: No s ...

你这是什么程序,找不到IRremote.h文件?

作者: 1095630341    时间: 2016-10-24 22:53
AllBlue 发表于 2016-10-24 08:28
你这是什么程序,找不到IRremote.h文件?

重新装过就可以了,谢谢你啊
作者: tiantianyouyou    时间: 2019-5-1 19:51
Arduino入门教程—基础实验篇九 数码管显示实验
作者: Kuroi    时间: 2020-1-20 11:07
不错不错




欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/) Powered by Discuz! X3.1