← Índice del curso

Sensores y Actuadores · Tema 17

Sensores ultrasónicos

Un murciélago mide distancias con el eco de un grito; el HC-SR04 hace lo mismo con 40 kHz y un par de transductores de pocos euros. El principio es una división, pero medir bien con él exige entender el tiempo de vuelo, la velocidad del sonido (que cambia con la temperatura), la zona ciega y un puñado de superficies que lo engañan.

01 · Punto de partida

Un nuevo bloque: distancia y movimiento

Con el taller de la luz nocturna terminó el bloque de luz y color. Empieza el de la distancia y el movimiento: saber a qué distancia está un objeto, si se acerca, si hay alguien en la habitación, cómo se inclina un dispositivo. A diferencia de la temperatura o la luz, la distancia no es una propiedad que se pueda medir «en el lugar»: hay que enviar algo hasta el objeto y ver qué vuelve. Todos los sensores de este bloque se basan en alguna forma de eco: sonido, luz infrarroja o láser.

Ya vimos de pasada al HC-SR04 en el tema 3, como ejemplo de una salida codificada en el ancho de un pulso, y en el tema 1 como parte de la cadena de medición. Ahora lo estudiamos a fondo, porque es el sensor de distancia más usado en proyectos educativos y robótica básica, y porque ilustra todo lo que puede salir mal con una medición «por eco».

02 · Principio

El tiempo de vuelo

Un transductor emite una ráfaga corta de ultrasonido (sonido de una frecuencia por encima de lo audible; en estos sensores, 40 kHz). La ráfaga viaja hasta un objeto, se refleja y vuelve a un receptor. El sensor mide el tiempo t entre la emisión y el regreso, el tiempo de vuelo (time of flight). Como el sonido recorre el camino de ida y vuelta, la distancia es la mitad de lo que habría recorrido:

d = v × t / 2

donde v es la velocidad del sonido en el aire. En condiciones normales vale unos 343 m/s, es decir, 0,0343 cm por microsegundo. La distancia en centímetros es entonces d = t(µs) × 0,0343 / 2 ≈ t / 58,3. Un objeto a 1 m devuelve el eco a los 5,8 ms; uno a 4 m, a los 23 ms. El sensor entrega ese tiempo como el ancho de un pulso (tema 3), y el programa solo tiene que medirlo.

El detalle que no se puede ignorar es que la velocidad del sonido no es una constante. En el aire depende sobre todo de la temperatura:

v ≈ 331,3 + 0,606 × T (m/s, con T en °C)
Velocidad del sonido en el aire según la temperatura.
TemperaturaVelocidad del sonidoMicrosegundos por cada centímetro de distancia
−10 °C325,2 m/s61,5 µs
0 °C331,3 m/s60,4 µs
20 °C343,4 m/s58,2 µs
30 °C349,5 m/s57,2 µs
40 °C355,5 m/s56,3 µs

Un cambio de 10 °C modifica la velocidad un 1,8 %: a 1 m, casi 2 cm. Si el programa supone 343 m/s y el aire está a 0 °C, un objeto a 100 cm se leerá a 103,7 cm. Para aplicaciones donde ±3 cm no importan (esquivar obstáculos), se ignora; para mediciones de ±1 cm, se compensa (sección 06). La humedad y la presión influyen mucho menos y se desprecian.

03 · El sensor

El HC-SR04

