Introducción
Este tutorial muestra cómo implementar un filtro
promedio en arduino. El objetivo es suavizar los valores de sensores ruidosos o
inestables de una manera fácil.
El filtro promedio está dado por la siguiente
fórmula
El resultado es la suma de una cantidad de N mediciones, y el total se divide por la cantidad de mediciones N. Cuantas más mediciones incluyas en el promedio, más ruido se eliminará. Sin embargo, se produce un retardo en la lectura de la señal.
Hardware requerido
- 1 Arduino
- 1 Potenciómetro de 10k ohm
- 1 Protoboard
- Cable
Circuito
En la figura 1
se muestra el esquema de conexión. Conecte un pin de un potenciómetro a 5V, el
pin central al pin analógico A0, y el último pin a GND.
Figura 1. Esquema de conexión.
Código
El siguiente código permite calcular el valor promedio de N muestras mediante la función promedio()
Sintaxis
AnalogInput: Entrada analógica
Sintaxis
promedio(N, AnalogInput)
Parámetros
AnalogInput: Entrada analógica
float sensorValue = 0; void setup() { Serial.begin(9600); } void loop() { sensorValue=promedio(100,0); Serial.println(sensorValue); delay(50); } float promedio(int numeroLecturas,int sensorPin) { float aux=0.0; for (int conta = 1; conta <= numeroLecturas ; conta++) { aux=aux+analogRead(sensorPin); // Escalamiento de PvdelayMicroseconds(10);}return (aux/numeroLecturas);}
Resultados
La figura 2 muestra la medición original y la filtrada para un N=10, debido al pequeño número de mediciones aún existe un ruido considerable.
Figura 2. Resultado del filtro con N=10.La figura 3 muestra la medición original y la filtrada para un N=100, debido al mayor número de mediciones, el resultado es una señal mas suavizada. Sin embargo, a medida que se incrementa N también lo hace el tiempo de muestreo.El tiempo de ejecución del filtro es de aproximadamente (N*0.13) milisegundos. Es decir, para un N=100 el tiempo de ejecución 13 milisegundos.
Figura 3. Resultado del filtro con N=100.
Me funciono para un proyecto similar gracias
ResponderBorrarhola: como puedo aplicarlo a un codigo para controlar un servo?
ResponderBorrargracias de ante mano