Semplice Mobile Media Arduino
Una delle principali applicazioni per la scheda Arduino è una lettura e la registrazione dei dati del sensore. Per esempio uno monitor della pressione ogni secondo della giornata. Poiché i tassi di campionamento elevate genera spesso picchi nei grafici si vuole anche di avere una media delle misurazioni. Poiché le misure non sono statici nel tempo ciò che spesso abbiamo bisogno è una media in esecuzione. Questa è la media di un certo periodo e molto utile quando si fa l'analisi di tendenza. Più semplice forma di una media mobile può essere fatto da codice che si basa sul medio esecuzione precedente: se uno non vuole usare calcoli in virgola mobile - come questo richiede memoria e diminuisce la velocità - si può fare completamente lo stesso nel dominio intero. La divisione per 256 nel codice di esempio è uno spostamento a destra 8, che è più veloce dire divisione per esempio 100. Questo è vero per ogni potenza di 2 come divisore e uno solo deve prendere cura la somma dei PESI è uguale alla potenza di 2. E, naturalmente, si dovrebbe prendere cura non è troppo pieno intermedia (considerare l'utilizzo di unsigned long) Se avete bisogno una media di funzionamento più accurato, in concreto degli ultimi 10 misurazioni, è necessario un array (o lista collegata) per tenerli. Questo array agisce come un buffer circolare e con ogni nuova misurazione il più vecchio viene rimosso. La media corrente viene calcolato come la somma di tutti gli elementi divisi per il numero di elementi nella matrice. Il codice per la media mobile sarà qualcosa di simile a questo: svantaggio di questo codice è che la matrice per contenere tutti i valori può diventare molto grande. Se si dispone di una misurazione al secondo e si desidera una media in esecuzione al minuto è necessario un array di 60 in media per ora avrebbe bisogno di una serie di 3600. Che non poteva essere fatto in questo modo su un Arduino come ha solo 2K di RAM. Tuttavia con la costruzione di una media di 2 stadi si può accedere abbastanza bene (disclaimer: non per tutte le misurazioni). Nel codice pseudo: Come è necessario un nuovo array statico interno per ogni funzione runningAverage, questo urla per essere implementato come una classe. biblioteca RunningAverage La biblioteca runningAverage fa una classe della funzione di cui sopra in modo che possa essere utilizzato più volte in uno schizzo. Esso disaccoppia l'add () e AVG () per essere un po 'più flessibile per esempio si può chiamare i molteplici tempi medi senza aggiungere nulla. Si prega di notare che ogni istanza della classe aggiunge una propria matrice per contenere le misure, e che questo aggiunge fino a l'utilizzo della memoria. L'interfaccia della classe viene mantenuto il più piccolo possibile. Nota: con la versione 0.2 i nomi dei metodi sono tutti fatti più descrittivo. Un piccolo schizzo mostra come può essere usato. Un generatore casuale viene utilizzato per simulare un sensore. Nel setup () il Myra viene cancellato in modo che possiamo iniziare ad aggiungere i nuovi dati. Nel loop () prima un numero casuale viene generato e convertito in un galleggiante da aggiungere a Mira. Poi il runningAverage viene stampato alla porta seriale. Si potrebbe anche visualizzare su qualche LCD o inviare tramite ethernet ecc Quando 300 elementi vengono aggiunti Myra viene cancellata per ricominciare da capo. Per utilizzare la libreria, creare una cartella nel vostro SKETCHBOOKPATHlibaries con il nome RunningAverage e mettere il. he cpp lì. Opzionalmente fare una sottodirectory esempi di inserire l'applicazione di esempio. 2011-01-30: iniziale versione 2011-02-28: distruttore mancante fisso in. h file di 2011-02-28: rimosso costruttore predefinito 2012--. trimValue () Yuval Naveh aggiunto trimValue (che si trova sul web) 2012/11/21: refactoring 2012-12-30: aggiunto fillValue () refactoring per la pubblicazione 2014/07/03: codice di protezione della memoria aggiunto - dimensioni, se array interno non può essere allocato diventa 0. Questo è quello di risolvere problema descritto qui - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - test ampiamente. Modello di classe RunningAverage. h RunningAverage. cppThis è un insieme di routine per l'esecuzione di analisi matematica di array di numeri. supporto funzione attuale: Tutte le funzioni sono completamente sovraccaricati per supportare i seguenti tipi di dati: Con l'eccezione di stddev () tutti restituiscono lo stesso tipo di dati come array. Una serie di valori int restituisce un singolo int. stdDev () restituisce sempre un galleggiante. Tutte le funzioni, tranne rollingAverage () prendono due argomenti. Il primo è la matrice su cui lavorare. Il secondo è il numero di voci nella matrice. rollingAverage () prende un terzo argomento - la nuova voce da aggiungere alla matrice. Rotolamento Formato medio: rollingAverage media (historyarray, slicecount, value) aggiunge valore alla matrice historyarray spostando tutti i valori in basso di una posizione. La media media viene quindi restituito. Formato: media media (array, slicecount) Calcola la media media dei valori in array. slicecount è il numero di voci nella matrice. Formato: la modalità media (array, slicecount) Trova il numero più comune nella matrice. Formato: massimo max (array, slicecount) Trova il più grande valore della matrice. Formato: minimo min (array, slicecount) Trova il valore più piccolo nella matrice. Deviazione Standard Format: deviazione stdDev (array, slicecount) La deviazione standard è la radice quadrata della media della somma dei quadrati delle differenze tra ogni punto dati e l'array significare media. Questa è l'unica funzione che non restituisce lo stesso tipo di dati come l'array. La deviazione standard è sempre restituito come float. I sto lavorando ad un robot mobile controllato tramite un ricevitore wireless a 2,4 GHz link. The è collegato al Arduino Uno che serve a bordo come il controller principale. Il canale di ingresso più critico (e principale) proveniente dal ricevitore produce un segnale molto rumoroso, che porta a un sacco di piccole modifiche nell'output degli attuatori, anche se questi non sono necessari. Sto cercando le librerie che possono eseguire smoothing efficiente. Ci sono dei segnali levigante librerie disponibili per l'Arduino (Uno) ha chiesto 16 Febbraio 14 alle 13:57 Mi sembra di vedere un sacco di picchi di rumore-campione unico nel segnale rumoroso. Il filtro mediano fa meglio a sbarazzarsi di picchi di rumore-campione unico rispetto a qualsiasi filtro lineare. (E 'meglio di qualsiasi filtro passa-basso, media mobile, media mobile ponderata, ecc in termini di tempi di risposta e la sua capacità di ignorare tali-campione singolo outlier rumore picco). Ci sono, infatti, molte biblioteche segnale-levigante per il Arduino, molti dei quali includono un filtro mediano. Segnale-levigante librerie a arduino. cc: librerie di segnale-levigante a github: Sarebbe qualcosa di simile a questo lavoro nel vostro robot (La mediana-di-3 richiede pochissima potenza della CPU, e quindi veloce): Si potrebbe filtrare questo digitalmente utilizzando un basso filtro passa: modificare il 0,99 per modificare la frequenza di taglio (più vicino a 1.0 è la frequenza più bassa). L'espressione effettiva per quel valore è exp (-2piffs) dove f è la frequenza di taglio desiderata e fs è la frequenza i dati vengono campionati a. Un altro tipo di filtro digitale è un filtro eventi. Funziona bene su dati che ha valori anomali per esempio 9,9,8,10,9,25,9. Un filtro evento restituisce il valore più frequente. Statisticamente questa è la modalità. medie statistiche quali la media, modalità, ecc possono essere calcolati utilizzando il Arduino libreria media. Un esempio tratto dalla pagina di Arduino libreria di cui:
Comments
Post a Comment