Radar de reversão ultrassônico com Arduino

Tempo de leitura: 5 minutes

Metas

  • Conheça as características do sensor ultrassônico HC-SR04
  • Saiba como medir a distância com o sensor ultrassônico
  • Saiba como variar a frequência do brilho do LED de acordo com a distância
  • Saiba como calcular como filtrar um sinal com o filtro de média
  • Saber como criar e usar novas funções
  • Etc.

 

Princípio de trabalho

O miniprojeto é um radar reverso usado por carros. Permite ao condutor saber que se aproxima de um obstáculo (parede da garagem, outro carro, etc.). O indicador de proximidade pode ser um buzzer ou através de LEDs (três LEDs vermelho, verde e azul que acendem ao mesmo tempo). Aqui variamos a frequência de brilho em função da distância: quando um objeto se aproxima do sensor, os LEDs piscam rapidamente (alta frequência). Os LEDs piscam mais lentamente conforme o objeto se afasta do sensor. Neste projeto, definimos a distância máxima em 50 cm (500 mm). Ou seja, quando a distância for maior que 50 cm, os LEDs param de piscar. Eles começam a iluminar a partir de 50 cm. O projeto consiste principalmente em um sensor ultrassônico HC-SR04, três LEDs e uma placa Arduino. Sensor ultrassônico HC-SR04

Ligação de componentes

Sinal TRIG: Pino 3
Sinal ECHO: Pino 2
LED vermelho: 5
LED verde: 6
LED azul: 7

 

Como medir a distância?

A placa Arduino envia um pulso de duração igual a 10 µs no pino TRIG. O pulso gera uma onda ultrassônica do transmissor ultrassônico. O receptor escuta o retorno da onda ou do eco através do pino ECHO. A duração do pulso de retorno é proporcional à distância go + return do sinal de ultrassom e à distância de propagação de uma onda de ultrassom (veja a fórmula na função abaixo e o projeto do secador de mãos por ultrassom). Portanto, podemos deduzir a distância entre o emissor e o objeto. Deve-se observar que o sensor retorna um valor zero quando o objeto está muito próximo ou muito distante (ausência do objeto). A função GetDisCM() retorna a distância em mm.

float GetDisCM(int Echo_in_pinn, int Trig_out_pinn, double Speed_soundd)
{
  float Dist_milm=0.0;
  long HC_val=0; 
  
  // Disparo da medição com o envio de um pulso de 10 µs
  digitalWrite(Trig_out_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_out_pin, LOW);
  
  // Leia o tempo de ida e volta da onda
  HC_val = pulseIn(Echo_in_pin, HIGH, 30000);
    
  // Calcule a distância d (mm), V = d / t ==> v * t
  // O coeficiente 2 para a distância externa
  Dist_milm = (HC_val/2.0) * Speed_sound; 

  return Dist_milm;
}

 

Como fazer um LED piscar de acordo com a distância?

A área útil para o sensor é fixada em 500 mm (50 cm). Quando a distância > 50 cm, os três LEDs são zerados. Quando a distância = 50cm, variou o brilho de acordo com a distância. O truque usado é usar a função delay () que varia com a distância. O exemplo abaixo mostra como piscar um LED com uma frequência igual a 100 Hz (período de 10 ms).

while(1)
{
  LED=1;
  delay(5); 
  LED=0
  delay(5); 
}

Vemos que a função delay() recebe como entrada apenas uma constante, mas também uma variável! esta funcionalidade permite variar o tempo de espera de acordo com a distância. Basta usar a distância como um argumento de entrada para a função: delay(Distance) da seguinte maneira:

while(1)
{
  Ditance= leia a distance; 
  LED=1;
  delay(Ditance); 
  LED=0
  delay(Ditance); 
}

A função SetLED() posiciona os LEDs de acordo com a distância. A função também leva em consideração a limitação de distância de 50 cm. Também ignora os valores zero induzidos pela ausência do objeto ou pela presença de um objeto mais próximo.

void SetLED(float Dist_mmm, int LED_rr, int LED_gg, int LED_bb)
{
    if((Dist_mmm < 500) && (Dist_mmm != 0.0))
    {
      digitalWrite(LED_rr, HIGH);
      digitalWrite(LED_gg, HIGH);
      digitalWrite(LED_bb, HIGH);
      delay(floor(Dist_mmm));
      digitalWrite(LED_rr, LOW);
      digitalWrite(LED_gg, LOW);
      digitalWrite(LED_bb, LOW);
      delay(floor(Dist_mmm));
    }  
}

 

