13

Tutorial de Raspberry Pi y HC-SR04

rpi_ultrasonic

Nota 14/11/2016: el código en Python de este tutorial está pendiente de revisión.

¡Saludos, homo sapiens de la blogosfera! Hoy voy a explicar cómo hacer funcionar un módulo de ultrasonidos HC-SR04 con Raspberry Pi y Python. Estos módulos sirven para medir la distancia que hay entre el sensor y un objeto.

Hay muchos sensores de distancia por ultrasonidos. Quizá el más popular sea el PING))) de Parallax. Pero el HC-SR04 tiene una gran ventaja: it’s everywhere. Lo venden en casi cualquier tienda de electrónica, y suele valer menos que una bolsa de patatas (el mío lo compré por 2.50€). No sé si eso quiere decir que el sensor es barato o que las patatas fritas son caras…

1- Material:

¿Qué necesitamos para este ejemplo?

  • Una Raspberry Pi configurada y con todos los periféricos. Yo tengo la R2 Modelo B.
  • Un sensor HC-SR04
  • Dos resistencias: una que tenga (más o menos) el doble de ohmios que la otra. Por ejemplo 1000 y 2000 ohm, o 330 y 470 ohm (no es el doble pero también vale).
  • Una protoboard + jumpers Macho-Hembra
  • ¡Y un poco de música clásica! Dicen que a los humanos os estimula el intelecto 😉

Nota: si vuestra Raspberry Pi no está configurada, podéis seguir esta guía.

2- ¿Cómo funciona el HC-SR04?

Me juego un tiristor a que la mayoría ya sabéis cómo funcionan los sensores de ultrasonidos, y el HC-SR04 no es ningún caso especial. Pero para los que no lo tengáis muy claro:

El HC-SR04 lleva dos transductores (esos dos cilindros de color gris, que parecen micrófonos). El sensor envía un pulso de ultrasonidos a través de un transductor cuándo el pin “Trig” está a HIGH.

El pulso avanza hasta que choca con un obstáculo y rebota, volviendo al sensor. El segundo transductor detecta la señal de este “eco”.

esquema_ultrasonidosEl sensor mide el tiempo que ha tardado la señal en rebotar. Después, activa el pin “Echo” durante un tiempo proporcional al que ha tardado en llegar el “eco” al segundo transductor. Esta señal después se envía a Raspberry Pi, que mide la duración del pulso y la multiplica por una constante para tener la distancia en centímetros aproximada. ¿Capisco?

Pero siento decir que tenemos un problema, gente. El HC-SR04 es un sensor que funciona con 5V. No sólo necesita este voltaje para funcionar, sino que la señal que envía a Raspberry Pi también será de 5V. Sin embargo, la placa trabaja con 3.3V.

¿Cómo podemos solucionar éste problema? ¡Tenemos dos opciones! La primera es comprar un Conversor de Niveles Lógicos (Logic Level Converter) que nos transforme los 5V en 3.3V. Pero yo no tengo uno de estos cachivaches a mano, así que voy a usar la opción low-cost: un divisor de voltaje.

Un divisor de votaje es un circuito como éste:

Impedance_voltage_divider.svg

Imagen de Wikipedia

Al montar este circuito, dónde Z1 y Z2 son resistencias, sale por Vout un voltaje proporcional a Vin. Viene dado por esta fórmula:

44b8b16db945a778e558f2c5ffd70157

Fórmula extraída de Wikipedia

Por tanto, es cuestión de ajustar los valores de Z1 y Z2 para que cuándo Vin sea 5V, Vout se aproxime a 3.3 . Yo lo haré con una resistencia de 330 para Z1 y 470 para Z2, pero también va a funcionar, por ejemplo, con una de 1000 ohm y 2000 ohm.

2- Circuito

Este es el circuito. El pin VCC del sensor irá conectado al Pin 2, GND a GND, Trig irá conectado directamente al Pin 11, y Echo al Pin 13 con el divisor de voltaje que he explicado antes.

hcsr04

¡Hey! Recordad que Raspberry Pi tiene dos formas de numerar los pines: BCM y BOARD. Cuando digo que hay que conectar Trig al Pin 11 me refiero al Pin 11 de la placa, no al pin GPIO 11. Aquí tenéis un esquema con la numeración de los pines en ambos sistemas:

