Un sensor de ultra sonidos es un dispositivo para medir distancias. Su funcionamiento se base en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor, que dispone de un micrófono adecuado para esa frecuencia. Midiendo el tiempo entre pulsos, conociendo la velocidad del sonido, podemos estimar la distancia del objeto contra cuya superficie impacto el impulso de ultrasonidos.
Los sensores de ultrasonidos son sensores baratos, y sencillos de usar. El rango de medición teórico del sensor HC-SR04 es de 2cm a 400 cm, con una resolución de 0.3cm. En la práctica, sin embargo, el rango de medición real es mucho más limitado, en torno a 20cm a 2 metros. Los sensores de ultrasonidos son sensores de baja precisión. La orientación de la superficie a medir puede provocar que la onda se refleje, falseando la medición. Además, no resultan adecuados en entornos con gran número de objetos, dado que el sonido rebota en las superficies generando ecos y falsas mediciones. Tampoco son apropiados para el funcionamiento en el exterior y al aire libre. Pese a esta baja precisión, que impide conocer con precisión la distancia a un objeto, los sensores de ultrasonidos son ampliamente empleados. En robótica es habitual montar uno o varios de estos sensores, por ejemplo, para detección de obstáculos, determinar la posición del robot, crear mapas de entorno, o resolver laberintos.
Vamos a montar en TinkerCad el circuito de la imagen inferior. En dicho circuito tenemos (además de la placa de Arduino y de la protoboard) el sensor de ultasonidos HC-SR04, un zumbador (Piezo en Arduino o Buzzer en inglés) y un LED. El circuito que vamos a realizar deberá funcionar de tal forma que a distancias mayores de 100 cm no hará nada, pero para distancias inferiores a esa y más, cuanto más cerca esté el obstáculo del sensor, el zumbador emitirá señal acústica de mayor frecuencia y el LED parpadeará, también, a mayor frecuencia. Todo esto se explica con más detalle al inicio de vídeo de más abajo.
El programa sería:
delaymicroseconds()
Hace una pausa en el programa durante la cantidad de tiempo (en microsegundos) especificado como parámetro. Hay mil microsegundos en una milésima de segundo, y un millón de microsegundos en un segundo. Actualmente, el máximo valor que se puede utilizar con precisión es de 16383. Para esperas mayores que esta, se recomienda usar la función delay(). El mínimo valor que se puede utilizar con precisión es de 3 μs.
Sintaxis: delayMicroseconds(valor);
valor: es el tipo de pulso que se quiere leer (HIGH o LOW). Tipo: int
pulseIn()
Lee un pulso (HIGH o LOW) de un pin determinado. Por ejemplo, si el valor especificado como parámetro es HIGH, pulseIn() espera a que el pin esté en HIGH, en ese momento comienza la cuenta (timing) hasta que la tensión en el pin esté en LOW momento en que cesa la cuenta. pulseIn() devuelve la duración del pulso en microsegundos. Asimismo, pulseIn() devuelve control con un 0 como retorno si el pulso no comienza dentro de un periodo especificado (time out).
Por ejemplo, sirve para detectar el cambio de estado en una señal por ultrasonidos, es decir, si se configura el pin del sensor de ultrasonidos a un valor alto (HIGH), devolverá el tiempo transcurrido entre el cambio de estado a ese valor. Previamente habrá que establecer el pin del triger en el sensor ultrasonidos a un valor bajo (LOW). De esta forma, sabiendo el tiempo transcurrido se puede calcular una distancia.
Sintaxis: pulseIn(pin, valor);
pin: es el número del pin del que se quiere leer la duración del pulso. Tipo: int
valor: es el tipo de pulso que se quiere leer (HIGH o LOW). Tipo: int
tone()
La función tone() proporciona en una salida PWM una señal con un ciclo de trabajo del 50% y una frecuencia especifica, también se puede indicar el tiempo que estará generando esa señal.
Sintaxis: tone(pin, frecuencia) // tone(pin, frecuencia, duración)
El parámetro duración es opcional; si no se especifica, el sonido continúa hasta que se ejecuta la orden noTone(pin). En caso de no especificar la duración, la función tone() se comporta igual que la digitalWrite(), es decir, cuando se le da la orden de poner el pin de salida a HIGH, lo mantiene en este estado hasta que se le da la orden de ponerlo a LOW.
noTone()
La función noTone() deja de generar la onda cuadrada que en principio estaba emitiéndose por una ejecución previa de tone(), a través del pin especificado. Si no hay ninguna señal emitiéndose en ese pin, esta función no hace nada. Se debe utilizar cuando se quiere generar un tono en otro pin distinto al último pin empleado.
Sintaxis: noTone(pin);
pin: es el número del pin del que se quiere leer la duración del pulso. Tipo: int
VÍDEO DE LA PRÁCTICA
Práctica resuelta
Es interesante en la mayoría de las ocasiones realizar bloques de código que sean reutilizables como parte de proyectos más complejos. En la siguiente práctica vamos a crear una función a modo de subrutina que llamaremos para obtener un dato. Dejamos el circuito igual. El nuevo programa sería: