Medir distancias con ultrasonidos

publicado en: Portada | 17

Para medir distancias utilizando ultrasonidos se sigue la misma técnica que usan el SONAR o la ecografía: emitir un sonido a una frecuencia alta y medir el tiempo que tarda en recibirse su eco, el rebote del sonido en el objeto cuya distancia se mide. Mientras que una ecografía trabaja con frecuencias entre 5 MHz y 50 MHz, un SONAR funciona con frecuencias entre 80 kHz y 400 kHz. Muy a grandes rasgos, las frecuencias más altas permiten buena resolución para detectar estructuras superficiales y las más bajas para estructuras profundas a costa de menores resoluciones. Para realizar medidas genéricas con ultrasonidos, algo como la distancia a los objetos que rodean a un vehículo aparcando, se suelen utilizar frecuencias de unos 40 kHz

principio de medida de distancia por ultrasonidos

Aunque existen transductores electroacústicos de ultrasonidos que pueden funcionar como emisor y como receptor, la configuración más frecuente consiste en usar emisores y receptores de ultrasonidos separados. El tipo más usado es el transductor cerámico, que puede encontrarse en distintos encapsulados como aluminio (el más frecuente), latón y plástico. Algunos de ellos pueden ser sumergibles sumergibles. Tienen un tamaño de unos 16 mm de diámetro (el más frecuente) o menor por unos 14 mm sobre la superficie de montaje.

emisor y receptor de ultrasonidos grandeemisor y receptor de ultrasonidos pequeño

Como decía más arriba, la frecuencia del sonido que emiten suele ser de 40 kHz con un ancho de banda de entre 1 kHz y 2 kHz y un nivel de sonido de unos 120 dB (un auricular común suele tener 100 dB aunque se recomienden 85 dB) y una sensibilidad de unos 60 dB. Lógicamente, mayores niveles de sonido conseguirán detectar distancias mayores por tener menor atenuación.

El ángulo de emisión está comprendido entre algo menos de 15° de los mejores y los 60° de los peores. Un ángulo grande producirá ecos en más objetos de los que se tratan de detectar con riesgo de que se detecten sus rebotes en lugar de los que se buscan: los que quedan justo enfrente del emisor/receptor de ultrasonidos.

Como emisor y receptor suelen ser indistinguibles, el fabricante incluirá una marca que permita saber cuál es cada uno. Normalmente se rotula con una letra T el emisor (transmisor) y una letra R el receptor.

emisor y receptor de ultrasonidos pequeño vistaemisor y receptor de ultrasonidos pequeño conectores

El rango de distancias que son capaces de medir es variable pero está comprendido entre los 2 cm y los 20 m. Los componentes más populares (como el 400ST/R160) son relativamente precisos (±0.5%) y tienen una precisión aceptable (2 mm) En el uso final, que dependerá de muchos factores, desde el montaje hasta el programa con el que el microcontrolador los gestione, no es razonable esperar que midan con precisión distancias menores de 4 cm ni mucho mayores de 4 m

La forma habitual de usar estos dispositivos desde un microcontrolador suele ser enviando un tren de pulsos (normalmente formado por 8) y controlando el tiempo que se tarda en recibir el eco de la señal. Como esta técnica es sencilla y funciona razonablemente bien, es fácil encontrar módulos que incluyen, además de los transductores cerámicos de ultrasonidos, la circuitería que realiza el trabajo y deja libre al µC para que se encargue solamente de enviar el pulso y medir el tiempo del rebote.

Para su uso en micro-robótica, el líder indiscutible es el HC-SR04 o su heredero el HY-SRF05. Es tan popular que su precio (por unidad) es más bajo que el de la pareja emisor+receptor sin circuitería. Tanto para detectar obstáculos con un pequeño robot como para aprender el principio de funcionamiento de la medida por ultrasonidos es una opción muy recomendable por precio y por sencillez de uso (aunque quizá no, si hace falta un rango de medidas, una precisión o resolución mayor) Al ser tan usado, también hay en el mercado accesorios mecánicos que permiten fijarlos cómodamente sobre un vehículo para construir fácilmente un robot casero.

Emisor receptor ultrasonidos SRF04Emisor receptor ultrasonidos SRF05

Dependiendo de la versión la circuitería del módulo puede ser diferente pero los conectores son los mismos entre modelos y muy parecidos entre el HC-SR04 y el HY-SRF05. Además de la alimentación (5 V y GND) hay un pin para disparar la señal (trigger) y otro para detectar la llegada del eco (echo) La principal ventaja del HY-SRF05 es que puede usar un único pin para la entrada y la salida (el pin trigger). Para usar este modo se conecta a masa el pin OUT. Además, este módulo es un poco más preciso que su antecesor: unos 2 mm frente a los aproximadamente 3 mm de precisión del HC-SR04.

Dependiendo del proyecto en el que se utilice la medida de distancias por ultrasonidos es posible conseguir un poco más de precisión considerando la temperatura del aire ya que la propagación del sonido en este medio aumenta (ligeramente) su velocidad con la temperatura.

