Quando se pensa em dar visão aos projetos, o componente mais utilizado é o sensor ultrassônico. Para utilizar ele com o Arduino não é muito complicado, pois existem bibliotecas que disponibilizam comandos simples para fazer essa interação. Entretanto, nesse post, vamos aprender sobre o funcionamento desse sensor e como utilizá-lo sem bibliotecas (muito fácil).

Para ter um entendimento aprofundado do assunto, recomendo que leia o post sobre efeito piezoelétrico.

O que é

O sensor de distância ultrassônico, como o próprio nome diz, é um sensor capaz de medir a distância dele até um objeto que esteja na sua frente. O sensor mais comum para utilizar com o Arduino é o HC-SR04 da imagem abaixo.

sensor ultrassonico HC-SR04

Também é possível encontrar o sensor PING))) da Parallax:

Fonte: Parallax

Os dois sensores tem a mesma essência de funcionamento, a mudança significativa está no número de pinos utilizados para enviar e receber os sinais. Mais abaixo, essas diferenças serão discutidas.

O sensor ultrassônico é capaz de fornecer medidas de distância consideravelmente precisas sem a necessidade de contato. E suas medições vão de 2 cm a 3 m (4m no HC-SR04) e em um ângulo máximo de 15º. Quando comparado com os sensores infravermelhos, o ultrassônico é mais versátil por não ser influenciado pela luz do ambiente. Portanto ele pode ser usado em ambientes diversos.

Funcionamento

Seu funcionamento se dá graças a duas partes importantes: uma emissora (Trigger) e uma receptora (Echo). Nas imagens acima, essas partes são os cilindros metálicos com uma grade na ponta. Essas duas partes possuem, basicamente, células piezoelétricas. No caso, o Trigger vibra a uma frequência de 40KHz (ouvido humano não é capaz de sentir) e gera ondas ultrassônicas e o Echo recebe essas vibrações.

Ele opera da seguinte forma: as ondas geradas pelo Trigger são projetadas para frente e batem em um objeto; as ondas que batem no objeto são refletidas e voltam para o sensor; as ondas retornadas são sentidas pelo Echo. Com isso, é possível saber a distância do objeto com base no tempo que as ondas demoram para ir e voltar.

Sensor HC-SR04

Esse sensor possui 4 pinos:

  • Gnd – Pino onde deve ser ligado o Gnd (Ground ou o terra) do Arduino
  • Vcc – Pino onde deve ser ligado o 5v (alimentação) do Arduino
  • Trigger – Pino onde os dados são enviados para começar a medição
  • Echo – Pino que retorna a distância medida

Para começar a medição, é necessário enviar um pulso (nível lógico alto) de 10µs para o pino Trigger. Depois disso, o próprio sensor emite 8 pulsos de 40Khz para gerar as ondas. E, depois de rebatida em algum objetivo, elas são recebidas no Echo e o módulo conta o tempo que demorou desde a emissão da onda até seu retorno. E, por fim, o sensor envia essa distância em forma da duração de um pulso no pino Echo.

Sensor da Parallax

Esse sensor possui apenas três pinos. Sendo que um dos pinos serve para enviar e receber os sinais das ondas ultrassônicas.

  • Gnd – Pino onde deve ser ligado o Gnd (Ground ou o terra) do Arduino
  • Vcc – Pino onde deve ser ligado o 5v (alimentação) do Arduino
  • SIG – Pino onde os dados são enviados e recebidos

Para iniciar a medição, é necessário enviar um pulso (nível lógico alto) de 5µs para o pino SIG. A mesma coisa do sensor HC-SR04 acontece aqui, a diferença é que o sinal retornado é enviado ao pino SIG. Portanto o pino SIG envia e recebe os dados.

Calculando a distância nos dois sensores

Como o pulso que é retornado indica a distância que a onda percorreu desde o Trigger até o Echo (ida e volta), devemos dividir esse pulso pela metade. Além disso, o valor lido é um tempo em microssegundos e temos que convertê-lo para distância.

Sendo assim, é preciso usar algumas noções básicas da física, como: Saber que a velocidade do som é de aproximadamente 340m/s e que, para o cálculo simples de distância, temos a seguinte relação:

d = v \times t

Onde d é a distância, v é a velocidade e t é o tempo. Por fim, tudo tem que estar na mesma unidade. Se medimos o tempo em microssegundos e queremos distâncias em cm, a velocidade do som tem que estar em cm/µs. Para essa conversão, obtemos o seguinte resultado: v = 0,034 cm/µs. Se você quiser a distância em metros, é só multiplicar por 100.

