Librería de Arduino AsyncSonar


La librería AsyncSonar permite controlar un sensor de ultrasonidos como el HC-SR04 de forma “asíncrona” (no bloqueante), es decir, permite que el bucle principal realice acciones adicionales mientras está esperando que se reciba el Echo.

Adicionalmente la librería AsyncSonar permite utilizar el sensor empleando un único pin para Trigger y Echo. Las mediciones se pueden obtener tanto en microsegundos como en milímetros. También se puede definir un periodo o distancia de Timeout.

Por otro lado, incorpora funciones para corrección de la velocidad del sonido con la temperatura y un filtro de mediana extremadamente rápido con un tamaño de ventana de 5 elementos.

Los objetos AsyncSonar se pueden encadenar, de forma que varios sensores de ultrasonidos se disparen secuencialmente cuando acabe el ping anterior, sin requerir intervención del usuario.

Anuncio:

Requisitos

La librería AsyncSonar emplea la librería YetAnotherPcInt desarrollada por Paulo Costa, disponible en Github y en el gestor de librerías de Arduino. Esta librería facilita el uso de las interrupciones Pin Change.

Manual de uso

El objeto AsyncSonar representa un sensor de ultrasonidos que realiza las acciones de la medición de forma asíncrona. Con objeto de que la librería sea lo menos intrusiva posible no se emplean Timers. En su lugar, se usa la filosofía de emplear un método Update(), que actualiza el estado del objeto.

Para realizar las acciones, AsyncSonar permite definir una función de callback, que se lanzará en Update() cuando se haya obtenido una medición válida. Adicionalmente, se puede emplear una función de callback en caso de que ocurra un Timeout.

El sensor se activa con el método Start() al que, opcionalmente, podemos pasar un valor de espera en milisegundos (por ejemplo, para la inicialización del sketch). Podemos dentener el proceso con el método Stop()

Cuando el sensor se activa, realiza el Ping en el pin del sensor. Una vez enviado el ping se cambia el estado del pin para recibir el Echo. Por tanto, únicamente es necesario un pin digital para controlar el sensor.

Para la espera del Echo AsyncSonar define una interrupción en el pin mediante la librería YetAnotherPcInt. Cuando el Echo es recibido, AsyncSonar almacena el tiempo entre Ping y el Echo, pero no realiza ninguna acción.

Para actualizar el estado de AsyncSonar es necesario llamar a la función Update(), que comprueba el estado de AsyncSonar. Si se ha recibido el echo, realiza las funciones de callback oportunas. Es necesario llamar a la función Update() con frecuencia desde el bucle principal.

Las funciones de callback reciben como parámetro el propio objeto AsyncSonar por lo que, dentro de la función, podemos emplear las funciones del AsyncSonar que ha invocado el método.

El resultado de la medición se obtiene con las funciones GetRawMM(), GetRawUS(), GetMeasureMM(), GetMeasureUS(). Las funciones RAW proporcionan el valor obtenido en la medición, mientras que las funciones Measure filtran las mediciones que obtienen mediciones negativas y timeouts.

También se incorpora un filtro de mediana rápido de 5 elementos. Para obtener los valores filtrados con la mediana se emplean las funciones GetFilteredMM() y GetFilteredUS(). El filtro de mediana también ignora las mediciones negativas y timeouts.

Las función Update() admite como parámetro opcional un objeto AsyncSonar, que puede ser el mismo objeto que la invoca u otro distinto. Tras recibir el echo, se activará el AsyncSonar pasado como parámetro. Esto facilita realizar mediciones continuas, o lecturas multisensor de forma secuencial.

Para la configuración del AsyncSonar se disponen funciones para establecer el timeout y el intervalo entre disparos triggerInterval. Para mejorar la precisión del sensor se dispone de la función para establecer la temperatura y corregir la velocidad del sonido.

Adicionalmente se dispone del fichero config.h, que contiene opciones adicionales de la librería.

Así, se puede desactivar el filtro de mediana descomentando #define ASYNCSONAR_DISABLE_MEDIAN, lo que hace más rápida la librería. Por otro lado, se puede hacer que la función de callback se llame dentro del ISR de la interrupción, en lugar de en el próximo Update(), a costa de ralentizar la ISR. Para ello, descomentar la línea #define ASYNCSONAR_USE_SONARISR.

Constructor

La clase AsyncSonar se instancia a través de su constructor.

Si tenemos descomentado #define ASYNCSONAR_USE_SONARISR en el fichero config.h el constructor será el siguiente.

Uso de AsyncSonar

La clase AsyncSonar dispone de los siguientes métodos.

Adicionalemnte, se tiene los siguientes métodos si se tiene comentado #define ASYNCSONAR_DISABLE_MEDIAN en el fichero config.h.

Ejemplos

La librería AsyncSonar incluye los siguientes ejemplos para ilustrar su uso.

  • SyncSimple: Muestra el uso bloqueante

  • SyncWithCallback: Muestra el uso bloqueante con función de callback

  • AsyncSingle: Muestra un ejemplo sencillo de uso asíncrono

  • AsyncContinuous: Muestra el uso asíncrono continuo con reactivacion en el callback

  • AsyncChain: Muestra el uso asíncrono continuo usando el propio AsyncSonar como parámetro en Update

  • AsyncChainMedian: Muestra el uso asíncrono utilizando el filtro de mediana

  • AsyncChainMultiple: Muestra la medición contínua asíncrona con múltiples sensores

  • AsyncISR: Muestra el uso con ejecución de la callback en la ISR

Instalación

  • Descargar la última versión desde GitHub
  • Descomprimir el archivo
  • Copiar en tu carpeta de librerías (normalmente Mis Documentos\Arduino\libraries)
  • Relanzar el IDE de Arduino

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino

Anuncio:

Previous Cómo calibrar la altura de la cama en la Anycubic i3 Mega
Next Cómo apagar o reiniciar Raspberry Pi correctamente