Sensor Ultrassônico HC-SR04 com Arduino

Figura 8: Carrinho com Sensor Ultrassônico HCSR-04 controlado por Joystick

Hoje o assunto do nosso post é o sensor ultrasônico HC-SR04. Vamos aprender a utilizar esse sensor com Arduino, seus princípios de funcionamento e aplicações. Sensores ultrassônicos são aplicados como um detectores de objetos e são muito populares principalmente na robótica, onde são utilizados para identificar obstáculos e corrigir continuamente o trajeto feito por um robô.

Por meio da emissão de sinais Ultrassônicos (veja na próxima seção o que são esses sinais), é possível especificar à distância do sensor até um determinado obstáculo. O range de atuação é da ordem de 4 metros, com distância mínima de medição de 2 cm e incluindo obstáculos dentre de um ângulo de abertura de 15 graus. Vamos conhecer esse sensor e aprender a como interfaceá-lo com nosso Arduino.

 

Introdução

 

O princípio de funcionamento do HC-SR04 consiste na emissão de sinais ultrassônicos pelo sensor e na leitura do sinal de retorno (reflexo/eco) desse mesmo sinal. A distância entre o sensor e o objeto que refletiu o sinal é calculada com base no tempo entre o envio e leitura de retorno.

 

Sinais Ultrassônicos são ondas mecânicas com frequência acima de 40 KHz

 

Como ouvido humano só consegue identificar ondas mecânicas até a frequência de 20KHz, os sinais emitidos pelo sensor Ultrassônico não podem ser escutados por nós.

O sensor HC-SR04 é composto de três partes principais:

  • Transmissor Ultrassônico – Emite as ondas ultrassônicas que serão refletidas pelos obstáculos;
  • Um receptor – Identifica o eco do sinal emitido pelo transmissor;
  • Circuito de controle – Controla o conjunto transmissor/receptor, calcula o tempo entre a emissão e recepção do sinal;

 

Funcionamento

 

O funcionamento consiste em três etapas:

  1. O circuito externo(Arduino) envía um pulso de trigger de pelo menos 10us em nível alto;
  2. Ao receber o sinal de trigger, o sensor envía 8 pulsos de 40khz e detecta se há algum sinal de retorno ou não;
  3. Se algum sinal de retorno for identificado pelo receptor, o sensor gera um sinal de nível alto no pino de saída cujo tempo de duração é igual ao tempo calculado entre o envio e o retorno do sinal ultrassônico;

Por meio desse pulso de saída cujo tempo é igual a duração entre emissão e recepção, nós calculamos a distância entre o sensor e o objeto/obstáculo, por meio da seguinte equação:

Distância  = (Tempo de duração do sinal de saída × velocidade do som) / 2

Em que:

  • Tempo de duração do sinal de saída é o tempo no qual o sinal de output permanece em nível alto;
  • Velocidade do som = 340 m/s;

Repare que as unidades devem estar coerentes para o resultado da conta ser correto. Assim, se a velocidade do som é dada em metros/segundo, o tempo de duração do sinal de saída deve estar em segundos para que possamos encontrar a distância em metros.

 

Pinagem e características elétricas

 

Sensor Ultrassônico com indicação de pinagem. Créditos: Eletrogate

Na figura 1 podemos ver os quatro pinos do sensor HC-SR04. Temos um pino de VCC, alimentado com 5V, um GND, e os dois pinos de controle e leitura do sensor: O Trigger, no qual nós aplicamos o sinal para comandar o envio dos pulsos ultrassônicos, e o Echo, que retorna para o Arduino os pulsos com o tempo de duração entre o envio e recepção do sinal de retorno. A corrente elétrica de operação do sensor é de 15mA, portanto é uma aplicação de baixo consumo energético.

 

Aplicações

 

Os sensores ultrassônicos podem medir variáveis como enchimento e altura sem ter que entrar em contato com os elementos do meio, o que é uma grande vantagem quando comparado com outros tipos de sensores. Uma outra vantagem é que o sensor ultrassônico não possui sua operação prejudicada pela transparência, poeira, sujeira ou vapores/gases presentes no ambiente.  Desde que o objeto reflita as ondas sonoras, é possível usar um sensor ultrassônico independentemente de seu acabamento superficial ou cor. Existem sensores que podem medir distâncias de dezenas de metros com ótima precisão. Devido a todas essas características, os sensores ultrassônicos são amplamente utilizados na indústria e em vária aplicações de robótica e automação.

