极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 78213|回复: 13

Arduino红外遥控系列教程2013——IRremote库进阶与调试

[复制链接]
发表于 2013-3-9 16:24:20 | 显示全部楼层 |阅读模式
本帖最后由 幻生幻灭 于 2013-3-9 16:25 编辑

惯例,在开始之前,先推荐本系列的前五篇教程。
Arduino红外遥控系列教程2013——发射与接收[链接]
Arduino红外遥控系列教程2013——红外转码[链接]
Arduino红外遥控系列教程2013——红外转码扩展应用1[链接]
Arduino红外遥控系列教程2013——红外协议之NEC[译文][链接]
Arduino红外遥控系列教程2013——IRremote多协议红外遥控扩展库[译文][链接]

重磅推出
Arduino IRremote Wiki 语法手册中文版[链接]


从今年1月初开始,断断续续的学习Arduino与红外遥控。没想到已经写了五篇教程,还整理了Wiki。本来当初只是想研究下红外协议,将来好给BOXZ做通讯。没想到系统的学习下来,还能整理出些教程和心得,分享给大家,希望对红外感兴趣的玩家能有所帮助。这是第六篇,可能是本系列的最后一篇教程了,然后就要把精力转移到将其用于BOXZ的通讯之中。最后感谢作者编写的IRremote库和一直以来支持我们的极客们!

正文
IRremote库进阶与调试
这里分享一些IRremote库的使用经验,以及部分作者在原文中没有提到过的重要信息。

http://v.youku.com/v_show/id_XNTI0MTcyMzg0.html

1. 兼容性
IRremote库不仅支持Arduino的大部分主板,还支持其他非常多的主板和芯片。图中绿色部分是默认的引脚。

大家也可以通过修改库IRremoteint.h文件来选择其他引脚。例如Arduino不是只能用数字引脚3,还可以使用数字引脚9作为其红外发射的输出。而这点在与其他库Timer冲突时显得格外有用,因为有时候红外不工作的可能原因之一就是定时器冲所突导致的。注意:此修改需要重启Arduino界面才能生效!笔者只测试过UNO的Pin 9。


2. 调试模式
当大家遇到接受红外编码无法识别时,可以激活这个可选的功能——DEBUG模式。如图通过修改库中IRremote.h文件,将#define DEBUG前面的注释符号“//”去掉后保存文件。关闭Arduino 界面并重启,然后下载样例代码examples\IRrecvDemo.ino。

打开串口软件,按下遥控器按键,此时所显示的内容会有天壤之别。如图,

大家可以根据每个信号(Mark)或者空格(Space)的时间长短来对接收的编码数据进行分析。

3. 协议编码的长度


4. NEC协议测量时间的定义标准。
IRremote库本身默认允许20%的容差。超过该范围则视为无效编码数据。


5. 容差
大家也可以通过修改库IRremoteint.h文件来增大容差范围。例如:测试红外接收发现经常丢码。可用前面提到过的DEBUG模式来分析测量时间是否有临界值。如有则可以考虑增大容差范围


6.红外接收状态显示
可以通过增加一条代码,实现接收红外数据时板载LED (Pin 13)闪烁,显示红外接收的状态。
irrecv.blink13(1); // 接收时闪烁板载LED 13


7. NEC的重复编码
可以在库IRremote.h文件中进行修改。


8. 新增协议
如果大家希望增加自己的协议的话,可以在库文件IRremote.cpp中添加。
通过调用私有类,可以很轻松的添加新协议,具体可以参考NEC的协议代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-3-9 22:59:28 | 显示全部楼层
本帖最后由 Damn_intuition 于 2013-3-9 23:00 编辑