El módulo HC-SR04 tiene dos cilindros metálicos: un emisor y un receptor piezoeléctricos de 40 kHz. Una pequeña placa genera la ráfaga, amplifica el eco y mide el tiempo. Tiene cuatro pines: Vcc (5 V), Trig, Echo y GND. Sus datos principales (de las hojas de datos habituales; las unidades varían entre fabricantes):

  • Alcance: de 2 a 400 cm. Por debajo de 2 cm, el transductor sigue vibrando después de emitir (ringing) y no puede oír el eco: es la zona ciega.
  • Alimentación: 5 V y unos 15 mA.
  • Disparo: un pulso de al menos 10 µs en el pin Trig.
  • Salida: un pulso en el pin Echo cuyo ancho es el tiempo de vuelo. El pin entrega 5 V: un microcontrolador de 3,3 V necesita un divisor o un conversor de niveles (tema 3).
  • Ángulo de medición: unos 15° según el fabricante; en la práctica el haz es más ancho y asimétrico.
  • Período entre mediciones: al menos 60 ms, para que los ecos de la medición anterior se extingan.
Diagrama temporal de una medición con el HC-SR04 Tres trazas. La primera, Trig, muestra un pulso de 10 microsegundos. La segunda muestra la ráfaga de ultrasonido emitida de 8 ciclos a 40 kHz, seguida, mucho después, del eco más débil. La tercera, Echo, sube cuando termina la ráfaga y baja cuando llega el eco; su ancho es el tiempo de vuelo. Trig10 µs Ultrasonido8 ciclos a 40 kHzeco (más débil) Echo ancho = tiempo de vuelo t

La secuencia es: el programa baja Trig, lo sube 10 µs y lo vuelve a bajar; el módulo emite 8 ciclos de 40 kHz; Echo sube cuando termina la emisión y baja cuando llega el eco; el programa mide cuánto tiempo estuvo Echo alto. Si no vuelve ningún eco, el módulo deja Echo alto durante unos 38 ms y luego lo baja: una lectura «sin objeto» que equivale a más de 6 m y debe interpretarse como tal.

04 · Programa

Leer el pulso de eco

Hay dos maneras de medir el ancho de Echo. La más simple usa pulseIn, que espera a que el pin cambie y mide cuánto dura el nivel:

const uint8_t TRIG = 9, ECHO = 10;

void setup() {
    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);
}

// Versión simple y bloqueante: tarda hasta el tiempo de espera máximo
float distanciaCm(float tempC) {
    digitalWrite(TRIG, LOW);  delayMicroseconds(2);
    digitalWrite(TRIG, HIGH); delayMicroseconds(10);
    digitalWrite(TRIG, LOW);

    unsigned long eco = pulseIn(ECHO, HIGH, 30000UL);     // tiempo máximo: 30 ms (≈ 5 m)
    if (eco == 0) return NAN;                             // no volvió ningún eco

    float v = 331.3 + 0.606 * tempC;                      // velocidad del sonido (m/s)
    return eco * v / 20000.0;                             // cm = µs × m/s / 2 × 1e-4
}

Es cómoda, pero bloquea el programa mientras espera: si el objeto está a 3 m, son 17 ms sin hacer nada más, y si no hay objeto, los 30 ms completos. Para un robot que además debe leer otros sensores y mover motores es demasiado. Además, mientras espera no atiende nada más, y su exactitud se degrada si hay otras interrupciones frecuentes. La alternativa es medir el pulso con una interrupción en el pin Echo, que anota el instante de subida y de bajada con micros(), mientras el bucle principal sigue trabajando:

const uint8_t PIN_ECHO = 2;                   // pin con interrupción externa (INT0)
volatile uint32_t tSubida = 0, anchoEco = 0;
volatile bool ecoListo = false;

void alCambiarEco() {
    if (digitalRead(PIN_ECHO)) tSubida = micros();
    else { anchoEco = micros() - tSubida; ecoListo = true; }
}

void setup() {
    pinMode(TRIG, OUTPUT);
    pinMode(PIN_ECHO, INPUT);
    attachInterrupt(digitalPinToInterrupt(PIN_ECHO), alCambiarEco, CHANGE);
}

uint32_t tMedida = 0;
bool esperando = false;