A 0 °C la velocidad del sonido en aire (con una humedad del 50% y a nivel del mar) es de 331.5 m/s y cada grado celsius añade 0.6 m/s. Por ejemplo, a 20 °C, el valor típicamente usado cuando no se atiende a la temperatura real, la velocidad sería 331.5 m/s + 0.6 m/s/°C × 20 °C = 343.5 m/s La constante más cómoda en el programa para obtener centímetros midiendo el tiempo en µs y considerando que hay que tomar la mitad del valor (ya que el tiempo resultante de la medición es el doble del buscado puesto que es el tiempo de ida y el de vuelta del tren de impulsos) es de 343.5 m/s × 100 / 1000000 / 2 = 0.017175 cm/µs

Circuitería emisor receptor ultrasonidos SRF04 SRF05

Para usar estos módulos se establece un nivel bajo durante al menos 2 µs para «limpiar» la conexión (el pulso del pin trigger), un nivel alto durante 10 µs para que se envíe el tren de pulsos, se establece otra vez bajo y se espera la recepción hasta 30 ms como máximo (una espera de 30 ms indica que no se ha detectado ningún obstáculo en el rango útil). Como son tiempos razonablemente bajos y con un máximo conocido, se puede programar una espera fija para controlar el tiempo de una forma más sencilla que ortodoxa.

Emisor receptor ultrasonidos SRF04 SRF05 (las dos caras)

Para terminar, un ejemplo de aplicación para Arduino que seguro ayudará a entenderlo mejor

Como el tiempo de espera máximo que se ha establecido es de 25000 µs, la distancia máxima que se puede medir es de algo más de 4 m de los poco más de 5 m que sería posible con los módulos HC-SR04 o HY-SRF05 que tienen un tiempo de espera máximo de 30000 µs

Víctor Ventura

Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.

Más entradas - Página web

Sígueme:
TwitterLinkedIn

Seguir Víctor Ventura:

Programador multimedia y web + IoT. Mejor con software libre.

Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.

