08 abril 2014

Sensor de estacionamento / ré com Arduino e sensor ultrasônico HC-SR04

No post de hoje vamos utilizar o Arduino juntamente com o sensor ultrasônico HC-SR04 para montar um sensor de estacionamento (ou sensor de ré), que emite um "bip" conforme o sensor se aproxima de um obstáculo. Quanto mais próximo o obstáculo, maior a frequência do bip.

Como (geralmente) uma imagem vale mais do que mil palavras, vamos dar uma olhada no sensor instalado em um trator, devidamente "emprestado" do sobrinho :-)



O circuito é composto apenas pelo Arduino, um sensor ultrasônico HC-SR04 e um buzzer, com uma resistência de 330 ohms para limitar a corrente.

Circuito Sensor de estacionamento com sensor ultrasonico HC-SR04
 
No programa, utilizei a biblioteca NEWTONE, que pode ser baixada nesse link e que eu já abordei nesse post.

O motivo de usar essa biblioteca é que a função TONE, normalmente usada para produzir sons com Arduino, apresenta conflito com a biblioteca Ultrasonic, também utilizada nesse projeto.

O som do bip pode ser alterado conforme a necessidade, alterando o valor das variáveis frequencia e tempo, setadas no começo do programa.

O pino Trigger do sensor vai ligado ao pino 13 do Arduino, e o pino Echo do sensor vai ligado ao pino 10 do Arduino. A alimentação do sensor é de 5 volts. O buzzer vai na porta 2 do Arduino.

A variável cmMsec armazena o valor da distância entre o sensor e o obstáculo. Uma série de comandos IF verificam o valor de cmMsec e atualizam a variável atraso, que é utilizada no final do programa para determinar a frequência de acionamento do bip.

Os valores lidos pelo sensor também podem ser acompanhados pelo serial monitor e, com algumas alterações no programa, exibidos em um display.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Programa : Sensor de estacionamento com HC-SR04  
// Autor : Arduino e Cia  
   
#include <Ultrasonic.h>   //Carrega a biblioteca Ultrasonic  
#include <NewTone.h>    //Carrega a biblioteca Newtone  
   
//Dados do buzzer  
#define tempo 500   
int frequencia = 2000;   
int Pinofalante = 2;   
    
int atraso = 1000;  
   
//Define o pino do Arduino a ser utilizado com o pino Trigger do sensor  
#define PINO_TRIGGER 13   
//Define o pino do Arduino a ser utilizado com o pino Echo do sensor  
#define PINO_ECHO   10   
   
//Inicializa o sensor ultrasonico  
Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO);   
   
void setup()  
{  
  pinMode(Pinofalante,OUTPUT); //Pino do buzzer   
  Serial.begin(9600); //Inicializa a serial  
}  
   
void loop()  
{  
  float cmMsec, inMsec;  
    
  //Le os dados do sensor, com o tempo de retorno do sinal  
  long microsec = ultrasonic.timing();   
   
  //Calcula a distancia em centimetros  
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);   
    
  //Ajusta o atraso de acordo com a distancia  
  if (cmMsec > 80)  
  {  
    atraso = 2000;  
  }  
  else if (cmMsec >50 && cmMsec<80)  
  {  
    atraso = 1500;  
  }  
  else if (cmMsec >30 && cmMsec<50)  
  {  
    atraso = 1200;  
  }  
  else if (cmMsec > 10 && cmMsec < 30)  
  {  
    atraso = 700;  
  }  
  else if (cmMsec < 10)  
  {  
    atraso = 300;  
  }  
     
  //Apresenta os dados, em centimetros, na Serial  
  Serial.print("Cent: ");  
  Serial.print(cmMsec);  
  Serial.print(" atraso : ");  
  Serial.println(atraso);  
  //Emite o bip  
  NewTone(Pinofalante, frequencia, tempo);   
   
  delay(atraso);  
} 

Podem ser adicionados outros comandos IF para melhorar a "precisão" do sensor, ou até mesmo ser utilizada outra solução para calcular o valor do delay. Uma sugestão seria a utilização da função map, por exemplo.

