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.
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:
2-Led Infravermelho:

Vamos dividir em duas etapas, a primeira vamos receber o código do Controle Remoto que vc quer clonar, para isso monte o seguinte esquema com o Receptor Infravermelho:

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\rOFF \tON");
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(" usec, ");
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(" usec");
}
}
ATENÇÃO: Para copiar este código, clique em VISUALIZAR FONTE(no canto superior direito).

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:

Bom, chegou a parte meia chata, vc tem que copiar estes números um por um, pode anotar ou faça como eu fiz, o velho ctrl+c e ctrl+v, abrindo outra IDE para segunda parte. A quantidade de número varia de controle para controle, então não se espante com tantos.
Vamos para segunda parte. 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() {
// This is the code for the CHANNEL + for the downstairs TV COMCAST
delayMicroseconds(); //Time off (Left Column on serial monitor)
pulseIR(); //Time on (Right Column on serial monitor)
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
delayMicroseconds();
pulseIR();
}
É agora que vamos usar aqueles números.
Observe um trecho do código:
void SendChannelUpCode() {
delayMicroseconds();
pulseIR();
No “delayMicroseconds();” vc vai colocar o primeiro número dentro dos parênteses e no “pulseIR();” vc vai colocar o segundo número também dentro do parênteses, observe com atenção a imagem:

Você irá repetir isso com todos os números. Cansativo não?
Talvez vc precise de mais ou menos delayMicroseconds() e pulseIR(), faça suas devidas mudanças, até que todos os números acabem, e deixe na ordem certa.
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. 2 Comentários.
muito Show, Parabéns.
Obrigado Eduardo, abraços