研究的比较透彻。借花献佛。
传一份arduion控制LEGO红外接收器的avr代码,有助于真正了解红外编码协议。
  1. #include <avr/io.h>
  2. #include <avr/delay.h>

  3. #define PININ (_BV(1)|_BV(2)|_BV(3)|_BV(4))
  4. #define LEFT  _BV(1)
  5. #define FORW  _BV(2)
  6. #define BACK  _BV(3)
  7. #define RIGHT _BV(4)

  8. void setup(void)
  9. {
  10.     // PB0 is outout
  11.     DDRB = _BV(0);       
  12.     // Pull-up input pins
  13.     PORTB = PININ;

  14.     // 9600000/8 Hz / (2 * 16) = 37500 Hz
  15.     OCR0A = 16;

  16.     // toggle output compare A (=PB0)
  17.     TCCR0A = (1 << COM0A0)|(1<<WGM01);
  18. }

  19. void on(void)
  20. {
  21.     // start timer; divide by 8
  22.     TCCR0B = (1 << CS01);
  23. }

  24. void off(void)
  25. {
  26.     // stop timer
  27.     TCCR0B = 0;

  28.     // clear PB0
  29.     PORTB = PININ;
  30. }

  31. void xmit( uint16_t ontime, uint16_t offtime ) {  
  32.     on();
  33.     _delay_loop_2(ontime); // 4 * ontime clocks
  34.     off();
  35.     _delay_loop_2(offtime);
  36. }

  37. #define ONTIME  (2500/4)
  38. #define HITIME  (4583/4)
  39. #define LOTIME  (1666/4)
  40. #define BTIME   (9200/4)
  41. #define ETIME   (625000/4)

  42. void xmitcode(uint16_t code) {
  43.     xmit(ONTIME,BTIME);

  44.     for( int i = 0; i < 16; i++ ) {
  45.        xmit(ONTIME, (code & 0x8000) ? HITIME : LOTIME );
  46.        code = code << 1;
  47.     }

  48.     xmit(ONTIME,0);
  49.     // calling _delay_loop_2 with ETIME causes an overflow
  50.     for( int i = 0; i < 256; i++ )
  51.        _delay_loop_2(ETIME/256);
  52. }


  53. #define CH1RFORBFOR 0x015b
  54. #define CH1RFORBREV 0x0197
  55. #define CH1RREVBFOR 0x0168
  56. #define CH1RREVBREV 0x01a4

  57. #define CH1RFOR   0x8117
  58. #define CH1RREV   0x8124
  59. #define CH1BFOR   0x8142
  60. #define CH1BREV   0x818e

  61. #define CH1NONE   0x010e

  62. /*
  63. *
  64. */
  65. int main(void)
  66. {
  67.     setup();

  68.     for(;;) {
  69.         uint8_t pin = ~(PINB & PININ);

  70.         if( pin & FORW )
  71.             xmitcode(CH1RFORBREV);
  72.         else if( pin & BACK )
  73.             xmitcode(CH1RREVBFOR);
  74.         else if( pin & LEFT )
  75.             xmitcode(CH1RREVBREV);
  76.         else if( pin & RIGHT )
  77.             xmitcode(CH1RFORBFOR);
  78.         else
  79.             xmitcode(CH1NONE);
  80.     }
  81. }
复制代码

评分

参与人数 1 +2 收起 理由
幻生幻灭 + 2 感谢分享。

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2013-7-18 16:46:40 | 显示全部楼层
问下楼主我想同时发射和接收应该怎样写?
  1. #include <IRremote.h>                   // 引用 IRRemote 函式库

  2. int RECV_PIN = 11;                      //定义红外接收器的引脚为11
  3. IRrecv irrecv(RECV_PIN);
  4. decode_results results;

  5. void setup()
  6. {
  7.   Serial.begin(9600);
  8.   irrecv.enableIRIn();                  // 初始化红外接收器
  9. }

  10. void loop() {
  11.   if (irrecv.decode(&results)) {
  12.     Serial.println(results.value, HEX);//以16进制换行输出接收代码
  13.     Serial.println();                  //为了便于观看输出结果增加一个空行
  14.     irrecv.resume();                    // 接收下一个值
  15.   }
  16. }

  17. IRsend irsend;                          // 定义 IRsend 物件来发射红外线讯号
  18. void loop()
  19. {
  20.   Serial.print("SendIR: ");
  21.   irsend.sendNEC(0x807F18E7, 32);             // 遥控器的红外线编码
  22.   delay(3000);                        // 等待3秒
  23. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-8-24 01:11:24 | 显示全部楼层
同楼上,同时发送和接收
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-26 11:09:26 | 显示全部楼层
舟泊烟渚 发表于 2013-8-24 01:11
同楼上,同时发送和接收

http://www.geek-workshop.com/thread-3446-1-1.html
回复 支持 反对

使用道具 举报

发表于 2013-10-22 17:44:36 | 显示全部楼层
我和同学都是用的美的空调的遥控器我解出的码有100脉冲而他的有200个问一下这是怎么回事???
他的解码可以调动空调问一下这是怎么回事?? 是频率调的不一样吗啊???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-23 10:57:29 | 显示全部楼层
jifukui 发表于 2013-10-22 17:44
我和同学都是用的美的空调的遥控器我解出的码有100脉冲而他的有200个问一下这是怎么回事???
他的解码可 ...

论坛搜 空调 红外
回复 支持 反对

使用道具 举报

发表于 2013-10-23 13:47:07 | 显示全部楼层
我来支持一下 呵呵
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-23 17:15:15 | 显示全部楼层
水乐天 发表于 2013-10-23 13:47
我来支持一下 呵呵

真不容易,能得到资深水军的支持。呵呵。
回复 支持 反对

使用道具 举报

发表于 2014-1-7 13:04:28 | 显示全部楼层
好东东,收藏了
回复 支持 反对

使用道具 举报

发表于 2015-8-24 21:29:48 | 显示全部楼层
感谢楼主!
回复 支持 反对

使用道具 举报

发表于 2017-2-25 10:14:55 | 显示全部楼层
感谢楼主,就是 7.8项没看明白。我在用红外遥控小车项目。想用别的遥控器代替Carmp3遥控器
回复 支持 反对

使用道具 举报

发表于 2017-10-1 17:34:05 | 显示全部楼层
修改库IRremoteint.h文件来选择其他引脚,测试过了,Uno 和2560都不好使,除了默认引脚能发射红外信号,其他的引脚都不行
回复 支持 反对

使用道具 举报

发表于 2017-11-10 10:41:19 | 显示全部楼层
楼主,最近在做一个红外遥控的小车,用的是Nano板,发现11号引脚不能输出PWM,是不是有冲突了?我改其它引脚就又可以了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:40 , Processed in 0.052974 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表