Montaje básico de un HC-SR04

Hoy vamos a presentar uno de los principales módulos usados en construcciones robóticas: sensores ultrasónicos.

La física

El sensor se basa en un principio simple, el funcionamiento de un sonar o la medición del tiempo que tardamos en escuchar el eco de una señal emitida. Una membrana emite un sonido ultrasónico y una segunda membrana captura la señal de eco reflejada por el obstáculo.

Por tanto, la fórmula es:

D = VT / 2

Donde…

D = distancia del obstáculo
V = velocidad del sonido
T = tiempo medido para señal de disparo para realizar la ida y vuelta

La división por 2 es debido al hecho de que el tiempo medido es el obtenido durante el viaje completo de la señal (ida y vuelta).

Observemos que la velocidad del sonido en el aire varía en función de la temperatura como sigue:

V = 331,4 + 0,62 t

Donde t es la temperatura medida en ° C y la velocidad se mide en metros / segundos. En nuestros experimentos se supone que la temperatura es 20 ° C y la velocidad del sonido es, por tanto, aprox. 340 m / s.

En nuestros cálculos tiempo será medido en microsegundos y la distancia de salida en centímetros. Por lo tanto la fórmula anterior se convierte en

D = 0.017 * T

Advertencia

El sonido es una onda longitudinal (es decir, que progresa a lo largo de una línea horizontal). Por lo tanto cuando el obstáculo no está perfectamente frente al módulo (paralelo al mismo), los sonidos pueden ser desviados y señal de eco puede no alcanzar de nuevo el sensor o llegar a él muy atenuada y por lo tanto no ser detectada (ver imagen 3).

Ese el motivo de que cuando el obstáculo está en un ángulo de más de 30 ° respecto a la dirección de propagación de la señal disparada por el sensor, este devuelva resultados erráticos.

Más advertencias

Observemos también que el material con el que está hecho el obstáculo debe ser tenido en cuenta. De hecho, algunos materiales tienden a absorber la señal de disparo y devolver resultados falsos al sensor de eco.

El módulo

Este es un sensor de ultrasonidos estándar de bajo coste (HC-SR4). Está construido esencialmente con dos micrófonos idénticos. Uno se utiliza como emisor y el otro como receptor. Incluye hay también la electrónica mínima para la generación de la señal.

Estas son sus principales características:

Fuente de alimentación: DC 5
Corriente de reposo: <2 mA
Corriente de trabajo: 15mA
Ángulo Eficaz: <15 °
Gama de Distancias: 2cm – 400cm
Resolución: 0.3cm
Ángulo de medición: 30 °
Disparador de entrada de ancho de pulso: 10us
Frecuencia ultrasónica: 40kHz
Dimensiones: 45mm x 20mm x 15mm

Observe que el rango de distancias devueltas es teórico. De hecho, en nuestros experimentos, para distancias superiores a 300 cm da resultados totalmente erráticos.

Las pregunta

Q: ¿Cómo debe ser de grande el obstáculo para poder ser “visto”?

A: De acuerdo con la hoja de datos el obstáculo mínimo debe tener una superficie de 0,5 m cuadrados. Eso garantiza que a una distancia de 3 metros la calidad de señal que le llega al sensor sea la suficiente para poder obtener un dato con una precisión aceptable en centímetros. Lógicamente cuanto más cerca esté el objeto que deseemos detectar, menor será la superficie necesaria para mantener ese nivel de precisión.

Su presentación

El módulo tiene cuatro pines. Su funcionalidad es la siguiente:

Vcc = + 5V DC
Trig = Señal de disparo (entrada)
Echo = señal de eco (salida)
Gnd = 0 V DC

La señal de disparo

El módulo acepta una señal TTL en el pin de Trigger (disparo), se recibe la señal de eco en el pin Echo (eco). La longitud de la señal recibida es proporcional a la distancia hasta el obstáculo.

El módulo emite la señal de disparo cuando el pin de disparo pasa a ALTO durante un período de al menos 10 microsegundos. Entonces, una ráfaga de 8 señales de 10 microsegundos cada una se emite en 40 kHz.

El circuito de prueba

Esta es la conexión básica del módulo HC-SR04 con el Arduino Uno (R3).

El programa de pruebas

Antes de entrar en el programa hay que destacar que las rutinas de medición se utilizan, por ejemplo, mucho en un robot, por lo tanto estas deben ser rápidas y utilizar con cuidado la memoria. Es decir que debemos prestar especial atención a la hora de dimensionar la estructura mínima de datos que necesitamos.

Para la variable que contiene el valor del tiempo de ida y vuelta (en microsegundos) nosotros sólo necesitamos una variable de tipor entero sin signo de 16 bits (uint16). Lo que verificamos tomamos como distancia máxima (4 metros) y aplicamos la fórmula anterior:

8 = 340 * T * 10 ^ 6

T = (8 / 340 )* 10^6

Donde 8 es la distancia máxima de ida y más la de vuelta. (4+4) y donde despejando comprobamos que T da un resultado de 23.530. Es decir no cabría en una variable de tipo entero sin signo. De hecho si necesitamos trabajar con unidades de medida inferiores, deberemos usar una variable de tipo entero sin signo de 32 bits (uint32)

/ ************************************************* ***************************
HC-SR04: programa de prueba para el módulo de ultrasonidos

Autor: Enrico Formenti
Permisos: licencia MIT

Observaciones:
************************************************** *************************** /

uint8_t const trigPin = 4;
uint8_t const echoPin = 2;

void setup () {
// Inicializamos la comunicación por el puerto serie:
Serial.begin (9600);
}

void loop ()
{

duracion uint32_t; // duración del viaje completo de la señal
uint32_t cm; // distancia del obstáculo

// El sensor se activa por un alto pulso de 10 o más microsegundos.
// Damos un pulso BAJO corto de previo para asegurar un pulso ALTO limpio:
pinMode (trigPin, OUTPUT);
digitalWrite (trigPin, LOW);
delayMicroseconds (3);

// Iniciamos la señal de disparo

digitalWrite (trigPin, HIGH);
delayMicroseconds (10);
digitalWrite (trigPin, LOW);

// Leemos la señal del sensor: un pulso ALTO cuya
// duración es el tiempo (en microsegundos) desde el envío
// del ping hasta la recepción de su eco al rebotar en un objeto.

pinMode (echoPin, INPUT);
duracion = pulseIn (echoPin, HIGH);

// Convertimos el tiempo en una distancia
cm = (uint32_t) ((duracion << 4) + duracion) / 1000.0; // cm = 17 * Duracion / 1000

Serial.print (cm);
Serial.print («centímetros»);
Serial.println ();

delay (100);
}

¿Y ahora qué?

Nuestros experimentos pueden avanzar en varias direcciones. En primer lugar, en obtener unas medidas más precisas. Está claro que nuestro sensor tiene alguna inexactitud. Por lo tanto es una buena idea hacer varias mediciones sucesivas y luego realizar algún tipo de cálculos estadísticos sobre ellos. Es evidente que, para ser útil este tipo de desarrollo debe mantener un buen compromiso entre velocidad de cálculo y precisión.

En segundo lugar, es evidente que el uso de un solo sensor no ayuda mucho a entender la geometría obstáculo. Por lo tanto uno puede añadir un segundo (y un tercero o más si lo deseamos) sensores con un ángulo diferente y extraer más información de la geometría del objeto detectado a partir de un mínimos de dos mediciones. Una tercera mejora podría ser la de montar el sensor en un servo y hacer que el servo rote, mientras que hacemos las mediciones, los datos obtenidos de esta manera nos ofrecerán una serie de medidas con ángulos diferentes que ayudarán a reconstruir el entorno que rodea a los sensores. Esta última mejora claramente reemplaza a la añadir más de un sensor.

Existen desarrolladores dentro de la comunidad que proporcionan librerías totalmente gratuitas para poder hacer todos estos cálculos de una forma mucho más sencilla, sobre todo si optamos por la opción de poner varios sensores en nuestro proyecto (alguno de ellos facilita el uso de hasta 16 sensores), esta posibilidad al igual que la de realizar los cálculos por nosotros mismos usando varios sensores o añadiendo un servomotor a nuestro circuito será objeto más adelante de otro artículo.

 

Dejar un comentario