Por enquanto é isso. Já posso devolver o trator para o dono. :-)

60 comentários:

  1. Olá! Parabéns pelo post!

    Por favor, poderia me esclarecer uma dúvida? Quando tento carregar o programa no Arduino, a IDE apresenta a seguinte mensagem de erro:

    "class Ultrasonic has no member named timinng"

    E aponta para a linha onde está o comando:

    long microsec = ultrasonic.timing();


    O que poderia estar causando este erro?

    Desde já agradeço!

    ResponderExcluir
    Respostas
    1. Oi Leandro,

      Por favor veja se não tem nada errado no programa, a mensagem que ele está apresentando é realmente essa, como "timinng" escrito errado ?

      Abraço.

      Excluir
    2. Ah... Na verdade na mensagem de erro aparece escrito timing com um 'n' só...

      Será que é um erro nas bibliotecas??? A biblioteca Ultrasonic que baixei neste site está na extensão .tar. Será que não pode ser isso???

      Excluir
    3. Oi Leandro,

      Você descompactou o arquivo .tar, correto ?

      Pode ser uma biblioteca diferente da que foi utilizada no post, existem várias bibliotecas Ultrasonic, e as funções podem ter sido escritas de forma diferente.

      A que estou usando eu baixei desse link :

      http://freecode.com/urls/f05d8c56e9a2b61313a757a6cfb3bdf5

      Veja que depois de descompactada, essa biblioteca gera a pasta HCSR04Ultrasonic. Renomeie a pasta apenas para "Ultrasonic".

      Abraço !

      Excluir
    4. Olá!

      Realmente o problema estava sendo causado por incompatibilidade da biblioteca. É que a pasta desse link está compactada duas vezes. E uma compactação foi feita na extensão .gz e outra na .tar.


      Agora deu certo! Muito obrigado!

      Excluir
    5. Legal Leandro !

      Que bom que deu certo. Se precisar de algo, estamos aí.

      Abraço !

      Excluir
  2. parabens pelo post.
    gostaria de saber como faço quando tenho duas condiçoes .
    ex distancia menor que 50 cm e tempo que o objeto permaneceu na frente do sensor superior a 3 s.
    obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde Camila,

      Você pode colocar um contador de tempo dentro do IF, e se atingir o tempo que você precisa ele toma alguma ação.

      Abraços.

      Excluir
  3. Olá Arduíno e Cia,

    Estou precisando de ajuda. Como farei para que o buzzer somente funcione quando o ultrasônico identificar algum obstaculo á frente? Caso contrario o buzzer permaneça desligado.

    Grato.

    ResponderExcluir
    Respostas
    1. Bom dia Willian,

      Faça um IF simples, que testa quando o valor de cmMsec for maior do que zero, ele aciona o buzzer. Exemplo :

      if (cmMsec > 0)
      {
      NewTone(Pinofalante, frequencia, tempo);
      }
      else
      {
      noNewTone();
      }

      Abraço !

      Excluir
    2. gostaria que so acione o buzzer quando identificar um objeto, vc deu o exemplo mas nao consegui implementar no codigo, como faço?

      Excluir
    3. Oi Carlos,

      Tente o circuito do programa desse artigo, implementando o IF que eu citei acima :

      http://www.arduinoecia.com.br/2013/05/medidor-de-distancia-com-o-sensor.html

      Se não conseguir, volte aqui e poste o código que eu te ajudo, ok ?

      Abraço !

      Excluir
  4. Como faço para quando chegar muito perto do sensor ultrassonico ele desliga o buzzer? e tambem só acionar o buzzer quando identificar algum objeto?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Use para isso os comandos IF. Por exemplo. Se CM > 0 significa que ele detectou algum objeto, e assim vc pode acionar alguma porta do Arduino.Para parar o buzzer, use o comando noNewTone().

      Abraço !

      Excluir
  5. pode me ajudar com esse codigo

    // Programa : Sensor de estacionamento com HC-SR04
    // Autor : Arduino e Cia
    float sinVal;
    int toneVal;
    #include //Carrega a biblioteca Ultrasonic
    #include //Carrega a biblioteca Newtone

    //Dados do buzzer
    #define tempo 500
    int frequencia = 40000;
    int Pinofalante = 2;


    int atraso = 1000;

    //Define o pino do Arduino a ser utilizado com o pino Trigger do sensor
    #define PINO_TRIGGER 13
    //Define o pino do Arduino a ser utilizado com o pino Echo do sensor
    #define PINO_ECHO 10

    //Inicializa o sensor ultrasonico
    Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO);

    void setup()
    {
    pinMode(Pinofalante,OUTPUT); //Pino do buzzer
    Serial.begin(9600); //Inicializa a serial
    }

    void loop()
    {

    float cmMsec, inMsec;

    //Le os dados do sensor, com o tempo de retorno do sinal
    long microsec = ultrasonic.timing();

    //Calcula a distancia em centimetros
    cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

    //Ajusta o atraso de acordo com a distancia


    //Apresenta os dados, em centimetros, na Serial
    Serial.print("Cent: ");
    Serial.print(cmMsec);
    Serial.print(" atraso : ");
    Serial.println(atraso);
    //Emite o bip
    if (cmMsec < 180)
    {
    for (int x=0; x<180; x++) {
    // converte graus para radianos, e depois obtém o valor do seno
    sinVal = (sin(x*(3.1416/180)));
    // gera uma frequência a partir do valor do seno
    toneVal = 2000+(int(sinVal*1000));
    tone(Pinofalante, toneVal);
    delay(2);
    }
    }
    else
    {
    noNewTone();
    }
    }

    sempre depois que ele toca o alarme o noNewtone nao o desliga fica tocando um bipe continuo

    ResponderExcluir
    Respostas
    1. Boa noite,

      Você está misturando o tone com o NewTone, tente alterar essa linha :

      tone(Pinofalante, toneVal);

      para

      NewTone(Pinofalante, toneVal);

      Abraço !

      Excluir
  6. nao tenho um resistor de 330ohms posso utilizar um de 300?

    ResponderExcluir
  7. No meu estão aparecendo os seguintes erros:
    sketch_apr03a.cpp: In function ‘void loop()’:
    sketch_apr03a.cpp:36:30: error: ‘class Ultrasonic’ has no member named ‘timing’
    sketch_apr03a.cpp:39:23: error: ‘class Ultrasonic’ has no member named ‘convert’
    sketch_apr03a.cpp:39:53: error: expected unqualified-id before numeric constant
    O que pode ser isso? Fiz tudo de acordo com o código (Copiada e colada básica) Instalei as bibliotecas, e mesmo assim não consigo achar o erro. :/

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Verifiquei e aqui compilou normalmente... Você tem outra versão de IDE para testar ? Pode ser algum conflito com outra biblioteca.

      Abraço.

      Excluir
  8. Boa noite,

    Qual o modelo do buzzer que você utilizou?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Um desses comuns de computador. Peguei de uma CPU velha. :)

      Abraço !

      Excluir
  9. Como posso criar um forma de desligar e ligar o sensor para que ele não fique apitando quando um carro parar atras de mim no transito?

    ResponderExcluir
    Respostas
    1. Boa tarde Diego,

      Você pode fazer com que o sensor funcione apenas quando o carro estiver em movimento, por exemplo, pois a princípio é um sensor de estacionamento, e não de proximidade, assim você pode usar um outro sensor para ver se o carro está se movimentando ou não.

      Acho que essa é a melhor maneira. Abraço !

      Excluir
    2. Eh bem simples, coloque um resistor ligado a lampada de Ré no positivo de 100k e quando você acionar a macha ré funcionará perfeitamente, mas não esqueça de declarar a variavel para se ter a resposta no arduino.

      Excluir
    3. Crie um Rotina de ativação do arduino, e,coloque um resitor de 100 k na lampada de macha ré.

      Excluir
  10. Ola amigo estou tendo esse erro aqui
    sketch_may25a:20: error: 'Ultrasonic' does not name a type
    sketch_may25a.ino: In function 'void loop()':
    sketch_may25a:33: error: 'ultrasonic' was not declared in this scope
    sketch_may25a:36: error: 'Ultrasonic' has not been declared
    sketch_may25a:66: error: 'NewTone' was not declared in this scope
    declaro a bibliotecas as variaveis ate fiz o download nos links passado mas o erros continuam tem como me ajudar ?

    ResponderExcluir
  11. Ola
    Montei um Drone e gostaria de coloco sensor ultrasonico e controlar ele de longe, para quando ele estiver proximo de bater ele emite um son no buzzer que estara no controle e não nele.
    Tem como me ajudar? eu ja tentei varias coisas só que não estou conseguindo fazer funcionar.

    Agradecido

    ResponderExcluir
    Respostas
    1. Boa noite,

      Interessante essa idéia. Como você está pensando em mandar os dados do drone para o controle ?

      Abraço !

      Excluir
    2. Comprei um drone pronto para aprender melhor pois não sabia nada.
      Entao comprei dois nrf24l01 e um arduino pro mini e consigo ligar led, motor e brincar de longe com dois nrf e dois arduinos, mas oque pretendo mesmo até mês que vem para apresentar o inicio do projeto, não estou conseguindo, que é colocar os sensores ultrasônicos HC-SR04 no drone e quando o drone estiver para bater ele envie um sinal via nrf para o outro nrf com arduino ligar o buzzer igual o programa de voces só que via nrf e não estou conseguindo.
      Tem como me ajudar?

      Excluir
  12. Amigo, não estou conseguindo fazer o seguinte, quero que objetos acima de 1 metro o buzzer fique desligado, começe apitar somente abaixo de 100cm. vi um exemple que deu num comentário mas não consegui implementar. pode me aajudar ?
    obrigado

    ResponderExcluir
    Respostas
    1. Boa noite,

      Faça um loop com apenas um IF, mais ou menos assim:

      if (cmMsec < 100)
      {
      NewTone(Pinofalante, frequencia, tempo);
      }

      Abraço!

      Excluir
  13. Boa noite, qual o problema do meu código ? eu quero que o bip seja soado somente quando tiver algum obstáculo perto do sensor, mas ele está soando sem parar. Poderia me ajudar ? Desde já obrigado!
    *Tentei testar se cmMsec for igual a zero ele desliga o sensor, mas não funcionou
    #include //Carrega a biblioteca Ultrasonic
    #include //Carrega a biblioteca Newtone

    //Dados do buzzer
    #define tempo 500
    int frequencia = 2000;
    int Pinofalante = 2;

    int atraso= 1000;
    //Define o pino do Arduino a ser utilizado com o pino Trigger do sensor
    #define PINO_TRIGGER 13
    //Define o pino do Arduino a ser utilizado com o pino Echo do sensor
    #define PINO_ECHO 10

    //Inicializa o sensor ultrasonico
    Ultrasonic ultrasonic(PINO_TRIGGER, PINO_ECHO);

    void setup()
    {
    pinMode(Pinofalante,OUTPUT); //Pino do buzzer
    Serial.begin(9600); //Inicializa a serial
    }

    void loop()
    {
    float cmMsec, inMsec;

    //Le os dados do sensor, com o tempo de retorno do sinal
    long microsec = ultrasonic.timing();

    //Calcula a distancia em centimetros
    cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);


    if (cmMsec == 0)
    {
    noNewTone();
    }

    //Ajusta o atraso de acordo com a distancia
    if (cmMsec > 80)
    {
    atraso = 1000;
    } else if (cmMsec >50 && cmMsec<80)
    {
    atraso = 1500;
    }
    else if (cmMsec >30 && cmMsec<50)
    {
    atraso = 1200;
    }
    else if (cmMsec > 10 && cmMsec < 30)
    {
    atraso = 700;
    }
    else if (cmMsec < 10)
    {
    atraso = 300;
    }

    //Apresenta os dados, em centimetros, na Serial
    Serial.print("Cent: ");
    Serial.print(cmMsec);
    Serial.print(" atraso : ");
    Serial.println(atraso);
    //Emite o bip
    NewTone(Pinofalante, frequencia, tempo);

    delay(atraso);
    }

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Utilize apenas um IF no código, ficaria mais ou menos assim:

      if (cmMsec > 0 && cmMsec < 30) /distancia maior do que 0 e menor do que 30cm
      {
      NewTone(Pinofalante, frequencia, tempo);
      }

      Abraço !

      Excluir
    2. scope
      sketch_oct02b:39: error: expected ';' before 'maior'
      invalid suffix "cm" on integer constant

      Excluir
  14. Parabens amigo me ajudou muito consegui quase terminar meu tcc estou com 2 sensores como seria a programação?desde ja agradeço obs:ja tentei editar assim

    #define PINO_TRIGGER 8

    #define PINO_TRIGGER 13

    #define PINO_ECHO 9

    #define PINO_ECHO 10

    Mas so reconheçe 1 sensor desde ja agradeço abraçs

    ResponderExcluir
  15. Boa Tarde, preciso de uma ajuda, eu copiei o seu código só que ta dando um erro:

    C:\Users\Brenno\Downloads\arduino-0022\arduino-0022\libraries\NewTone\NewTone.cpp: In function 'void NewTone(uint8_t, long unsigned int, long unsigned int)':
    C:\Users\Brenno\Downloads\arduino-0022\arduino-0022\libraries\NewTone\NewTone.cpp:25: error: 'digitalPinToBitMask' was not declared in this scope
    C:\Users\Brenno\Downloads\arduino-0022\arduino-0022\libraries\NewTone\NewTone.cpp:26: error: 'digitalPinToPort' was not declared in this scope
    C:\Users\Brenno\Downloads\arduino-0022\arduino-0022\libraries\NewTone\NewTone.cpp:26: error: 'portOutputRegister' was not declared in this scope
    C:\Users\Brenno\Downloads\arduino-0022\arduino-0022\libraries\NewTone\NewTone.cpp:27: error: 'portModeRegister' was not declared in this scope

    o que faço?

    ResponderExcluir
  16. Ola, estou desenvolvendo um detector de cores para deficientes visuais, entao precisa ser com modulo de voz, estou usando o modulo IS1820 e preciso que ele fale determinada cor quando detectada pelo codigo rgb, estou usando o sensor ColorPal2838, ja programei o sensor, porem nao sei como fazer o modulo reproduzir o que eu programar no arduino, Grande abrac!!!

    ResponderExcluir
    Respostas
    1. Bom dia,

      O IS1820 só vai reproduzir o que está gravado na memória, sem que você possa escolher qual parte da gravação vc quer.

      Acho que o mais indicado seria o WTV-020, gravando o arquivo de som de cada cor em um arquivo separado:

      http://www.arduinoecia.com.br/2015/06/modulo-mp3-wtv020-sd-arduino.html

      Abraço!

      Excluir
  17. Uma duvida,
    Como poderia colocar um botão liga-desliga ?

    ResponderExcluir
  18. Boa tarde fiz toda a programação so que quando vou carregar ele mostra isso e n carrega na placa e aparece isso aqui.

    ''O sketch usa 5.698 bytes (17%) de espaço de armazenamento para programas. O máximo são 32.256 bytes.''
    Variáveis globais usam 253 bytes (12%) de memória dinâmica, deixando 1.795 bytes para variáveis locais. O máximo são 2.048 bytes.

    o que seria isso?

    ResponderExcluir
    Respostas
    1. Bom dia Tales,

      São apenas informações sobre a quantidade de memória e recursos que o programa ocupa.

      A IDE apresenta alguma mensagem de erro ?

      Abraço!

      Excluir
  19. Boa Tarde. Parabéns pelo post...
    Gostaria de dar uma finalidade pratica para o projeto, adaptando o sensor aa luz de ré do carro, ligando assim somente quando engatasse a marcha aa ré. Minha duvida é se o hc-sr04, pode ficar com os dois sensores expostos as intempéries como chuva e temperatura do asfalto, visto que se eu colocar o sensor dentro de uma caixa hermetica ele não vai funcionar...

    ResponderExcluir
    Respostas
    1. Boa tarde Majela,

      Realmente acho que não aguenta, apesar que nunca testei com vidro/acrilico, já que ele tem uma distância mínima de detecção (3 cm, se não me engano). Nesse caso, não sei o que aconteceria se você colocasse um vidro dentro dessa distância mínima. Vou testar.

      Existem outros sensores ultrassonicos que eu creio que sejam mais adequados, mas eu não testei com Arduino:

      https://www.sick.com/br/pt/sensores-de-distancia/sensores-de-ultrassom/c/g185671

      Abraço!

      Excluir
    2. arduino e cia, Tem como disponibilizar o link da biblioteca #include do seu projeto, pois aqui eu to usando esta dando erro e não reconhece algumas funções do código.
      desde já agradeço e parabéns pelo projeto.

      Excluir
    3. arduino e Cia, tem como esta disponibilizando o link da biblioteca #include que você esta utilizando no projeto, por que o que eu estou usando esta dando erro e não reconhece algumas funções do código.
      desde ja agradeço.

      Excluir
    4. Oi Ronielson,

      É a biblioteca newtone ? Já atualizei o link da biblioteca no post.

      Abraço!

      Excluir
  20. Boa tarde... o link q vc deixou da sua bib do Sensor Ultra sonico, está fora.. e as que eu tenho nenhuma é compativel, provavelmente a variável é diferente :P
    poderia disponibilizar por favor? grato desde já,
    att Will Gasperi

    ResponderExcluir
    Respostas
    1. Bom dia,

      Tente este link, por favor: http://freecode.com/projects/hc-sr04-ultrasonic-arduino-library

      Abraço!

      Excluir
  21. Boa tarde!

    Saberia me dizer como utilizar este sensor para a seguinte situação: o meu obstáculo está atrás de uma parede, portanto não quero captar o primeiro eco (da parede) mas sim o segundo, do objeto que está atrás dela.
    Obrigado

    ResponderExcluir
    Respostas
    1. Boa noite,

      Hummm.. vc quer um sinal que "atravesse" parede ?

      Excluir
    2. Bom dia!
      Isso, justamente como um ultrassom, utilizado para ultrassonografia. Acredito que o som emitido por este sensor já atravessa a parede e este mesmo som enviado também retorna ao sensor, porém não sei como captar este som ... que vem mais fraco ... demora um pouco mais... dependendo de vários fatores, como a espessura e material da parede e do obstáculo que está do outro lado.

      Sabe se tem como captar este som mais fraco e mais demorado que o sensor recebe de eco?

      Obrigado
      Davi

      Excluir
    3. Oi Davi,

      Eu já vi sensores ultrassonicos que podem "enxergar" através da parede, mas creio que com o HC-SR04, especificamente, não seja possível.

      Vamos ver se algum outro leitor do blog pode te ajudar com esse assunto. :)

      Abraço!

      Adilson

      Excluir
    4. Sim Adilson, vamos aguardar. Você lembra que sensores eram estes?

      Obrigado
      Davi

      Excluir
    5. Não lembro direito, mas era um sensor industrial, e bem caro, inclusive.

      Vou ver se acho a referência aqui em algum canto.

      Abraço!

      Excluir
  22. Eu gostaria de saber como faço pra inicialmente, em:

    if (cmMsec > 80)
    {
    atraso = 2000;

    ao invés de um atraso de 2000 eu silenciasse o buzer, para q ele começasse a bipar apenas a partir do intervalo (cmMsec >50 && cmMsec<80)

    ResponderExcluir
  23. Ola. Como seria o programa se eu colocasse o sensor barométrico BMP 180 no lugar do ultrasônico.

    abaço

    ResponderExcluir