Home » Arduino » ¿Cómo medir distancias con el sensor de ultrasonidos HC-SR04 con Arduino?

Login with your Social Account

¿Cómo medir distancias con el sensor de ultrasonidos HC-SR04 con Arduino?

  •  
  •  
  •  
  •  
  •  
  •  

Descubre cómo medir distancias con el sensor de ultrasonidos HC-SR04 con Arduino. Ejemplos de conexión y programación (gráfica y textual).

A continuación se describen los pasos necesarios para medir distancias con el sensor de ultrasonidos HC-SR04 con Arduino. Se explicarán varios ejemplos de programación, incluyendo ejemplos de programación gráfica.

¿Cómo funciona?

El sensor de ultrasonidos HC-SR04 emite un tren de ondas ultrasónicas por una de las membranas y recibe el eco de dichas ondas, cuando rebotan sobre los objetos, con la otra membrana. El principio de funcionamiento es con el tiempo de vuelo (TOF) que corresponde al tiempo que emplea la onda ultrasónica en viajar por el aire desde que es emitida hasta que es recibida. En realidad la distancia recorrida por la onda es el doble de la distancia del ultrasonido al objeto.

Sabiendo que la velocidad del sonido en el aire es aproximadamente 343.59m/s esto implica cada 29uS la onda recorre un centímetro (58uS/cm al objeto si consideramos el tiempo de la onda entre la ida y la vuelta).

El sensor HC-SR04 tiene (además de los pines de alimentación VCC a +5V y masa 0V o GND) dos pines que controlan el disparo (TRIG) y el echo recibido por la onda (ECHO). Para generar una secuencia de disparo debemos activar la señal TRIG durante al menos 10uS (poner a +5V) y volverla a desactivar (poner a 0V). Después debemos esperar a que la señal ECHO se active y medir el tiempo transcurrido entre que generamos el disparo y el echo ha sido recibido.

Para calcular la distancia del objeto en centímetros, debemos dividir al tiempo transcurrido en uS por 58.

Propiedades del sensor:

– La onda ultrasónica tiene un ángulo detección en el cual es teóricamente sensible y por tanto toda onda que venga en un ángulo dentro del lóbulo principal será recibida que es aproximadamente de 15 grados.

– La distancia máxima del sensor es de 400cm.

– Los sensores pueden verse afectados por el fenómeno cross-talking: la onda de un sensor es recibida por otro sensor o un mismo sensor puede recibir su propia onda de un disparo previo si los tiempos de espera entre disparo y disparo no son adecuados (los tiempos recomendados entre disparo y disparo son de unos 50ms o 60ms). Si tenemos varios sensores de ultrasonidos y queremos minimizar el efecto cross-talking, lo lógico es secuenciar los disparos, aún así será muy difícil distinguir entre los echos recibidos por un robot u otro en el caso de que utilicen los mismos sensores, con lo que debéis asumir que la medición puede estar repleta de errores.

– En teoría la onda rebota sobre los espejos de forma especular y por tanto si se inclina mucho un sensor con respecto a una superficie debería dejar de verla. Lo cierto es que dado que gran parte de las superficies no son completamente lisas o disponen de bordes u otros elementos próximos que pueden hacer rebotar la onda, el sensor suele detectar, en la gran mayoría de casos, objetos que tienen un ángulo de incidencia superior al ángulo de detección del sensor.

– Estos sensores de ultrasonidos están pensados para funcionar en el aire, no en el agua.

– Cristales y espejos son teóricamente detectados, pero puede que por su grosor no se detecten correctamente.

– Los colores no afectan a este sensor.

– Otras variables como la temperatura y la presión suelen tener cierta influencia, pero se suelen despreciar en la mayoría de ocasiones.

Conexión:

Primero se describe cómo conectar los cables para llevar las señales al arduino. En este caso, es recomendable utilizar cables separados para llevar las señales a la placa de expansión IO del arduino, protoboard o directamente al arduino. Por simplicidad, aquí se muestran las conexiones directas al arduino, si utilizáis una placa de expansión IO o protoboard las conexiones deben ser equivalentes.

Lectura de un único sensor:

Los pines TRIG y ECHO puede estar conectados a cualquier pin IO Digital de Arduino. Los pines VCC y GND los podemos llevar a cualquiera de los pines de la protoboard.

sr04_nano_bb

En el caso de utilizar la tarjeta de expansión IO las conexiones podrían ser como:sr04_nano_io_bb

 

La librería NewPing que permite controlar el disparo del sensor de ultrasonidos con Arduino IDE. Podéis descargar aquí el código de ejemplo:

Con ArduBlock podemos utilizar el siguiente código de ejemplo:

HC_SR04_Ardublock

Podéis descargar aquí el código de ejemplo con Ardublock:

Lectura de múltiples ultrasonidos:

Lectura secuencial:

Si vamos a utilizar varios ultrasonidos a la vez, lo lógico es conectar una señal TRIG y ECHO para cada ultrasonido, pudiendo así secuenciar los disparos (señal TRIG). En este caso,la lectura secuencial de los ultrasonidos puede que sea un inconveniente para el control del robot, ya que cada ultrasonido requiere entre 50-60ms entre disparo y disparo (aunque en realidad se puede ajustar incluso hasta los 29ms). Como ventaja es que se simplifica la programación porque se trata de una lectura secuencial.

sr04_secuencial_nano_bb

En el caso de utilizar la tarjeta de expansión IO, las conexiones serían:

sr04_secuencial_nano_io_bb1

A continuación se incluye un ejemplo con tres sensores basado en la librería NewPing con un tiempo de secuenciación de 33ms:

Con ArduBlock podemos utilizar el siguiente código de ejemplo:

HC_SR04_secuencial_Ardublock

Podéis descargar aquí el código de ejemplo con Ardublock:

Lectura en paralelo con señal TRIG compartida:

Si en nuestro robot ya no nos quedan pines suficientes para utilizar dos pines por ultrasonido o si pretendemos mejorar los tiempos de lectura de todos los sensores de ultrasonidos, se puede adoptar una solución de compromiso en la que la señal TRIG está compartida por todos los sensores y la señal ECHO es individual, de forma que se disparan todos a la vez con lo que el tiempo de espera es significativamente menor. Se trata de una situación poco estándar y por tanto no debe tomarse como referencia de los casos típicos a utilizar en vuestros robots. Además, debéis considerar que pueden manifestarse los fenómenos de cross-talking de forma más patente, de forma que las ondas que genera un ultrasonido sean recibidas por otros, generando así un ruido difícil de detectar. En ese caso, lo conveniente es posicionar los sensores para que al menos tengan 90º de giro entre ellos.

sr04_multiple_nano_bb

A continuación se incluye una modificación de la librería NewPing que permite disparar varios ultrasonidos simultáneamente.

 Con ArduBlock podemos utilizar el siguiente código de ejemplo (nótese que el código aquí es más complicado dadas la imposibilidad de disparar de forma múltiple los tres ultrasonidos con los módulos de ultrasonido que incorpora Ardublock):
HC_SR04_multiple_Ardublock

Podéis descargar aquí el código de ejemplo con Ardublock:

A %d blogueros les gusta esto: