Sensor Ultrassom HC-SR04

505 Flares Twitter 0 Facebook 505 Google+ 0 505 Flares ×

O sensor ultrassom é amplamente utilizado em aplicações onde se deseja medir distâncias ou evitar colisões, como na robótica móvel e de reabilitação. Nesse tutorial utilizaremos o sensor ultrassom HC-SR04 disponível em nossa loja.

Princípio de Funcionamento

Tudo começa pela emissão de um pequeno pulso sonoro de alto frequência que se propagará na velocidade do som do meio em questão. Quando este pulso atingir um objeto, um sinal de eco será refletido para o sensor. A distância entre o sensor e o objeto pode então ser calculada se soubermos o tempo entre a emissão e a recepção do sinal e a velocidade do som no meio em questão. Como mostra a Figura 1.

HC-SR04 sensor ultrassom
Figura 1 – Princípio de Funcionamento sensor ultrassom

Utilizando o HC-SR04 no Arduino

Para iniciarmos uma medição, o pino Trig deve receber um pulso de 5V por pelo menos 10 us. Isso fará com que o sensor emita 8 pulsos ultrassônicos em 40kHz e inicie a espera pelas ondas refletidas. Assim  que uma onda refletida for detectada, o pino Echo que estava em 0V será alterado para 5V por um período igual ao tempo de propagação da onda.

  • Para uma melhor medição da distância, a área do objeto na qual a onda será refletida deve ser de pelo menos 0,5 m^2.

Pinagem e Exemplo de Conexão

O HC-SR04 possui 4 pinos sendo eles:

  1. Vcc – Deve ser conectado a um pino 5V do Arduino.
  2. Trig – Deve ser conectado a um pino digital configurado como saída. Utilizaremos o pino 10.
  3. Echo – Dever ser conectado a um pino digital configurado como entrada. Utilizaremos o pino 9.
  4. Gnd – Dever ser conectado a um pino GND do Arduino.

Exemplo de Código 1 – Nível Básico

Nesse exemplo utilizaremos a biblioteca Ultrasonic.h (Clique aqui para baixar). A utilização dessa biblioteca é bastante simples:

Primeiro devemos incluir a biblioteca. Para saber como incluir uma biblioteca, visite o post Sensores DHT e Uso de Bibliotecas.

Devemos definir o nome do sensor e em quais pinos estão conectados o trig e o echo . No exemplo a seguir, o nome do sensor é ultrassom, o trig está conectado na porta 12 e o echo na porta 13.

Ultrasonic ultrassom(12,13);

Para ler a distância, basta chamar a função ultrassom.Ranging(CM). Para valor em centímetros usar CM e para valor em polegadas usar INC. Essa função retorna um valor de variável long.

long distancia = ultrassom.Ranging(CM); // distancia recebe o valor medido em centímetros

Veja um exemplo de código:

#include <Ultrasonic.h>
 Ultrasonic ultrassom(12,13); // define o nome do sensor(ultrassom)
//e onde esta ligado o trig(12) e o echo(13) respectivamente

 void setup() {
 Serial.begin(9600); //Habilita Comunicação Serial a uma taxa de 9600 bauds.
 long distancia;
 }
 void loop()
 {
   distancia = ultrassom.Ranging(CM);// ultrassom.Ranging(CM) retorna a distancia em centímetros(CM) ou polegadas(INC)
   Serial.print(distancia); //imprime o valor da variável distancia
   Serial.println("cm");
   delay(100);
 }

Exemplo de Código 2 – Nível Intermediário

Nesse exemplo utilizaremos uma abordagem na qual o microcontrolador ficará bloqueado enquanto faz a medida de posição, ou seja, enquanto estiver realizando uma medição de distância não irá executar outras instruções. Para isso utilizaremos a função pulseIn() da biblioteca padrão do Arduino. Essa função mede comprimento de um pulso em um determinado pino e retorna o respectivo tempo em microssegundos.

const uint8_t trig_pin = 10;
const uint8_t echo_pin = 9;

uint32_t print_timer;

void setup() {
  Serial.begin(9600); // Habilita Comunicação Serial a uma taxa de 9600 bauds.

  // Configuração do estado inicial dos pinos Trig e Echo.
  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);
  digitalWrite(trig_pin, LOW);
}

void loop() {
  // Espera 0,5s (500ms) entre medições.
  if (millis() - print_timer > 500) {
    print_timer = millis();

    // Pulso de 5V por pelo menos 10us para iniciar medição.
    digitalWrite(trig_pin, HIGH);
    delayMicroseconds(11);
    digitalWrite(trig_pin, LOW);

    /* Mede quanto tempo o pino de echo ficou no estado alto, ou seja,
    o tempo de propagação da onda. */
    uint32_t pulse_time = pulseIn(echo_pin, HIGH);

    /* A distância entre o sensor e o objeto será proporcional a velocidade
      do som no meio e a metade do tempo de propagação. Para o ar na
      temperatura ambiente Vsom = 0,0343 cm/us. */
    double distance = 0.01715 * pulse_time;

    // Imprimimos o valor na porta serial;
    Serial.print(distance);
    Serial.println(" cm");
  }
}

Exemplo de Código 3 – Nível Avançado

Nesse exemplo utilizaremos uma abordagem na qual o microcontrolador não precisará ficar bloqueado enquanto faz a medida de posição pois utilizaremos a interrupção por mudança de estado (PCINT) para medir o tempo do pulso de eco.

const uint8_t trig_pin = 10;
const uint8_t echo_pin = 9;

volatile uint32_t pulse_time;
volatile bool done = 1; // Indica se a medição está pronta para impressão;
uint32_t print_timer;

void setup() {
  Serial.begin(9600); // Habilita Comunicação Serial a uma taxa de 9600 bauds.

  // Configuração do estado inicial dos pinos Trig e Echo.
  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);
  digitalWrite(trig_pin, LOW);

  cli();
  PCICR |= (1 << PCIE0);
  PCMSK0 |= (1 << PCINT1); // Ativa PCINT no pino 9.
  sei();
}

ISR(PCINT0_vect) {
  if (PINB & (1 << PINB1)) { // D9 mudou de LOW para HIGH;
    pulse_time = micros();
  }
  else { // D9 mudou de HIGH para LOW;
    /* Mede quanto tempo o pino de echo ficou no estado alto, ou seja,
       o tempo de propagação da onda. */
    pulse_time = micros() - pulse_time;
    done = 1;
  }
}

void loop() {
  // Espera 0,5s (500ms) entre medições.
  if (millis() - print_timer > 500 && done == 1) {
    print_timer = millis();

    /* A distância entre o sensor e o objeto será proporcional a velocidade
       do som no meio e a metade do tempo de propagação. Para o ar na
       temperatura ambiente Vsom = 0,0343 cm/us. */
    double distance = 0.01715 * pulse_time;

    // Imprimimos o valor na porta serial;
    Serial.print(distance);
    Serial.println(" cm");

    // Pulso de 5V por pelo menos 10us para iniciar medição.
    digitalWrite(trig_pin, HIGH);
    delayMicroseconds(11);
    digitalWrite(trig_pin, LOW);

    done = 0;
  }
}

505 Flares Twitter 0 Facebook 505 Google+ 0 505 Flares ×

Rodolfo Picoreti

Estudante de Engenharia Elétrica e integrante do PET Elétrica UFES.

You may also like...