domingo, 15 de maio de 2016

Como utilizar vários sensores ultrasonicos com o arduino

O Sensor Ultrassônico HC-SR04 é um componente muito comum em projetos com Arduino, e permite que você faça leituras de distâncias entre 2 cm e 4 metros, com precisão de 3 mm. Pode ser utilizado simplesmente para medir a distância entre o sensor e um objeto, como para acionar portas do microcontrolador, desviar um robô de obstáculos, acionar alarmes, etc.
Arduino e sensor ultrassônico HC-SR04
O funcionamento do HC-SR04 (datasheet) se baseia no envio de sinais ultrassônicos pelo sensor, que aguarda o retorno (echo) do sinal, e com base no tempo entre envio e retorno, calcula a distância entre o sensor e o objeto detectado.
HC-SR04 - Trigger e Echo
Primeiramente é enviado um pulso de 10µs, indicando o início da transmissão de dados. Depois disso, são enviado 8 pulsos de 40 KHz e o sensor então aguarda o retorno (em nível alto/high), para determinar a distância entre o sensor e o objeto, utilizando a equação Distância = (Tempo echo em nível alto * velocidade do som) /2
Diagrama de tempo HC-SR04
Para ligação do sensor ao microcontrolador, são utilizados 4 pinos: Vcc, Trigger, ECHO e GND.

CONECTANDO O SENSOR HC-SR04 AO ARDUINO

A ligação do sensor ao Arduino no nosso programa vai utilizar, além dos pinos de alimentação, ospinos digitais 4 para o Trigger, e para o Echo. A alimentação será feita pelo pino 5V do Arduino:
Circuito Arduino e HC-SR04
O programa usa a biblioteca Ultrasonic, que você pode baixar aqui. Descompacte a pasta Ultrasonic e coloque-a dentro da pasta LIBRARIES da IDE do Arduino.
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
//Programa: Conectando Sensor Ultrassonico HC-SR04 ao Arduino
//Autor: Eduardo
//Carrega a biblioteca do sensor ultrassonico
#include
//Define os pinos para o trigger e echo
#define pino_trigger 4
#define pino_echo 5
//Inicializa o sensor nos pinos definidos acima
Ultrasonic ultrasonic(pino_trigger, pino_echo);
void setup()
{
  Serial.begin(9600);
  Serial.println("Lendo dados do sensor...");
}
void loop()
{
  //Le as informacoes do sensor, em cm e pol
  float cmMsec, inMsec;
  long microsec = ultrasonic.timing();
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
  //Exibe informacoes no serial monitor
  Serial.print("Distancia em cm: ");
  Serial.print(cmMsec);
  Serial.print(" - Distancia em polegadas: ");
  Serial.println(inMsec);
  delay(1000);
}
No programa todo o cálculo é feito por meio da biblioteca Ultrasonic. O sensor é inicializado nos pinos trigger e echo, e depois efetuamos a leitura dos dados do sensor, atribuindo às variáveiscmMsec e inMsec os valores das distâncias em centímetros e polegadas, respectivamente. Os dados são mostrados no serial monitor:
Serial Monitor HC-SR04
Agora utilizando 4 sensores ultrasonicos no arduino :
#include #define pino_trigger 7 #define pino_trigger2 13 #define pino_trigger3 3 #define pino_trigger4 10 #define pino_echo 6 #define pino_echo2 12 #define pino_echo3 2 #define pino_echo4 11 //Inicializa o sensor nos pinos definidos acima Ultrasonic ultrasonic(pino_trigger, pino_echo);//sensor 1 Ultrasonic ultrasonic2(pino_trigger2, pino_echo2);//sensor 2 Ultrasonic ultrasonic3(pino_trigger3, pino_echo3);//sensor 3 Ultrasonic ultrasonic4(pino_trigger4, pino_echo4);//sensor 4 float s1;// variavel do tipo flutuante, sensor 1 float s2; float s3; float s4; void setup() { Serial.begin(9600); Serial.println("Lendo dados aguarde filho da puta..."); } void loop() { //Le as informacoes do sensor 1 long microsec = ultrasonic.timing(); s1 = ultrasonic.convert(microsec, Ultrasonic::CM); //Le as informacoes do sensor 2 long microsec2 = ultrasonic2.timing(); s2 = ultrasonic2.convert(microsec2, Ultrasonic::CM); //Le as informacoes do sensor 3 long microsec3 = ultrasonic3.timing(); s3 = ultrasonic3.convert(microsec3, Ultrasonic::CM); //Le as informacoes do sensor 4 long microsec4 = ultrasonic4.timing(); s4 = ultrasonic4.convert(microsec4, Ultrasonic::CM); delay(10); Serial.print("Distancia sensor 1: "); Serial.print(s1); Serial.print(" - Distancia sensor 2: "); Serial.print(s2); Serial.print(" - Distancia sensor 3: "); Serial.print(s3); Serial.print(" - Distancia sensor 4: "); Serial.println(s4);//println coloca eles em paralelo delay(10); }

18 comentários:

  1. código funcionando perfeitamente vlw pela ajuda

    ResponderExcluir
  2. Companheiro!!! Excelente trabalho, parabéns! perdi um dia tentando utilizar a biblioteca Newping dentro do meu projeto, pois falava-se que a Ultrasonic não trabalharia com mais de um sensor...ledo engano!!! Obrigado pela força!

    ResponderExcluir
  3. Olá boa tarde, se eu quiser apenas dois sensores é só eliminar as informações do 3 e 4? Att

    ResponderExcluir
    Respostas
    1. Sim, só tirar !! do mesmo modo se quiser colocar mais sensores é só acrescentar mais variáveis.

      Excluir
  4. ola boa noite estou tentando montar um projeto de estacionamento com 10 vagas usando sensor ultrassônico com biblioteca newping, primeiro tentei com um exemplo de 2 vagas e funcionou perfeitamente porem quando incremento as outras 8 utilizando a biblioteca que diz que posso usar ate 15 sensores mudando os valores que já vem da biblioteca para otimizar o projeto exemplo sensor1 34 e 35 sensor2 36 e 37 sensor3 38 e 39 nao funciona, vc poderia ajudar?

    ResponderExcluir
  5. como faço pra registrar os valore lidos pelos 4 sensores num cartao? ou no excel? é possivel?

    ResponderExcluir
  6. Usando os sensores juntos, um do lado do outro, funciona? Não dá interferência?

    ResponderExcluir
  7. man, vamos valorizar os criadores? esse código é baseado no código feito pelo Adilson Thomsen da filipe flop. custa nada dizer que se baseou nele.
    https://www.filipeflop.com/blog/sensor-ultrassonico-hc-sr04-ao-arduino/

    ResponderExcluir
  8. Cara curti mas no meu arduino o tempo de resposta ta demorando muito...
    Eu descobri que é a parte de leitura. Quando eu retiro ela o tempo volta ao normal mas se aparece la o tempo buga fica super lento.

    ResponderExcluir
  9. Como ficaria esses 4 cada um acionando um relé?

    ResponderExcluir
  10. Ola ao compilar no IDE arduino ele está apresentando 'class ultrasonic' has no member named 'timing'? gostaria de saber como resolvo isso

    ResponderExcluir
  11. como posso colocar uma condição if para acionar os leds para cada sensor?

    ResponderExcluir
  12. Cada sensor necessita do seu próprio trigger?

    ResponderExcluir
  13. " Lendo dados, aguarde filho da puta ... "
    kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

    ResponderExcluir