0

Como Ligar o Sensor Distancia Ultrassom HC-SR04 ao Arduino

O Sensor Distancia Ultrassom HC-SR04 é bastante utilizado em aplicações onde se deseja medir distâncias ou evitar colisões, como na robótica móvel e de reabilitação. Neste tutorial utilizaremos o Sensor Ultrassom HC-SR04 que podem adquirir na ElectroFun.

Princípio de Funcionamento

Tudo começa pela emissão de um pequeno impulso sonoro de alta frequência que se propagará na velocidade do som. Quando este impulso 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 imagem abaixo.
 

Princípio de Funcionamento Sensor ultrassom


 

Utilizando o HC-SR04 no Arduino

Para iniciarmos uma medição, o pino Trig deve receber um impulso de 5V por pelo menos 10us. 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 detetada, 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 de uma superficie de 0,5 metros quadrados.

 

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

Neste exemplo utilizaremos a biblioteca Ultrasonic.h (Clique aqui para download). 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

Neste 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

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

 
Artigo gentilmente cedido por Vida de Silicio
 

Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.

Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.

Não se esqueçam de fazer like na nossa Página no Facebook.

Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?

Comments

Comentários

mariana guedes

Deixar uma resposta