El módulo alcance ultrasonido HC-SR04 es una fantástica adición a cualquier proyecto de robot. Su seguimiento un robots (suponiendo que nos hemos fijado puntos de referencia) en un rango reportado de 2 400cm con exactitudes de 3mm de posibles de forma muy sencilla y barata. También es una gran manera de añadir la evitación del objeto para detener tu preciosa creación estrellándose en el escenario.
La operación de los módulos es muy sencilla. Cuando se dispara con un pulso de 10us en el pasador del gatillo el módulo envía ocho pulsos de ultrasonidos de 40kHz. El módulo entonces toma el pin eco alta y mantiene allí hasta que recibe un eco hacia el módulo. La longitud del tiempo que el pin eco es alta es directamente proporcional a la distancia a un objeto. De hecho, este tiempo es el tiempo que tardan los pulsos para viajar hacia el objeto y hacia atrás y, porque sabemos que la velocidad del sonido a 20° C en aire seco a nivel del mar en 343.2 m/s, podemos utilizar la siguiente fórmula para calcular la distancia entre el módulo y el objeto:
distancia (m) = (veces * velocidad (m/s)) / 2
Como vamos a medir el tiempo en microsegundos es fácil para nosotros trabajar cuánto sonido viaja por microsegundo y simplemente multipliquen el tiempo medido por este número.
343.2 m/s = 0.0343.2cm/us
Así que ahora podemos decir:
distancia (cm) = (time(us) * speed(cm/us)) / 2 = (tiempo * 0.0343.2)/2
Como multiplicar y dividir son medidas costosas (en términos de tiempo) en un microcontrolador que puede también dividir la constante de velocidad por 2 ahora y ahorra el esfuerzo de repetición más adelante, así:
distancia (cm) = time(us) * 0.01716
Ahora, vamos a medir un número (entero) entero de microsegundos y sabemos que el flotante punto matemáticas es menos eficiente en un microcontrolador que el entero equivalente. Así, en vez de multiplicando la cantidad medida de tiempo por un flotante punto número podríamos dividirlo por un entero porque 0.01716 es aproximadamente igual a 1/58, así:
distancia (cm) = time(us) / 58(cm/us)
Utilizando el mismo método podemos determinar que la distancia a un objeto en pulgadas es el siguiente:
distancia (en) = time(us) / 148(in/us)
Así que, ahora que sabemos cómo funciona el sensor, cómo usarlo y cómo obtener un valor útil de su salida. El problema final, para mí, es que esperando el pin de echo ir baja bloqueará la ejecución de programas. Esto significa que espera el módulo tomar una lectura no podemos hacer otra cosa. Dada la gama de módulos de 400cm nos podríamos estar esperando tanto como 23ms. Ahora, esto no puede parecer mucho, pero para un robot que tiene un bucle de control iterativo y muchas otras cosas para hacer (controladores motores, otros datos de sensor) esto es una demora significativa.
Afortunadamente, hay una manera que el microcontrolador puede decirnos cuándo cambia el pin eco en lugar de nosotros tener que observar y esperar. Este mecanismo se llama una 'interrupción' porque el microcontrolador literalmente interrumpe la ejecución del programa cuando una condición de interrupción ocurre y llamar a una función de nuestra elección. Y este es el método que he usado para este ejemplo. Cuando el pin eco va alto al principio de las nuestra interrupción se llama rutina de servicio (ISR, función que se ocupa de la interrupción) y guardamos la hora actual en nuestra hora de inicio. Cuando el pin eco baja al final de la que van nuestro ISR se llama otra vez y nos guarde la hora actual como nuestro tiempo de fin. La diferencia entre los tiempos de inicio y el final es el tiempo necesario para que los que van. ¡ Simple! Hay un montón de recursos que hay que describen cómo interrumpe el momento mejor que he podido y ya he escrito mucho por aquí mucho! También, he envuelto el código en una biblioteca pequeña, así que si quieres usarlo y no importa cómo funcionan las interrupciones, no necesita.