Componente · Sensor

Sensor ultrassônico HC-SR04

O HC-SR04 é o sensor ultrassônico usado pela maioria dos robôs para medir distância. Como funciona o sonar, seus limites reais e como conectá-lo.

O que é

O HC-SR04 é um sensor de distância por ultrassom—a pequena placa com dois cilindros prateados que parecem olhos de robô. Ele mede distância como um morcego ou um submarino: emite uma rajada de som alto demais para ser ouvido, escuta o eco e cronometra o tempo da ida e volta. Por poucos dólares, dá a um robô a percepção do espaço à sua frente, razão pela qual é o sensor padrão do primeiro robô que desvia de obstáculos.

Os dois cilindros são um transmissor e um receptor. Um emite o pulso; o outro escuta. Todo o restante da placa é um circuito de temporização que transforma o eco em um sinal mensurável pelo microcontrolador.

Diagrama de um HC-SR04 conectado a um microcontrolador: fios VCC, Trigger, Echo e GND codificados por cor vão até os quatro pinos do sensor; o sensor emite ondas ultrassônicas que são refletidas por um objeto, e a distância é igual ao tempo do eco multiplicado pela velocidade do som, dividido por dois.
Dispare um pulso, cronometre o tempo até o eco retornar e converta para distância—os quatro fios são alimentação, massa, Trigger e Echo. Baixar SVG

Como funciona

O sensor usa um protocolo simples com dois fios:

  1. Você envia um pulso HIGH ao pino Trigger por 10 microssegundos.
  2. O sensor dispara oito pulsos ultrassônicos a 40 kHz e coloca o pino Echo em nível alto.
  3. Quando o eco retorna, ele leva o pino Echo novamente a LOW.
  4. Você mede quanto tempo o pino Echo permaneceu em HIGH.

Essa largura de pulso é o tempo de ida e volta. O som viaja a cerca de 343 m/s no ar, portanto distance = (echo_time × 343) / 2—a divisão por dois existe porque o som foi e veio. A maioria do código do Arduino encapsula isso em pulseIn() e um pouco de aritmética.

Como depende da velocidade do som, a leitura varia levemente com a temperatura (o som viaja mais rápido no ar quente). Para um robô que desvia de paredes, esse erro é irrelevante; para medições precisas, ele importa e deve ser compensado.

Quando usar

Use um HC-SR04 sempre que um robô precisar saber, de forma aproximada, a distância até o objeto mais próximo—desvio de obstáculos, acompanhamento de paredes, proteção contra “sair da mesa” ou acionamento de um comportamento quando algo se aproxima. Seu feixe largo é útil nesse caso: é difícil não enxergar um obstáculo.

Procure outra opção quando precisar de distância precisa, um feixe estreito ou atualizações rápidas. Um sensor de tempo de voo usa luz em vez de som e fornece uma leitura estreita, rápida e precisa ao milímetro—melhor para mapeamento ou quando o robô precisa avaliar uma abertura específica.

Conexões e armadilhas

  • O pino Echo é uma saída de 5 V. Em uma placa de 5 V como o Arduino Uno, tudo bem. Em uma placa de 3,3 V como o ESP32, coloque um divisor de tensão em Echo ou poderá danificar o pino.
  • Respeite a zona morta e o cone. Nada abaixo de ~2 cm é detectado, e o feixe de ~15° faz o sensor informar o objeto mais próximo em um cone—uma perna de mesa ao lado pode acioná-lo.
  • Alvos macios e inclinados enganam. Espuma, tecido ou uma parede em ângulo muito inclinado dispersam o eco para longe do receptor, e o sensor lê “longe” ou nada. Funciona melhor em superfícies planas e rígidas voltadas para ele.
  • Não faça leituras rápidas demais. Deixe ~60 ms entre leituras para o eco anterior desaparecer; leituras mais rápidas e ecos espúrios produzem leituras falsas. Filtrar o fluxo ajuda—veja como reduzir o ruído dos sensores.

Pinagem

Pino Nome Direção O que faz
1 VCC Entrada 5 V. A placa consome cerca de 15 mA, com pico durante um pulso
2 Trig Entrada Aplique HIGH por 10 µs para iniciar uma medição
3 Echo Saída Fica HIGH quando a rajada sai e LOW quando ela retorna. Saída de 5 V
4 GND — Massa

Os quatro pinos estão sempre nessa ordem, e o módulo quase sempre fica orientado com os pinos voltados para o lado oposto aos transdutores; portanto, VCC fica à esquerda quando você olha para os “olhos”.

Conectando a um Arduino

HC-SR04 Arduino Uno ESP32
VCC 5 V 5 V (do VIN, não da trilha de 3,3 V)
Trig Qualquer pino digital Qualquer GPIO
Echo Qualquer pino digital Por um divisor — veja abaixo
GND GND GND

O problema dos 3,3 V

O pino Echo produz 5 V completos, e um GPIO do ESP32 ou do Raspberry Pi foi projetado para 3,3 V. Aplicar 5 V a um deles ultrapassa o máximo absoluto e, embora muitas vezes aguente por algum tempo, realmente danifica o pino. Dois resistores resolvem:

Echo ──┬── 1 kΩ ──┬── to 3.3 V GPIO
       │          │
       │        2 kΩ
       │          │
       └──────────┴── GND

Esse divisor fornece 5 V × 2/(1+2) = 3.33 V. Qualquer proporção próxima de 2:1 funciona—1 kΩ e 2 kΩ, ou 10 kΩ e 20 kΩ. Não use valores acima de aproximadamente 20 kΩ, ou a capacitância de entrada do pino desacelerará o flanco o suficiente para distorcer a temporização que você está tentando medir.

A aritmética da distância e onde ela erra

distance = (echo_microseconds x speed_of_sound) / 2

O som viaja a 343 m/s a 20 °C, o que equivale a 0.0343 cm/µs. Esse é o valor que todo mundo usa: divida o tempo do eco por 58.2 para obter centímetros.

A velocidade do som depende da temperatura, aproximadamente:

speed (m/s) = 331.3 + 0.606 x temperature_celsius
Temperatura Velocidade do som Erro ao assumir 20 °C
0 °C 331 m/s Lê 3,5% mais longe
20 °C 343 m/s —
40 °C 356 m/s Lê 3,7% mais perto

A 2 m, isso corresponde a cerca de 7 cm de diferença entre uma garagem no inverno e uma sala quente. Para desviar de obstáculos, é irrelevante. Para medir uma abertura, compense—e, se houver um MPU-6050 ou quase qualquer sensor I²C no robô, você já terá uma leitura de temperatura.

Código mínimo funcional

const int TRIG = 9, ECHO = 10;
const unsigned long TIMEOUT_US = 25000UL;   // ~4.3 m, past the sensor's range

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

// Returns centimetres, or -1 when nothing came back.
float pingCm() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  unsigned long us = pulseIn(ECHO, HIGH, TIMEOUT_US);
  if (us == 0) return -1.0f;        // timeout: no echo, NOT "zero distance"
  return us / 58.2f;
}

// Median of three kills the occasional wild reading.
float pingMedianCm() {
  float a = pingCm(); delay(60);
  float b = pingCm(); delay(60);
  float c = pingCm();
  if (a > b) { float t = a; a = b; b = t; }
  if (b > c) { float t = b; b = c; c = t; }
  if (a > b) { float t = a; a = b; b = t; }
  return b;
}

void loop() {
  float cm = pingMedianCm();
  if (cm < 0) Serial.println("no echo");
  else        Serial.println(cm);
  delay(60);
}

Três detalhes fazem a diferença entre um sensor que funciona e outro que não funciona:

O tempo limite não é opcional. pulseIn sem tempo limite fica bloqueado até um eco chegar e, em uma superfície macia ou inclinada, ele nunca chega. O robô parece congelar em intervalos aleatórios, e a causa parece ser qualquer coisa, menos o sensor.

Zero não é uma distância. Um tempo limite expirado significa “nada voltou”, o que normalmente significa que o objeto mais próximo está longe ou é invisível—o oposto de zero. Código que trata o tempo limite como 0 cm fará o robô acionar a parada de emergência em uma sala vazia.

A mediana de três descarta a leitura absurta que esses sensores produzem regularmente. Um valor espúrio de 20 cm em espaço aberto basta para fazer o robô curvar para uma parede.

Lendo honestamente o padrão do feixe

A especificação diz 15°, o que parece um feixe estreito de lanterna. Não é—esse é o ângulo de meia abertura do lóbulo principal, e a consequência prática é que, a 1 m, o sensor ouve um cone com cerca de 50 cm de diâmetro.

Distância Largura aproximada do cone
20 cm ~10 cm
50 cm ~26 cm
1 m ~53 cm
2 m ~105 cm

O sensor informa o objeto mais próximo em qualquer ponto desse cone e não diz nada sobre onde dentro do cone ele estava. É por isso que um HC-SR04 detecta uma moldura de porta que não consegue localizar, e por que uma perna de mesa bem ao lado pode acionar uma parada.

Para percorrer uma sala, isso é uma vantagem—é muito difícil não enxergar um obstáculo. Para medir a distância até um objeto específico, a medição fica inadequada, e você deve usar um VL53L0X.

O que ele não consegue enxergar

Isso decorre da física, não de defeitos, e projetar em torno desses limites faz parte do trabalho:

Superfície O que acontece Por quê
Parede com ângulo superior a ~45° Lê longe ou nada O som reflete para longe do receptor, como a luz em um espelho
Almofadas, cortinas, espuma Não lê nada O material absorve o pulso em vez de refleti-lo
Objetos muito próximos Não lê nada abaixo de ~2 cm O receptor ainda está surdo após a rajada de transmissão
Objetos finos (perna de uma cadeira vista de perfil) Detectado, mas mal localizado O cone é largo; o retorno existe, mas a direção angular não
Outro HC-SR04 por perto Leituras absurdas aleatórias Ele ouve o pulso do outro sensor—escalone os tempos

