Clonando Qualquer Controle Remoto

Nesse post de hoje, vou ensinar como clonar qualquer controle remoto, assim vc pode controlar sua Televisão, DVD, Som e etc. Depois é só usar sua imaginação para criar o seu projeto, meu próximo post vou falar sobre o meu projeto utilizando o sensor ultrassônico para ligar a TV quando alguém, por exemplo, senta no sofá, mas primeiro vamos clonar o Controle remoto.

Pessoal, tenho recebido relatos que o controle de ar condicionado não funciona com este método, então fica aqui está observação até que se encontre uma solução ou outro método.

Recebi um comentário do leitor Anderson sobre sua experiência com este método na clonagem de controle remoto de ar condicionado, e que pode ser uma solução para o que estiverem com problemas,  gostaria de mais opniões. Aproveito para agradecer Anderson pela sua colaboração.

Parabéns pelo post. Depois de muitos tutoriais seguidos e sem sucesso na ativação do meu ar condicionado, o seu foi o único que funcionou. Gostaria de acrescentar um comentário a respeito do funcionamento do seu algoritmo para condicionadores de ar. FIz o teste no meu ar e funcionou 100%. No entanto, ao testar no ar condicionado de um amigo, o código não funcionou. Porém, aumentando o tamanho do buffer de 100 para 250, o ar ligou! Então, talvez para os que estejam tendo problemas de acionamento do ar, aumentar o buffer seja a solução.(Anderson)

Esse tutorial vc pode pegar neste site em Inglês onde tirei o material, estarei apenas facilitando o seu entendimento:

http://www.instructables.com/id/Clone-a-Remote-with-Arduino/

http://learn.adafruit.com/ir-sensor

O que vc vai precisar:

1-Receptor Infravermelho:

rcir

2-Led Infravermelho:

ledinfra

Vamos dividir em dois passos, o primeiro vamos receber o código do  Controle Remoto que vc quer clonar, para isso monte o seguinte esquema com o Receptor Infravermelho:

Esquema

1º Passo Depois de montado, abra o IDE do Arduino e cole o seguinte código:

/* Raw IR decoder sketch!

This sketch/program uses the Arduno and a PNA4602 to
decode IR received. This can be used to make a IR receiver
(by looking for a particular code)
or transmitter (by pulsing an IR LED at ~38KHz for the
durations detected

Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/

// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN PIND
#define IRpin 2

// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000

// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20

// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing

void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}

void loop(void) {
uint16_t highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length

// while (digitalRead(IRpin)) { // this is too slow!
while (IRpin_PIN & _BV(IRpin)) {
// pin is still HIGH

// count off another few microseconds
highpulse++;
delayMicroseconds(RESOLUTION);

// If the pulse is too long, we 'timed out' - either nothing
// was received or the code is finished, so print what
// we've grabbed so far, and then reset
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;

// same as above
while (! (IRpin_PIN & _BV(IRpin))) {
// pin is still LOW
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;

// we read one high-low pulse successfully, continue!
currentpulse++;
}

void printpulses(void) {

Serial.println("\n\r\n\rReceived: \n\r OFF \t ON");
// Gera o codigo da tecla pressionada.
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print("delayMicroseconds(");
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(");\n");
Serial.print("pulseIR(");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.print(");\n");
}

}

Feito isso, faça o upload e clique em Serial monitor. Vc verá como na figura abaixo:

O Arduino está pronto para receber o código. Pegue o controle e aperte a tecla que vc deseja clonar, atenção: Aperte apenas uma vez. Vc verá agora como na imagem abaixo:

clonando01

Selecione a partir do primeiro delayMicroseconds até o final do código gerado, depois Ctrl+c para copiar .

2º Passo

Agora que temos os números não precisamos mais do Receptor Infravermelho ao nosso projeto, fique a vontade de deixar ou retirar, no entanto estará no esquema caso queira clonar mais teclas, lembrando que para clonar mais, repita novamente o tutorial.

 Cole no IDE o seguinte código:

 // This sketch will send out a Nikon D50 trigger signal (probably works with most Nikons)
// See the full tutorial at http://www.ladyada.net/learn/sensors/ir.html
// this code is public domain, please enjoy!

int IRledPin =  13;    // LED connected to digital pin 13

// The setup() method runs once, when the sketch starts

void setup()   {
// initialize the IR digital pin as an output:
pinMode(IRledPin, OUTPUT);

Serial.begin(9600);
}

void loop()
{
Serial.println("Sending IR signal");

SendChannelUpCode();
delay(500);
}

// This procedure sends a 38KHz pulse to the IRledPin
// for a certain # of microseconds. We'll use this whenever we need to send codes
void pulseIR(long microsecs) {
// we'll count down from the number of microseconds we are told to wait

cli();  // this turns off any background interrupts

while (microsecs > 0) {
// 38 kHz is about 13 microseconds high and 13 microseconds low
digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
delayMicroseconds(10);         // hang out for 10 microseconds
digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
delayMicroseconds(10);         // hang out for 10 microseconds

// so 26 microseconds altogether
microsecs -= 26;
}

sei();  // this turns them back on
}

void SendChannelUpCode() {
   //Cole aqui o código criado no passo 1
}
 

 

Agora na função SendChannelUpCode() dê um Ctrl+v para colar o código copiado no passo1.

Irá ficar assim:

clonando02

Feito isso, faça o upload e se vc fez tudo certo, ao apontar o Led IR para a televisão ou para o aparelho que vc escolheu, ele vai receber o código clonado, como se fosse o próprio Controle Remoto.

Observe que ele irá enviar o código infinitamente, se quiser que envie o sinal apenas quando apertar o botão, fique atento aos próximos posts. Até mais!

######

CURIOSIDADES:

O led infravermelho presente no nosso projeto, tem a função de enviar o código para o aparelho através de piscadas, ou seja, ele acende e apaga, várias vezes em uma velocidade muito rápida. Nossos olhos não conseguem enxergar o led acendendo, mas se colocarmos o celular na opção de tirar foto e filmarmos o Led veremos ele piscar. Essa é uma das formas para ver se o Led está funcionando.

Publicado em julho 31, 2012, em Arduino. Adicione o link aos favoritos. 40 Comentários.

    • Obrigado Eduardo, abraços

      • Ola meu brother…bom, eu tenho uma tv e receptor de parabolica,pois bem, como devo fazer pra utilizar apenas o controle do receptor pra ligar e desligar a tv e tbm toca de canais e volumes…..grato

      • Cara, assim, nesse tutorial vc não vai modificar nada no controle dos aparelhos, até pq não dar, então o que você pode fazer é criar um outro “controle remoto”, através do Arduino, aí sua imaginação que manda através do código, pode comprar botões na eletrônica, e fazer seu próprio controle remoto, clonar os comandos e no código fazer ligar dois aparelhos de vez com um clique só, controlar o volume, troca de canais. Vc tb pode em vez de comprar botões fazer um aplicativo para android, e controlar pelo celular. Não dar pra vc usar um controle do receptor para controlar a tv pq os códigos são diferentes.

  1. Oii, por favor, como é que faz para ele acionar apenas 1 vez ? olhei seu blog todo e não encontrei, por favor, poderia me dar uma luz sobre isso ? estou fazendo um tcc e isso tem a ver.
    Obrigado!

    • Olá Douglas. Bom, a função “SendChannelUpCode();” cada vez que executa, envia o código apenas uma vez, como neste tutorial ele está no loop, vai enviar infinitas vezes. O que vc pode fazer é colocar uma condição para executar, por exemplo, vc quer que ele envie o sinal cada vez que apertar um botão, aí vc vai colocar um botão no seu projeto, colocar a condição quando alguém apertar o botão e dentro dessa condição chamar a função SendChannelUpCode(). Isso é um exemplo, mas vc pode ter várias outras opções de acordo com a sua necessidade. Se ainda tiver dúvidas, me fale como vc quer fazer o acionamento e podemos achar uma solução.

      • Olá Silas, meu projeto eu preciso desse conhecimento de envio do sinal para a tv.
        Porém eu quero fazer isso por comando de voz, utilizarei o EasyVR Comando de Voz. Você tem algo para me ajudar nesse projeto ? pois não faço idéia de como irei fazer isso, a parte em si do comando de voz, já sei como capturar os códigos e já fiz isso, e como coloca-lo na IDE isso eu já sei, o que eu preciso agora é um tutorial passo a passo do comando de voz, você tem algo que possa me ajudar ?
        Muito obrigado pela resposta! Vlw!

      • Nunca trabalhei com o EasyVR, então fica dificil te ajudar, mas no lab tem um tutorial, não sei se vai te ajudar….http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-easyvr-shield-com-arduino….Vendo o código por cima, percebi que easyvr.getCommand() pega o seu comando e logo depois compara com a gravação que vc fez antes, se tudo tiver ok ele executa o que vc quer, ai é só colocar SendChannelUpCode() com todo o código. Pesquise no youtube tb, pode ter coisa legal lá…flw

  2. Matheus Medeiros

    Cara esse código funciona com qualquer aparelho mesmo???

    Tente com um controle de ar condicionado e não deu certo, já tente várias vezes.

    Se puder faz um vídeo!!!!

    • Realmente Matheus algumas pessoas estão relatando que não estão conseguindo para ar condicionado, vou até colocar como uma observação no tutorial para isso até que encontre uma solução. Irei tentar tb, e conseguindo eu te aviso. Obrigado

      • controles de ar condicionado enviam uma informaçao geral da operaçao, ou seja, envia todas as informaçoes de modos toda vez que um botão é pressionado. Sendo assim este código pode nao funcionar.

  3. Há como colocar o codigo do IR para gerar outro código? Por exemplo, receber um comando de liga de um controle da TV e dar um comando no som.

    Obrigado.

    • Se entendi direito acho que dar sim, precisa de uma função de recebimento e comparação de código. Agora fica mais fácil se você usar o arduino para ligar a Tv e logo em seguida dar um comando para o som, basta que você tenha em mãos o controle remoto do som também para clonar. Nesse tutorial tem a função void SendChannelUpCode(), é nessa função que está o código do delayMicroseconds() e do pulseIR() em que você preenche com os números e corresponde apenas a uma função do controle remoto, por exemplo, a de ligar a TV. Porém se você quiser, pode alterar o nome dessa função(SendChannelUpCode()) para o que realmente ela faz, por exemplo, LigaTv() ou VolumeMaisTv(), ou no seu caso ComandoSom(), certo que o que vai mudar entre elas é o delayMicroseconds() e o pulseIR() referente ao código de cada comando. Feito isso na hora de chamar a função, chamar as duas, por exemplo:
      void loop(){
      LigaTv();
      ComandoSom();
      }
      Claro que assim irá enviar infinitamente, ai vc coloca um botão para quando apertar mandar o comando para os dois.
      Se ficou duvidas, pode perguntar…Abraços

  4. Oii Silas, você sabe como criar o próprio código ?
    É o seguinte, estou com um projeto na minha casa de acionamento, porém os acionamentos ficam em vários lugares, então estou querendo acioná-los via Emissor infravermelho.
    Exemplo: quero ligar a lampada que está a alguns metros de mim, ai darei um comando para o arduino(será por voz), este mesmo arduino enviará um sinal infravermelho pro receptor, e ele acionará a tv.
    (essa parte de enviar o código em hexa que não tou encontrando)

    Obrigado!!

  5. Olá, aí vai uma pequena contribuição para facilitar “a parte chata” de copiar e colar, o trecho abaixo gera diretamente o código para a tecla pressionada, é só substituir a função printpulses.

    void printpulses(void) {

    Serial.println(“\n\r\n\rReceived: \n\rOFF \tON”);
    // Gera o codigo da tecla pressionada.
    for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print("delayMicroseconds(");
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(");\n");
    Serial.print("pulseIR(");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.print(");\n");
    }

    }

  6. OLA AMIGO,GOSTARIA DE UMA AJUDA,OU ORIENTAÇÃO.
    EU MONTO PAINEIS DE COMANDO DE DE QUARTO PARA MOTÉIS,COMPRO CONTROLE DE TV PARARELO ,CORTO O CHIP,E EMBUTO NOS PAINEIS PARA COMANDO DO TV.ESSE PROCESSO E TRABALHOSO E DEMORADO;GOSTARIA DE ME ORIENTAR SE TERIA CONDIÇÕES DE MONTAR OU COMPRAR,ALGUEM FAZER COM MICRO CONTROLADOR,DE QUALQUER MANEIRA,COLOCAR O SISTEMA EM MINHA PROPRIA PLACA,SERVINDO PARA QUALQUER TV CM CODICO,SEI LA DO JEITO QUE DER CERTOI ,QUALQUER ORIENTAÇAÕ E MUITO AGRADECIDO E OBRIGADO.

  7. Matheus Morcinek

    Após a primeira parte de copiar o codigo de um controle, não consigo enviar sketchs para o arduino, alguem poderia me ajudar, ao tentar enviar ou ao apertar no botao de serial monitor aparece um erro:/

  8. Seria tão bom se “programadores” soubessem que existem resistores…

    Aí eles colocavam o valor dos resistores no texto e nas montagens e nós não precisaríamos ter que deixar a “cópia” e ir atrás do “original”.

    • Olá Euclides, peço desculpas, é pq eu suponho que quem trabalha com Arduino sabe identificar o valor do resistor pelas cores, e na imagem do tutorial tem. 1ªFaixa: Vermelho(2), 2ª Faixa: Vermelho(2), 3ªFaixa: Marrom(x10), ou seja, um resistor de 220Ω. Ou se preferir pode fazer o seu próprio cálculo baseado no datasheet do seu transmissor Ir, se achar sua tensão e corrente adequada, é fácil encontrar com a primeira Lei de Ohm(V=RI). Obrigado por visitar!

  9. Ola,eu queria uma ajuda com meu projeto,eu quero clonar meus controles para usar no meu android via Bluetooth,mais eu não sei mexer direito com Arduíno!
    Eu já fiz projetos com Bluetooth e com esse de clonar controles(e eles deram certo \o/ obrigado)mais nunca fiz projetos envolvendo os dois juntos você pode me ajudar?

    • Posso sim, siga o meu blog e se inscreva no meu canal do youtube, que vou fazer um tutorial ainda esta semana de como fazer um aplicativo e programar o Arduino como controle remoto, assim você será informado assim que eu postar. E parabéns, é sempre bom quando dar tudo certo…Abraços

  10. Olá Sssillas, parabéns pela iniciativa. Eu estou tentando desenvolver este projeto, porém estou encontrando dificuldade porque para alguns aparelhos como home theater, não consegui fazer funcionar. Gostaria de saber se você teve algum tipo de problema com algum dispositivo e qual foi a solução?

  11. Leandro Modesto Rodrigues jr.

    Amigos, olá! Sou absolutamente novato no assunto. Na verdade, clonar o controle remoto é o meu primeiro projeto um pouco maior. Quero tentar construir algo com um ou dois motores de passo acionados por ir. Ao tentar clonar o controle que tenho disponível, seguindo os passos aqui indicados, deparei-me com o seguinte: cada vez que aperto a tecla no controle uma nova seqüência surge como resposta no serial monitor, no entanto os número sano sempre diferentes. Qual o motivo disso? Qual seqüência devo usar?

    • Pode dar diferença na leitura, use qualquer uma, pois em razões de microssegundos a mais ou a menos não vai comprometer na leitura do sinal. Agora se vc foi até o final do tutorial e não obteve sucesso, indico este tutorial: https://www.youtube.com/watch?v=Q4BXK2m7FMs
      Lembrando que para tentar acionar os motores via ir, vc deve seguir outros tutoriais.

      • Leandro Modesto Rodrigues Jr.

        Amigo, obrigado pela resposta! Peguei a primeira e funcionou. Mas algo ainda está, digamos, “frágil”. Vez ou outra o arduino não responde. Parece que acontece alguma interferência que não sei explicar. Embora o receptor esteja encapsulado, parece funcionar melhor com as luzes totalmente apagadas. Retornei ao script de captação dos códigos e percebi que os dados recebidos são diferentes quando as luzes estão apagadas. Como eu posso resolver isso?

      • Realmente n sei o que pode estar acontecendo, pode ser defeito nos componentes, defeito nos fios. Faça este tutorial para testar, é bem mais simples que este método, e vc pode seguir a minha montagem do circuito ao invés da do video, então pule o video para o momento que ele começa a programar…https://www.youtube.com/watch?v=Q4BXK2m7FMs

      • Leandro Modesto Rodrigues Jr.

        Novamente, agradeço a imediata atenção dispensada. Você tem razão. Troquei o receptor (comprei um novo), bastou ser trocado e começou a funcionar. Substitui meu código pela biblioteca de sua indicação no vídeo e deu tudo certo. Acho que posso partir para outro.
        Obrigado!

      • Fico feliz por isso Leandro, parabéns, e é assim mesmo, trabalhar com componentes eletrônicos tem essas coisas, mas o importante é não desistir que a recompensa no final é muito boa. vlw

  12. Olá Sssillas,

    Parabéns pelo post. Depois de muitos tutoriais seguidos e sem sucesso na ativação do meu ar condicionado, o seu foi o único que funcionou. Gostaria de acrescentar um comentário a respeito do funcionamento do seu algoritmo para condicionadores de ar. FIz o teste no meu ar e funcionou 100%. No entanto, ao testar no ar condicionado de um amigo, o código não funcionou. Porém, aumentando o tamanho do buffer de 100 para 250, o ar ligou! Então, talvez para os que estejam tendo problemas de acionamento do ar, aumentar o buffer seja a solução.

    Era isso, obrigado pelo tutorial!

    • De grande ajuda Anderson o seu comentário, irei colocar sua experiência no post. Obrigado!

      • Obrigado, Sssillas. Eu só gostaria de fazer mais um comentário que havia esquecido, mais um detalhe com que me deparei: usando a IDE Arduino 1.0.5 em windows 7 64bits, funcionou sem problemas, mas ao tentar utilizar o mesmo código na IDE Arduino 1.0.5 em Linux Ubuntu 14.04, o ar não ligou, como manda a lei de Murphy. O segredo foi alterar os tempos de delayMicroseconds() dentro da função pulseIR() de 10us para 5us (4 também funcionou). Em outras palavras, as duas IDEs compilam o código de maneira diferente de modo que o Arduino leva mais tempo para que o IR mude de estado quando se utiliza a IDE do Linux. Então esses tempos devem ser alterados para atender a frequência do sinal de 38kHz.
        Agora sim, acho que foram essas as conclusões que tive.

        E obrigado mais uma vez por esse sketch simples e eficaz!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 72 outros seguidores

%d blogueiros gostam disto: