Neste artigo será apresentado uma simples aplicação do Sensor Ultrassônico HC-SR04 onde esse tem boa precisão e é de fácil obtenção no mercado.
Funcionamento
Seu funcionamento consiste basicamente
em enviar um sinal que, ao atingir o obstáculo, retorna para o sensor e com esse tempo de emissão e recepção, é feito o cálculo
entre o sensor e o objeto.
Processo de medição:
- É enviado um sinal com duração de 10 us (microssegundos) ao pino trigger, indicando que a medição terá início
- Automaticamente, o módulo envia 8 pulsos de 40 KHz e aguarda o retorno do sinal pelo receptor
- Caso haja um retorno de sinal (em nível HIGH), determinamos a
distância entre o sensor e o obstáculo utilizando a seguinte equação: Distância = [Tempo ECHO em nível alto * Velocidade do Som] / 2.
A velocidade do som considerada é de 340 m/s,
com isso o resultado é obtido em metros e o tempo em segundos. Como o tempo calculado é de ida e volta, é preciso dividir a distância por 2.
Especificações:
Especificações:
- Alimentação: 5V DC
- Corrente de Operação: 2mA
- Ângulo de efeito: 15°
- Alcance: 2cm ~ 4m
- Precisão: 3mm
Visto isso, será apresentado o projeto Indicador de Proximidade o qual permite calcular a distância de um objeto, escalonar essa distância para cada necessidade e indicar a proximidade do obstáculo através de sinal sonoro e luminoso.
Componentes:
- 01 Arduino
- 01 CI registrador de deslocamento 74HC595
- 08 LEDs
- 08 Resistores de 220Ω
- 01 Resistor de 150Ω (para diminuir a intensidade sonora caso necessário))
- 01 Sonorizador
- 01 Sensor Ultrassônico HC-SR04
Após plena certeza da conexão dos fios, inclua a biblioteca Ultrasonic e carregue o código:
1 // Projeto
Sensor de Distância
2
3 #include
<Ultrasonic.h>
4
5 #
define latchPin 8 // Pino conectado ao pino 12 do 74HC595 (Latch)
6 #
define clockPin 12 // Pino conectado ao pino 11 do 74HC595 (Clock)
7 #
define dataPin 11 // Pino conectado ao pino 14 do 74HC595 (Data)
8 #
define pinBip 13 // Pino do som conectado ao pino
13 do Arduino
9 #
define trig 7 // Pino 7 do Arduino será a saída de trigger
10 #
define echo 6 // Pino 6 do Arduino será a entrada de echo
11
12 void barraLED(float entValor, int c); // Função do sinal luminoso
13 void funBip(float entValor, int c); // Função que gera um bip
14 void trigPulse(); // Função que gera o pulso de trigger
15
16 float pulse; //Variável que armazena o tempo de duração do echo
17 float dist_cm; //Variável que armazena o valor da distância em centímetros
18
19
20 void setup()
21 {
22 // Define os pinos como saída
23 pinMode(latchPin, OUTPUT);
24 pinMode(clockPin, OUTPUT);
25 pinMode(dataPin, OUTPUT);
26 pinMode(trig, OUTPUT); //Pino de trigger será saída digital
27
28 //
29
30 pinMode(echo, INPUT); //Pino de echo seá entrada digital
31
32 digitalWrite(trig, LOW); //Saída trigger inicia em
nível baixo
33
34 Serial.begin(9600); //Inicia comunicação serial
35
36
37 }
38
39
40 void loop()
41 {
42
43 int c = 10; // Constante que determina a escala de distância
44
45
46 trigPulse(); //Aciona o trigger do módulo ultrassônico
47
48 pulse = pulseIn(echo, HIGH); //Mede o tempo em que o
pino de echo fica em nível alto
49
50 dist_cm = pulse/58.82; // Valor da distância real em centímetros
51
52 // 340m/s
53 // 34000cm/s
54
55 /*
56 100000 us - 34000/2 cm/s
57 x us - 1cm
58 1E6
59 x = ----- = 58.82
60 17E3
61 */
62
63
64 Serial.println(dist_cm/c); // Imprime o valor na serial.
(dist_cm/c) --> Escala de distância
desejada
65
66 digitalWrite(latchPin, LOW); // Define latchPin como
LOW, para permitir o fluxo de dados
67
68 barraLED(dist_cm, c);
69
70 digitalWrite(latchPin, HIGH); // Define latchPin como HIGH, para fechar e enviar os dados
71
72
73 }
74
75
76 void barraLED(float entValor, int c)
77
78 {
79
80 boolean pinState[8]; /*Inicializamos uma variável
booleana, pinState, que armazenará o estado no
81 qual você deseja que o pino relevante esteja, quando
os dados forem enviados (1 ou 0): */
82
83 /* Os pinos de dados e do clock são definidos como LOW para limpar as
linhas de dados
84 e do clock, deixando-as prontas para o envio de novos dados. */
85
86 digitalWrite(dataPin, LOW);
87 digitalWrite(clockPin, LOW);
88
89 if(entValor > 0 && entValor <= 32/c)
90 {
91
92 funBip(entValor, c);
93 pinState[0] = HIGH;
94 pinState[1] = LOW;
95 pinState[2] = LOW;
96 pinState[3] = LOW;
97 pinState[4] = LOW;
98 pinState[5] = LOW;
99 pinState[6] = LOW;
100
pinState[7] = LOW;
101
102 for(int i = 0; i < 8; i++)
103 {
104
digitalWrite(dataPin, pinState[i]); // Envia
o bit no extremo ascendente do clock
105
digitalWrite(clockPin, HIGH); // Para escrever esse valor no registro de armazenamento
106
digitalWrite(clockPin, LOW); // Interrompa o deslocamento de dados
107
108 }
109
110
delay(10);
111
112 }
113
114
115 if(entValor > 32/c && entValor <= 64/c)
116 {
117
118
funBip(entValor, c);
119
pinState[0] = HIGH;
120
pinState[1] = HIGH;
121
pinState[2] = LOW;
122
pinState[3] = LOW;
123
pinState[4] = LOW;
124
pinState[5] = LOW;
125
pinState[6] = LOW;
126
pinState[7] = LOW;
127
128 for(int i = 0; i < 8; i++)
129 {
130
digitalWrite(dataPin, pinState[i]);
131
digitalWrite(clockPin, HIGH);
132
digitalWrite(clockPin, LOW);
133
134 }
135
136
delay(10);
137
138 }
139
140
141 if(entValor > 64/c && entValor <= 96/c)
142 {
143
funBip(entValor, c);
144
pinState[0] = HIGH;
145
pinState[1] = HIGH;
146
pinState[2] = HIGH;
147
pinState[3] = LOW;
148
pinState[4] = LOW;
149
pinState[5] = LOW;
150
pinState[6] = LOW;
151
pinState[7] = LOW;
152
153 for(int i = 0; i < 8; i++)
154 {
155
digitalWrite(dataPin, pinState[i]);
156
digitalWrite(clockPin, HIGH);
157
digitalWrite(clockPin, LOW);
158
159 }
160
161
delay(10);
162
163 }
164
165
166 if(entValor > 96/c && entValor <= 128/c)
167 {
168
169
funBip(entValor, c);
170
pinState[0] = HIGH;
171
pinState[1] = HIGH;
172 pinState[2] = HIGH;
173
pinState[3] = HIGH;
174
pinState[4] = LOW;
175
pinState[5] = LOW;
176
pinState[6] = LOW;
177
pinState[7] = LOW;
178
179 for(int i = 0; i < 8; i++)
180 {
181
digitalWrite(dataPin, pinState[i]);
182
digitalWrite(clockPin, HIGH);
183
digitalWrite(clockPin, LOW);
184
185 }
186
187
delay(10);
188
189 }
190
191
192 if(entValor > 128/c && entValor <= 160/c)
193 {
194
funBip(entValor, c);
195
pinState[0] = HIGH;
196
pinState[1] = HIGH;
197
pinState[2] = HIGH;
198
pinState[3] = HIGH;
199
pinState[4] = HIGH;
200
pinState[5] = LOW;
201
pinState[6] = LOW;
202
pinState[7] = LOW;
203
204 for(int i = 0; i < 8; i++)
205 {
206
digitalWrite(dataPin, pinState[i]);
207
digitalWrite(clockPin, HIGH);
208
digitalWrite(clockPin, LOW);
209
210 }
211
212
delay(10);
213 }
214
215
216 if(entValor > 160/c && entValor <= 192/c)
217 {
218
219
funBip(entValor, c);
220
pinState[0] = HIGH;
221
pinState[1] = HIGH;
222
pinState[2] = HIGH;
223
pinState[3] = HIGH;
224
pinState[4] = HIGH;
225
pinState[5] = HIGH;
226
pinState[6] = LOW;
227
pinState[7] = LOW;
228
229 for(int i = 0; i < 8; i++)
230 {
231
digitalWrite(dataPin, pinState[i]);
232
digitalWrite(clockPin, HIGH);
233
digitalWrite(clockPin, LOW);
234
235 }
236
237
delay(10);
238 }
239
240
241
242 if(entValor > 192/c && entValor <= 224/c)
243 {
244
funBip(entValor, c);
245
pinState[0] = HIGH;
246
pinState[1] = HIGH;
247
pinState[2] = HIGH;
248
pinState[3] = HIGH;
249
pinState[4] = HIGH;
250 pinState[5] = HIGH;
251
pinState[6] = HIGH;
252
pinState[7] = LOW;
253 for(int i = 0; i < 8; i++)
254 {
255
digitalWrite(dataPin, pinState[i]);
256
digitalWrite(clockPin, HIGH);
257
digitalWrite(clockPin, LOW);
258
259 }
260
261
delay(10);
262
263 }
264
265
266
267 if(entValor > 224/c && entValor <= 255/c)
268 {
269
funBip(entValor, c);
270
pinState[0] = HIGH;
271
pinState[1] = HIGH;
272
pinState[2] = HIGH;
273
pinState[3] = HIGH;
274
pinState[4] = HIGH;
275
pinState[5] = HIGH;
276
pinState[6] = HIGH;
277
pinState[7] = HIGH;
278
279 for(int i = 0; i < 8; i++)
280 {
281
digitalWrite(dataPin, pinState[i]); // Envia
o bit no extremo ascendente do clock
282
digitalWrite(clockPin, HIGH); // para escrever esse valor no registro de armazenamento
283
digitalWrite(clockPin, LOW); // interrompa o deslocamento de dados
284
285 }
286
287
delay(10);
288
289 }
290
291 if(entValor > 255/c)
292 {
293
funBip(entValor, c);
294
pinState[0] = LOW;
295
pinState[1] = LOW;
296
pinState[2] = LOW;
297
pinState[3] = LOW;
298
pinState[4] = LOW;
299
pinState[5] = LOW;
300
pinState[6] = LOW;
301
pinState[7] = LOW;
302
303 for(int i = 0; i < 8; i++)
304 {
305
digitalWrite(dataPin, pinState[i]); // Envia
o bit no extremo ascendente do clock
306
digitalWrite(clockPin, HIGH); // Para escrever esse valor no registro de armazenamento
307
digitalWrite(clockPin, LOW); // Interrompa o deslocamento de dados
308
309 }
310
311
delay(10);
312
313 }
314
315
316
317 }
318
319
320 void funBip(float entValor, int c)
321 {
322 float sinVal;
323 int toneVal;
324
325 if(entValor > 0 && entValor <= 32/c)
326 {
327
328
tone(pinBip, 2000);
329
delay(10);
330
331 }
332
333 if(entValor > 32/c && entValor <= 64/c)
334 {
335
tone(pinBip, 2000, 100); /*
336 O comando tone() requer dois ou três parâmetros,
da seguinte maneira:
337 tone(pin, frequência)
338 tone(pin, frequência, duração) */
339
340
delay(200);
341
noTone(pinBip);
342 }
343
344
345 if(entValor > 64/c && entValor <= 96/c)
346 {
347
tone(pinBip, 2000, 100);
348
delay(300);
349
noTone(pinBip);
350 }
351
352 if(entValor > 96/c && entValor <= 128/c)
353 {
354
tone(pinBip, 2000, 100);
355
delay(400);
356
noTone(pinBip);
357 }
358
359 if(entValor > 128/c && entValor <= 160/c)
360 {
361
tone(pinBip, 2000, 100);
362
delay(500);
363
noTone(pinBip);
364 }
365
366 if(entValor > 160/c && entValor <= 192/c)
367 {
368
tone(pinBip, 2000, 100);
369
delay(600);
370
noTone(pinBip);
371 }
372
373 if(entValor > 192/c && entValor <= 224/c)
374 {
375
tone(pinBip, 2000, 100);
376 delay(700);
377
noTone(pinBip);
378 }
379
380 if(entValor > 224/c && entValor <= 255/c)
381 {
382
tone(pinBip, 2000, 100);
383
delay(800);
384
noTone(pinBip); ;
385 }
386
387 if(entValor > 255/c)
388 {
389
390
noTone(pinBip);
391 }
392
393 }
394
395 void trigPulse()
396 {
397
digitalWrite(trig, HIGH); // Pulso de trigger em nível alto
398
delayMicroseconds(10); // Duração de 10 micro segundos
399
digitalWrite(trig, LOW); // Pulso de trigge em nível baixo
400 }
401
Com isso, observar-se que, conforme o objeto se aproxima do sensor, os LEDs vão se apagando escalonadamente com a diminuição da distância e, também, o sinal sonoro vai bipando mais rapidamente com a proximidade do objeto. Efeito inverso é observado quando o objeto se afasta.
Nenhum comentário:
Postar um comentário