Portanto, a fórmula final será:

d = \frac{0,034 \times t}{2}

d = 0,017 \times t

Obs.: é necessário dividir por 2 por causa da medição ser a distância de ida e volta

Utilizando no Arduino

Circuito

Abaixo está o circuito do sensor HC-SR04:

circuito sensor ultrassônico

O Vcc é ligado ao 5v e o GND ao GND. O pino Trig é ligado ao pino digital 2, e o Echo ao pino digital 3.

O circuito para o sensor da Parallax é o mesmo para a alimentação. Além disso, basta ligar o pino SIG no pino digital 2 do Arduino.

Programação

Para testar o sensor, vamos utilizar o monitor serial para exibir os valores da distância.

Sensor HC-SR04

Basta definir o pino Trig como saída e o Echo como entrada. De resto é só seguir a lógica explicada anteriormente:

  • Mandar o pulso de 10µs: manda o pino para estado alto, espera 10µs e manda para estado baixo
  • Receber a medição: basta utilizar a função pronta do Arduino chamada pulseIn que retorna o tempo que um pulso ficou em nível alto ou baixo. Como a distância é retornada em nível alto, basta utilizar “distancia = pulseIn(pinoEcho, HIGH);”
  • Processar a distância: de acordo com a fórmula encontrada, multiplicar a distancia encontrada no passo anterior
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
#define pinoTrig 2 // Pino de comunicaçao ligado ao Trigger
#define pinoEcho 3 // Pino de comunicaçao ligado ao Echo
float distancia; // Variavel de leitura da distancia

void leitura(); // Funçao de leitura da distancia

void setup(){
  Serial.begin(9600);// Inicia a comunicação serial

  pinMode(pinoTrig, OUTPUT);
  pinMode(pinoEcho, INPUT);
  digitalWrite(pinoTrig, LOW); // Inicia com o pino em nível baixo
}

void loop(){
  leitura();

  distancia = distancia/2; // Divide por 2 pois esse e o tempo da onda ir e voltar
  distancia = distancia*0.034029; // Multiplicamos por 0,034 por causa da velocidade do som (d=v*t)

  Serial.print("Distancia em cm: ");
  Serial.println(distancia);

  delay(1000); // Esse delay pode ser menor
}

void leitura(){
  digitalWrite(pinoTrig, HIGH); // Manda um sinal de nível alto por 10 microssegundos
  delayMicroseconds(10);
  digitalWrite(pinoTrig, LOW);

  distancia = pulseIn(pinoEcho, HIGH); // Le o comprimento de onda em alta
}

Sensor da Parallax

O importante a ser observado é que o pino de comunicação tem que ficar comutando entre pino de entrada e saída a todo momento para realizar a leitura ou para enviar o pulso.

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
#define sig 2 // Pino de comunicaçao ligado ao SIG
float distancia; // Variavel de leitura da distancia

void leitura(); // Funçao de leitura da distancia

void setup(){
  Serial.begin(9600); // Inicia a comunicação serial

  pinMode(sig, OUTPUT);
  digitalWrite(sig, LOW); // Inicia com o pino em nível baixo
}

void loop(){
  leitura();

  distancia = distancia/2; // Divide por 2 pois esse e o tempo da onda ir e voltar
  distancia = distancia*0.034029; // Multiplicamos por 0,034 por causa da velocidade do som (d=v*t)

  Serial.print("Distancia em cm: ");
  Serial.println(distancia);

  delay(1000); // Esse delay pode ser menor
}

void leitura(){
  pinMode(sig, OUTPUT); // Define o pino como saida
  digitalWrite(sig, HIGH); // Manda um sinal de nível alto por 5 microssegundos
  delayMicroseconds(5);
  digitalWrite(sig, LOW);

  pinMode(sig, INPUT); // Define o pino como entrada para fazer a leitura
  distancia = pulseIn(sig, HIGH); // Le o comprimento de onda em alta
}

Aplicações

Esse sensor pode ser usado em diversas aplicações, dentre elas:

  • Detectar a passagem de um objeto em uma linha de produção
  • Sensor de ré e auxiliar de direção do carro
  • Detecção de um obstáculo por um robô
  • Instrumento de medição
  • Bengala eletrônica para cegos

Se quiser ter informações mais detalhas do sensor, como o valor real da velocidade do som para a temperatura do ambiente, recomendo que leia o datasheet dos sensores:

Sensor de obstáculo infravermelho