Como calcular o valor médio?

A função GetMean() retorna o valor médio da distância. O tamanho do filtro de média é variável (conforme o tamanho aumenta, o tempo de resposta aumenta, a precisão aumenta).

float GetMean(long Taille, int Echo_in_pinn, int Trig_out_pinn, double Speed_soundd)
{
  long i;
  float Distance_tmp, Mean_val=0.0,Somme=0.0; 
  for(i=0; i<Taille; i++)
  {
    Distance_tmp=GetDisCM( Echo_in_pinn,  Trig_out_pinn,  Speed_soundd);
    Somme=Somme+Distance_tmp; 
  }
  Mean_val=Somme/Taille; 
  return Mean_val;
}

Programa principal

// Variáveis ​​para HC-SR04
const int Echo_in_pin = 2; 
const int Trig_out_pin = 3;
float Dist_mm=0.0;

// Velocidade do som (mm / us)
const double Speed_sound = 340.0e-3;

// Configurações
const int LED_r=5;  
const int LED_g=6;  
const int LED_b=7;  

void setup() 
{    
    // Inicialização HC-SR04
    pinMode(Trig_out_pin, OUTPUT);
    pinMode(Echo_in_pin, INPUT);
    digitalWrite(Trig_out_pin, LOW);
  
    // Init interface série
    Serial.begin(115200); 

    // LEDs 
    pinMode(LED_r,OUTPUT);
    pinMode(LED_g,OUTPUT);
    pinMode(LED_b,OUTPUT);
    digitalWrite(LED_r, LOW);
    digitalWrite(LED_g, LOW);
    digitalWrite(LED_b, LOW);
}

void loop() 
{       

    /* Medir distância */
    Dist_mm=GetDisCM( Echo_in_pin,  Trig_out_pin,  Speed_sound); // Valor bruto
    //Dist_mm=GetMean(8,  Echo_in_pin,  Trig_out_pin,  Speed_sound); // Valor médio

    /* Exibição de distância */
    Serial.println(Dist_mm); 
    
    /* Ativação de LEDs */
    SetLED(Dist_mm, LED_r, LED_g, LED_b);
}

// Calcule a distância em mm
float GetDisCM(int Echo_in_pinn, int Trig_out_pinn, double Speed_soundd)
{
  float Dist_milm=0.0;
  long HC_val=0; 
  
  // Disparo da medição com o envio de um pulso de 10 µs
  digitalWrite(Trig_out_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_out_pin, LOW);
  
  // Leia o tempo de ida e volta da onda
  HC_val = pulseIn(Echo_in_pin, HIGH, 30000);
    
  // Calcule a distância d (mm), V = d / t ==> v * t
  // O coeficiente 2 para a jornada de ida
  Dist_milm = (HC_val/2.0) * Speed_sound; 

  return Dist_milm;
} 

// Valeur Moyenne 
float GetMean(long Taille, int Echo_in_pinn, int Trig_out_pinn, double Speed_soundd)
{
  long i;
  float Distance_tmp, Mean_val=0.0,Somme=0.0; 
  for(i=0; i<Taille; i++)
  {
    Distance_tmp=GetDisCM( Echo_in_pinn,  Trig_out_pinn,  Speed_soundd);
    Somme=Somme+Distance_tmp; 
  }
  Mean_val=Somme/Taille; 
  return Mean_val;
}

void SetLED(float Dist_mmm, int LED_rr, int LED_gg, int LED_bb)
{
    if((Dist_mmm < 500) && (Dist_mmm != 0.0))
    {
      digitalWrite(LED_rr, HIGH);
      digitalWrite(LED_gg, HIGH);
      digitalWrite(LED_bb, HIGH);
      delay(floor(Dist_mmm));
      digitalWrite(LED_rr, LOW);
      digitalWrite(LED_gg, LOW);
      digitalWrite(LED_bb, LOW);
      delay(floor(Dist_mmm));
    }  
}

 

 

Fotos do projeto

 

Conclusão

Neste artigo, mostrei como usar fazer um medidor de distancia usando Sensor Ultra sonico com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esse Sensor Ultrasonico. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.