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:
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
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.