Arduino.cl – Compra tu Arduino en Línea

Filtro exponencial EMA (Exponential Moving Average)

Básicamente este filtro encuentra un valor filtrado de una medición. Para ello utiliza la fórmula de la forma:

aporta un suavizado que depende directamente del valor , tiene ventajas en el cálculo ya que utiliza una única instrucción y almacena en memoria solo el valor filtrado anterior. En esta ocasión utilizaremos el filtro exponencial como filtro pasa bajos para eliminar ruidos de altas frecuencias en la señal que permite estabilizar la medición de sensores

El factor Alpha es un condicionante para el filtro exponencial y sus valores variables van entre 0 y 1, con ello

                Alpha = 1, entrega una señal sin filtrar

                Alpha = 0, entrega un valor filtrado siempre 0

Una disminución del valor Alpha aumenta la suavidad de la señal, haciéndola más estable y menos susceptible a cualquier ruido, pero esto también provoca un aumento del tiempo de respuesta del sistema, de alguna forma retrasa la señal respecto de la original. Los valores más habituales van desde 0,2 a 0,6

Ahora bien ¿Cómo utilizamos esto en nuestro Arduino? Debemos utilizar la librería del filtro EMA, la puedes descargar en el link. Si nunca has descargado librerías, lo que debes hacer es presionar el botón virtual “code” y posteriormente “Download zip”. Esto último será una constante en la incorporación de librerías externas, siempre debe estar en formato de compresión zip y respetar cierta estructura para que el IDE de Arduino pueda utilizarla, estructura como la de la imagen.

Para este caso en particular, la librería fue descargada de GitHub (plataforma para crear proyectos abiertos, por ello el código puede ser descargado por cualquier usuario) y pertenece al desarrollador Luis Llamas.

Tras la descarga cargamos la librería al IDE, desde “Programa”, “Incluir librería”, “Añadir biblioteca .zip”

Buscamos la librería y presionamos abrir. Si todo está correcto en la estructura y el formato tendremos el mensaje de tranquilidad.

Ya podemos aplicar el filtro a cualquier señal. Haremos una prueba con un sensor de humedad (higrómetro) conectado al pin analógico 0, en un programa simple y lo contrastaremos con la señal filtrada con los parámetros óptimos mencionados, recordemos que variaban de un alpha entre 0,2 y 0,6 como recomendación.

Las instrucciones básicas usadas para esta librería son:

  • SingleEMAFilter<int> singleEMAFilter(alpha);
    • Asigna Alpha para condición de filtrado
  • addValue(valor);
    • añade el valor al filtro y devuelve el valor de un filtro pasa bajos
  • GetLowPass();
    • Ultimo valor filtrado como pasa bajos (devuelve mismo valor anterior)
  • GetHighPass();
    • Ultimo valor filtrado como pasa altos

El código es una simple lectura analógica, con la inclusión de la librería, el factor de filtrado y el filtro propiamente tal, además del arreglo para graficas.

#include                        //librería EMA

int humedad;                   //declaración de tipo de dato y variable

int humedadfiltrada;           //declaración de tipo de dato y variable filtrada

SingleEMAFilter singleEMAFilter(0.6);       //filtro, idealmente entre 0,2 y 0,6

void setup() {

  Serial.begin(9600);                           //inicio de comunicación serial

}

void loop() {

 humedad = analogRead(A0);                     //lectura analógica

 humedadfiltrada = singleEMAFilter.AddValue(humedad); //filtro valor analógico

 Serial.print(humedad);                        //primera variable a graficar

 Serial.print(“,”);         //separador necesario para graficar otra variable

 Serial.println(humedadfiltrada);             //ultima variable a graficar

 delay(50);                                   //delay para evitar ruido excesivo

}

Para visualizar el filtro pasa bajos utilizamos directamente la instrucción addvalue, para realizar el ejemplo del filtro con solo una línea de comandos. Si quisieran usar un pasa altos, la gráfica debe realizarse a partir de la instrucción singleEMAFilter.GetHighPass() y no de addvalue.

Para todas las gráficas el color azul es la variable directamente leída y el color rojo es la variable filtrada de acuerdo al valor de alpha. Todos los gráficos están considerados con el mismo tiempo.

Primero veremos la prueba con un filtro de 0,1, fuera del rango optimo recomendado. Podemos ver que la señal filtrada se vuelve lenta en relación a la variable sin filtrar, puede ser útil para un display donde no es importante la rapidez de la respuesta de la lectura de información.

Continuamos con el valor mínimo recomendado, un filtro con un alpha de 0,2, es posible ver que la señal filtrada se acerca mucho más a la variable sin filtrar, algo amortiguada, pero con mayor respuesta. Este es un valor más indicado si necesitamos que la respuesta sea estable y algo cercana a los tiempos de la variable.

Para efectos prácticos analizaremos el factor alpha de 0,6 y no mayor. Esto porque si nos acercamos a 1, básicamente no existe filtro y todo lo que veremos será prácticamente un par de señales superpuestas.

La señal filtrada es mucho más rápida, casi tanto como la variable no filtrada, simplemente algo más suavizada. Estos valores elevados son ideales para ejecutar controles que requieran ser más precisos, cuando necesitemos respuestas eficientes ante perturbaciones, sin embargo, se sacrifica la estabilidad ganada con valores pequeños de factor alpha.

Dadas las características de tus proyectos, esta herramienta puede ser muy útil, pero debes equilibrar las necesidades, mayor velocidad de respuesta (levemente suavizada la señal filtrada) y menor estabilidad o estabilidad (menores fluctuaciones en cambios de valores) sobre velocidad de respuesta.

Visita nuestra pagina de Arduino y nuestra Tienda para mas información.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Te informaremos cuando el producto esté en stock nuevamente. Por favor, deje su dirección de correo electrónico válida.

No fields found, please go to settings & save/reset fields