Obteniendo una mejor lectura de sensores en Arduino
Escrito por Nico | 13 de Julio de 2009   

Muchas veces, como sucede cuando utilizamos potenciómetros, tendremos valores oscilantes sobre un número aunque no estemos realizando nada sobre el sensor. Esto sucede porque el sensor puede estar sujeto a variaciones aleatorias, y la suma de estas actúa como ruido.

Existirán varias formas de reducir esta cantidad de ruido, y en este caso mostraremos 2 de ellas que pueden implementarse directamente en el código del Arduino. Primero estableceremos un umbral (o threshold) que será la diferencia entre un valor y otro del sensor sin que este siendo hecho nada sobre el mismo. Esto es, si dejamos quieto el pote y empieza a variar entonces que punto tomamos como umbral para realizar otra acción (correción u otra cosa)

Circuito

arduino smoothing

Esquemática

arduino smoothing

Código

Threshold:

Definimos una variable Threshold y no registramos un cambio a menos que el cambio sea superior a ese valor. Al principio del código, declaramos:

int Threshold = 2; // Definimos el umbral

Ahora vamos al void loop {} y hacemos que se chequee el valor del pote con el del umbral:

 if( abs(nuevoPotVal - prevPotVal) >= Threshold); 
//Si el valor cambio mas que el umbral definido, hacer algo

La función abs() siempre nos devuelve un valor positivo, aunque la diferencia sea 2 y -2, nos ahorramos un if :P

Smoothing

Un ejemplo de esto podemos encontrarlo dentro del software del Arduino, en File->Sketchbook->Examples->Analog->Smoothing. Se toman varias mediciones, y se hace un promedio de ellas mediante un Array()

 /* Promediado de valores con Arduino
Utilizando un Pote en analog input 0  // Definimos el numero de muestras a tomar. 
 // Mientras mas alto el numero
 // mas mediciones serán promediadas, 
 // pero la salida será mas lenta
 // con respecto a la entrada. Usar una constante en 
 // lugar de una variable normal
 // nos permite usar este valor para 
 // determinar el tamaño de los array de lectura

 const int numReadings = 10;
  int readings[numReadings];      // Lecturas de la entrada analogica
 int index = 0;                  // El indice de la lectura actual
 int total = 0;                  // Total
 int average = 0;                // Promedio
  int inputPin = 0;
  void <strong>setup</strong>()
 {
   // Iniciamos el puerto serie
   Serial.begin(9600);                   
   // Iniciamos todas las lecturas a la entrada 0 
   for (int thisReading = 0; thisReading < numReadings; thisReading++)
     readings[thisReading] = 0;          
 }
  void <strong>loop</strong>() {
   // Restamos la ultima lectura:
   total= total - readings[index];         
   // Leemos del sensor:  
   readings[index] = analogRead(inputPin); 
   // Añadimos la lectura al total:
   total= total + readings[index];       
   // Avanzamos a la proxima posicion del array  
   index = index + 1;                    
    // Si estamos en el final del array...
   if (index >= numReadings)              
     // ...volvemos al inicio: 
     index = 0;                           
    // Calculamos el promedio:
   average = total / numReadings;         
   // Lo mandamos a la PC como un valor ASCII 
   Serial.println(average, DEC);               
 }

Saludos, Nico!

 

Referencias:

http://arduino.cc/en/Tutorial/Smoothing
http://roguescience.org/wordpress/?page_id=52

Comentarios
¡Sólo los usuarios registrados pueden escribir comentarios!

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."