极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17223|回复: 8

Arduino的IRremote库,无法用同一片AVR兼顾收发功能

[复制链接]
发表于 2016-7-7 18:38:42 | 显示全部楼层 |阅读模式
本帖最后由 wr57 于 2016-7-12 10:45 编辑

我想实现当板子未接收到红外线信号时自己发送IR信号,当接收到回复后停止发送的功能,
但只要程序里使用了irsend.sendNEC(0x12345678, 32); 这一函数之后,程序的接收功能就停止工作。请指教要怎样解决这一问题呢

关于红外编码同时接收与发送的问题
http://www.geek-workshop.com/thread-3946-1-1.html

这一帖子询问了相同问题,并提供了例程

而在
同一程序内,怎么实现发射红外信号和接收红外信号交替进行?
http://www.geek-workshop.com/thread-7549-1-1.html

这一贴中,有人提到在发送后重新调用irrecv.enableIRIn(); 函数来重新使能接收,但我尝试后发现该函数只有写在setup里才能生效,在loop中调用的话毫无反应。
回复

使用道具 举报

发表于 2016-7-8 09:20:40 | 显示全部楼层
我试过自收发的代码,可以实现收发。还测试过 两个Arduino双收发,不过需要将自己的收发隔离开,不然自己的干扰很大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-8 13:15:21 | 显示全部楼层
164335413 发表于 2016-7-8 09:20
我试过自收发的代码,可以实现收发。还测试过 两个Arduino双收发,不过需要将自己的收发隔离开,不然自己的 ...

谢谢 !可以请问是怎么解决收发冲突的问题吗?或者直接丢可行的代码也可以  双收发的时候隔离是指收发时长间隔开来还是硬件上物理隔离呢?
回复 支持 反对

使用道具 举报

发表于 2016-7-8 22:56:55 | 显示全部楼层
硬件上需要隔离的,用黑色不透明的。软件上也可以将接收屏蔽掉,但是要根据自己的需求
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-11 09:24:55 | 显示全部楼层
164335413 发表于 2016-7-8 22:56
硬件上需要隔离的,用黑色不透明的。软件上也可以将接收屏蔽掉,但是要根据自己的需求

请问软件上接收屏蔽是怎样做啊……我无论怎么写都没有办法做到自收发写在一块板子上啊 真的能实现吗
回复 支持 反对

使用道具 举报

发表于 2016-7-11 10:14:49 | 显示全部楼层
我是这样做的:板子A带有红外收发,处于主动模式,板子B也带有红外收发。
首先,A的接收默认是开启的,B的接收也是开启的。A再接到上位机的命令后由红外发射发出特定的码,然后B接收到,接收到后B会由红外发射出特定的码,A会去接收。从而完成了一次收发。
但是自收发本身意义不大,自己发出去,自己受到。你难道是让收发的红外距离很远,用来做物体检查?
回复 支持 反对

使用道具 举报

发表于 2016-7-11 10:47:31 | 显示全部楼层
本帖最后由 maidoo 于 2016-7-11 10:53 编辑

软件上屏蔽自收发冲突是很容易的。Arduino的IrRemote库其实本身就不支持同时自发自收。下面是我写的一键开启电视,功放加机顶盒的代码,有收有发,调试OK。可参考
  1. /*
  2. * On my Arduino pro mini board, I use some IO pin to supply power for IR receiver.
  3. * This will be benfit to mount IR recv module to board.
  4.     D9--- Data
  5.     D8--- GND
  6.     D7--- VCC

  7. */

  8. #include <IRremote.h>

  9. #define RECV_PIN    9

  10. // LED_PIN:  Arduino mini pro =13; DigiSpark =0
  11. #define LED_PIN     13

  12. IRrecv irrecv(RECV_PIN);
  13. IRsend irsend;

  14. decode_results results;

  15. // ====== 可触发系统动作的红外指令 ======
  16. #define CMD_TRIG  0xC1AA11EE

  17. // ====== 被触发的指令 ======
  18. // IPTV机顶盒 开
  19. #define CMD11       0xC1AAA15E

  20. // 电视机 开
  21. #define CMD12       0x1eff33CC

  22. // 功放 开
  23. #define CMD13       0x00ff55AA

  24. // ------ 延时几秒钟后
  25. // 电视机 静音
  26. #define CMD21       0xC1AA21DE

  27. // IPTV 切换到 42 频道
  28. #define CMD22       0x1e2354AB
  29. #define CMD23       0xf30101FE


  30. int mode;

  31. void setup()
  32. {
  33.     Serial.begin(9600);

  34.     // provide VCC and GND for IR receiver module
  35.     pinMode(8, OUTPUT); digitalWrite(8, LOW);
  36.     pinMode(7, OUTPUT); digitalWrite(7, HIGH);

  37.     irrecv.enableIRIn();

  38.     // LED off
  39.     pinMode(LED_PIN, OUTPUT);
  40.     digitalWrite(LED_PIN, LOW);

  41.     Serial.println("maidoo-Receiver started!");
  42. }

  43. void loop()
  44. {
  45.     volatile unsigned long time;
  46.     unsigned char i;

  47.   if (irrecv.decode(&results)) {
  48.     Serial.println(results.value,HEX);

  49.     digitalWrite(LED_PIN, HIGH);
  50.     //dump(&results);

  51.     // 检测到这是总开关的指令,开始做事
  52.     if (CMD_TRIG == results.value) {

  53.         digitalWrite(LED_PIN, HIGH);
  54.         Serial.print("I wakeup to do somthing.");


  55.         irsend.sendNEC(CMD11, 32); delay(50);
  56.         irsend.sendNEC(CMD12, 32); delay(50);
  57.         irsend.sendNEC(CMD13, 32);

  58.         // 延时 5秒 等机顶盒启动完毕
  59.         //time = millis();
  60.         //while (millis() - time < 3000);

  61.         for (i=0; i <= 5; i++) {
  62.             digitalWrite(LED_PIN, HIGH);
  63.             delay(200);
  64.             digitalWrite(LED_PIN, LOW);
  65.             delay(800);
  66.         }

  67.         irsend.sendNEC(CMD21, 32); delay(50);
  68.         irsend.sendNEC(CMD22, 32); delay(50);
  69.         irsend.sendNEC(CMD23, 32);

  70.         Serial.println("  ---> Done!");

  71.         // Both sender & receiver used the same Timer2, it should be re-init recv to enable interrupt
  72.         irrecv.enableIRIn();
  73.     }
  74.     else{
  75.         //time = millis();
  76.         //while (millis() - time < 200);
  77.         delay(50);
  78.     }

  79.     digitalWrite(LED_PIN, LOW);

  80.     // 事情做完,重新开启红外接收
  81.     irrecv.resume(); // Receive the next value
  82.   }

  83. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-11 17:35:28 | 显示全部楼层
164335413 发表于 2016-7-11 10:14
我是这样做的:板子A带有红外收发,处于主动模式,板子B也带有红外收发。
首先,A的接收默认是开启的,B的 ...

的确是做物体检测的!我的想法是一方默认开启接收,一方默认开启发送,当接收方收到命令就转至发送,发送方收到命令就转至接收,这样半轮询进行收发……但是一旦把接收函数和发送函数都写到一块板子上就当机了 接收函数死活收不到东西
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-12 10:44:56 | 显示全部楼层
maidoo 发表于 2016-7-11 10:47
软件上屏蔽自收发冲突是很容易的。Arduino的IrRemote库其实本身就不支持同时自发自收。下面是我写的一键开启 ...

谢谢大神!照着这个代码在启动和发送后都加了enable之后收发成功了 太感谢了!
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-17 17:46 , Processed in 0.040932 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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