Framework Arduino II: Aula 06 Sensores Ultrassônicos HC-SR04

Imagem meramente ilustrativa

 

Introdução

    Os sensores ultrassônicos são sensores que emitem sinais ultrassônicos e calculam pelo tempo de resposta desses sinais a distância de um ponto ou objeto. Isso permite utilizá-los na robótica para detecção de obstáculos, como também servem para detectar níveis de água em reservatórios através de suas versões blindadas a prova d'água.

Animação mostrando o princípio de funcionamento do sensor ultrassônico
Animação mostrando o princípio de funcionamento do sensor ultrassônico


    Também existem versões industriais de maior precisão e alcance que permitem medir alturas de pilhas de embalagem, diâmetros de bobinas, níveis em silos, etc. Por ser um sensor facilmente encontrado, usaremos o HC-SR04 como padrão para estudar sensores ultrassônicos.

Conhecendo o HC-SR04

    O HC-SR04 é um módulo contendo componentes periféricos e dois sensores cilíndricos principais, um responsável por transmitir o sinal ultrassônico (trigger)e outro responsável por receber o retorno desse sinal (echo). 

Representação de um HC-SR04 com sensores e terminais
Representação de um HC-SR04 com sensores e terminais


    Conta também com quatro terminais: VCC, TRIG, ECHO e GND. O terminal TRIG será conectado a um pino digital de saída do Arduino e o ECHO a um pino digital de entrada. O sinal de 5v enviado pelo pino de saída faz com que o sensor envie pulsos de 40khz em direção a um obstáculo.

    Se o objeto estiver a uma distância de 2 cm a 4 metros, haverá retorno deste sinal captado pelo receptor. O intervalo entre envio e recebimento determina um tempo de duração de sinal. 

    Se multiplicarmos esse tempo pela velocidade do som que é 340 metros por segundo e dividirmos por dois, já que o sinal foi e voltou, teremos um medida que representa a distância do sensor ao objeto, mas  podemos utilizar alguns artifícios e simplificar essa conta apenas dividindo esse tempo de duração por 58 e já ter o valor da distância em centímetros.

    Para aqueles que não gostam de fazer contas, podemos utilizar bibliotecas que nos dá o valor da distância mais facilmente.

    Segundo nossas pesquisas, a taxa de atualização dessas leituras é de cerca de 100 vezes por segundo, com uma precisão de 3mm, trabalhando com uma corrente entre 2 e 15 mA.

Tabela com as especificações de um HC-SR04 genérico
Tabela com as especificações de um HC-SR04 genérico


    É bom lembrar que, dependendo do projeto, esses sensores precisarão de algum tipo de suporte, que pode ser fixo para os projetos de robótica ou móveis quando o projeto exige que o sensor seja apontado para diferentes direções. 

Suporte fixo para HC-SR04
Suporte fixo para HC-SR04


    Também temos "cases", isto é, encapsulamentos prontos para abrigar o sensor, conferindo a eles certa proteção. Alguns deles podem ser encontrados em lojas virtuais, como também na forma de arquivos para download e posterior impressão 3D.

Case direcionável para HC-SR04
Case direcionável para HC-SR04


Montagem

    Sua montagem é relativamente fácil, não exigindo resistores externos, por isso farei algo muito simples, apenas para mostrar como o sensor com e sem bibliotecas, mas deixarei no final um link para um projeto mais elaborado.

Simulação da montagem no Wokwi
Simulação da montagem no Wokwi


    Link: https://wokwi.com/projects/413576535125184513

Sketch

    Temos duas opções de Sketch para essa mesma montagem: Uma utiliza a fórmula de cálculo da distância que falei e a outra utiliza um biblioteca que facilita nossa vida dispensando o cálculo. Vamos ao primeiro:

  1. int trig=9;
  2. int echo=8;
  3. int duracao=0;
  4. void setup() {
  5.   Serial.begin(9600);
  6.   pinMode(trig, OUTPUT);
  7.   pinMode(echo, INPUT);
  8. }
  9. void loop() {
  10.   digitalWrite(trig, HIGH);
  11.   delayMicroseconds(10);
  12.   digitalWrite(trig, LOW);
  13.   duracao= pulseIn(echo, HIGH);
  14.   Serial.print("Distância em centimetros: ");
  15.   Serial.println(duracao / 58);
  16.   delay(1000);
  17. }

    Nesse código estamos declarando nas primeiras linhas as três variáveis que utilizaremos: duas para os pinos de trig echo, além de uma para guardar a duração do intervalo em micro segundos. Na função setup() estamos apenas iniciando o monitor serial e configurando os pinos como saída e entrada.

    A mágica toda acontece na função loop() onde ativamos o sinal de trigger, estabelecemos um intervalo de 10 microssegundos com a função delayMicroseconds() e desligamos em seguida o sinal.

     Com a função pulseIn() pegamos o intervalo de resposta do echo, depois é só fazer a conta e imprimir o resultado no monitor serial.

Não gostou de fazer contas?

    Tudo bem. Eu vou colocar também aqui um link para outra montagem onde utilizei a biblioteca do pessoal da Robo Core (ver referências). Veja como fica mais fácil:

  1. #include "Ultrasonic.h"
  2. int trig=9;
  3. int echo=8;

  4. HC_SR04 sensor(trig,echo);
  5. void setup() {
  6.   Serial.begin(9600);
  7. }
  8. void loop() {
  9.   Serial.print("Distância em centimetros: ");
  10.   Serial.println(sensor.distance());
  11.   delay(1000);
  12. }

    Nesse código temos a inclusão de uma biblioteca que na realidade são dois arquivos: um cpp onde temos a classe que vai ser utilizada e outro de cabeçalho. Repare isso nos arquivos adicionais da montagem do link abaixo.

    Aqui temos na linha 5 o instanciamento do objeto sensor com base na classe HC_SR04 do arquivo cpp que utiliza como parâmetro os pinos de trig e echo. O resto do código é bem parecido com o primeiro, descontado o que não foi utilizado. Na hora da impressão da distância utilizamos um método distance() que calcula pra gente.

    Link para essa montagem com a biblioteca: https://wokwi.com/projects/413578863051030529

Um projeto de Sustentabilidade

    Durante o curso Sistemas Embarcados na Fatec, fizemos uma disciplina de Sustentabilidade onde apresentei um projeto que utilizava dois desses sensores: um para verificar o nível de um reservatório inferior com água de reuso proveniente de um telhado e outro para verificar o nível de um reservatório superior que utilizava essa água para descarga e outros fins.

Projeto de Sustentabilidade com uso e HC-SR04 e Relê
Projeto de Sustentabilidade com uso e HC-SR04 e Relê

    Se o nível do reservatório superior estivesse baixo e o inferior estivesse cheio, um relê acionava uma bomba para mandar água do reservatório inferior para o superior. Vou deixar aqui o link para uma representação do projeto no Tinkercad.

Simulação no Tinkercad para Projeto de Sustentabilidade
Simulação no Tinkercad para Projeto de Sustentabilidade

    Esclareço que no lugar da bomba, o Tinkercad só me permitiu colocar uma lâmpada para representá-la, mas acho que serve como exemplo de uso. Também cabe lembrar que para projetos como esse, o recomendável é a utilização de sensores blindados como o da figura abaixo:

Sensor ultrassônico a prova d'água
Sensor ultrassônico a prova d'água


    Link do Tinkercad: Clique aqui.

    Nas próximas aulas veremos display LCD para dispensar o uso do monitor serial.

Próxima Aula                                                                                                                        Aula Anterior

Referências

BALLUFF. Sensor ultrassônico: como ele funciona e de que modo pode ajudar a sua indústria? Disponível em <https://balluffbrasil.com.br/sensor-ultrassonico-como-ele-funciona-e-de-que-modo-pode-ajudar-a-sua-industria/> Acesso em 01 nov 2024.

BLOG ELETROGRATE. Sensor Ultrassônico HC-SR04 com Arduino. Disponível em <https://blog.eletrogate.com/sensor-ultrassonico-hc-sr04-com-arduino/> Acesso em 01 nov 2024.

MAKER HERO. Sensor de Distância Ultrassônico HC-SR04. Disponível em <https://www.makerhero.com/produto/sensor-de-distancia-ultrassonico-hc-sr04/> Acesso em 01 nov 2024.

ROBO CORE. Sensor Ultrassônico - HC-SR04. Disponível em <https://www.robocore.net/sensor-robo/sensor-de-distancia-ultrassonico-hc-sr04> Acesso em 01 nov 2024.