Cómo conectar un Sensor de distancia ultrasónico HC-SR04 a Raspberry Pi

En este pequeño tutorial veremos cómo conectar un sensor de distancia Ultrasónico HC-SR04 a una tarjeta Raspberry Pi, también encontrarás un código de programación para tus primeras pruebas.

El sensor HC-SR04 nos permite conocer la distancia a la que se encuentra un objeto, cuenta con dos transductores ultrasónicos y con 4 terminales de conexión:

  • GND – Alimentación negativa
  • ECHO – Pin para mandar la señal ultrasónica
  • TRIG – Pin para recibir el rebote de la señal ultrasónica
  • VCC – Alimentación positiva

Su funcionamiento consiste en emitir una señal ultrasónica con uno de sus transductores para después recibir el rebote de dicha señal en su segundo transductor. Si medimos el tiempo que le toma a la señal alcanzar el objeto más cercano y regresar y conocemos la velocidad del sonido podemos calcular la distancia a la que se encuentra dicho objeto con la siguiente formula:

 Distancia = ( Tiempo_medido ) * (velocidad_del_sonido) / 2

El sensor HC-SR04 es entonces un componentede entrada, es decir, su funcionamiento consiste en entregar la información correspondiente a la distancia a través del tiempo de un pulso en su pin de señal ECHO, la tarjeta Raspberry Pi a su vez recibe la señal y obtiene el tiempo de duración del pulso con uno de sus GPIO configurado como entrada.

Es importante mencionar que el sensor se alimenta a 5V, su pin TRIG es compatible con el nivel lógico de la Raspberry Pi 3.3V pero el pin ECHO no lo es ya que entrega 5V cuando está en alto. Por esta razón utilizaremos un convertidor de nivel lógico para proteger a la tarjeta Raspberry Pi.

Diagrama de conexiones

Raspberry Pi – Protoboard Chica – Sensor Ultrasónico de distancia HC-SR04 – Level shifter

Código de Python3

Copiamos el siguiente código a un script de Python y lo ejecutamos con Python3 para observar el valor entregado por el sensor cada 0.5 segundos aproximadamente.



# Importamos la paquteria necesaria
import RPi.GPIO as GPIO
import time

TRIG = 23 #Variable que contiene el GPIO al cual conectamos la señal TRIG del sensor
ECHO = 24 #Variable que contiene el GPIO al cual conectamos la señal ECHO del sensor

GPIO.setmode(GPIO.BCM)     #Establecemos el modo según el cual nos refiriremos a los GPIO de nuestra RPi            
GPIO.setup(TRIG, GPIO.OUT) #Configuramos el pin TRIG como una salida 
GPIO.setup(ECHO, GPIO.IN)  #Configuramos el pin ECHO como una salida 


#Contenemos el código principal en un aestructura try para limpiar los GPIO al terminar o presentarse un error
try:
    #Implementamos un loop infinito
    while True:

        # Ponemos en bajo el pin TRIG y después esperamos 0.5 seg para que el transductor se estabilice
        GPIO.output(TRIG, GPIO.LOW)
        time.sleep(0.5)

        #Ponemos en alto el pin TRIG esperamos 10 uS antes de ponerlo en bajo
        GPIO.output(TRIG, GPIO.HIGH)
        time.sleep(0.00001)
        GPIO.output(TRIG, GPIO.LOW)

        # En este momento el sensor envía 8 pulsos ultrasónicos de 40kHz y coloca su pin ECHO en alto
        # Debemos detectar dicho evento para iniciar la medición del tiempo
        
        while True:
            pulso_inicio = time.time()
            if GPIO.input(ECHO) == GPIO.HIGH:
                break

        # El pin ECHO se mantendrá en HIGH hasta recibir el eco rebotado por el obstáculo. 
        # En ese momento el sensor pondrá el pin ECHO en bajo.
	# Prodedemos a detectar dicho evento para terminar la medición del tiempo
        
        while True:
            pulso_fin = time.time()
            if GPIO.input(ECHO) == GPIO.LOW:
                break

        # Tiempo medido en segundos
        duracion = pulso_fin - pulso_inicio

        #Obtenemos la distancia considerando que la señal recorre dos veces la distancia a medir y que la velocidad del sonido es 343m/s
        distancia = (34300 * duracion) / 2

        # Imprimimos resultado
        print( "Distancia: %.2f cm" % distancia)

finally:
    # Reiniciamos todos los canales de GPIO.
    GPIO.cleanup()

¡Sigue explorando!