Measure distance with an HC-SR04 ultrasonic sensor
Intermediário
- 503componentes na bancada
- 44placas rodando agora
- 1.00xtempo real, em todas as placas
O HC-SR04 é o sensor com que toda turma começa, porque não tem nada escondido nele: nenhum barramento, nenhum endereço, nenhuma biblioteca em que você precise confiar. Você manda um pulso, ele devolve um pulso, e a duração do segundo é a distância. O circuito acima liga um deles a um Arduino Uno e transforma a leitura num sensor de estacionamento, com um buzzer que apita mais rápido à medida que a parede chega perto e uma lâmpada vermelha quando passa da linha de parada.
Abra no editor e arraste o controle deslizante do sensor para mover a parede. O monitor serial imprime a distância em centímetros e o intervalo entre os bipes.
What you need
- Um Arduino Uno
- Um sensor ultrassônico HC-SR04
- Um buzzer
- Um LED vermelho e um resistor de 220 ohms
- Uma protoboard e jumpers
Wiring
| Componente e pino | Vai para | Nota |
|---|---|---|
| VCC do HC-SR04 | 5 V | O módulo precisa de 4,5 V ou mais |
| GND do HC-SR04 | GND | |
| TRIG do HC-SR04 | Pino 7 | A placa dispara um ping por este pino |
| ECHO do HC-SR04 | Pino 6 | Em nível alto durante o tempo que o som leva para voltar |
| Buzzer | Pino 9 | A outra perna no GND |
| LED vermelho, por um resistor de 220 ohms | Pino 8 | Acende quando passa da linha de parada |
Como o sensor mede
Mantenha o TRIG em nível alto por pelo menos dez microssegundos e o módulo envia uma rajada curta de som a 40 kHz, depois deixa o ECHO em nível alto exatamente pelo tempo que o som leva para chegar até o objeto e voltar. O som anda cerca de 343 metros por segundo em temperatura ambiente, o que dá 0,0343 centímetro por microssegundo, e ele faz o percurso duas vezes. Então a distância em centímetros é o tempo do eco em microssegundos dividido por cerca de 58, o número pelo qual todo sketch de HC-SR04 divide.
O componente do Mokxi segue a temporização do datasheet: o ECHO sobe 460 microssegundos depois do trigger, fica em nível alto 58 microssegundos por centímetro, e sem nada ao alcance fica em nível alto pelo timeout inteiro de 38 milissegundos. A velocidade do som vem de uma temperatura do ar que você pode ajustar no componente, então um sketch que divide por 58 lê uma parede a um metro como 104 centímetros no ponto de congelamento, que é o que um módulo de verdade também faz.
O código, explicado
O exemplo lê o sensor por meio de uma pequena função auxiliar que faz o trigger, mede o tempo do eco e devolve milímetros, ou zero quando nada voltou. Escrita à mão com pulseIn(), que é como a maioria dos tutoriais faz, a medição tem cinco linhas.
O comportamento de estacionamento é uma função só. A menos de 15 centímetros ele mantém uma nota longa e acende o LED. Entre isso e dois metros, o intervalo entre os bipes cresce em linha reta de 90 milissegundos até 900. Além de dois metros ele fica em silêncio. Cada loop termina com uma espera de 60 milissegundos, e esse número importa: o datasheet pede 60 milissegundos entre um ping e outro, porque o eco do último ainda está ricocheteando pela sala.
const int TRIG = 7;
const int ECHO = 6;
long readCm() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long us = pulseIn(ECHO, HIGH, 38000);
return us / 58;
}Experimente no editor
Abra o circuito no editor e selecione o sensor. A propriedade de temperatura dele é a temperatura do ar, 20 graus por padrão. Coloque 0 e a mesma parede aparece alguns centímetros mais longe, porque o som é mais lento no ar frio; coloque 40 e ela aparece mais perto. O sketch não mudou, e o de uma placa de verdade também não mudaria.
Em seguida, mude o delay(60) no fim de cada ramo do loop() para delay(20). Muitos pings agora ficam sem resposta, porque o módulo ainda está esperando o último eco sumir e ignora um trigger que chega cedo demais, então o monitor serial começa a misturar "nada ao alcance" com distâncias de verdade. Volte para 60 e toda leitura volta a ser real.
Para um projeto diferente com a mesma ligação, tire o código do buzzer e mande a distância para o plotter serial, e você tem um medidor de distância simples.
Common mistakes
Disparar pings mais rápido do que a cada 60 milissegundos. A primeira leitura volta e as outras são ignoradas, porque o módulo se recusa a disparar enquanto ainda está escutando. O componente simulado faz a mesma coisa, então o bug aparece aqui antes de aparecer na sua mesa.
Trocar o TRIG e o ECHO. Nada queima, mas a placa fica esperando um pulso que nunca chega, e toda leitura dá zero ou o timeout inteiro.
Esquecer o timeout. Sem nada ao alcance, o eco dura 38 milissegundos, e o pulseIn() sem timeout espera um segundo inteiro antes de desistir, o que faz o resto do sketch parecer travado.
Confiar no último milímetro. Um HC-SR04 de verdade acerta no máximo por alguns milímetros e se confunde com superfícies macias ou inclinadas. A leitura simulada é exata, o que ajuda a aprender o código, mas é mais boazinha que a bancada.
Ligar o ECHO direto numa placa de 3,3 volts. O módulo aciona o ECHO com 5 volts. Num Uno tudo bem; num ESP32 ou num Pico, um circuito de verdade precisa de um divisor resistivo nessa linha.
Perguntas
Qual é o alcance do HC-SR04?
De uns 2 centímetros a 4 metros. O componente simulado informa qualquer coisa mais perto que 20 milímetros ou mais longe que 4000 como nada ao alcance.
Por que dividir por 58?
O som leva cerca de 29 microssegundos para andar um centímetro em temperatura ambiente, e o eco percorre a distância duas vezes, na ida e na volta. 29 vezes 2 dá 58.
Dá para usar o HC-SR04 com um ESP32?
Dá, com o mesmo código. No hardware de verdade os pinos do ESP32 não toleram 5 volts, então coloque um divisor no ECHO, por exemplo de 1 k e 2 k, para baixar para cerca de 3,3 volts.
O simulador modela o próprio som?
Não. Não há ângulo de feixe nem reflexão num ambiente. O componente é um cronômetro que mantém o ECHO em nível alto pelo tempo de ida e volta na velocidade do som, com a distância definida num controle deslizante. Isso basta para escrever e depurar o código exatamente como ele roda no hardware.
Continuar
Monte isto de verdade
Abra o editor, mude um valor e veja o número mudar junto. Nada para instalar, e não precisa de conta.