17 Respuestas

  1. Lucas st

    Hola, buenisimo el articulo, es psoible utilizarlos para detectar cambios de distancia del orden de los milímetros? Saludos!

    • Víctor Ventura

      Hola, Lucas.

      No te aconsejo utilizar este tipo de equipos para detectar medidas del orden de milímetros.

      Aunque técnicamente es posible que existan emisores y receptores de ultrasonidos que trabajen bien en el rango de milímetros (yo no conozco ninguna versión comercial de tales dispositivos) los que se tratan en el artículo están diseñados para trabajar en el rango de centímetros aunque el hecho de que su «precisión nominal», hasta dos milímetros, pueda sugerir lo contrario.

      Como digo en el artículo, su precisión final (nominalmente ±0.5 %) dependerá de otros factores además del propio dispositivo, como del material que se mida (sobre el que rebote la vibración) o de la forma en la que estén montados (como el ángulo con el que emitan-reciban).

      A falta de saber con más precisión cómo montarías los sensores y qué harías con ellos, en principio te recomendaría que optaras por tecnología óptica para resolver lo que planteas.

      Saludos y gracias por tu elogio y por visitar polaridad.es. ¡Vuelve pronto!

  2. mbnava

    Se comportaría igual, digo la señal si el sensor y el objeto se encerraran en una caja de plástico?

    • Víctor Ventura

      ¡Hola!

      No he hecho la prueba, así que solo puedo conjeturar, toma con cuidado lo que te digo y no lo tengas por cierto sin ponerlo tú mismo a prueba.

      En primer lugar, la caja de plástico debe ser bastante grande porque el rango de medidas es bastante limitado considerado a una escala humana. En un comentario anterior hago referencia a la poca precisión para tamaños pequeños y además tampoco serviría para distancias grandes, que no parece ser tu caso.

      En segundo lugar, creo, por el comportamiento que he observado de estos sensores, que son muy sensibles a ecos. Para que pueda explotarse de forma correcta en un contexto con ecos (como el que cabe esperar de un espacio cerrado tan pequeño) sería necesario mucho análisis por software del comportamiento para obtener una medida correcta de la distancia.

      En resumen, yo no utilizaría un sensor de ultrasonidos en ese espacio, creo que te conviene más un método óptico o, si es realmente pequeño, mecánico o de proximidad por efecto Hall. Quizá conociendo mejor tu proyecto yo mismo, o algún lector, podríamos darte una opinión más productiva.

      ¡Gracias por participar en el blog! ¡Hasta pronto!

  3. Rubén

    Hola, que tal gracias por la información, te querría hacer una consulta,

    Con tal de conseguir localizar un robot en un espacio de 3×3 metros, existiría la posibilidad de colocar 3 emisores repartidos por el perímetro de este área y el receptor en un robot en movimiento, con tal de poder conocer la distancia entre el robot y cada uno de los receptores y así determinar las coordenadas en las que se encuentra dicho robot???

    Gracias por adelantado

    • Víctor Ventura

      Hola, Rubén.

      Seguramente será posible pero me parece una solución que se presta a problemas. En principio, yo trataría de buscar una opción diferente con otra tecnología.

      Para determinar si es posible habría que saber cómo se comporta frente a los ultrasonidos el material que recubre ese espacio y el propio robot (porque puede que lo mejor sea que el receptor esté junto con el emisor y no en el robot). Especialmente problemáticos suelen ser los ecos que pueden aparecer como falsas detecciones.

      También sería relevante saber cómo es el movimiento del robot (para saber si se puede conocer con precisión su orientación) ya que otra opción es dotarlo de (al menos) un par emisores receptores para posicionarlo.

      Suerte con tu proyecto y gracias por participar en el blog

  4. Alex

    buenas tardes mi pregunta seria si puedo medir el espesor de un tela que se le llama guata es microfibra tiene como oyos y esponjosa quiero que mida en milimetros pero de pronto si me arroja variacion a la hora de leer el dato este es mi codigo y quiero ver si lo puedo hacer mas exacto o que podria calibrar mejor para que mi sensor de una medicion menos variante por que mi led prende y apaga mucho por la variacion de valores de entrada.
    const int echo=41;
    const int trig =43;
    int ledR=31;
    int ledA=33;

    long tiempo, distancia;
    void setup() {
    Serial.begin(9600);
    pinMode (echo, INPUT);
    pinMode (trig, OUTPUT);
    pinMode (ledR, OUTPUT);
    pinMode (ledA, OUTPUT);

    }

    void loop() {
    digitalWrite( trig, LOW);
    delay (400);
    digitalWrite( trig, HIGH);
    delay(400);
    digitalWrite(trig,LOW);
    tiempo= pulseIn(echo,HIGH);
    distancia=153-(tiempo/5.8);
    Serial.print(distancia);
    Serial.println (» mm «);

    if ((distancia>3)&&(distancia= 13)&&(distancia 17)
    {digitalWrite (ledR, HIGH);}
    else {digitalWrite (ledR, LOW);}
    delay (2500);
    }

    • Víctor Ventura

      Hola, Alex.

      Me gustaría poder darte una respuesta seria y profesional pero me temo que no conozco la industria a la que hace referencia tu pregunta. Por favor, toma esta respuesta considerando que es algo informal y que corresponde a mi intuición no a mi experiencia (que no tengo) en el sector textil. Ojalá algún lector pueda aportar su experiencia y algún dato más concreto.

      Si se me planteara medir un espesor pequeño (milímetros) de un producto opaco intentaría usar una tecnología óptica (seguramente más barata y sencilla de implementar) o electromagnética (basada en el efecto hall, probablemente más precisa cuando la implementación sea más compleja).

      Al hablar de la implementación pienso en dos factores, en primer lugar que el grosor deba estar en cierto umbral de tolerancia (medir entre un máximo y un mínimo) y en segundo lugar que sea viable disponer el sensor perpendicular al plano del tejido e incluso restringirlo mecánicamente (ceñirlo a un plano para evitar que se levante o arrugue)

      Si es mecánicamente viable utilizar una sonda sobre el tejido sin falsear el espesor (porque aplaste la tela) sería relativamente sencillo implementar una pletina perforada con una ranura por la que se proyectara luz y un sensor al otro lado determinara el grosor por la medida de haz que atraviesa dicha ranura.

      Espero haberte ayudado un poco.

      ¿Algún lector se anima a aportar algo más?

      Saludos.

  5. camilo

    Hola Victor, Podrías por favor ayudarme con este código? se trata de agregarle las lineas de código para incorporar el sensor HC SR05 para que detenga los motores cuando detecte un obstáculo a veinte centímetros de distancia.

    Este es el código que tengo actualmente funcionando y al que necesito agregar lo comentado más arriba. Muchas gracias anticipadamente.

    char t;

    void setup() {
    pinMode(13,OUTPUT); //left motors forward
    pinMode(12,OUTPUT); //left motors reverse
    pinMode(11,OUTPUT); //right motors forward
    pinMode(10,OUTPUT); //right motors reverse

    Serial.begin(9600);

    }

    void loop() {
    if(Serial.available()){
    t = Serial.read();
    Serial.println(t);
    }

    if(t == ‘1’){ //move forward(all motors rotate in forward direction)
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    }

    else if(t == ‘2’){ //move reverse (all motors rotate in reverse direction)
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    }

    else if(t == ‘3’){ //turn right (left side motors rotate in forward direction, right side motors doesn’t rotate)
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    }

    else if(t == ‘4’){ //turn left (right side motors rotate in forward direction, left side motors doesn’t rotate)
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    }

    else if(t == ‘5’){ //STOP (all motors stop)
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    }
    delay(100);
    }

  6. Lino Martinez

    Hola buen dia, para un sensor que me detecte la prescencia de un vehiculo en movimiento cual me recomendarias a una distancia de 7 mts

  7. Carlos Ortega

    Buenas tengo una duda y es con la parte de la condicion de cronometro>ESPERA_ENTRE_LECTURAS, no se para que se hace, podrias explicarme un poco mejor y el porque ese valor de 1000?
    Saludes.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *