Problema ao Enviar e Receber IR no mesmo Arduino

Pessoal estou com problemas ao receber o sinal (codigo) de um controle IR e retransmitir outro codigo IR. "Controle Universal".
O Arduino recebe normalmente o codigo certo mas não envia o outro codigo.

Ficando assim:

0
Could not decode message
Raw (66): -7650 900 -1000 950 -950 950 -950 950 -950 950 -2700 950 -950 950 -2700 950 -950 950 -2750 900 -2700 950 -2700 1000 -2700 950 -950 900 -2750 950 -950 950 -2700 1000 -900 1000 -900 950 -1000 900 -2750 900 -2750 950 -950 950 -950 950 -950 950 -2700 1000 -2650 950 -2750 900 -1000 900 -1000 950 -2700 900 -2750 950 -2700 950

Se eu retirar do void Setup o comando irrecv.enableIRIn(); ele funciona transmitindo o codigo correto:

AF518E7
Decoded NEC: AF518E7 (32 bits)
Raw (68): 20768 8950 -4450 550 -550 550 -550 600 -550 550 -550 550 -1650 600 -500 600 -1650 550 -550 550 -1700 550 -1650 550 -1650 600 -1650 550 -550 600 -1650 550 -550 550 -1650 600 -500 600 -550 550 -550 550 -1700 550 -1650 600 -500 600 -550 550 -550 550 -1650 600 -1650 550 -1650 600 -550 550 -550 550 -1650 600 -1650 550 -1650 550

A parte eletronica esta correto. É algo no codigo que nao esta desabilitando o receptor na hora de transmitir.
Segue o codigo abaixo. Alguem pode me ajudar? TKS

?#?include? <IRremote.h>

int RECV_PIN = 12;

IRrecv irrecv(RECV_PIN);
decode_results results;

IRsend irsend;

void setup()
{
irrecv.enableIRIn(); -------SE RETIRAR FUNCIONA A TRANSMISSAO CORRETAMENTE MAS NAO RECEBE MAIS.

Serial.begin(9600);

}

void loop() {

while(irrecv.decode(&results))
{
long int decCode = results.value;
Serial.println(results.value);
irrecv.resume();

if (results.value == 16736925) {
for (int i = 0; i < 4; i++) {
irsend.sendNEC(0xAF518E7, 32);
delay(400);
irrecv.enableIRIn();

}
}
}
}

Onde está ligado o LED para envio de mensagem?

Já testaste se o envio de mensagem alguma vez funcionou?
Experimenta primeiro o envio de mensagens sem receberes e só depois tenta juntar as duas funcionalidades.

Sim, ja testei e esta funcionando corretamente. Somente quando junta as duas partes que ele não envio o codigo corretamente.

O led para envio esta ligado em D3 (arduino uno)

Troca o LED de envio por um LED normal e vê se pisca...

Já agora, importas-te de meter os programas que usaste para testar separadamente?

Eu fico com a ideia q estas a usar o mesmo arduino para enviar e receber, ou seja, comunicar com ele proprio.
Se assim for, bem isso não vai funcionar porque os IR não tem buffer, logo enquanto estas a enviar não vais conseguir estar a receber porque o arduino faz uma acção de cada vez.
Mas posso estar enganado, não consegui entender bem qual o propósito do teu projecto

Bubulindo:
Eu já testei o led transmissor! Atravez de uma câmera consigo ver ele transmitindo normalmente. Se eu usar o exemplo IRsendDemo da biblioteca IRremote, ele envia corretamente o código, usando a interface serial.
E se você reparar este no meu sketch eu so juntei a este exemplo de transmissão IRsendDemo com o outro exemplo que é para recepção IRrecv Demo.

Tsunamy_boy:
O projeto é somente com 1 arduino.
É um projeto para controlar o aparelho de TV que possuo.
Eu estou querendo fazer com que o arduino receba os sinais de um controle remoto qualquer e envie para a TV os códigos originais para controla-la.
Por exemplo: Quero trocar o canal da TV. Eu vou usar o outro controle remoto (qualquer), apertando a tecla na qual eu esta configurando no Sketch para enviar o código referente à troca de canal da TV.

OBS: Para ser mais preciso eu uso outro arduino como receptor para verificar se o codigo que esta sendo enviado é igual ao da TV. É onde esta o problema, o codigo enviado não é o correto.

Ficando assim:

0
Could not decode message
Raw (66): -7650 900 -1000 950 -950 950 -950 950 -950 950 -2700 950 -950 950 -2700 950 -950 950 -2750 900 -2700 950 -2700 1000 -2700 950 -950 900 -2750 950 -950 950 -2700 1000 -900 1000 -900 950 -1000 900 -2750 900 -2750 950 -950 950 -950 950 -950 950 -2700 1000 -2650 950 -2750 900 -1000 900 -1000 950 -2700 900 -2750 950 -2700 950

Ele teria que enviar assim:

AF518E7
Decoded NEC: AF518E7 (32 bits)
Raw (68): 20768 8950 -4450 550 -550 550 -550 600 -550 550 -550 550 -1650 600 -500 600 -1650 550 -550 550 -1700 550 -1650 550 -1650 600 -1650 550 -550 600 -1650 550 -550 550 -1650 600 -500 600 -550 550 -550 550 -1700 550 -1650 600 -500 600 -550 550 -550 550 -1650 600 -1650 550 -1650 600 -550 550 -550 550 -1650 600 -1650 550 -1650 550

Tu estás com um problema... e eu é que tenho de ir ver os exemplos para descobrir qual o teu problema?
Custa-te muito colocar aqui o exemplo que usaste para poder ver se o código que juntaste um ao outro está bem junto? Eu estou a dar-te parte do meu dia para te ajudar e tu ainda queres que gaste mais tempo a pesquisar as bibliotecas que usas porque tu não queres ter esse trabalho?

E experimentar na TV propriamente dita? Funciona? O tal Arduino de teste recebe bem quando tens o programa só de envio?

Olhando por alto o teu código não foi bem ligado... tu dizes ao Arduino para receber o próximo valor e depois pões-te a enviar de volta o valor.

void loop() {

if (irrecv.decode(&results)) { //se existe algo descodificado...
    long int decCode = results.value;
    Serial.println(results.value);
    if (results.value == 16736925) {  // se o que foi descodificado, é o que queremos receber... 
        for (int i = 0; i < 4; i++) {  //não percebo este for... mas o artista aqui és tu... 
            irsend.sendNEC(0xAF518E7, 32);
            delay(400);
        }
    }
    irrecv.enableIRIn();
    irrecv.resume(); //esta instrução pode até ser desnecessária... 
    }
}

Dá uma experimentadela assim... o segredo é juntar ambos os códigos, mas apenas fazer um de cada vez. Tu estavas a misturar tudo dentro dum while.
Nota também que durante sensivelmente 2 segundos após enviares um valor correcto, o teu arduino não vai responder de volta.... mas certamente que sabes porque é que isso acontece. :slight_smile:

Caro bubulindo, imaginei que poderia saber como é esta biblioteca!
De qualquer forma segue as mesmas: Exemplo de transmissão e recepção.

O codigo que você me passou, também não funcionou. Ficou do mesmo jeito que o meu!

O que acontece, ele esta transmitindo um codigo "maluco" , ou seja transmitindo esta, mas transmite um codigo que esta errado!

Sim ja teste na TV. Com o exemplo da biblioteca (IRsendDemo) ele funciona perfeitamente. Mas repare que no void setup ele não usa a linha irrecv.enableIRIn(); (claro porque não tem receptor). No meu programa eu necessito usar esta linha, mas se retira - la e testar com a seria (send) ele envia o codigo correto.
O "tal" arduino recebe bem!

Pelo que eu estou entendedo, o receptor tem que ser desativado ao fazer a transmissão! Mas não sei como fazer isso.

IRsendDemo.pde (450 Bytes)

IRrecvDemo.pde (546 Bytes)

void loop() {

if (irrecv.decode(&results)) { //se existe algo descodificado...
    long int decCode = results.value;

    if (results.value == 16736925) {  // se o que foi descodificado, é o que queremos receber... 
        for (int i = 0; i < 4; i++) {  //não percebo este for... mas o artista aqui és tu... 
            irsend.sendNEC(0xAF518E7, 32);
            delay(400);
        }
    }
    Serial.println(results.value);
    irrecv.enableIRIn();
    //irrecv.resume(); //esta instrução pode até ser desnecessária... 
    }
}

Duvido que seja isto, mas experimenta assim...
Outra coisa... o delay é mesmo de 400??

budulindo, não entendi, o código é o mesmo do anterior que vc me passou!!

Eu coloquei o "for" para emitir o código 4 vezes, somente para não ter que ficar dando o comando toda hora para ver se a transmissão esta certa.
E o delay(400) é so para dar um intervalo entre estas 4 vezes.

Rafael_K_A:
budulindo, não entendi, o código é o mesmo do anterior que vc me passou!!

Experimentaste???

ANTES:

void loop() {

if (irrecv.decode(&results)) { //se existe algo descodificado...
    long int decCode = results.value;
    Serial.println(results.value); // REPARA NESTA LINHA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    if (results.value == 16736925) {  // se o que foi descodificado, é o que queremos receber... 
        for (int i = 0; i < 4; i++) {  //não percebo este for... mas o artista aqui és tu... 
            irsend.sendNEC(0xAF518E7, 32);
            delay(400);
        }
    }
    irrecv.enableIRIn();
    irrecv.resume(); //esta instrução pode até ser desnecessária... 
    }
}