Um robô que dependa apenas de medição ultrassônica acabará empurrando uma cortina até que algo ceda. É exatamente por isso que uma chave de colisão é a forma mais barata de ganhar confiabilidade em todo o robô.

Solução de problemas

Sintoma Causa provável Solução
Sempre lê 0 Trata o tempo limite como distância Retorne um valor sentinela e trate “sem eco” explicitamente
O robô congela aleatoriamente pulseIn sem tempo limite Passe um tempo limite — 25000 µs cobre todo o alcance
As leituras mudam muito Leituras mais rápidas que ~60 ms Espere o eco anterior desaparecer
Estável, mas errada por alguns por cento Temperatura Compense com a fórmula da velocidade do som
Funciona na bancada, mas não no robô Ruído dos motores na trilha de 5 V Desacople a alimentação do sensor; afaste os fios dos motores
Dois sensores interferem Ambos ouvem um ao outro Acione-os alternadamente, nunca simultaneamente
O pino do ESP32 parou de responder Echo de 5 V em um GPIO de 3,3 V Adicione o divisor—e verifique se o pino ainda funciona
Detecta coisas que não estão à frente O cone de 15° Esperado; restrinja mecanicamente o ângulo útil ou use um sensor a laser

HC-SR04 ou VL53L0X?

HC-SR04 VL53L0X
Método Som de 40 kHz Tempo de voo de laser de 940 nm
Alcance 2 cm – 4 m 3 cm – 2 m (até 4 m no melhor caso)
Feixe ~15° de meio ângulo — cone largo ~25° de campo de visão, mas efetivamente um ponto estreito
Taxa de atualização ~16 Hz (ciclo de 60 ms) Até 50 Hz
Não detecta Superfícies macias e muito inclinadas Superfícies foscas escuras e espelhadas, luz solar intensa
Interface Dois pinos, sem biblioteca I²C
Custo ~US$ 2 ~US$ 5

Eles falham em materiais opostos, o que torna a escolha fácil depois de conhecer o ambiente. O sonar enxerga uma caixa coberta por pano preto que o laser não vê; o laser enxerga uma porta de vidro em um ângulo que o sonar não vê. Em um robô que precisa ser confiável, a resposta honesta muitas vezes é usar os dois—mais uma chave de colisão para quando ambos estiverem errados.

Explore o grafo

Usado nestas montagens

Projetos, caminhos de aprendizagem e simuladores que incluem Sensor ultrassônico HC-SR04.

Comparar

Alternativas

Perguntas

Perguntas frequentes sobre Sensor ultrassônico HC-SR04

O que é o sensor ultrassônico HC-SR04?

O HC-SR04 é um sensor de distância de baixo custo que mede a distância de um objeto usando uma rajada de ultrassom refletida nele—o mesmo princípio usado por morcegos e sonar. É o sensor que a maioria dos robôs iniciantes usa para detectar e evitar obstáculos.

Como funciona o HC-SR04?

Você envia um pulso curto ao pino Trigger. O sensor emite oito rajadas ultrassônicas de 40 kHz e mantém o pino Echo em nível alto até o eco retornar. Meça quanto tempo o pino Echo permanece alto e, como o som viaja a cerca de 343 m/s, a distância é esse tempo multiplicado pela velocidade do som, dividido por dois devido à ida e volta.

Qual é o alcance máximo do HC-SR04?

O HC-SR04 mede aproximadamente de 2 cm a 4 m. Sua precisão é maior entre 5 cm e 2 m; perto do limite de 4 m, as leituras ficam pouco confiáveis, e objetos a menos de cerca de 2 cm ficam em sua zona morta e não podem ser medidos.

O HC-SR04 é preciso e confiável?

Ele é preciso o suficiente para desviar de obstáculos—cerca de 3 mm de resolução em um alvo plano, rígido e diretamente voltado para ele. Dificulta com superfícies macias ou inclinadas, que dispersam o eco, é afetado pela temperatura e possui um feixe largo de ~15°; portanto, detecta um cone, não um ponto.

Como conecto um HC-SR04 a um Arduino?

Conecte VCC a 5 V, GND à massa, Trigger a qualquer pino digital de saída e Echo a um pino digital de entrada. Uma ressalva: o pino Echo produz 5 V; portanto, se você usar uma placa de 3,3 V como o ESP32, reduza a tensão com um divisor antes de lê-lo.

HC-SR04 ou US-100—qual é melhor?

O US-100 é um parente próximo com modo compensado por temperatura, opção de interface serial e operação de 3,3–5 V, o que o torna mais preciso e mais adequado a placas de 3,3 V. O HC-SR04 é mais barato e tem mais tutoriais. Para aprender, o HC-SR04 serve; para precisão, o US-100 tem vantagem.

Como verifico se meu sensor ultrassônico está funcionando?

Imprima a distância medida no monitor serial e mova a mão para perto e para longe do sensor—a leitura deve variar suavemente. Se ficar presa em zero ou no valor máximo, verifique as conexões de Trigger e Echo, confirme uma alimentação de 5 V estável e certifique-se de que o tempo limite é longo o bastante para todo o alcance de 4 m.

Leitura complementar

Referências