As principais aplicações são:

  • Detecção de objetos e verificação de presença;
  • Medição de altura e largura;
  • Medição de níveis de enchimento;
  • Detecção de obstáculos;
  • Posicionamento de sistemas robóticos;
  • Correção de rota de robôs e outros mecanismos móveis como carros de controle remoto;

Aqui no nosso projeto, vamos mostrar um circuito simples de como controlar o sensor HC-SR04 e calcular distâncias, e vamos mostrar uma aplicação muito legal. Um carrinho controlado por Joystick que utiliza o HC-SR04 para identificar e desviar de obstáculos.

 

Descrição do Projeto

 

Primeiro, vamos montar um circuito para ligar o HC-SR04 com Arduino UNO e utilizá-lo para medir distâncias. Assim você vai aprender passo a passo a como utilizar o sensor e a aplicá-lo a qualquer projeto. Depois, vamos mostrar uma aplicação avançada (códigos serão disponibilizados nas próximas seções) na qual o sensor é usado para evitar que um carrinho controlado por Joystick bata em obstáculos durante a sua aplicação.

 

Aspectos de Hardware

 

A montagem para controlar o sensor com o Arduino é fácil e não exige componentes adicionais. Com a montagem abaixo você pode facilmente identificar objetos e calcular distâncias. No nosso caso, vamos usar o terminal serial da IDE Arduino para mostrar as distâncias calculadas.

 

Figura 2: Montagem Sensor HC-SR04 com arduino

Aspectos de Software

 

O software para utilizar o HC-SR04 não é complicado. O pulso de disparo do sensor é fácil de ser implementado. Para ler o tempo de duração do pino de output nós dispomos da função nativa PulseIn(). A equação para calcular a distância a partir do tempo medido também é simples.

Na figura 3 temos a primeira parte do software. As variáveis declaradas são para determinar os pinos de trigger(pino 2) e de leitura do sensor(pino 3). Temos três variáveis do tipo float utilizadas para medir o  tempo do pulso no output do sensor e calcular a distância.

 

Figura 3: Declaração de variáveis e função Setup()

 

Na função void setup(), inicializamos o pino 2 como saída e o 3 com entrada. Além disso, configuramos a comunicação serial para 9600 de baud rate.

Função void loop()

Na figura 4 temos a função void loop(), onde o programa será executado continuamente. O corpo do programa consiste em três partes:

  1. Enviar pulso de 10us para o pino de trigger do sensor. Isto é feito com a função DisparaPulsoUltrassonico();
  2. Ler o pino de output do sensor e medir o tempo de duração do pulso utilizando a função PulseIn. Esta função retorna o tempo de duração do pulso em microsegundos para que o mesmo seja armazenado em uma variável;
  3. Por fim, chamamos a função CalculaDistancia(tempo) passando como parâmetro o tempo lido com a função PulseIn. Esta função calcula a distância entre o sensor e o obstáculo. Nós chamamos esta função de dentro da função Serial.println(), de forma que o resultado já é impresso diretamente no terminal serial;

 

Figura 4: Função void loop()

 

Por fim, temos as duas funções que implementamos. Uma para enviar o pulso de trigger do sensor e outra para calcular a distância entre o sensor e o obstáculo.

 

Figura 5: Função DisparaPulsoUltrassonico()

 

A função DisparaPulsoUltrassonico() apenas ativa o pino 2 em nível alto, espera 10 microsegundos e volta a setar o pino para nível baixo. Lembre que 10us é o tempo mínimo que o pulso deve perdurar para disparar o sensor HC-SR04.

 

Figura 6: Função CalculaDistancia(float tempo_us)

 

A função CalculaDistancia recebe como parâmetro o tempo do pulso no pino Echo do sensor. Com esse tempo nós usamos a equação informada no datasheet(ver seção de introdução) para calcular a distância entre o sensor e o obstáculo.

 