void loop() {
    uint32_t ahora = millis();

    if (!esperando && ahora - tMedida >= 60) {         // una medición cada 60 ms como mínimo
        tMedida = ahora;
        ecoListo = false;
        esperando = true;
        digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW);
    }
    if (esperando && ecoListo) {
        noInterrupts();
        uint32_t ancho = anchoEco;                        // copia atómica de un dato de 32 bits
        interrupts();
        esperando = false;
        procesarEco(ancho);
    } else if (esperando && ahora - tMedida > 40) {  // ni siquiera el módulo devolvió el pulso
        esperando = false;
        procesarEco(0);                                   // sin eco
    }
    // ... el resto del programa corre sin esperas
}

La estructura es la que conocemos del curso: un temporizador (millis()) decide cuándo disparar, una interrupción mide, y el bucle recoge el resultado y lo procesa. Dos detalles de robustez: la copia de anchoEco se hace con las interrupciones desactivadas, porque una variable de 32 bits en un AVR de 8 bits no se lee de forma atómica (tema 21 del curso de Microcontroladores); y se agrega un tiempo máximo propio, para que una falla del sensor (cable cortado) no deje al programa esperando para siempre.

05 · Los límites

Qué mide en realidad

El sensor no mide «la distancia al objeto»: mide el tiempo hasta el primer eco suficientemente fuerte. Esa frase encierra casi todos los problemas del HC-SR04:

  • Zona ciega. Por debajo de 2 cm no se distingue el eco de la vibración residual del transductor. Montado detrás de una carcasa o con un objeto muy cerca, entrega lecturas absurdas o constantes de unos 2 cm.
  • Cono de detección. El haz tiene un ángulo de unos 15° nominales y lóbulos laterales. A 3 m, el haz cubre un círculo de unos 80 cm de diámetro: el eco puede venir de un mueble lateral y no del objeto de interés. Para esquivar obstáculos conviene un sensor apuntando al frente; para un objeto pequeño, una cuidadosa orientación.
  • Superficies. Las superficies duras, lisas y perpendiculares al haz devuelven un buen eco. Las inclinadas lo desvían lejos del receptor (un muro a 45° puede no devolver nada), las blandas (tela, espuma, cortinas, ropa) lo absorben, y los objetos pequeños o finos (una varilla) devuelven un eco débil.
  • Reflexiones múltiples. En espacios cerrados, el eco puede rebotar en dos superficies y llegar con un retardo de más. El resultado es una distancia mayor que la real, o un eco que llega durante la medición siguiente.
  • Ruido acústico. Algunas fuentes (aire comprimido, motores, frenos) emiten ultrasonido que el receptor capta como un eco falso.
  • Interferencia entre sensores. Dos HC-SR04 que miden al mismo tiempo se escuchan entre sí. Con varios sensores se los dispara en secuencia, esperando que cada eco se extinga, nunca simultáneamente.
  • Falsos positivos de temperatura y viento. Un gradiente fuerte de temperatura (un calefactor entre el sensor y el objeto) curva el haz, y el viento lateral lo desvía.
Alcance efectivo aproximado según el objeto (valores ilustrativos: medir siempre con el objeto real).
ObjetoAlcance efectivo típicoPor qué
Pared plana y dura, perpendicularhasta ≈ 400 cmEco fuerte hacia el receptor
Superficie dura inclinada 30°≈ 250 cmParte del eco se desvía
Superficie dura inclinada 45°≈ 60 cmEl eco se aleja del receptor
Tela, espuma, cortinas≈ 120 cmAbsorben el sonido
Poste o varilla fina≈ 150 cmPoca superficie reflectante

06 · Mejorar la exactitud

Compensar la temperatura

La compensación consiste en calcular la velocidad del sonido con la temperatura real del aire en lugar de usar una constante. Cuesta una línea de código y un sensor de temperatura (un DS18B20 o un SHT31 del tema 12), y reduce el error que vimos en la tabla:

