wr57 发表于 2016-7-7 18:38:42

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

本帖最后由 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中调用的话毫无反应。

164335413 发表于 2016-7-8 09:20:40

我试过自收发的代码,可以实现收发。还测试过 两个Arduino双收发,不过需要将自己的收发隔离开,不然自己的干扰很大

wr57 发表于 2016-7-8 13:15:21

164335413 发表于 2016-7-8 09:20 static/image/common/back.gif
我试过自收发的代码,可以实现收发。还测试过 两个Arduino双收发,不过需要将自己的收发隔离开,不然自己的 ...

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

164335413 发表于 2016-7-8 22:56:55

硬件上需要隔离的,用黑色不透明的。软件上也可以将接收屏蔽掉,但是要根据自己的需求

wr57 发表于 2016-7-11 09:24:55

164335413 发表于 2016-7-8 22:56 static/image/common/back.gif
硬件上需要隔离的,用黑色不透明的。软件上也可以将接收屏蔽掉,但是要根据自己的需求

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

164335413 发表于 2016-7-11 10:14:49

我是这样做的:板子A带有红外收发,处于主动模式,板子B也带有红外收发。
首先,A的接收默认是开启的,B的接收也是开启的。A再接到上位机的命令后由红外发射发出特定的码,然后B接收到,接收到后B会由红外发射出特定的码,A会去接收。从而完成了一次收发。
但是自收发本身意义不大,自己发出去,自己受到。你难道是让收发的红外距离很远,用来做物体检查?

maidoo 发表于 2016-7-11 10:47:31

本帖最后由 maidoo 于 2016-7-11 10:53 编辑

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

*/

#include <IRremote.h>

#define RECV_PIN    9

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

IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

// ====== 可触发系统动作的红外指令 ======
#define CMD_TRIG0xC1AA11EE

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

// 电视机 开
#define CMD12       0x1eff33CC

// 功放 开
#define CMD13       0x00ff55AA

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

// IPTV 切换到 42 频道
#define CMD22       0x1e2354AB
#define CMD23       0xf30101FE


int mode;

void setup()
{
    Serial.begin(9600);

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

    irrecv.enableIRIn();

    // LED off
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, LOW);

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

void loop()
{
    volatile unsigned long time;
    unsigned char i;

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

    digitalWrite(LED_PIN, HIGH);
    //dump(&results);

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

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


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

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

      for (i=0; i <= 5; i++) {
            digitalWrite(LED_PIN, HIGH);
            delay(200);
            digitalWrite(LED_PIN, LOW);
            delay(800);
      }

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

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

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

    digitalWrite(LED_PIN, LOW);

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

}

wr57 发表于 2016-7-11 17:35:28

164335413 发表于 2016-7-11 10:14 static/image/common/back.gif
我是这样做的:板子A带有红外收发,处于主动模式,板子B也带有红外收发。
首先,A的接收默认是开启的,B的 ...

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

wr57 发表于 2016-7-12 10:44:56

maidoo 发表于 2016-7-11 10:47 static/image/common/back.gif
软件上屏蔽自收发冲突是很容易的。Arduino的IrRemote库其实本身就不支持同时自发自收。下面是我写的一键开启 ...

谢谢大神!照着这个代码在启动和发送后都加了enable之后收发成功了 太感谢了!
页: [1]
查看完整版本: Arduino的IRremote库,无法用同一片AVR兼顾收发功能