Medidor de distancias ultrasónico con indicación analógica


Este circuito permite conocer una distancia entre el módulo emisor receptor ultrasónico y un obstáculo sólido. La distancia es representada por medio de una aguja en un cuadrante y el movimiento de dicha aguja se controla por medio de un servo para modelismo. Ya hice otra nota en el sitio sobre el uso de servos con Arduino por lo que si quieren verla para tener mas conocimientos al respecto pueden hacer clic acá. En esta nota me centraré en la parte ultrasónica nada mas. La medición ultrasónica de distancia basa su principio de funcionamiento en la emisión de un pequeño pulso electromagnético en el espectro ultra audible cuyas frecuencias parten de los 20KHz (el tope superior del espectro audible humano) y promediando su frecuencia tope los 250KHz. Tras emitirse este pulso electromagnético quedamos a la espera de su rebote midiendo el tiempo que toma en ser recibido. La velocidad en la que este pulso se desplaza por el aire es la propia velocidad del sonido que a temperaturas medias ronda los 343 metros por segundo. demos determinar que dicho pulso demandará en recorrer un solo metro 2915 µS (micro segundos) o 2,915 milisegundos. Por despeje podemos intercambiar el dato que conocemos (tiempo) por el que desconocemos (distancia) y deducir entonces que:

 //Mide el tiempo que le tomó al pulso ir hacia el objeto y regresar
Distancia=pulseIn(sensorECHO,HIGH);

//Calcula la distancia
Distancia=int(Distancia/(29.15*2));

Para que lo tengan presente la primer sentencia carga en la posición de memoria (o variable) Distancia el tiempo en que ingresa el pulso de rebote. No es un valor de distancia en si, es sólo el tiempo en microsegundos que demoró en retornar. No lo cargue en otra posición de memoria que pude llamar TIEMPO por ejemplo porque soy bastante ahorrativo con respecto al espacio de memoria RAM pero convengamos que se podría haber hecho y quedar mas prolijo. Determinada la cantidad de microsegundos que demoró el pulso en volver luego de impactar un objeto y rebotar se calcula la distancia la cual es por regla de tres simple el despeje de lo expresado en el párrafo anterior al segmento de programa. Bien, despejamos que a 343 metros por segundo la velocidad del sonido 1 metro se calcula haciendo 1 sobre (dividido) 343 lo que equivale a 2,915 milisegundos o 2915 microsegundos. Si ese valor corresponde a un metro entero sólo un centímetro debería ser un 1% de dicho valor o sea 29,15 microsegundos. Sabiendo cuantos microsegundos tardó la señal en rebotar dividiendo dicho tiempo en 29,15 obtendremos LA MITAD de la distancia. La mitad ? Claro, porque el tiempo obtenido corresponde a ida hacia el objeto y de regreso al sensor o sea que para una lectura de distancia tenemos que multiplicar dicho coeficiente por dos. Todo este cálculo dentro de int se encarga de eliminar decimales puesto que no los quería y de esa forma obtengo en centímetros enteros la distancia a la que un objeto se encuentra con respecto al sensor ultrasónico.

El conexionado es por demás simple, solo tres cables tiene el servo y cuatro el sensor ultrasónico. En mi taller tenía este sensor ultrasónico que viene ya del chino fabricante con una tira de postes a 90 grados por lo que busqué utilizar conexiones en el arduino uno que sean directas a los pines y de esa forma con enchufar uno en el otro quedó armado. Un tema no menor es que la alimentación del módulo sensor ultrasónico tuve que obtenerla de uno de los pines de E/S del arduino y por ende configurar dicho terminal como salida y ponerlo en alto para tener allí 5V. El servo hay que alimentarlo por fuera de la placa arduino puesto que consume mas corriente de la que el arduino y el USB son capaces de proveer.

El programa cargado en el Arduino es por demás simple luego de inicializaciones que hace al arrancar cuando se le aplica alimentación toma el tiempo que tarda en rebotar un pulso, calcula distancia, calcula ángulo para actuar sobre el servo, con ese dato posiciona la aguja del indicador, envía a PC vía comunicación serie la distancia en centímetros enteros así como el valor que se necesita en el servo para que la aguja refleje ese dato en el cuadrante, hace una espera para que no sea muy histérico en su funcionamiento y repite todo el ciclo infinitamente. Nótese que sólo se muestra en aguja y PC cuando el valor está dentro de la posibilidad de escala del cuadrante (un metro veinte centímetros).

Aquí se ve con claridad en el trazo amarillo (canal 1) el pulso disparado mientras que en segundo canal (trazo azul) se ve el tiempo que tarda el pulso en volver. Al ejecutar la función pulseIn la entrada pasa a pullup y por ende pasa su estado lógico 1 hasta que el sensor ponga en bajo. 

En este link pueden descargar el programa para cargar en el Arduino, el mismo se encuentra bastante comentado por lo que entenderlo no va a presentar demasiados retos.

En este otro link pueden acceder al video subido a YouTube con el funcionamiento de este aparato. El pulso del trazo inferior corresponde como se explicó antes al pulso de regreso, no al ancho de pulso para el servo si bien parecería serlo! Nótese que en el video se oye unos chispazos que en verdad en persona no se sienten aquí frente al equipo. Al parecer el micrófono del teléfono celular que empleo para las filmaciones logra captar frecuencias superiores a las audibles pero quedan registradas dentro del espectro humano por lo que en la recepción quedan plasmadas en forma de tics.

 

Pablo Canello, 01/ABR/2020