Error al medir un objeto a 100 cm suponiendo siempre 20 °C.
Temperatura realEcoDistancia calculada con 343,4 m/sError
−10 °C6149 µs105,6 cm+5,6 cm
0 °C6037 µs103,7 cm+3,7 cm
20 °C5824 µs100,0 cm0,0 cm
30 °C5723 µs98,3 cm−1,7 cm
35 °C5674 µs97,4 cm−2,6 cm

El error es proporcional a la distancia: a 4 m, los 5,6 cm se convierten en 22 cm. Si el sensor está al aire libre o en una nave con grandes variaciones de temperatura, la compensación es imprescindible. Si se mide en interiores con temperatura casi constante, alcanza con fijar una constante para la temperatura media de la instalación. Con dos precauciones: el sensor de temperatura debe medir el aire del recorrido del sonido y no el calor de la placa, y la temperatura se actualiza cada varios segundos, no en cada medición.

07 · Datos confiables

Filtrar las lecturas

Una serie de lecturas de un HC-SR04 sobre un objeto fijo parece tener dos clases de errores. El primero es un ruido pequeño de ±0,3 a ±1 cm por diferencias de temperatura, electrónica y cuantización. El segundo es más grave: de vez en cuando aparece una lectura completamente equivocada: un 0 (sin eco), un valor doble (reflexión múltiple) o un valor mucho menor (un insecto, una ráfaga de ruido). Un promedio simple de esas lecturas se contamina con los valores atípicos; la herramienta adecuada es la mediana (tema 5):

const uint8_t N = 5;
float lecturas[N];
uint8_t cantidad = 0, indice = 0;

float medianaN(const float *datos, uint8_t n) {         // copia y ordena (n es pequeño)
    float copia[N];
    for (uint8_t i = 0; i < n; i++) copia[i] = datos[i];
    for (uint8_t i = 1; i < n; i++) {
        float x = copia[i]; int8_t j = i - 1;
        while (j >= 0 && copia[j] > x) { copia[j + 1] = copia[j]; j--; }
        copia[j + 1] = x;
    }
    return copia[n / 2];
}

void procesarEco(uint32_t ancho) {
    if (ancho == 0) return;                              // sin eco: no entra al historial
    float cm = ancho * velocidadSonido / 20000.0;
    if (cm < 2 || cm > 400) return;                     // fuera del rango del sensor
    lecturas[indice] = cm;
    indice = (indice + 1) % N;
    if (cantidad < N) cantidad++;
    distanciaFiltrada = medianaN(lecturas, cantidad);
}

El filtro de mediana de cinco muestras descarta hasta dos lecturas atípicas sin dejar rastro. Reglas complementarias:

  • Descartar lo imposible antes de filtrar: ceros, valores fuera de 2 a 400 cm, saltos que implican velocidades absurdas (un objeto que se mueve 3 m en 60 ms).
  • Distinguir «sin eco» de «lejos». Un cero repetido puede significar que el objeto salió del alcance o que se desconectó el sensor. Un contador de ceros consecutivos permite declarar «sin objeto» o «falla» según la política de la aplicación (tema 44).
  • Aplicar un suavizado exponencial (tema 5) sobre la mediana si se necesita una salida estable, aceptando el retardo.
  • Usar histéresis en las decisiones por umbral (tema 7): «obstáculo a menos de 30 cm» con una banda de 5 cm evita que el robot dude.

08 · Alcances y alternativas

Resolución y alternativas

La resolución de la medición depende del reloj con que se mide el pulso. Con pulseIn o micros() en un Arduino de 16 MHz, el temporizador cuenta de a 4 µs. Con un temporizador en modo captura (tema 24 del curso de Microcontroladores), la resolución llega a 1 µs o menos:

Resolución teórica de la distancia según la resolución del temporizador (a 20 °C).
Resolución del relojDistancia por cuentaComentario
4 µs (micros() en AVR de 16 MHz)≈ 0,069 cmMás fina que el ruido del sensor
1 µs (captura)≈ 0,017 cmMás fina todavía; el límite lo pone el sensor

