Saturday, November 5, 2016

Exponencial Moving Average Arduino

biblioteca de media móvil para Arduino o cableado de Sofian Audry Inspirado por código de Karsten Kutza Una biblioteca de media móvil exponencial de memoria eficientes. Una media móvil es una forma sencilla de suavizar una señal. Mediante el ajuste de un parámetro llamado un coeficiente de ponderación, es posible controlar el grado de suavizado, haciendo que la señal de más o menos reactivos a los cambios. bibliotecas similares y alternativa: Microsmooth Una biblioteca de suavizado de señal ligero y rápido para Arduino. Proporciona muchos tipos tipos de algoritmo de suavizado a través de una API basada en la función. Arduino filtrado de la señal biblioteca proporciona un marco y clases para diferentes tipos de filtros de señal de paso bajo y filtro de mediana. RunningAverage Una biblioteca para calcular una media móvil simple (SMA) sobre una ventana de tiempo. RunningMedian Una biblioteca para el cálculo de la mediana móvil sobre una ventana de tiempo. Copia la carpeta media móvil a su carpeta de bibliotecas de Arduino. Incluir la biblioteca Crear una instancia Una instancia de media móvil se puede crear en un número de maneras. Un flujo de movimiento promedio obras utilizando un coeficiente de reducción de ponderación (), un valor entre 0 y 1 que se utiliza para mezclar el valor actual con el rastro de todos los valores anteriores. observaciones un mayor descuentos mayores más rápidas. Para crear una instancia con defecto (0.1): Para crear una instancia con un valor específico (en este caso 0,01): También es posible especificar un tamaño de ventana en lugar de N enviando un argumento gt 1 como el primer parámetro del constructor. En este caso, el coeficiente se aproxima para que coincida con el tamaño de la ventana usando la fórmula 2 / (N1). Esto por supuesto no es exacta, pero más como una regla de oro para el ajuste. Por ejemplo, para crear una instancia que corresponde a la media móvil sobre un tamaño de ventana de aproximativamente 100 muestras: El segundo parámetro permite establecer el valor inicial de la media móvil (por defecto es 0). Sin embargo, se recomienda para inicializar usando el reset (valor) utilizando un valor representativo imparcial de la distribución, como una sola muestra. Actualiza la media móvil con el nuevo valor. La función también devuelve el valor actual (opcional): Esta es una colección de rutinas para llevar a cabo análisis matemático de arrays de números. de apoyo a la función actual: Todas las funciones están completamente sobrecargados para apoyar los siguientes tipos de datos: Con la excepción de STDDEV () todos ellos devuelven el mismo tipo de datos que el array. Una matriz de valores int devuelve un solo int. STDDEV () siempre devuelve un flotador. Todas las funciones excepto rollingAverage () toma dos argumentos. La primera es la matriz a trabajar. El segundo es el número de entradas de la matriz. rollingAverage () toma un tercer argumento - la nueva entrada para agregar a la matriz. Formato rodando media: rollingAverage media (historyarray, slicecount, valor) aporta un valor añadido a la matriz historyarray cambiando todos los valores abajo un solo lugar. La media promedio es entonces devuelta. Formato significa: media media (array, slicecount) Calcula la media aritmética de los valores en la matriz. slicecount es el número de entradas de la matriz. Formato: Modo normal (matriz, slicecount) Busca el número más común en la matriz. Formato máximo: máximo Max (array, slicecount) Busca el valor más grande de la matriz. Formato mínima: mínimo min (array, slicecount) Busca el valor más pequeño de la gama. Formato Desviación Estándar: STDDEV desviación (array, slicecount) La desviación estándar es la raíz cuadrada de la media de la suma de los cuadrados de la diferencia entre cada punto de datos y la matriz significa la media. Esta es la única función que no devuelve el mismo tipo de datos como la matriz. La desviación estándar siempre se devuelve como un flotador. Ejemplo: Sharei estoy trabajando en un robot móvil controlado a través de un 2,4 GHz receptor link. The inalámbrico está conectado a la Arduino Uno que sirve a bordo como el controlador principal. El canal de entrada más crítico (y principal) que viene desde el receptor produce una señal muy ruidosa, lo que conduce a una gran cantidad de cambios menores en la salida de los actuadores, a pesar de que éstos no son necesarios. Estoy en busca de bibliotecas que pueden realizar el suavizado eficiente. ¿Hay alguna señal de suavizar las bibliotecas disponibles para el Arduino (ONU) pidieron a 16 de Feb 14 a las 13:57 Creo ver una gran cantidad de picos de ruido de una sola muestra en su señal con ruido. El filtro de mediana hace mejor en deshacerse de los picos de ruido de una sola muestra que cualquier filtro lineal. (Es mejor que cualquier filtro de paso bajo, media móvil, promedio móvil ponderado, etc., en función de su tiempo de respuesta y su capacidad para ignorar tales valores extremos de una sola muestra pico de ruido). Hay, de hecho, muchas bibliotecas de suavizado de señal para el Arduino, muchos de los cuales incluyen un filtro de mediana. bibliotecas señal de redondeo al arduino. cc: bibliotecas de suavizado de señal en github: ¿Le algo como esto en su trabajo del robot (La mediana-of-3 requiere muy poca energía de la CPU, y por lo tanto rápido): Usted podría filtrar este digital usando la mínima el filtro de paso: cambiar el 0,99 a cambiar la frecuencia de corte (más cercano a 1,0 es menor frecuencia). La expresión real para ese valor es exp (-2pif / fs), donde f es la frecuencia de corte que desee y fs es la frecuencia de los datos se tomaron muestras a. Otro tipo de filtro digital es un filtro de eventos. Funciona bien en los datos que tiene, por ejemplo, los valores atípicos 9,9,8,10,9,25,9. Un filtro de eventos devuelve el valor más frecuente. Estadísticamente este es el modo. promedios estadísticos, como media, la moda, etc., pueden ser calculados usando la Biblioteca Media Arduino. Un ejemplo tomado de la página de la biblioteca de Arduino se refiere a: exponencial doble filtro de media móvil 8211 Acelerar el EMA A veces tiene una señal ruidosa que desea filtro de paso bajo a una señal menos ruidosa. El filtro de media móvil exponencial (EMA) es un filtro agradable y fácil de implementar en su sistema embebido. Leer más sobre el filtro EMA aquí. Sin embargo, a veces el EMA puede ser demasiado lento. El equilibrio entre la supresión del ruido y la velocidad simplemente no podría ser lo suficientemente bueno. O bien la señal filtrada doesn8217t mover lo suficientemente rápido o si la señal es demasiado ruidoso. Esto no es una imagen muy buena comparación entre EMA y DEMA. Sólo queríamos una imagen fresca aquí. Leer más abajo para una comparación adecuada DEMA 8230the DEMA se subamortiguado mientras que la EMA se sobreamortiguado. Una solución a esto podría ser el doble exponencial de media móvil filtro (DEMA). En una dada la DEMA tiene una respuesta más rápida que la EMA mientras que todavía mantiene la misma supresión de ruido. Una desventaja potencial con el filtro DEMA es que es posible que obtenga un rebasamiento. En otras palabras, el DEMA se subamortiguado mientras que la EMA se sobreamortiguado. Mira este post para averiguar lo que queremos decir con esto. Algoritmo El algoritmo es bastante simple: Lo más difícil aquí es el último término donde se toma la EMA de la EMA. Para lograr esto tenemos que tener dos variables globales en lugar de uno. Implementación Here8217s una implementación rápida del filtro DEMA en Arduino. Nótese que utilizamos dos variables globales para el filtrado en lugar de uno. Le línea azul del gráfico: señal original, línea naranja: EMA regular, línea roja: DEMA. Como se puede ver aquí, el DEMA se las arregla para seguir la señal original mejor sin más ruido. Observe también el sobreimpulso en la respuesta al escalón. El capítulo en la parte inferior del DEMA se puso a prueba en el proyecto del balancín con resultados positivos después de escribir la entrada de blog final. Este es un escenario en el que necesitamos la alta velocidad que el DEMA puede proporcionar. También hay algo llamado Triple that8217s media móvil exponencial (TEMA). Este filtro utiliza los mismos principios que DEMA, pero toma aún más. Relacionados ArticlesTutorial: Potenciómetros con Arduino y filtrar en esta entrada de blog vamos a pasar por lo que un potenciómetro es y cómo funcionan, cómo conectarlo a un Arduino, así como describir un problema común en lo que respecta al potenciómetro uso y una solución a ese problema . ¿Qué es un potenciómetro Un potenciómetro, en adelante, una olla. es una resistencia variable. Es un componente eléctrico con tres terminales (pines es decir, o piernas): uno para la tensión de entrada (por ejemplo 5V), uno para la tensión de salida (por ejemplo, GND) y otro para recoger el valor de la olla (we8217ll llaman a esto el limpiaparabrisas). Mecánicamente hablando, ollas están físicamente ajustado por lo general con los dedos. Tanto ollas de rotación y lineales son comunes. Una rotación y una olla lineal (fuente: Wikipedia) Ollas se utilizan mucho en todo tipo de aparatos eléctricos. botones de volumen, reguladores de luz y atenuadores en los mezcladores de audio a menudo son ollas. También vienen en versiones digitales e incluso motorizados, pero están fuera del alcance de este post. Si desea controlar la velocidad de su motor eléctrico, posición del servo, el brillo del LED, filtro de corte en el sintetizador, control de ganancia del amplificador de guitarra o miles de otras cosas interesantes en su propio sistema embebido, una olla podría ser la solución para ti. La Teoría Para una introducción a la teoría eléctrica, echar un vistazo a este post que escribimos hace un tiempo donde explicamos los fundamentos tales como tensión, resistencia y corriente, así como la relación entre éstos. Así, what8217s sucediendo en un circuito con un pote es, básicamente, la división de tensión en la práctica. R1 y R2 son dentro de la propia olla. (Fuente: Wikipedia) En los esquemas anteriores, las resistencias R 1 y R 2 son parte de la propia olla. R L es la resistencia de la carga (un motor, un LED o lo que sea). Cuando se enciende o deslizar el bote, que va a cambiar los valores de R1 y R2. Al mover el bote de una manera reducirá R1 y R2 aumentar. y viceversa. Esto da lugar a diversos valores de voltaje en el limpiaparabrisas (el que va a R L en los esquemas arriba). El valor de la tensión en sí se puede calcular utilizando la siguiente ecuación: donde V L es la diferencia de voltaje entre el limpiaparabrisas y el pin de salida, y V S es la diferencia de voltaje entre el pin de entrada y de salida. Para simplificar esto un poco: si el pin de salida se conecta a GND, simplemente se puede decir que la LV es la tensión en el limpiaparabrisas y Vs es el voltaje en el pin de entrada (y luego simplemente ignora el 8220voltage difference8221 jerigonzas desde GND se define como 0 V). El Pot y el Arduino 8211 un Ejemplo Basta con la teoría, let8217s hacer las cosas en marcha y funcionando con un ejemplo del hardware En el siguiente ejemplo se utiliza una pequeña we8217ve 10K maceta de plástico de placa, una placa. unos hilos de salto (estos son excelentes para este propósito) y, por supuesto, un Arduino (en este caso un Leonardo). Dejamos 5V ir a uno de los pasadores en los lados de la olla y GND a la otra. El del medio tiene que ir a uno de los ANALOG IN pines en la Arduino, en este caso A0. Y that8217s que el circuito está en funcionamiento el cable rojo: 5V, alambre negro: GND, cable amarillo: señal de limpiaparabrisas a ADC. ADC (Analog-to-Digital Converter) La señal de la olla es analógica, pero queremos que sea digital, por lo que podemos leer el valor en la pantalla. Arduino tiene un ADC incorporado (conversión analógica-digital) que crea una representación digital de la señal analógica. Cuanto mayor sea el voltaje de entrada, mayor será el valor digital. ADC Arduino8217s toma de 0 a 5 voltios y tiene una resolución de 10 bits que permite que 1.024 valores digitales de salida. Para resumir: 0 voltios es equivalente a un valor digital de 0 y 5 voltios es equivalente a un valor digital de 1023. Puede leer más sobre Arduino8217s ADC aquí. El software de la forma más básica para leer el valor de la olla es imprimir el valor digital al monitor serie, por lo that8217s lo we8217re va a hacer. El flujo de este sencillo programa irá así: Inicializar las variables globales. Configurar el módulo de serie. El bucle para leer el voltaje de la olla y lo dirige a través de la ADC. Escribir el valor digital de la olla al monitor de serie. Esperar 50 ms antes de repetir. A continuación se muestra el código we8217re ejecutando en el Leonardo: Cuando el código está en funcionamiento, abra el Monitor de serie en el IDE de Arduino para ver el cambio de valor de la olla a medida que gira la perilla. Recuerde que debe establecer la velocidad de transmisión para el mismo valor que en la inicialización de serie en el software (115200 en nuestro caso) un problema común y Filtrado Si el software debe reaccionar significally a los cambios en la olla (por ejemplo, cambiar un estado mayor) you8217re a tener un mal momento. La razón de esto es que mientras you8217re no tocar la olla, los valores pueden cambiar de todos modos. Y cuanto mayor sea la resolución de la ADC es, más probable es que se produce este ruido de medición. La razón para este problema es que el bote se ajusta continuamente y que a menudo está colocado en el medio de dos valores digitales. Recuerde que el mundo real es tan diminutos cambios no ideales, inevitables en el voltaje del ruido es suficiente para volcar hacia atrás y adelante entre dos o más valores digitales. Un par de soluciones Así que, ¿cómo hacer frente a esta En primer lugar, don8217t diseñar el programa de modo que un pequeño cambio en el bote hace algo importante. En segundo lugar, para reducir este ruido de medición puede intentar añadir filtro de paso bajo simple en el software. Un algoritmo de media móvil a menudo suficiente. Vamos a implementar un algoritmo de media móvil exponencial, de ahora en adelante reffered como EMA. para suavizar la señal en este ejemplo. No dude en probar algunos de los otros algoritmos de media móvil también. El algoritmo EMA es la siguiente: donde S t es el resultado de la EMA en el tiempo t. Y t es la medición olla en el tiempo t. y es un coeficiente en la gama lt0,1gt que decide cuántas muestras del algoritmo EMA debe tener en cuenta. Una baja será muy lenta a los cambios rápidos de entrada y tomar muchas muestras en cuenta. Un alto será rápido, pero la media sobre un menor número de muestras. Usted puede mirar en como especie de una frecuencia de corte de un filtro de paso bajo. Una visualización de cómo opera la EMA. Las columnas a lo largo del eje X, son las muestras con la más reciente a la izquierda. La altura de las columnas en el eje Y es la 8220weight8221 de cada muestra, es decir, cómo 8220important8221 cada muestra es el cálculo de la EMA. (Fuente: Wikipedia) Here8217s el código final con la EMA: Experimente con diferentes valores de ver la diferencia en la velocidad al cambiar rápidamente la posición de la olla. Un corto Conclusión Esperamos que este pequeño tutorial es útil para usted. Potenciómetros son muy útiles en sistemas embebidos y muy divertido para jugar. Utilizarlos para controlar lo you8217d igual que los artículos relacionados


No comments:

Post a Comment