Controle Remoto IR

Controle Remoto IR
Controles remotos estão presentes em todos os lugares e todos tem o mesmo princípio de funcionamento, com o envio de informações criptografadas via raios infravermelhos. É praticamente impossível não encontrar uma residência que não tenha esse tipo de dispositivo, seja para ligar uma TV, um DVD, um  Blu-Ray ou um aparelho de som.
Mapear o controle remoto deve ser a primeira etapa que deve ser feita no controle remoto, pois você não sabe realmente o sinal transmitido quando pressionamos cada tecla do controle remoto. Para isso, mostraremos, primeiramente, um exemplo bem simples conforme o esquema abaixo: 

Controle Remoto IR


Após montar esse circuito, inclua a Biblioteca IRremote.h e carregue o seguinte código:

 1  #include <IRremote.h>
 2  int RECV_PIN = 8;
 3  IRrecv irrecv(RECV_PIN);
 4  decode_results results;
 5  void setup()
 6  {
 7      Serial.begin(9600);
 8      irrecv.enableIRIn();
 9  }
10  void loop()
11  {
12      if (irrecv.decode(&results))
13      {
14          Serial.println(results.value, HEX);
15          irrecv.resume();
16      }
17  }

Feito isso, vemos que, a cada tecla que apertamos, é mostrado no Monitor Serial seu código no formato HEXADECIMAL. Logo, percebe-se que podemos usar cada código das teclas para ser utilizado na programação do Arduino, porém lembre-se sempre de colocar "0x" na frente de cada valor hexadecimal na correspondente programação.
Então, como quase tudo em automação envolve motores elétricos, partiremos para um projeto prático onde serão controlados a velocidade e o sentido de rotação de um motor elétrico com os botões desse controle remoto.
Componentes:
  • 01 Arduino
  • 01 Resistor de 10K
  • 01 LED receptor de Infravermelho (Fototransistor)
  • 02 LEDs de cores distintas
  • 02 Resistores de 220
  • 01 Ponte H L298N
  • 01 Motor Elétrico de 5V 
  • 01 Fonte Externa qualquer de 5V a 12V 
 Monte o circuito o circuito conforme o esquema abaixo:


Feito isso, carregue o código no Arduino:


  1  #include <IRremote.h>
  2
  3  # define enA 2                  // ENA
  4  # define MotorDireitoAvante  3  // IN1
  5  # define MotorDireitoAtras   4  // IN2
  6  # define Recv_Pin            8
  7  # define LedVerd            A0 // LED verde
  8  # define LedVerm            A1 // LED vermelho
  9
 10  int veloc = 0;
 11  char direct = 'A';
 12  char anterior = 'A';
 13
 14  IRrecv irrecv(Recv_Pin);
 15  decode_results results;
 16
 17  void parada(char direct, int v);
 18
 19  void setup()
 20  {
 21      Serial.begin(9600);
 22      irrecv.enableIRIn(); // Começa a receber
 23
 24      pinMode(MotorDireitoAvante, OUTPUT);// IN1
 25      pinMode(MotorDireitoAtras, OUTPUT); // IN2
 26
 27      pinMode(LedVerd, OUTPUT);
 28      pinMode(LedVerm, OUTPUT);
 29
 30      Serial.begin(9600);
 31      Serial.println( " Aperte 'NEXT' para Avante ou 'PREV' para a Re ");
 32      Serial.println(" ");
 33      Serial.println(" Aumente  e diminua a velocidade com ' + ' e ' - ' respectivamente ou digite de 1 a 9 para velocidades pre-definidas ");
 34      Serial.println(" ");
 35  }
 36
 37  void loop()
 38  {
 39
 40      if (irrecv.decode(&results))
 41      {
 42          Serial.println(results.value, HEX);
 43          if (results.value == 0xFF02FD) // NEXT
 44          {
 45              Serial.println("Botao 'NEXT' Pressionado");
 46              Serial.println("Avante!!!");
 47              direct = 'A';
 48          }
 49          if (results.value == 0xFF22DD)
 50          {
 51              Serial.println("Botao 'PREV' Pressionado");
 52              Serial.println(" A Re!!!");
 53              direct = 'R';
 54          }
 55          if (results.value == 0xFFA857)
 56          {
 57              veloc = veloc + 5;
 58              Serial.println("Botao ' + ' Pressionado");
 59              Serial.print(" Velocidade: ");
 60
 61              if(veloc >= 255)
 62              {
 63                  veloc = 255;
 64              }
 65              Serial.println(veloc);
 66          }
 67
 68          if (results.value == 0xFFE01F)
 69          {
 70              veloc = veloc - 5;
 71              Serial.println("Botao ' - ' Pressionado");
 72              Serial.print(" Velocidade: ");
 73
 74              if(veloc <= 0)
 75              {
 76                  veloc = 0;
 77              }
 78              Serial.println(veloc);
 79          }
 80
 81          if (results.value == 0xFF6897)
 82          {
 83              direct = 'P';
 84              Serial.println("Botao 'Zero' Pressionado");
 85              Serial.println("Parrada de Emergencia !!!!!!!!! ");
 86              Serial.println("Desligado !!!!!!!!! ");
 87              parada(direct, veloc);
 88              veloc = 0;
 89          }
 90          if (results.value == 0xFF30CF)
 91          {
 92              Serial.println("Botao '1' Pressionado");
 93              veloc = 30;
 94          }
 95          if (results.value == 0xFF18E7)
 96          {
 97              Serial.println("Botao '2' Pressionado");
 98              veloc = 45;
 99          }
100          if (results.value == 0xFF7A85)
101          {
102              Serial.println("Botao '3' Pressionado");
103              veloc = 75;
104          }
105          if (results.value == 0xFF10EF)
106          {
107              Serial.println("Botao '4' Pressionado");
108              veloc = 105;
109          }
110          if (results.value == 0xFF38C7)
111          {
112              Serial.println("Botao '5' Pressionado");
113              veloc = 135;
114          }
115          if (results.value == 0xFF5AA5)
116          {
117              Serial.println("Botao '6' Pressionado");
118              veloc = 165;
119          }
120          if (results.value == 0xFF42BD)
121          {
122              Serial.println("Botao '7' Pressionado");
123              veloc = 195;
124          }
125          if (results.value == 0xFF4AB5)
126          {
127              Serial.println("Botao '8' Pressionado");
128              veloc = 225;
129
130          }
131          if (results.value == 0xFF52AD)
132          {
133              Serial.println("Botao '9' Pressionado");
134              veloc = 255;
135          }
136          irrecv.resume(); // Recebe o próximo valor
137      }
138
139      if(direct == 'A')
140      {
141          if(anterior == 'R')
142          {
143              parada(direct, veloc);
144              delay(1000);
145
146          }
147          analogWrite(LedVerd, 255);
148          analogWrite(LedVerm, 0);
149          digitalWrite(MotorDireitoAvante, HIGH);// IN1
150          digitalWrite(MotorDireitoAtras, LOW);  // IN2
151          anterior = 'A';
152          analogWrite(enA, veloc);
153      }
154      if(direct == 'R')
155      {
156          if(anterior == 'A')
157          {
158              parada(direct, veloc);
159              delay(1000);
160
161          }
162          analogWrite(LedVerm, 255);
163          analogWrite(LedVerd, 0);
164          digitalWrite(MotorDireitoAvante, LOW);// IN1
165          digitalWrite(MotorDireitoAtras, HIGH);// IN2
166          anterior = 'R';
167          analogWrite(enA, veloc);
168      }
169
170  }
171
172  void parada(char direct, int v)
173  {
174      if(direct == 'A')
175      {
176          analogWrite(LedVerd, 255);
177          analogWrite(LedVerm, 255);
178          for(int i=0; i<= v ; i++)
179          {
180              analogWrite(enA, v-i);
181              delay(20);
182          }
183
184      }
185      if(direct == 'R')
186      {
187          analogWrite(LedVerd, 255);
188          analogWrite(LedVerm, 255);
189          for(int i=0; i<= v ; i++)
190          {
191              analogWrite(enA, v-i);
192              delay(20);
193          }
194      }
195      if(direct == 'P')
196      {
197          digitalWrite(MotorDireitoAvante, LOW); // IN1
198          digitalWrite(MotorDireitoAtras, LOW);  // IN2
199          delay(100);
200          analogWrite(LedVerd, 0);
201          analogWrite(LedVerm, 0);
202      }
203  }

Após carregar o programa e ligar a alimentação do motor, observamos que apertando a tecla " NEXT "  seguida da tecla " 1 " o motor começa a girar em um sentido com uma velocidade pré-definada de 30. Pressionando a tecla  " + " o motor acelera gradativamente e a tecla  " - "  o motor desacelera  gradativamente. Pressionando " PREV ", o sentido de rotação é invertido e o LED vermelho acende indicando esse sentido. Podemos ainda utilizar as teclas de 2 a 9 para outras velocidade pré-definidas ou " zero " para a parada instantânea.