[TUTORIAL] Acquisire e filtrare segnali con Arduino – Realizzare facilmente un filtro software a media mobile

Se ci troviamo davanti alla necessità di filtrare un segnale analogico che dobbiamo acquisire con Arduino, la prima cosa che ci viene in mente di fare è quella di inserire, tra il sensore e l’ingresso analogico, una rete RC che “lisci” il nostro segnale. In questo articolo illustro come implementare con Arduino un filtro software a media mobile.

 

 Iscriviti al nostro canale YouTube per saperne di più! 🙂

IL FILTRAGGIO DIGITALE

Nonostante questa sia un’ottima soluzione, penso che avere un filtraggio a livello software sia una soluzione più elegante. I motivi per i quali un filtro software a media mobile è preferibile essenzialmente due:

-Non necessita di componenti aggiuntivi (anche se un filtro RC esterno sarebbe opportuno per evitare l’aliasing)

-E possibile regolare (anche dinamicamente) il livello di filtraggio desiderato.

Iscriviti al nostro canale YouTube per saperne di più! 🙂

Esistono più tecniche di filtraggio digitale, ma per me che non sono mai stato in mago del filtraggio digitale, il filtro più semplice e intuitivo che sono riuscito a realizzare è il FILTRO A MEDIA MOBILE (filtro FIR).

Questa tipologia di filtro non fa altro che calcolare la media tra l’ultimo campione acquisito e un numero variabile di campioni precedentemente acquisiti. Il numero di campioni sui quali viene effettuata la media è detta PROFONDITA’ DEL FILTRO e, maggiore sarà questo numero, maggiore sarà il livello di filtraggio. C’è anche da considerare che il livello di filtraggio dipende anche dalla frequenza di campionamento.

ATTENZIONE: La controindicazione che in questo particolare caso abbiamo, è quella di non impostare la profondità del filtro non superiore ai 30 campioni. Questo perchè, essendo la variabile utilizzate per fare la somma un intero, e essendo il valore massimo di ogni campione 1023, c’è il rischio di andare in OVERFLOW. Questo comporterebbe un valore errato di uscita.

Riporto di seguito l’esempio e i sorgenti d’esempio scaricabili

#include "filter.h"

#define INPUT_PIN A0   

Filter filtro;
int sampleF;
void setup() {

Serial.begin(9600);
filtro.setDepthFilter(10);     //imposta la lunghezza del filtro

}

void loop() {
  
   sampleF = filtro.filterSamples(analogRead(INPUT_PIN)); 
  
   Serial.println(sampleF);
   
   delay(100);
}

Potere scaricare il codice d’esempio per il filtraggio software e le librerie annesse a questo link:

https://github.com/nerdityourself/Filtro_media_mobile