HC-SR04 – Sensor Ultrassônico de distância com Arduino
O sensor ultrassônico HC SR04 é amplamente utilizado em aplicações onde se deseja medir distância ou evitar colisões, como na robótica móvel e de reabilitação. Neste tutorial aprenderemos como utilizar o Módulo Sensor HC-SR04 com Arduino.
Sensor Ultrassônico HC-SR04
Tudo começa pela emissão de um pequeno pulso sonoro de alta frequência que se propagará na velocidade do som no meio em questão. Quando este pulso atingir um objeto, um sinal de eco será refletido para o sensor. A distância entre o sensor e o objeto pode então ser calculada caso saibamos o tempo entre a emissão e a recepção do sinal, além da velocidade do som no meio em questão. Afigura a seguir exemplifica o processo.
Para uma melhor medição da distância, a área do objeto na qual a onda será refletida deve ser de pelo menos 0,5 m2.
Mãos à obra – Medindo distância com o HC-SR04
Componentes necessários:
Montando o projeto
Agora vamos conectar os componentes do projeto. Para isso, desligue o cabo USB de seu Arduino e monte seu circuito conforme a figura a seguir.
O HC SR04 possui 4 pinos sendo eles:
- Vcc – Deve ser conectado a um pino 5V do Arduino.
- Trig – Deve ser conectado a um pino digital configurado como saída. Utilizaremos o pino 8.
- Echo – Deve ser conectado a um pino digital configurado como entrada. Utilizaremos o pino 7.
- Gnd – Deve ser conectado a um pino GND do Arduino.
Programando
Crie um no programa (sketch) e salve com o nome de “programa_ultrassom_hcsr04”.
Nesse exemplo utilizaremos a biblioteca Ultrasonic.h. A utilização dessa biblioteca é bastante simples.
– Instalar a biblioteca pelo IDE do Arduino
Esse é o método mais fácil. Primeiramente, faça o download dos arquivos da biblioteca compactados no formato zip. Geralmente as bibliotecas já são distribuídas compactadas, porém às vezes é necessário fazer o download dos arquivos separadamente e compactá-los à parte. Em seguida, basta abrir o IDE e ir em “Sketch -> Incluir Biblioteca -> Adicionar biblioteca .ZIP” E selecionar o aquivo baixado:
Com isso, a nova biblioteca foi instalada. Para utilizá-la, basta ir em “Sketch -> Incluir Biblioteca” e selecionar a biblioteca desejada.
Você pode ver mais detalhes sobre como adicionar uma biblioteca no tutorial Sensores DHT11 e DHT22 e o Uso de Bibliotecas.
– Código exemplo
Com o seu programa salvo, escreva nele o código abaixo:
//Leitura de distância com o sensor HC-SR04 #include <Ultrasonic.h> Ultrasonic ultrassom(8,7); // define o nome do sensor(ultrassom) //e onde esta ligado o trig(8) e o echo(7) respectivamente long distancia; // Esta função "setup" roda uma vez quando a placa e ligada ou resetada void setup() { Serial.begin(9600); //Habilita Comunicação Serial a uma taxa de 9600 bauds. } // Função que se repete infinitamente quando a placa é ligada void loop() { distancia = ultrassom.Ranging(CM);// ultrassom.Ranging(CM) retorna a distancia em // centímetros(CM) ou polegadas(INC) Serial.print(distancia); //imprime o valor da variável distancia Serial.println("cm"); delay(100); }
Após escrever o código, salve e depois clique em Carregar (Upload) para que o programa seja transferido para seu Arduino.
Colocando para funcionar
Abra o Serial Monitor e coloque um obstáculo na frente do sensor ultrassônico. Se tudo deu certo, conforme você variar a distância do obstáculo em relação ao sensor, a distância medida aparecerá no serial monitor, tal como a figura a seguir.
Entendendo a fundo
Entendendo o Software
– Biblioteca Ultrasonic.h
Na elaboração do software utilizaremos a biblioteca Ultrasonic.h. Essa biblioteca implementa as funcionalidades do sensor ultrassom HC-SR04, tornando sua utilização extremamente simples.
– Declarando um Ultrassom
Para o uso dessa biblioteca devemos definir o nome do sensor e em quais pinos estão conectados os pinos trig e echo.
Ultrasonic nomesensor(trig,echo);
No exemplo a seguir, o nome do sensor é ultrassom, o pino do trig está conectado na porta 8 e o pino do echo na porta 7.
Ultrasonic ultrassom(8,7);
– Medindo a distância
Para ler a distância, basta chamar a função Ranging(CM). Para valor em centímetros, deve-se usar CM e para valor em polegadas, deve-se usar INC. Essa função retorna um valor de variável long.
long distancia = ultrassom.Ranging(CM); // distancia recebe o valormedido em cm
Observe que usamos o nome do sensor escolhido, no nosso caso ultrassom, seguido de ponto e o nome da função que queremos usar. Para o Arduino estamos falando que queremos usar determinada função do objeto mencionado, no nosso caso o ultrassom.
– Imprimindo na porta serial
Para imprimir o valor de distância lido usamos a função Serial.print().
Serial.print(distancia); //imprime o valor da variável distancia Serial.println("cm");
Repare que na primeira linha imprimimos o valor da variável distância e na segunda linha imprimimos a palavra cm, que está entre aspas duplas. Sempre que quisermos imprimir um texto devemos colocá-lo dentro de aspas duplas, caso contrário o programa irá entender que o texto é o nome de uma variável.
Repare também que na segunda linha usamos o sufixo -ln depois de print. Esse sufixo informa que depois de escrito o texto, o programa deve pular uma linha.
Entendendo o Hardware
Como dito anteriormente, o sensor ultrassom mede a distância através da medição do tempo que uma onda leva para sair do emissor, colidir com um obstáculo e ser refletido, para, finalmente, ser detectado pelo receptor. Desta forma, podemos notar que nosso sensor ultrassom possui dois cilindros metálicos que se assemelham a olhos em sua placa. São, na realidade, dois altos falantes: um trabalha como o emissor do sinal ultrassom e o outro como receptor.
– Fazendo a leitura do tempo
Para iniciarmos uma medição, o pino Trig, que funciona como gatilho do nosso sensor ultrassom, deve receber um pulso de 5V por pelo menos 10 microssegundos. Isso fará com que o sensor HC-SR04 emita 8 pulsos ultrassônicos em 40kHz (T piezzo) e o pino ECHO, que funcionará como nosso cronômetro, vai para 5V, iniciando assim a espera pelas ondas refletidas.
Assim que uma onda refletida for detectada, o pino Echo, que estava em 5V, será alterado para 0V. Desta forma, o período que o pino Echo fica em 5V é igual ao tempo que a onda emitida leva para ir até o obstáculo e voltar.
Veja a imagem abaixo para entender o que acontece no sensor HC-SR04.
Por fim, para sabermos quão longe nosso obstáculo está, basta contarmos quanto tempo (T) a tensão no pino Echo ficou em 5V. Em posse desse tempo, sabendo que ele é o dobro do tempo de ida e volta da onda do sensor ultrassônico até o obstáculo, e, considerando a velocidade do som igual a 340,29 m/s, temos:
Desta forma, temos que a distância até o obstáculo é igual a ΔS.
A função Ultrasonic.h faz exatamente o procedimento descrito, retornando apenas o valor da distância.
Outra opção de código
Poderíamos seguir o procedimento explicado usando o seguinte código:
// Leitura HC-SR04 const uint8_t trig_pin = 10; const uint8_t echo_pin = 9; uint32_t print_timer; void setup() { Serial.begin(9600); // Habilita Comunicação Serial a uma taxa de 9600 bauds. // Configuração do estado inicial dos pinos Trig e Echo. pinMode(trig_pin, OUTPUT); pinMode(echo_pin, INPUT); digitalWrite(trig_pin, LOW); } void loop() { // Espera 0,5s (500ms) entre medições. if (millis() - print_timer > 500) { print_timer = millis(); // Pulso de 5V por pelo menos 10us para iniciar medição. digitalWrite(trig_pin, HIGH); delayMicroseconds(11); digitalWrite(trig_pin, LOW); /* Mede quanto tempo o pino de echo ficou no estado alto, ou seja, o tempo de propagação da onda. */ uint32_t pulse_time = pulseIn(echo_pin, HIGH); /* A distância entre o sensor ultrassom e o objeto será proporcional a velocidade do som no meio e a metade do tempo de propagação. Para o ar na temperatura ambiente Vsom = 0,0343 cm/us. */ double distance = 0.01715 * pulse_time; // Imprimimos o valor na porta serial; Serial.print(distance); Serial.println(" cm"); } }
Desafio
Sabendo como funciona um sensor ultrassônico, faça o programa que meça a distância sem o auxílio da biblioteca.
Fechamento
Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.
Engenheiro Eletricista pela UFES, Técnico em Automação industrial pelo IFES, MBA Gestão de Projetos pela USP e Fundador do Vida de Silício. Sonhador com uma única pretensão, fazer a diferença.
17 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
E possivel utilizar a placa de giroscopio e + 3 sensores ultrasonicos p/ controle de nivel plataforma
Meus parabéns. Excelente didática.
Como eu faço para, mandar o sinal do sensor para um motor ?
preciso medir o volume de diesel em um tanque, com o sensor este sensor eu consigo fazer isso?
meu tanque tem 40 cm largura, x 40 cm de comprimento x 1 metro de altura totalizando 160 lts.
como converto cm de distancia por quantidade de litros?
alguém pode me ajudar no código?
Caro Allan, boa tarde. Preciso de algo do gênero para distância em torno de trinta metros com frequência da ordem de 60 Hz. Sem pressa. Grato.
como eu faço pra retornar numero com vírgula, ampliando a exatidão?
Como eu coloco parâmetro no sensor ? para ele funcionar só quando passa um objeto naquela distancia ou mais perto
Excelente explicação, tudo perfeitamente explicado, e muito bem explicado!
Parabens!
Meu sensor ultrassonico está lendo as informações invertidas, quando aproximo o objeto, ele mostra o valor 103cm e quando distancio o valor vai diminuindo… O que eu faço??
Cadê os códigos?
Aqui não aparece nada.
Valeu!
Como proceder para ler distancia em três sensores HCSR004, com um só programa e sem a biblioteca ultrasonic
QUAL O ERRO?Me ajudem por favor
#include
Ultrasonic ultrassom1(13,10); // define o nome do sensor(ultrassom)
Ultrasonic ultrassom2(14,15); // define o nome do sensor(ultrassom)
Ultrasonic ultrassom3(16,17); // define o nome do sensor(ultrassom)
Ultrasonic ultrassom4(20,21); // define o nome do sensor(ultrassom)
long distancia1;
long distancia2;
long distancia3;
long distancia4;
void setup() {
Serial.begin(9600); //Habilita Comunicação Serial a uma taxa de 9600 bauds.
}
// Função que se repete infinitamente quando a placa é ligada
void loop()
{
distancia1 = ultrassom1.Ranging(CM);// ultrassom.Ranging(CM) retorna a distancia em centímetros(CM) ou polegadas(INC)
distancia2 = ultrassom2.Ranging(CM);
distancia3 = ultrassom3.Ranging(CM);
distancia4 = ultrassom4.Ranging(CM);
Serial.print(distancia1); //imprime o valor da variável distancia
Serial.println(“cm”);
delay(100);
Serial.print(distancia2); //imprime o valor da variável distancia
Serial.println(“cm”);
delay(100);
Serial.print(distancia3); //imprime o valor da variável distancia
Serial.println(“cm”);
delay(100);
Serial.print(distancia4); //imprime o valor da variável distancia
Serial.println(“cm”);
delay(100);
}
Faltou o nome da biblioteca outra som Nick entre final de menor e maior depois do Include
não consegui baixar a biblioteca do sensor
Eu não consegui baixar o link o que eu faço?
qual o erro linha
long distancia = ultrassom.Ranging(CM); // distancia recebe o valormedido em cm
No primeiro exemplo.
A declaração da variável “distancia” não deveria estar dentro do void.setup, declare a variável antes que dará certo.