Tutorial: como utilizar o controle remoto IR com Arduino

Adquira estes componentes na Loja do Lab de Garagem

Neste tutorial vamos mostrar como utilizar o IR Control Kit da Sparkfun. O Kit vem com dois emissores Infravermelho, dois receptores Infravermelho e o Controle Remoto. Ao apertar um botão do controle remoto, um LED acenderá. É um LED para cada botão do controle remoto.

Você pode utilizar também a biblioteca IRRemote.

 

Faça a seguinte ligação no Arduino:

 

Depois de feito as ligações acima, passe a programação abaixo:

 

int irPin = 2; //Sensor pin 1 wired to Arduino's pin 2
int statLED = 3;
int statLED1 = 4;
int statLED2 = 5;
int statLED3 = 6;
int statLED4 = 7;
int statLED5 = 8;
int statLED6 = 9; //Toggle the status LED every time Power is pressed
int start_bit = 2200; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)

void setup() {
pinMode(statLED, OUTPUT);
pinMode(statLED1, OUTPUT);
pinMode(statLED2, OUTPUT);
pinMode(statLED3, OUTPUT);
pinMode(statLED4, OUTPUT);
pinMode(statLED5, OUTPUT);
pinMode(statLED6, OUTPUT);
digitalWrite(statLED, LOW);
digitalWrite(statLED1, LOW);
digitalWrite(statLED2, LOW);
digitalWrite(statLED3, LOW);
digitalWrite(statLED4, LOW);
digitalWrite(statLED5, LOW);
digitalWrite(statLED6, LOW);

pinMode(irPin, INPUT);

Serial.begin(9600);
Serial.println("Waiting: ");
}

void loop() {
int key = getIRKey(); //Fetch the key

if(key != 0) //Ignore keys that are zero
{
Serial.print("Key Recieved: ");
switch(key)
{
case 144: Serial.print("CH Up");
if(digitalRead(statLED) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED, HIGH);
else
digitalWrite(statLED, LOW);
break;

case 145: Serial.print("CH Down");
if(digitalRead(statLED1) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED1, HIGH);
else
digitalWrite(statLED1, LOW);
break;

case 146: Serial.print("VOL Right");
if(digitalRead(statLED2) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED2, HIGH);
else
digitalWrite(statLED2, LOW);
break;
case 147: Serial.print("VOL Left");
if(digitalRead(statLED3) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED3, HIGH);
else
digitalWrite(statLED3, LOW);
break;
case 148: Serial.print("Mute");
if(digitalRead(statLED4) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED4, HIGH);
else
digitalWrite(statLED4, LOW);
break;
case 165: Serial.print("AV/TV");
if(digitalRead(statLED5) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED5, HIGH);
else
digitalWrite(statLED5, LOW);
break;
case 149:
Serial.print("Power");
if(digitalRead(statLED6) == LOW) //This toggles the statLED every time power button is hit
digitalWrite(statLED6, HIGH);
else
digitalWrite(statLED6, LOW);
break;
}

Serial.println();
}
}

int getIRKey() {
int data[12];
int i;

while(pulseIn(irPin, LOW) < start_bit); //Wait for a start bit

for(i = 0 ; i < 11 ; i++)
data[i] = pulseIn(irPin, LOW); //Start measuring bits, I only want low pulses

for(i = 0 ; i < 11 ; i++) //Parse them
{
if(data[i] > bin_1) //is it a 1?
data[i] = 1;
else if(data[i] > bin_0) //is it a 0?
data[i] = 0;
else
return -1; //Flag the data as invalid; I don't know what it is! Return -1 on invalid data
}

int result = 0;
for(i = 0 ; i < 11 ; i++) //Convert data bits to integer
if(data[i] == 1) result |= (1 i);

return result; //Return key number
}

 

A função int getIRKey() conta o tempo do pulso em LOW que o controle remoto transmite. Para cada botão é um número de pulsos diferente. Portanto, ao apertar o botão POWER, por exemplo, o Arduino detectará LOW, fará a contagem em microssegundos e guardará na matriz data[i]. Depois o Arduino fará uma comparação de todos os elementos da matriz com as constantes bin_1 e bin_0 e transfomará os dados em binário (0 ou 1). Por fim converterá os dados em bits para inteiro. Ao terminar, o Arduino volta para o loop() e verifica cada caso, acendendo o LED correspondente ao dado inteiro que foi convertido.

 

E é isso! Esperamos que tenha gostado! Se tiver dúvidas sobre o tutorial, poste aqui neste blog! Em caso de sugestões, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui! Até a próxima!

 

Referências:

http://arduino.cc/en/

http://labdegaragem.com/profiles/blogs/tutorial-emissor-e-receptor-...

http://www.arcfn.com/2009_08_01_archive.html

http://www.sparkfun.com/tutorials/291

Exibições: 32925

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcos Vinícius Cândido em 21 novembro 2012 às 9:37

Seria bom postar a lista de material utilizado

Comentário de Celso Gonçalves Melero em 6 novembro 2012 às 18:19
O erro apontado pelo Valdenio é que faltam dois sinais de menor que entre o 1 e o i. Este operador, desloca "n" bits para a esquerda.

http://arduino.cc/en/Reference/Bitshift
Comentário de Valdênio Paulino de Melo em 17 setembro 2012 às 14:56

Comentário de Valdênio Paulino de Melo 1 segundo atrásExcluir comentário

la nas últimas linhas esta faltando um ''

if(data[i] == 1) result |= (1  i)

Comentário de Wiechert em 21 agosto 2012 às 16:47

Euclides,

Segue o link para o datasheet do receptor usado no kit da sparfun vendido aqui na loja do LDG: http://www.sparkfun.com/datasheets/Sensors/Infrared/tsop382.pdf

Abraço

Comentário de Euclides Franco de Rezende em 21 agosto 2012 às 16:00

Qual é o código do componente receptor de IR deste kit?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço