Calibrando los sensores

Calibrando los sensores

A continuación, se va a definir el método que se ha utilizado para la calibración de los sensores que se encuentran a la entrada del parking.

Una vez montado el subsistema, lo primero que debemos hacer es calibrar los sensores para que las mediciones sean correctas y evitar medidas erróneas o falsos positivos.

Para esta tarea, se ha hecho uso de una librería de Arduino llamada ResponsiveAnalogRead. Esta librería cuenta con un algoritmo perfeccionado de reducción de ruidos en medición de sensores analógicos, en el siguiente enlace se puede visualizar el comportamiento de este:
Los pasos que hace esta librería para eliminar el ruido son los siguientes:
  1. Visualising the problem
  2. En este punto observa el problema que existe al recibir datos analogicos de un sensor, donde el ruido hace que los datos no se mantengan estáticos.
  3. The exponential moving average
  4. En este punto empieza a aplicar un algoritmo primitivo de suavizado de datos mediante el siguiente código:




  5. Being responsive
  6. En este punto realiza un cambio en el algoritmo para que se ajuste el ruido según la velocidad de cambio en las mediciones del sensor.


  7. Applying the brakes
  8. Este último cambio busca “frenar” el comportamiento ruidoso de la lectura analogica del dato, de forma que si el sensor ha medido y no ha vuelto a medir más, el valor se refleje estático. Esta última parte está pensada mayormente al control de potenciómetros
Con esta librería conseguimos ajustar los niveles de luminosidad y opacidad en ambos sensores y así poder detectar sin fallos la presencia de un vehículo encima de ellos.
Código para el calibrado

Una vez explicada la librería que vamos a utilizar, el siguiente punto es realizar el código que se va a ejecutar la primera vez que se inicialice el subsistema de control de entrada/salida.

//Sensors
const int NUM_SENSORES = 2; // Número de Sensores
const int settime = 5000;   // Tiempo dedicado al ajuste desde el inicio del programa
int limitCoche[] = {0,0};    // Offset pasa coche
int PLAZAS_LIBRES = 2;      // Número de plazas libres

int ValorLDR[] = {0,0};          // Valor lectura LDR
int MinLDR[]   = {1023, 1023};   // Valor mínimo de la LDR
int MaxLDR[]   = {0,0};          // Valor máximo de la LDR
int enable[]   = { D5, D6 };      // Pines habilitado sensores

ResponsiveAnalogRead luz(A0, true);

void setup() {
 Serial.begin(9600);
 for(int i=0; i<NUM_SENSORES; i++) {
    pinMode(enable[i], OUTPUT);
 }

 Serial.println((String)"Calibrando durante "+settime+" ms...");
 //Iniciamos la calibración
 for(int j=0; j<(settime)/100; j++) {
    for(int i=0; i<NUM_SENSORES; i++) {
      // habilita el ldr
      digitalWrite(enable[i], HIGH);
   
      // update the ResponsiveAnalogRead object every loop
      luz.update();
   
      ValorLDR[i] = luz.getValue(); // Leemos el valor del sensor 1

      // deshabilita el ldr
      digitalWrite(enable[i], LOW);
   
      // Grabamos el valor máximo si es mayor que el guardado
      if (ValorLDR[i] > MaxLDR[i]) {
          MaxLDR[i] = ValorLDR[i];
      }
   
      // Grabamos el valor mínimo si es menor que el guardado
      if (ValorLDR[i] < MinLDR[i]) {
          MinLDR[i] = ValorLDR[i];
          limitCoche[i] = MinLDR[i]+40;
      }
    }

    delay(100);
 }
 Serial.println("Fin calibrado");
}

Este código calibrará los sensores durante 5 segundos, alternando la medición entre un sensor y otro hasta que finaliza el tiempo. Para ello empezamos a calibrar sin ningún objeto sobre los sensores LDR y a continuación vamos introduciendo un objeto consiguiendo menos luminosidad en ambos sensores.
La forma en cómo se calibra es la siguiente:
  1. Un bucle selecciona el sensor que se va a medir.
  2. Habilita el sensor que va a medir.
  3. Se recoge el valor, sin ruidos, del sensor mediante el uso del método update() de la librería ResponsiveAnalogRead.
  4. Leemos el valor mediante el uso del método getValue() y lo guardamos en la variable ValorLDR.
  5. Deshabilita el sensor una vez se ha obtenido el resultado.
  6. Si ValorLDR es mayor que MaxLDR, guardamos el valor máximo.
Si ValorLDR es menor que MinLDR, guardamos el valor mínimo y le asignamos al offset para el coche el valor + 40, indicando de esta forma que valor arrojaría el pasar de un coche.
De esta forma obtendremos la calibración del sistema acotado entre un valor mínimo y un valor máximo.

Comentarios

Entradas populares de este blog

Clasificador Difuso del sistema

Cliente MQTT del ESP8266

I2C