Arduino + Sensor Ultrasônico HC-SR04

 

Olá caros leitores deste humilde blog, como prometido, vou postar meu primeiro projeto utilizando Arduino e o sensor ultrasônico HC-SR04.

Primeiramente vamos a uma breve explicação do que é esse sensor:
O sensor ultrasônico HC-SR04 funciona como um detector de objetos e permite medir distancias mínimas de 2 centímetros podendo chegar a distancias máximas de até 5 metros com uma precisão de 3 milímetros . Estes sensores emitem um sinal ultrasônico que reflete em um objeto e retorna ao sensor (eco). O sinal de retorno é captado, permitindo-se deduzir a distância do objeto ao sensor tomando o tempo de trânsito do sinal.

A velocidade do sinal ultrasônico é de aproximadamente 340 m/s, assim, se o sensor estiver a uma distância d do objeto, o sinal percorrerá uma distância equivalente a 2d para sair e retornar ao sensor. Sabendo esses conceitos é possível calcularmos a distancia de um objeto pela formula:

O sensor é composto por 4 pinos, sendo eles:

  • VCC : alimentação de 5V
  • TRIG : pino de gatilho
  • ECHO : pino de eco
  • GND : terra

Inicio da montagem do projeto:

Esquema montado na mini protoboard:

A montagem do circuito foi feita da seguinte maneira:

1°  – O jumper de cor azul é ligado ao pino GND (terra) do arduino e ligado ao pino GND (terra) do sensor.
2°  – O jumper de cor amarela é ligado ao pino 13 do arduino e ligado ao pino ECHO (eco) do sensor.
3°  – O jumper de cor branca é ligado ao pino 12 do arduino e ligado ao pino TRIG (emisso) do sensor.
4°  – O jumper de cor vermelha é ligado ao pino de 5V (corrente) do arduino e ligado ao pino VCC (corrente) do sensor.

Embora, na foto parece que os pinos estejam ligados em lugares diferentes dos descritos acima, você deverá seguir os passos citados para que a montagem fique de forma correta.

Após o montagem do circuito você deverá carregar o código na IDE do arduino. O codigo usado foi escrito usando a biblioteca do sensor ultrasonico, o download da biblioteca pode ser feito AQUI.  O datasheet do sensor pode ser encontrado AQUI.

Código usado:

#include "Ultrasonic.h"
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
//iniciando a função e passando os pinos
Ultrasonic ultrasonic(12,13);

void setup()
{
   Serial.begin(9600); //inicia a porta serial
   pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
   pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
}

void loop()
{
  //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
    digitalWrite(trigPin, LOW);
  // delay de 2 microssegundos
    delayMicroseconds(2);
  //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
    digitalWrite(trigPin, HIGH);
  //delay de 10 microssegundos
    delayMicroseconds(10);
  //seta o pino 12 com pulso baixo novamente
    digitalWrite(trigPin, LOW);
  // função Ranging, faz a conversão do tempo de
  //resposta do echo em centimetros, e armazena
  //na variavel distancia
    int distancia = (ultrasonic.Ranging(CM));

Serial.print("Distancia em CM: ");
Serial.println(distancia);
delay(1000); //espera 1 segundo para fazer a leitura novamente
}

Após o código carregado e enviado para o microcontrolador do arduino, abra o monitor serial na IDE do arduino para verificar as saídas do seu projeto. Repare que as distancias mudam os valores, nesse momento havia um objeto se aproximando e distanciando constantemente do sensor.


Bom é isso aí. Aguardem, no próximo post vou mostrar um projeto usando leds.

98 comentários em “Arduino + Sensor Ultrasônico HC-SR04

  1. Poxa muito bom, funcionou perfeitamente aqui, tava com certos problemas, e por acaso achei o seu e muitos outros que resolveriam, mas o seu foi o primeiro e funcionou bem, só que eu achei uma coisa estranha, eu tava muito perto do sensor, e dava em torno de 18 cm…19cm, é assim mesmo?
    vlws abcs! E muito obrigado AJUDOU MT!

  2. Meu amigo,

    Muito legal seu código, não sei se você pode me ajudar como o meu, tenho que programar o arduino uno, para movimentar 02 motores utilizando uma ponte H CI L293D, os motores devem ficar parados por 5s e depois iniciar o movimento ate atingir a metade da velocidade e ao acionar um sensor ele deve atingir a velocidade máxima, esse código é para um projeto de robo de sumo que irei implementar na faculdade, nesta programação irei utilizar 03 sensores LDR e um sharp, por que ele deve detectar a area e se estiver para sair da arena ele deve parar e mudar o sentido da rotação, tambem em velocidade baixa, ele só deve atingir a velocidade total quando localizar oponente, eu já fiz quase tudo falta agora esta programação que não estou consiguindo fazer.

    Você pode me ajudar?

    Obrigado.

    Adelmo

  3. Caro Fernando,
    Gostei do seu documento, muito didático. Porém, estou tendo problemas na carga da biblioteca onde o compilador retorna o seguinte erro: “In file included from sketch_feb01a.cpp:1:
    C:\Program Files (x86)\arduino-1.0\libraries\Ultrasonic/Ultrasonic.h:11:22: error: WProgram.h: No such file or directory”
    Ele não encontra o WProgram.h.
    Estou usando a versão 1.0. será que é isso?
    Como saio dessa?
    Abraços
    Pedro Henrique

      • Estava com o mesmo problema. Graças a este toque eu consegui fazê-lo funcionar.
        Obrigado.

        Fiz um programa bem mais simples que dá o mesmo resultado, veja abaixo:

        #include
        Ultrasonic ultrasonic(12,13);

        void setup() {
        // initialize serial communication:
        Serial.begin(9600);
        }

        void loop()
        {
        Serial.print(ultrasonic.Ranging(CM));
        Serial.print(“cm”);
        Serial.println();

        delay(1000);

        }

  4. ola pessoal gostaria de saber se dar pra colocar a medida ao invés de cm em mm, por favor manda a resposta pro meu email. grato yuri…

    • Olá kaio! Se voce usa Windows, provavelmente esteja em uma das pastas de Arquivos de Programa/Arduino/Libraries procure por isso e então cole a pasta da biblioteca dentro da pasta libraries.

      Já se voce esta usando Linux, encontrara esta pasta em: /usr/share/arduino/libraries

      É isso….

  5. Olá, possuo um sensor deste ultrassônico e outro de temperatura um birck LM75A, gostaria de saber se posso ligar os dois ao mesmo tempo no VCC do Arduíno. Obrigado.

  6. Hey poderia informar de que ano é esse arduíno e o modelo direitinho? Obrigada. E se eu comprar qualquer arduino desse modelo duemilanove, o programa roda tbm ?

    • Olá Wanessa, o arduino Duemilanove foi lançado no ano de 2009 por isso tem esse nome (Italiano)!! Voce pode usar qualquer arduino desde que seja compativel com o microcontrolador ATmega328…. Pode usar tanto o arduino MEGA, UNO, Duemilanove, etc..

      O Arduino MEGA possui um ATmega2560 mas é compativel com outras tambem!! Alem de possuir mais memoria e mais pinos para a prototiágem….Só que tantas vantagens fazem com que ele seja mais caro em relação a outros…

      É isso….. Abraço

  7. Consegui montar o sistema e executá-lo sem problema algum. Porém, me surgiu uma dúvida, eu tenho como deixar a leitura mais sensível? Ela me parece meio demorada. Já tentei deminuir o delay, mas não notei diferença.

  8. Olá,
    Gostei bastante do post.
    Gostaria de saber se você já fez ou sabe de algum sensor, de preferência sônico ou não invasivo, para medir volume?

  9. ola,eu fiz exatamente como esta no codigo acima,porem o sensor retorna apenas valores 1,2,3,4 CM, mesmo quando coloco um objeto numa distancia maior, vc sabe o que poderia estar errado ? obrigado

    • Bem, nesse caso, se voce tem certeza absoluta que toda a ligação do circuito esta certa e o código esta certo tambem. Existe a possibilidade de seu sensor ultrasonico estar com algum problema, digo isso porque tambem aconteceu comigo logo que comprei o kit arduino!

  10. Ola fiz exatamente o que vc fez e deu certo , agora estou tentando colocar um led pra acender quando a distancia for menor que 30 cm , outro pra acender uando for 50 cm , e otro pra 1 metro , mais estou embaralhado na programação . Pode me dar uma luz nisso?

    • É simples, basta usar a condição if() else. Um exemplo é:

      if(distancia < 30)
      {
      digitalWrite(pinoLED, HIGH);
      }
      else
      if(distancia == 50)
      {
      digitalWrite(pinoLED, HIGH)
      }
      else
      if(distancia == 100)
      {
      digitalWrite(pinoLED, HIGH)
      }
      else
      digitalWrite(pinoLED, LOW);

  11. Amg estou com um problema, quando tento compilar o exemplo que vem com a bilbioteca ocorre o seguinte erro: ‘Ultrasonic’ does not name a type . O que poderia ser? abracos

      • Olá, Estou com o mesmo problema do Saraceni.
        Quando mando compilar o cod ele exibe a mensagem ‘Ultrasonic’ does not name a type. Alguém pode me ajudar? Abraços

  12. Ola amigo, sou iniciate com o arduino, comprei um kit e veio o sensor ultrasonic, mas ate hje nao tinha faito funcionar, com suas dicas acabei de faze-lo funcionar, mas gostaria de outra dica se puder me ajudar, adicionar o display RT 162-7 16×2, se puder me ajudar agradeço…

  13. Obrigado amigo, funcinou perfeitamente… agora estou fazendo um outro progeto, com um acelerometro, estou contruindo um robo equilibrista tipo (SEGWEY) estou tentando fazer o programa, a parte mecanica ja esta quase toda pronta, se tiver alguma dica da programaçao…

  14. Boa tarde. Testei o sensor como vc ensinou e realmente funcionou. Você sabe me
    informar se ele informa a distância apenas em números inteiros, ou teria como mudar algo no código ou outra coisa para ele ler em números decimais? Queria uma precisão maior.

    Grato

  15. Desculpa cara, mas sou meio leigo e não entendi como fazer direito. Tem como explicar melhor com detalhes? Serei grato. Obrigado.

  16. Ou muda apenas na parte do código na IDE mesmo onde há:
    “int distancia = (ultrasonic.Ranging(CM));” no lugar de int, float? Ou eu to viajando total? rsrs

  17. Bom dia,
    Esse projeto também funciona com o sensor ultrasonico URM37? No caso de não funcionar, você teria algum projeto baseado neste modelo de sensor?

      • Pois é colega, pelo que eu entendi fiz a anteração nesta linha [int distancia = (ultrasonic.Ranging(CM)); ] , troquei para [float distancia = (ultrasonic.Ranging(CM)); ] ele mostra números inteiros, porem com duas casas decimais, só que com zero, por exemplo 10 cm, ele mostrou 10,00 cm. Então colega gostaria que ele mostrasse, por exemplo 10,3 cm, isto é possível de se fazer?

      • Bom colega, troquei a variavel para float neste ponto [int distancia = (ultrasonic.Ranging(CM));], mas mesmo assim não obtive exito, a medida passou apenas a ser, por exemplo, 10,00cm, É neste ponto que se faz a alteração?

      • gostaria dessa resposta também…
        no datasheet do sensor fala que ele mede distancia de 3mm a 5m…
        como faço pra medir 3mm ?

        nao deu certo mudar pra float… conforme o jcrepa disse.

  18. Olá, montei o projeto do ultrasonico e funcionou perfeito, mas teria como me tirar uma duvida, como eu faço para colocar mais de um sensor?
    Acretido que seja a questão de definir outros pinos como echo e trig além dos já definidos, mas como ficaria o programa?

  19. Oi.
    Tem ideia de como controlar um motor DC através da saída do arduíno ?
    Por exemplo fazer o motor parar se a distancia for menos que 5cm ?

  20. Parabens pelo artigo. Eu fiz e funcionou tudo certinho.

    Pode me dar uma luz pra eu poder trabalhar com essas distancias?
    Por exemplo: eu quero que acione um motor 127v quando o objeto estiver a 50cm do sensor.

  21. cara, fiz o codigo igualzinho como está ali em cima…
    o programa funcionou , só que fica aparecendo distancia = 0 cm…
    ou seja, ele nao está medindo.
    as conexões estão certas tambem.
    tem ideia de como concertar ? dá para testar o sensor para saber se está funcionando ? (pq comprei no mercado livre)

    Grato

  22. estou ligando certo aqui, mais dá erro direto e a luz amarela do arduino apaga ao conectar o pino 13 e o erro está abaixo:

    sketch_aug26a.ino:1:24: error: Ultrasonic.h: No such file or directory
    sketch_aug26a:5: error: ‘Ultrasonic’ does not name a type
    sketch_aug26a.ino: In function ‘void loop()’:
    sketch_aug26a:29: error: ‘ultrasonic’ was not declared in this scope
    sketch_aug26a:29: error: ‘CM’ was not declared in this scope

  23. Boa tarde,

    Quando tento compilar o mesmo aparece o seguinte erro:

    sensor_de_distancia.ino: In function ‘void loop()’:
    sensor_de_distancia:21: error: ‘class Ultrasonic’ has no member named ‘Ranging’
    sensor_de_distancia:21: error: ‘CM’ was not declared in this scope

  24. Amigo, sou novo no Arduino.
    Não consegui achar esse include “Ultrasonic.h” no local indicado.
    Achei um código semelhante a esse seu que não usa esse include.
    Compilei e funcionou de primeira.
    Não entendi … Poderia, por favor, me explicar ??

  25. Oi, eu estou fazendo um projeto e preciso de um sensor para arduino que detecte velocidade de uma roda de bicicleta. Se alguém souber qual o sensor e o Arduino adequado para isso, por favor, me responde.

    obrigado!

  26. Cara
    Tem como utilizar o ultrassom para passar um certo material e só dar resposta em material especifico?

  27. Ola amigo, estava olhando seu projeto, e achei um equivoco na sua formula, pois não entendi de onde veio o valor “120”.
    Obrigado pela atenção

  28. boa tarde, essa etapa ja consegui concluir , porem necessito converter as informações em porcentagem não em centímetros e tambem os parametros minimos e maximos de leitura , como devo proceder ?
    Grato
    Att. wesley

  29. Pingback: Sensor Ultrasónico HC-SR04 + Arduino Panama Hitek

  30. Já testei varios códigos e todos que tem int distancia = (ultrasonic.Ranging (CM) ; dá mensagem de erro.Como posso resolver isso ???

  31. firpinheiro bom dia quero tanto ver este projecto a funcionar mais ao verificar está a apresentar seguintes erros.
    sketch_sep21a.ino:1:24: error: Ultrasonic.h: No such file or directory
    sketch_sep21a:5: error: ‘Ultrasonic’ does not name a type
    sketch_sep21a.ino: In function ‘void loop()’:
    sketch_sep21a:29: error: ‘ultrasonic’ was not declared in this scope
    sketch_sep21a:29: error: ‘CM’ was not declared in this scope

    • Ultrasonic ultrader(4,5);
      Ultrasonic ultraiz(9,10);

      long microsec1 = 0;
      float distanciaCM1 = 0;
      long microsec2 = 0;
      float distanciaCM2 = 0;

      void setup(){
      Serial.begin(9600); //Inicializando o serial monitor

  32. ola amigo, estou precisando colocar o sensor em um tanque para ele enviar o sinal a um computadorl, porem o tanque é de aproximadamente 12 metros de altura, poderia me indicar sensor, materiais ou aonde posso contratar alguém que possa fazer o projeto pra mim, ou se você pode fazer o projeto?

  33. Bom dia, no meu projeto estou utilizando o sensor Hc’Sr04. Estou com um problema, pois quando não há obstáculos antes de 4m, o sensor faz medições estranhas(numero negativos) ou simplesmente ‘não mede nada’. Queria que o sensor não esperasse tanto tempo pelo retorno do sinal, Echo, e em um tempo periódico enviasse o Trigger independente do Echo receber ou não um sinal.
    O que posso fazer?
    Obrigado!

Deixar mensagem para ferpinheiro Cancelar resposta