Botando pra Rodar!

 

Com o software e montagem das duas seções anteriores, nós temos a seguinte saída na porta serial:

 

Figura 7: Saída no terminal serial

 

Veja que estamos mostrando a distância em centímetros e em metros também!

 

Carrinho com sensor Ultrassônico!

 

O carrinho trata-se de um chassi como esse, com uma série de componentes eletrônicos embarcados. Os principais deles são:

O funcionamento é da seguinte forma. À medida que o carrinho anda pelo terreno, ele identifica os obstáculos e evita o encontro com os mesmos e corrige a rota de acordo com os comandos do Joystick. As figuras 8 e 9 mostram a montagem de todos os componentes juntos e montados no chassi.

 

Figura 8: Carrinho com Sensor Ultrassônico HCSR-04 controlado por Joystick

Figura 9: Carrinho com Sensor Ultrassônico HCSR-04 controlado por Joystick

Aqui você pode acessar os códigos usados no carrinho. São basicamente dois. O primeiro é para o Arduino que vai no carrinho controlando o sensor Ultrassônico e o servo (módulo receptor). O segundo vai no arduino que controla o Joystick (módulo transmissor).

Software transmissor

Além do firmware, você vai precisar também de duas bibliotecas adicionais para fazer o controle do módulo RF.  São elas a “nRF24L01.h” e”RF24.h“. Você pode fazer o download das duas bibliotecas neste link.

Basicamente, o firmware faz a leitura dos sinais analógicos do JoyStick com duas entradas, uma para o eixo x e outra para o eixo y. Essas duas entradas são usadas para calcular os movimentos feitos pelo usuário. Uma entrada digital é usada para ler se o JoyStick foi pressionado ou não.  Essas três variáveis são declaradas dentro de uma estrutura usada para definir o tipo Controle, por meio da diretiva typedef.

 

Figura 9: Firmware do arduino transmissor

Figura 10: Firmware do arduino transmissor

 

As três variáveis da estrutura c, do novo tipo definido Controle, são constantemente monitoradas e enviadas via RF para o módulo receptor instalado no carrinho. Essa parte do código está na função void loop().

 

Figura 10: Função void loop()

Figura 11: Função void loop()

Software receptor

Para software receptor, além das bibliotecas anteriores, você vai precisar também de adicionar a “Ultrasonic.h”, que pode ser encontrada aqui. Novamente vamos declarar uma variável do tipo Controle a partir da instrução typedef, na qual teremos os valores correspondentes ao eixo x e y do joystick, bem como se o mesmo está pressionado ou não.

Na função void loop(), constantemente recebemos os dados do transmissor e avaliamos os valores das coordenadas. Dependendo desses valores, isto é, dependendo da posição de como o joystick é manuseado, nós chamamos alguma das funções abaixo:

  • frear();
  • acelerar();
  • re();
  • giraEsquerda();
  • giraDireita();
  • conversaoEsquerda();
  • reEsquerda();
  • conversaoDireita();
  • reDireita();

Cada uma dessas funções aciona os motores do carrinho de forma a realizar a manobra desejada. Em todas elas o sensor ultrassônico é usado para avaliar se há algum obstáculo ou não. Caso um obstáculo seja detectado, a manobra não é realizada. Caso o caminho esteja livre, os motores nas rodas do carrinho são acionados normalmente.

Considerações finais

 

E aí, o que achou de aprender a usar o sensor ultrassônico e conhecer essa aplicação do carrinho controlado por Joystick?! O sensor HC-SR04 pode ser usado em várias outras aplicações, e agora você já sabe tudo que precisa para poder implementar aplicações com ele.

Quando fizer o seu projeto, mande as fotos e comentários para a gente. E se tiver alguma dúvida sobre o post, deixe seu comentário aqui no Blog! Até a próxima!

Avaliações: 5.0. de 1 voto.
Por favor, aguarde...
Vitor Vidal
Vitor Vidal
Engenheiro eletricista, mestrando em eng. elétrica e apaixonado por eletrônica, literatura, tecnologia e ciência. Divide o tempo entre pesquisas na área de sistemas de controle, desenvolvimento de projetos eletrônicos e sua estante de livros.