Sensor Infravermelho não funciona corretamente

Olá,

estou fazendo umas experiências com infravermelho no meu arduino. Abri uma televisão velha minha e arranquei o sensor ir dela (que recebe os sinais do controle remoto) :D. Liguei no meu Arduino, montei o circuito, upei o código e, a princípio, tudo funcionou perfeitamente. Estou usando a biblioteca IRremote do Ken Shirriff. Acontece que, quando fecho o "Serial Monitor", o sensor IR não lê direito os comandos que envio :~! No meu projeto, quando aperto a tecla "1" do meu controle remoto da TV, o Arduino aciona um relé. Pois bem, quando estou com o "serial monitor" aberto, o sensor lê todas a vezes que aperto a tecla, até posso apertar muito rápido que ele mesmo assim lê. Porém, se fecho o "serial monitor", o sensor parece que tem dificuldade para ler, e reconhece somente alguns comando que envio, uma vez ou outra. Fico apertando a tecla "1" mas o sensor não aciona o relé.

O que pode ser isso??? Não consigo ver explicação lógica nisso. O que tem de tão especial no "Serial Monitor"???

Por favor, me ajudem nisso se puderem...

Caso seja necessário, está aqui meu código:

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{

  • Serial.begin(9600);*

  • pinMode(13, OUTPUT); *

  • irrecv.enableIRIn(); // Start the receiver*
    }
    void loop() {

  • irrecv.decode(&results);*

  • if (irrecv.decode(&results)) { //se o receptor IR recebeu um valor,...*

  • if (results.value == 551520375){ //se esse valor for...*

  • if (digitalRead(13) == 0){*

  • digitalWrite(13, HIGH);}*

  • else {digitalWrite(13, LOW);}*

  • }*

  • Serial.println(results.value);*

  • irrecv.resume(); // Receive the next value*

  • }*
    }

Abraço a todos.

Amigo tente usadar um delay logo após o recebimento.
O que acho que está ocorrendo é que estão chegando muitos valores ao mesmo tempo.
E quando vc abre o serial monitor ele tem que printar e durante isso da tempo de ler sem dar erro.

