Tutorial – Medindo distância na raspberry pi / Banana Pi com HC-SR04

Vamos desbravar o sensor ultrasônico HC-SR04, sensor que pode ser utilizado para detectar objetos, evitar colisão com obstáculos e etc.

O módulo HC-SR04 possui um circuito pronto, com emissor e receptor ultrasônico. É capaz de mensurar distâncias de 2cm a 4 metros, com precisão de 3mm.
Seu ângulo de detecção é de aproximadamente 15 graus, segundo o seu datasheet.
Especificações
Tensão                     : 5V
Corrente                   : 15mA
Frequência               : 40Hz
Ângulo de detecção : < 15°
alcance da medição : 2cm – 400 cm
Precisão                   : 3mm
Dimensão                 : 45 x 20 x 15mm
Pinagem                   : Vcc(5V), Trigger (input), Echo (output), GND
HC-SR04 na raspberry pi
A saída do módulo (pino ECHO) utiliza um nível alto (+5V), a raspberry pi trabalha com valor de entrada em 3.3v.
Por isso, devemos utilizar dois resistores para criar um divisor de tensão básico.V saída / V entrada =  R2/R1+R2V saída = 3.3
V entrada = 5
R1 = 1000 ohms3.3 / 5 = R2/1000+R2
0.66 = R2/1000+R2
660 + 0.66R2 = R2R2 = 1941 ohms
 

 

Funcionamento do módulo HC-SR04
É emitido um sinal com duração de 10us(microsegundos) ao pino TRIG, marcando o inicio da medição.
O módulo envia 8 pulsos de 40KHZ e fica aguardando o retorno do receptor, caso haja retorno do Echo (nível HIGH), podemos medir a distãncia utilizando está fórmula:
distância = duração do pulso x velocidade do som / 2
A velocidade do som é variável, em condições normais de pressão e no nível do mar a uma temperatura de 20ºC, as ondas sonoras se propagam a 340,29 m/s.
Então, se pretende medir a distância através da água, certifique-se que você está utilizando a velocidade correta do som.
Se você deseja se aprofundar no assunto, procura sobre reflexão, refração, interferência e ressonância sonora.
Outro ponto interessante são , Reflexão, refração, interferência e ressonância sonora.
Serão descritas as implementações em C e python no próximo tópico.
 
Implementações
 
Vamos começar exemplificando em C utilizando a biblioteca wiringPi, em seguida, em python utilizando a biblioteca RPi.GPIO.
instalação
   $ git clone git://git.drogon.net/wiringPi
   $ cd wiringPi
   $ git pull origin
   $ cd wiringPi
   # ./build
   # apt-get install python-rpi.gpio
Código em C
  
   /* para compilar: gcc exemplo_ultrasonico.c -lwiringPi -o exemplo_ultrasonico */

#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#include <sys/time.h>

 // gpio 23
 #define ECHO_PIN        23 

 // gpio 24
 #define TRIG_PIN        24 

 // Velocidade do som 340,29 m/s -> 34029 cm/s
 #define SPEED_OF_SOUND  34029

 int main (void) {
  
  // configura os pinos
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  digitalWrite(TRIG_PIN, LOW);
  delay(1000);

  struct timeval time_start, time_end;
  double time_elapsed, distance;
  
  // emite o sinal com duração de 10us, marcando o inicio da medição
  digitalWrite(GPIO_TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(GPIO_TRIGGER, LOW);

  // Nosso primeiro passo deve ser o de gravar o ultimo baixo timestamp (time_start) para o ECHO (início de pulso), pouco antes do sinal de retorno.
  while (digitalRead(ECHO_PIN) == LOW) {
   gettimeofday(&time_start, NULL);
  }

  // Uma vez que um sinal é recebido, o valor é alterado a partir de baixo (LOW) e alta (HIGH), e o sinal irá permanecer elevada durante a duração do impulso de eco. portanto, precisamos também da última alta timestamp para o ECHO (time_end).
  while (digitalRead(ECHO_PIN) == HIGH) {
   gettimeofday(&time_end, NULL);
  }
  
  // Calculamos a diferenca do tempo
  time_elapsed = (time_end.tv_sec + time_end.tv_usec / 1000000.0) - (time_start.tv_sec + time_start.tv_usec / 1000000.0);
  
  // calcula a distancia em cm, como tempos o comprimento da ida e volta do sinal, e necessario a divisão por 2, pois queremos a distancia do ultrasônico até o objeto.
  distance = (time_elapsed * SPEED_OF_SOUND) / 2;
  printf("Distance: %.2f cmn", distance);
  return 0;
 }
  
Código em python
  
 import RPi.GPIO as GPIO
 import time

 GPIO.setmode(GPIO.BCM)

 # gpio 23
 ECHO_PIN = 23

 # gpio 24
 TRIG_PIN = 24

 # Velocidade do som 340,29 m/s -> 34029 cm/s
 SPEED_OF_SOUND = 34029

 # configura os pinos
 GPIO.setup(TRIG_PIN, GPIO.OUT)
 GPIO.setup(ECHO_PIN, GPIO.IN)

 GPIO.output(TRIG_PIN, GPIO.LOW)
 time.sleep(1)

 # emite o sinal com duração de 10us, marcando o inicio da medição
 GPIO.output(TRIG_PIN, GPIO.HIGH)
 time.sleep(0.00001)
 GPIO.output(TRIG_PIN, GPIO.LOW)

 # Nosso primeiro passo deve ser o de gravar o ultimo baixo timestamp (time_start) para o ECHO (início de pulso), pouco antes do sinal de retorno.
 while GPIO.input(ECHO_PIN) == GPIO.LOW:
  time_start = time.time()
  
 # Uma vez que um sinal é recebido, o valor é alterado a partir de baixo (LOW) e alta (HIGH), e o sinal irá permanecer elevada durante a duração do impulso de eco. portanto, precisamos também da última alta timestamp para o ECHO (time_end).
 while GPIO.input(ECHO_PIN) == GPIO.HIGH:
  time_end = time.time()
  
 # calculamos a diferença de tempo
 time_elapsed = time_end - time_start 

 # calcula a distancia em cm, como tempos o comprimento da ida e volta do sinal, e necessario a divisão por 2, pois queremos a distancia do ultrasônico até o objeto.
 distance = (time_elapsed * SPEED_OF_SOUND) / 2 

 print("Distance: {0:.2f}".format(distance))

 GPIO.cleanup()
  

Pronto, isso é tudo o que você precisa para iniciar suas brincadeiras com o módulo HC-SR04 na raspberry, boa diversão!

 

Que tal nos encontrar no SeuTubo para ver dicas, tutoriais e Reviews de placas? Canal Sistemas Embarcados

Que tal na página do Facebook?
Quem sabe Google Plus?
Que tal no Pinterest?
Ou talvez me encontrar no Twitter para receber as ultimas noticias quentinhas: @SEmbarcados
E não esqueça que também tem o email, sistemasembarcadosbr@gmail.com
Conheça também nossos grupos do Facebook:
Abraços e até a próxima