Un sensor analógico envía un nivel de voltaje, normalmente entre 0 y 5V, que representa un valor físico. Esta tensión puede estar sujeta a ruidos de medición (interferencias electrónicas, interferencias electromagnéticas, precisión de la medición, etc.). En algunas aplicaciones, necesitará un valor bastante estable para hacer sus cálculos o para detectar los eventos que le interesan. Un método sencillo de configuración es el método de promedio móvil que permite modificar el valor leído de acuerdo con el historial de mediciones.
Hardware
- Computadora
- Arduino UNO
- Cable USB A macho a B macho
- Un sensor analógico
Principio de funcionamiento
El principio del promedio móvil es registrar un cierto número de mediciones en una tabla y luego promediar estos valores en cada lectura. Hay varios fallos en esto:
- toma un tiempo para que el tablero se llene. Por lo tanto, hay un retraso en el establecimiento del promedio. Tengan cuidado de tener esto en cuenta al iniciar el microcontrolador.
- la variación de la medición será más lenta, por lo que será imposible detectar fenómenos «rápidos». Compruebe cuidadosamente el comportamiento de lo que quiere medir.
- el tablero ocupa más espacio de memoria y requiere más tiempo de gestión
Esquema
Una entrada analógica se conecta preferentemente a una clavija analógica en el microcontrolador. No se requiere ninguna conexión adicional para operar el promedio de funcionamiento. Es una solución puramente algorítmica. Para obtener resultados más controlados, es posible poner filtros electrónicos en su circuito de medición.
Código
Vamos a crear una función que leerá la entrada analógica y manejará la tabla y el promedio. En este código hemos colocado un retardo() en el bucle, para que la visualización en el monitor de serie sea más lenta. Asegúrese de eliminar este retraso() para obtener resultados más consistentes.
//Parameters const int aisPin = A0; const int numReadings = 10; int readings [numReadings]; int readIndex = 0; long total = 0; //Variables int aisVal = 0; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init AnalogSmooth pinMode(aisPin, INPUT); } void loop() { readAnalogSmooth(); Serial.print(F("ais avg : ")); Serial.println(smooth()); delay(200); } void readAnalogSmooth( ) { /* function readAnalogSmooth */ ////Test routine for AnalogSmooth aisVal = analogRead(aisPin); Serial.print(F("ais val ")); Serial.println(aisVal); } long smooth() { /* function smooth */ ////Perform average on sensor readings long average; // subtract the last reading: total = total - readings[readIndex]; // read the sensor: readings[readIndex] = analogRead(aisPin); // add value to total: total = total + readings[readIndex]; // handle index readIndex = readIndex + 1; if (readIndex >= numReadings) { readIndex = 0; } // calculate the average: average = total / numReadings; return average; }
Resultado
En el monitor serial vemos que el valor bruto oscila entre 306 y 308 mientras que el promedio móvil se mantiene estable en 305.
Aplicaciones
- Filtro de medición
- Reducir el ruido en la medición de un sensor
Fuentes
- https://www.aranacorp.com/es/dale-sentido-a-su-robot/
- https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código