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); }

2 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