DEPOIS:

void loop() {

if (irrecv.decode(&results)) { //se existe algo descodificado...
    long int decCode = results.value;
//NÃO ESTÁ AQUI SERIAL.PRINT NENHUM.... 
    if (results.value == 16736925) {  // se o que foi descodificado, é o que queremos receber... 
        for (int i = 0; i < 4; i++) {  //não percebo este for... mas o artista aqui és tu... 
            irsend.sendNEC(0xAF518E7, 32);
            delay(400);
        }
    }
    Serial.println(results.value);//EM VEZ DISSO ESTÁ AQUI!!!!!!!!!!!!!!!!!!!
    irrecv.enableIRIn();
    //irrecv.resume(); //esta instrução pode até ser desnecessária... 
    }
}

O código não é igual. É uma diferença minúscula, é certo, mas não é igual.
Como a porta série é bufferizada, se fizeres um print antes de usares algo com temporizações muito apertadas, pode acontecer que a transmissão de dados estrague as temporizações.

A biblioteca não desliga a porta série para enviar e receber... logo é uma possibilidade. Pelo que li, se enviares algo desactivas o receptor e vice-versa, pelo que a única coisa mais óbvia que me salta à vista é isto da porta série.

E no exemplo que experimentaste?? Estava lá um for para repetir o comando 4 vezes?

É meu caro, nao deu certo também! Esta do mesmo jeito!
O exemplo tem um "for" com 3 vezes.
Eu experimentei seu codigo e retirei tambem o "for", ficou do mesmo jeito.
Sera que existe um codigo, função para desabilitar a recepção assim como o irrecv.enableIRIn(); para habilita-la?

A função send faz isso através da chamada IROut dentro desse método.
Ao fazeres enableIRIn, tudo volta ao início.

Como tens testado isto?

Na verdade eu não tenho testado! Nem sei como fazer. Eu ja coloquei esta funçao enable.IROut(); no codigo e nao surte efeito. Porem se eu coloca-la no void setup, ela para o receptor.
Eu ultilizei esse codigo abaixo para testar as partes. Parece que ele esta fazendo isso sim, corretamente. Veja so:

#include <IRremote.h>
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;
void setup()
{
  irrecv.enableIRIn(); 
  Serial.begin(9600);
}

long int decCode = 0;

void loop() {

  if(irrecv.decode(&results)) {
    decCode = results.value;
    Serial.println(decCode, HEX);
    irrecv.resume();
  }

  if (decCode == 0xFF629D) {

    Serial.println("Codigo Recebido");
    Serial.println("Modo de Transmissao");

    for (int i = 0; i < 4; i++) {
      irsend.sendNEC(0xAF518E7, 32);
      Serial.print("Enviado: ");
      Serial.println(i+1);
      delay(50);
    }

    Serial.println("Receptor ativado");
    irrecv.enableIRIn();
    decCode = 0;
  }

}

Ao acompanhar pela serial ficou assim:

FF629D
Codigo Recebido
Modo de Transmissao
Enviado: 1
Enviado: 2
Enviado: 3
Enviado: 4
Receptor ativado

Talvez isto te dê uma idea melhor sobre o IR e o protocolo NEC que estas a usar

O enableIROut, muito provavelmente nem compila já que é uma função privada.

Rafael_K_A:
Na verdade eu não tenho testado!

Importas-te de explicar melhor isto do não tens testado???

O código que mostraste agora parece correcto. Se não tens testado, nem sabes como testar, andas aqui a gozar com a gente? Explica-te melhor para ver se nos entendemos.

HugoPT, obrigado. Vou dar uma olhada neste video!

budulindo, eu não fiz um teste mais especifico.
Eu percebo pelo seguinte passo, se eu retirar o irrecv.enableIRIn(); dessa parte do codigo que esta abaixo. Eu so consigo transmitir uma unica vez, pq o receptor para de receber. Isso mostra que ele esta parando. Ja colocando esta mesma funcao irrecv.enableIRIn(); o repetor funciona direto.

for (int i = 0; i < 4; i++) {
      irsend.sendNEC(0xAF518E7, 32);
      Serial.print("Enviado: ");
      Serial.println(i+1);
      delay(50);
    }

    Serial.println("Receptor ativado");
    irrecv.enableIRIn(); //RETIRAR ESTE CODIGO O RECEPTOR PARA APOS A TRANSMISSAO
    decCode = 0;
}

Ainda não estou bem a perceber.

Aquele código que meti e que tu disseste que estava na mesma... como testaste?

Fiz upload dele normalmente!
Testei no arduino que tem a recepção e a transmissão.
Liguei a TV pra ver, nao funcionou.
Depois usei o outro Arduino que tenho para fazer a recepção do codigo que p primeiro arduino transmite. E ficou na mesma.