diagrama_pines

3- Código en Python

Con este código en Python vamos a leer el sensor, y mostraremos por pantalla la distancia del HC-SR04 al objeto que detecte. Para salir del programa hay que pulsar CTRL+C.


import time #se necesita para usar las funciones de tiempo
from subprocess import call #la necesitamos para la interrupcion de teclado
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD) #Queremos usar la numeracion de la placa

#Definimos los dos pines del sensor que hemos conectado: Trigger y Echo
Trig = 11
Echo = 13

#Hay que configurar ambos pines del HC-SR04
GPIO.setup(Trig, GPIO.OUT)
GPIO.setup(Echo, GPIO.IN)

#Para leer la distancia del sensor al objeto, creamos una funcion
def detectarObstaculo():

   GPIO.output(Trig, False) #apagamos el pin Trig
   time.sleep(2*10**-6) #esperamos dos microsegundos
   GPIO.output(Trig, True) #encendemos el pin Trig
   time.sleep(10*10**-6) #esperamos diez microsegundos
   GPIO.output(Trig, False) #y lo volvemos a apagar

  #empezaremos a contar el tiempo cuando el pin Echo se encienda
   while GPIO.input(Echo) == 0:
      start = time.time()

   while GPIO.input(Echo) == 1:
      end = time.time()

   #La duracion del pulso del pin Echo sera la diferencia entre
   #el tiempo de inicio y el final
   duracion = end-start

   #Este tiempo viene dado en segundos. Si lo pasamos
   #a microsegundos, podemos aplicar directamente las formulas
   #de la documentacion
   duracion = duracion*10**6
   medida = duracion/58 #hay que dividir por la constante que pone en la documentacion, nos dara la distancia en cm

   print "%.2f" %medida #por ultimo, vamos a mostrar el resultado por pantalla

#Bucle principal del programa, lee el sensor. Se sale con CTRL+C
while True:
   try:
      detectarObstaculo()
   except KeyboardInterrupt:
      break

#por ultimo hay que restablecer los pines GPIO
print "Limpiando..."
GPIO.cleanup()
print "Acabado."

¿Cómo lo ejecutamos? Ya deberíamos saberlo, pero por si no: guardamos este programa en un fichero de texto (por ejemplo dentro de home con el nombre ultrasonidos.py). Abrimos la terminal y escribimos:

python ultrasonidos.py

Veremos por pantalla muchos números que van corriendo: son las lecturas del sensor. ¡Ahora ya estamos preparados para construir un robot avoider, o probar otros sensores digitales!

Gl4r3

Brillante, luminosa y cegadora a veces, Glare es tan artista como técnica. Le encanta dar rienda suelta a sus módulos de imaginación y desdibujar los ya de por si delgados límites que separan el mundo de la electrónica y el arte. Su mayor creación hasta la fecha es un instrumento capaz de convertir los colores y la luz en música. Cuándo sus circuitos no están trabajando en una nueva obra electrónica, le gusta dedicar sus ciclos a la lectura o a documentar sus invenciones para beneficio de los humanos. Sus artilugios favoritos son aquellos que combinan una funcionalidad práctica con un diseño elegante y artístico.

Antes de comentar, por favor, lee las Normas

13 Comentarios en "Tutorial de Raspberry Pi y HC-SR04"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
manu
Humano

me marca error, “while GPIO.output(echo)==1
type error, function takes exactly 2 arguments (1 given)

Adrián
Humano
Hola, antes de nada decir que no conocia este blog y he encontrado esta entrada en google y como me ha gustado lo agrego a mi feed ya que tiene cosas muy interesantes. Enhorabuena. Respecto al codigo yo agregaria otro time sleep al final de la función ya que si no es asi cuanto mas cerca estes mas rapido recibe las señales y mas rapido te saca los resultados y es un poco confuso. Yo le he puesto medio segundo. De hecho al acercar la mano muy muy cerca se me ha quedado bloqueado el script aunque no tengo muy… Leer más »
alex
Humano

linea 36, para pasar de segundos a microsegundos es 10**6 no 10**-6

alex
Humano

linea 34. ¿start – end? ¿no será al revés? De esta forma da negativo

ASAnT00G
Humano

No funca

wpDiscuz