if (irrecv.decode(&results)) { //se o receptor IR recebeu um valor,...
delay(200); .....

Ou use uma varialvel para receber o valor do IRRECV e depois compare.

Caramba, eu nunca iria imaginar isto! mas faz sentido... logo que eu chegar em casa vou tentar fazer isso.

Bem que eu percebi mesmo que no Serial Monitor, quando eu não mandava comando nenhum a partir do controle remoto, ele ficava printando "0" na tela direto, várias vezes. Mas porque isso, se não estou enviando nada para o sensor??? Como ele pode estar recebendo alguma coisa?

Outra coisa que acontece, não sei se tem a ver: quando abro o programa do arduino, o relé aciona várias vezes, tipo fica doido. E quando abro o serial monitor também acontece a mesma coisa. Ele manda sinal do pino output do arduino sem que eu queira... estranho...

Mas muito obrigado pela dica, vou testar em casa e logo respondo aqui se deu certo.

Puxa... não deu certo Webert. Tentei colocar delays de 200ms, 50, 20, 10, 5, 1 e até 0.01. Mudei a posição do delay no código (linha) também e nada. O que mais pode ser???

Eu estava pensando em alguma coisa física, tipo saturação do sensor por algum motivo, ou algum componente eletrônico que eu pudesse colocar para melhorar este funcionamento... sei lá, uma resistência, ou um transistor, eu não entendo muito de eletrônica não, sabe...

Apesar de que tudo indica que seja alguma coisa lógica, pois tenho funcionamentos diferentes com o Serial Monitor aberto e fechado. Quando mando abrir o Serial Monitor, o que acontece? (digo, por trás dos panos) Porque quando eu abro o Serial Monitor, os outputs do arduino ligam e desligam (no meu caso, o relé aciona e desaciona umas duas vezes)? Quando fecho o Serial Monitor, acontece o mesmo...

Minha ligação do sensor no arduino está assim:

Obrigado pela força!

Tente colocar o delay logo apos ligar o led da porta 13

if (digitalRead(13) == 0){
digitalWrite(13, HIGH);
Delay(2000)}

Veja se acende.

Olá ViniciusPolo, obrigado pela ajuda.

Não funcionou. Eu tentei colocar vários delays diferentes, em linhas diferentes, mas não funcionaram. Aliás, observei uma coisa que talvez possa ajudar:

Quando estou com o Serial Monitor aberto e aperto o botão do controle remoto, o LED "Tx" do Arduino pisca. Já quando o Serial Monitor está fechado, o Led "Tx" não acende, porém se eu ficar insistindo em apertar o botão do controle, uma vez ou outra consigo acionar o relé, tenho que ficar tentando, mas mesmo assim o Led "Tx" não acende.

O "Tx" não é o led que indica que o arduino está transmitindo dados? Como pode, se configurei o pino 13 (onde está ligado o sensor ir) com output? Era o "Rx" que era para acender, não é?

E o fato de não acender quando o Serial Monitor está fechado?

ctrindade, testei seu codigo aqui com um sensor tsop4838 e funcionou normal, só mudei o codigo de identificação da tecla...
com serial monitor ligado ele envia o codigo decodificado e se for o programado acende/apaga o led do pino 13;com o serial monitor desligado ele acende o pino de tx algumas vezes(talvez até encher o buffer interno do ftdi) e pára, mas a funcionalidade de ligar ou desligar o led do pino 13 pela tecla programada fica normal...
talvez seja seu sensor ou seu arduino(qual a origem?)

Olá fabiohbm007,

boa idéia, pode ser o sensor mesmo. Cheguei a desconfiar dele, mas descartei a hipótese porque ele funciona normalmente quando o serial monitor está aberto. Mas como você falou que mesmo com o serial monitor fechado funcionou, então pode ser o meu sensor.

o sensor que estou usando é de uma televisão velha que eu abri. A marca da televisão é Toshiba ou Panasonic, não sei ao certo pois arranquei o sensor das duas. O arduino comprei na internet, não acredito que esteja com problema pois nunca apresentou nenhum.

com o serial monitor desligado ele acende o pino de tx algumas vezes(talvez até encher o buffer interno do ftdi) e pára

hummm, percebi o que você está falando. Realmente o led tx acende algumas vezes. Mas não entendi a história do buffer. Para que serve??

Deixe-me perguntar: como você ligou o sensor no arduino?? Igual a mim? Porque a verdade é que entendo pouco de eletrônica e desconfio que meu circuito está mal feito. Você poderia dar uma olhada e dizer se tem algo errado??

Aqui está: ImageShack - sensorir.gif

Entre a saída do sensor ir e o pino 11 do arduino achei que precisasse de uma resistência, porém coloquei resistências de valores diferentes ali e, quanto maior a resistência, mais dificuldade o sensor tinha para ler os comandos.

Seguindo esta lógica (menor a corrente, mais dificuldade do sensor ler os comandos), será que eu precisaria colocar ali um transistor?? (já que o transistor amplifica a corrente)

Bom eu tenho dois sensores diferentes aqui, o TSOP4838 que a pinagem está no datasheet e um que também retirei de um videocassete.
Vou te passar as minhas ligações como você desenhou na imagem do post anterior:
TSOP4838 ---> sinal gnd 5v http://www.vishay.com/docs/82090/tsop48xx.pdf
videocassete ---> sinal 5v gnd ???

Me lembrei que existem várias frequências de IR assim como vários protocolos para que um controle não interfira no outro aparelho. Testando o controle que tenho aqui com o TSOP passa de 6 metros, já o mesmo controle com o sensor do videocassete aciona até 40cm e depois não reconhece mais o controle, provavelmente o sensor seja de uma frequência próxima e quando perto aciona porque satura o receptor... teste com outros controles remotos.

Me lembrei que existem várias frequências de IR assim como vários protocolos para que um controle não interfira no outro aparelho.

Então fabiohbm007, a biblioteca que estou usando já identifica qual o protocolo que o controle remoto está utilizando. Logo, praticamente qualquer controle que eu usar será identificado e decodificado pela biblioteca.

Veja A Multi-Protocol Infrared Remote Library for the Arduino

Porém não sei se isso tem a ver com frequência. A princípio, penso que sim, pois cada protocolo tem um tempo específico de "mark" e "space" e se a biblioteca pode ler os protocolos mais comuns, logo pode ler qualquer frequência. :roll_eyes:

Mas de qualquer forma vou testar outro controle sim. Só peço que espere um pouco pois fui buscar um outro controle remoto que eu tinha aqui guardado e descobri que tem um formigueiro dentro dele!! :astonished: Logo que eu conseguir tirar essa formigaiada de dentro dele eu testo e posto aqui.

A frequência que me referi seria a frequencia da portadora, para o sol ou lampadas não interferirem no sinal do controle remoto, a luz infravermelha "pisca" à frequencia de 38khz, o sensor que se usa apenas detecta se há essa frequencia chegando a ele. Por isso o uso do mark/space para codificação e por esse motivo que você trocar o sensor por um fototransistor não funciona.
Se você abrir o arquivo da IRremote.cpp da biblioteca, procure pelas funções

...
void IRsend::sendNEC(unsigned long data, int nbits)
{
  enableIROut(38);// aqui a portadora é 38Khz para enviar...
...
...
void IRsend::sendSony(unsigned long data, int nbits) {
  enableIROut(40);//aqui a portadora é 40Khz...
...
...
void IRsend::sendRC5(unsigned long data, int nbits)
{
  enableIROut(36);//Aqui a portadora é 36Khz
...

Por isso se você usar o sensor de uma TV Phillips(RC5/RC6) não vai funcionar com um controle emoto de uma TV Sony.