Como el ruido real del HC-SR04 es de ±0,3 cm o más, la resolución del reloj no es el factor limitante: afinar el temporizador no mejora la medición. La exactitud práctica es de ±1 cm en las mejores condiciones y se degrada con la temperatura sin compensar y con superficies difíciles. Cuando el HC-SR04 no alcanza, las alternativas son:

Alternativas para medir distancias.
SensorPrincipioVentajaLimitación
JSN-SR04T (sonda impermeable)Ultrasonido, transductor selladoResiste agua y polvo; para tanques y exterioresZona ciega mayor (≈ 20–25 cm)
Ultrasónicos industriales (MaxBotix y otros)Ultrasonido, con salida analógica, serie o PWMHaz más estrecho, compensación de temperatura incluidaMás caros
Sharp GP2Y0A (infrarrojo)Triangulación ópticaRápido, haz muy angostoRango corto, salida no lineal (tema 18)
VL53L0X (láser, tiempo de vuelo)Tiempo de vuelo de luz infrarrojaHaz estrecho, exacto a pocos milímetrosAlcance de 1 a 2 m; afectado por la luz solar (tema 18)

La regla de elección: el ultrasonido es robusto frente al color y la transparencia del objeto (un vidrio o un objeto negro lo reflejan igual que uno blanco), y funciona en oscuridad y con humo; sufre con las superficies blandas e inclinadas. La luz (infrarroja, láser) es precisa y de haz fino, pero depende del color y de la luz ambiente. Se complementan.

09 · Analogía con programación

Temperatura, resolución y ráfagas de lecturas

Probemos tres piezas de lógica: la dependencia de la velocidad del sonido con la temperatura (y el error si se la ignora), la conversión del ancho del pulso a distancia con distinta resolución del reloj, y el filtrado de una ráfaga de lecturas con valores atípicos usando la media, la mediana y una media que descarta los ceros.

Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.

def velocidad(temp_c):
    """Velocidad del sonido en el aire (m/s)."""
    return 331.3 + 0.606 * temp_c


def eco_us(distancia_cm, temp_c):
    """Tiempo de vuelo que mediría el sensor."""
    return 2 * distancia_cm / velocidad(temp_c) * 1e4


def distancia_cm(eco, temp_c):
    return eco * velocidad(temp_c) / 20000


print("T (°C)  v (m/s)  µs por cm")
for t in (-10, 0, 20, 30, 40):
    print(f"{t:6d}  {velocidad(t):7.1f}  {2e4 / velocidad(t):9.2f}")

print()
print("Objeto a 100 cm; el programa supone siempre 20 °C:")
for t in (30, 0):
    eco = eco_us(100, t)
    calculada = distancia_cm(eco, 20)
    print(f"  aire a {t:2d} °C: eco {eco:6.0f} µs -> {calculada:6.2f} cm (error {calculada - 100:+.2f} cm)")

print()
print("Resolución del reloj (a 20 °C):")
for resolucion in (4, 1):
    print(f"  {resolucion} µs por cuenta -> {distancia_cm(resolucion, 20):.3f} cm por cuenta")

# ---- Una ráfaga de lecturas con dos ceros (sin eco) ----
lecturas = [100.4, 99.8, 100.9, 0, 100.2, 0, 99.7, 100.1, 100.6]
ordenadas = sorted(lecturas)
media = sum(lecturas) / len(lecturas)
mediana = ordenadas[len(ordenadas) // 2]
validas = [x for x in lecturas if x > 0]
print()
print(f"Media simple:           {media:7.2f} cm")
print(f"Mediana:                {mediana:7.2f} cm")
print(f"Media sin los ceros:    {sum(validas) / len(validas):7.2f} cm")

Resultado: la velocidad del sonido pasa de 325,2 m/s a −10 °C a 355,5 m/s a 40 °C. Un objeto a 100 cm con el aire a 30 °C se lee 98,27 cm (−1,73 cm) y con el aire a 0 °C, 103,66 cm (+3,66 cm), si el programa supone 20 °C. Una cuenta de 4 µs equivale a 0,069 cm, y de 1 µs, 0,017 cm. En la ráfaga, la media simple da 77,97 cm (arrastrada por los ceros), la mediana 100,10 cm y la media sin ceros 100,24 cm. Probá reemplazar un cero por 201,5 (un eco doble): la mediana casi no se mueve y la media sin ceros sí.

El ejemplo muestra por qué la mediana es el filtro natural de este sensor: no necesita saber qué tipo de error ocurrió. Su límite es que, con solo la mitad de las lecturas buenas o menos, también falla; en ese caso hay que detectar la falla (tema 44).

10 · Exploración interactiva

Un eco con sus límites y una ráfaga de lecturas

El primer instrumento simula una medición: elegí la distancia real, el tipo de superficie, la temperatura del aire y si el programa compensa la temperatura, y mirá el ancho del eco, la distancia calculada y el error. El segundo repite la medición nueve veces con ruido y lecturas espurias, y compara la media con la mediana. Los alcances por superficie son los de la tabla de la sección 05, un modelo ilustrativo.

Instrumento 1: una medición con el HC-SR04

Velocidad real del sonido—
Ancho del pulso de eco—
Distancia que calcula el programa—
Error—
Distancia por cuenta del reloj—
Estado de la medición
—

Instrumento 2: una ráfaga de 9 lecturas sobre el mismo objeto

Lecturas (cm)—
Media simple—
Mediana—
Media sin ceros—

Recorrido guiado

  1. Con una pared a 100 cm, 20 °C, velocidad fija y reloj de 4 µs: el eco dura unos 5824 µs y la distancia calculada es 100,0 cm (con un error de décimas por la cuantización del reloj). Cada cuenta equivale a 0,069 cm.
  2. Bajá la temperatura a 0 °C: el eco dura unos 6036 µs y el programa, que supone 20 °C, calcula 103,7 cm. Cambiá a «velocidad compensada»: el error desaparece.
  3. Subí la distancia a 400 cm con aire a 30 °C y velocidad fija: el error ya es de unos 7 cm. El error de la temperatura crece con la distancia.
  4. Llevá el objeto a 1 cm: aparece la zona ciega y la lectura deja de ser confiable. Pasá a 450 cm: no hay eco (fuera del rango del sensor).
  5. Cambiá la superficie a «Tela o espuma» y alejá el objeto a 150 cm: ya no hay eco, aunque estés dentro del alcance nominal del sensor. Con «Dura inclinada 45°» ocurre pasados los 60 cm.
  6. Con el reloj de 16 µs, cada cuenta equivale a 0,27 cm: ya es comparable al ruido del sensor. Un bucle lento degrada la medición.
  7. En el instrumento 2, con ruido de 0,3 cm y sin lecturas espurias: media y mediana coinciden. Subí la probabilidad de espurias al 30 % y medí varias veces: la media se aleja del valor real, mientras que la mediana casi no cambia.
Desafío: el robot en una bodega fría

Un robot mide distancias con el HC-SR04 y su programa supone 20 °C, pero opera en una cámara frigorífica a −10 °C. Con el instrumento 1 comprobá el error a 50, 100 y 200 cm: unos +2,8; +5,6 y +11,2 cm. El robot cree que los obstáculos están más lejos de lo real. Si su distancia de frenado se calcula con el valor medido, ¿qué consecuencia tiene? Frena tarde. La solución más barata es una constante de compensación para esa temperatura, o un sensor de temperatura en el robot. Un error sistemático conocido es un error corregible.

11 · Método de trabajo

Cómo elegir y conectar un sensor ultrasónico

  1. Definí el alcance y la exactitud necesarios. De 2 a 400 cm y ±1 cm es lo mejor que ofrece un HC-SR04; si hace falta más, otro sensor.
  2. Analizá el objeto: material, forma, orientación respecto del haz. Probá con el objeto real, no con la pared del escritorio.
  3. Alimentá a 5 V con desacople y, si el microcontrolador es de 3,3 V, adaptá el nivel del pin Echo.
  4. Elegí el método de lectura: pulseIn para pruebas; interrupción o captura cuando el programa hace otras cosas.
  5. Respetá el período mínimo de 60 ms y dispará varios sensores en secuencia, nunca a la vez.
  6. Compensá la temperatura si el error de ±3 % de la distancia es excesivo.
  7. Filtrá con una mediana de 3 a 5 lecturas y tratá los ceros como «sin eco», no como una distancia.
  8. Decidí con histéresis y prevé la falla del sensor (cable cortado: Echo siempre en alto o en bajo).
  9. Montalo con cuidado: sin objetos a menos de unos 5 cm, con el eje perpendicular al plano a medir, y sin vibraciones que lo muevan.

Si un HC-SR04 da siempre cero, revisá primero la alimentación (5 V), el pulso de disparo (10 µs) y el cableado de Trig y Echo; si da valores erráticos, el entorno (superficie, ángulo, ruido) y el período de repetición.

12 · Comprensión

Confusiones frecuentes

«El HC-SR04 mide con exactitud milimétrica»

Su resolución de reloj sí lo permitiría, pero el ruido, la temperatura y la geometría limitan la exactitud práctica a ±1 cm o peor.

«La velocidad del sonido es 343 m/s»

Es el valor a 20 °C. Cambia unos 0,6 m/s por grado: a 0 °C es 331 m/s y a 40 °C, 355 m/s.

«Un cero en la lectura significa distancia cero»

Significa que no volvió ningún eco (objeto lejano, absorbente o inclinado) o que el sensor falló. Hay que tratarlo como «sin dato».

«Con dos sensores puedo medir al mismo tiempo»

Se interfieren: cada uno recibe el eco del otro. Hay que dispararlos en secuencia, esperando que cada eco se extinga.

«Si no detecta un objeto, el sensor está roto»

Lo más frecuente es que la superficie absorba o desvíe el sonido (tela, ángulo, objeto fino). Una pared plana a 50 cm es la prueba básica.

«Un promedio de varias lecturas elimina los errores»

Si hay lecturas completamente erróneas (ceros, ecos dobles), el promedio se contamina. La mediana las ignora.

13 · Práctica guiada

Predecí antes de comprobar

1. Del eco a la distancia

El pin Echo permanece en alto 5830 µs con el aire a 20 °C. ¿A qué distancia está el objeto?

Ver solución

d = 5830 × 343,4 / 20 000 ≈ 100,1 cm. Con la regla aproximada de 58,3 µs por cm da 100,0 cm.

2. Error por temperatura

Un objeto está a 2 m y el aire está a 35 °C, pero el programa supone 20 °C. ¿Qué distancia calcula y qué error comete?

Ver solución

Con v = 352,5 m/s a 35 °C el eco dura 2 × 200 / 352,5 × 104 ≈ 11 347 µs. El programa, con 343,4 m/s, calcula 11 347 × 343,4 / 20 000 ≈ 194,8 cm: un error de −5,2 cm (−2,6 %).

3. Tiempo máximo de espera

Se quiere medir hasta 4 m con aire a 20 °C. ¿Cuánto tarda el eco más lejano? Si se usa pulseIn con un tiempo de espera de 25 000 µs, ¿hasta dónde se mide?

Ver solución

Eco a 4 m: 2 × 400 / 343,4 × 104 ≈ 23 300 µs. Con un tiempo de espera de 25 ms se mide hasta 25 × 10−3 × 343,4 / 2 ≈ 4,29 m. Con 30 ms (≈ 5,1 m) hay más margen, a costa de bloquear más tiempo cuando no hay objeto.

4. Resolución

¿Cuántos centímetros equivale una cuenta de 4 µs (con micros()) y una de 1 µs? ¿Tiene sentido afinar el reloj si el ruido del sensor es de 0,3 cm?

Ver solución

4 µs → 4 × 343,4 / 20 000 ≈ 0,069 cm; 1 µs → 0,017 cm. Ambas son mucho menores que 0,3 cm: no tiene sentido afinar el reloj; el límite lo pone el sensor.

5. El cono del haz

Con un semiángulo de haz de 7,5°, ¿qué radio cubre el haz a 3 m? ¿Qué implica para medir un objeto pequeño a esa distancia?

Ver solución

Radio = 3 m × tan 7,5° ≈ 0,39 m, o sea un círculo de unos 79 cm de diámetro. Cualquier objeto dentro del cono, no solo el de interés, puede devolver el primer eco. Para un objeto pequeño hay que despejar el entorno o usar un sensor de haz más angosto (tema 18).

6. Elegir el sensor

Elegí HC-SR04, sonda impermeable o sensor de otro tipo para: (a) un robot que esquiva obstáculos en interiores entre 5 y 200 cm; (b) medir el nivel de agua de un tanque de 3 m, al aire libre; (c) medir el espesor de una pieza con ±0,1 mm.

Ver solución

(a) HC-SR04, con filtro de mediana y compensación opcional. (b) Sonda impermeable (JSN-SR04T o similar), montada por encima del tanque, con su zona ciega (≈ 25 cm) y compensación de temperatura. (c) Ninguno de los ultrasónicos: la exactitud necesaria es 100 veces mejor; hace falta un calibre, un sensor láser o un comparador mecánico.

14 · Síntesis

Ideas para recordar

  • Un sensor ultrasónico mide el tiempo de vuelo de un eco; la distancia es d = v·t/2, con v ≈ 343 m/s a 20 °C (0,0343 cm/µs, unos 58,3 µs por cm).
  • La velocidad del sonido cambia con la temperatura: v ≈ 331,3 + 0,606·T m/s. Ignorarlo da errores de unos 0,17 % por cada grado, que crecen con la distancia.
  • El HC-SR04 mide de 2 a 400 cm, se dispara con un pulso de 10 µs y entrega el tiempo de vuelo como el ancho del pulso en Echo (5 V).
  • pulseIn es simple pero bloquea; una interrupción en Echo con micros() permite medir sin bloquear, con una copia atómica del resultado.
  • El período entre mediciones debe ser de al menos 60 ms, y varios sensores se disparan en secuencia.
  • Mide el primer eco suficientemente fuerte: tiene zona ciega, un cono ancho y falla con superficies blandas, inclinadas o muy finas.
  • Un cero significa «sin eco», no «distancia cero»; las lecturas espurias se filtran con una mediana y no con un promedio.
  • La resolución del reloj (0,069 cm con 4 µs) es mejor que el ruido del sensor (≈ 0,3 cm): la exactitud práctica es de ±1 cm.
  • El ultrasonido es insensible al color y la transparencia; la luz (tema 18) es más precisa pero depende del objeto y de la luz ambiente.

¿Listo para el tema 18?

Antes de avanzar, convertí un eco de 3500 µs en centímetros a 20 °C, estimá el error que produce suponer 20 °C cuando el aire está a 0 °C a 150 cm, y explicá por qué la mediana de cinco lecturas es mejor que su promedio cuando hay ecos perdidos. Si podés justificar las tres respuestas, ya sabés medir distancias con ultrasonido.

En el próximo tema estudiamos los sensores infrarrojos y de tiempo de vuelo láser: los Sharp GP2Y0A y el VL53L0X, con su triangulación óptica, sus curvas no lineales y su sensibilidad a las superficies reflectantes.