Go Down

Topic: Sensor proximidad por infrarrojos sharp (Read 3 times) previous topic - next topic

Lisergio

Buenas a todos.
Tengo un problemilla ,
estoy haciendo un sencillo contador de personas con un arduino uno, un lcd 16x2 y un sensor de proximidad por infrarrojos marca sharp.
el funcionamiento es correcto,es decir, cuando pasa alguien,el valor del contador sube pero me realiza lecturas erróneas y se suman personas al contador cuando no pasa nadie..

el código que he usado es el siguiente:



// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int contador=0;
int medida_activacion = 0;
int sensorPin = A0;
int sensorValue = 0;

void setup() {

lcd.begin(16, 2);
lcd.print("Cuenta Personas");
delay(1000);
lcd.clear();
//ajustamos una medida de mas o menos la mitad del hueco de paso
medida_activacion = (1.5*analogRead(sensorPin));
}

void loop() {

sensorValue = analogRead(sensorPin);

lcd.setCursor(0,0);
lcd.print("S1:");
lcd.print(sensorValue); //mostramos en el LCD el valor de lectura del sensor
lcd.setCursor(9u,0);
lcd.print("ACT:");     
lcd.print(medida_activacion); //mostramos en el LCD el valor limite para el comparador (valor inicial x 1.5)
lcd.setCursor(0,1);
lcd.print ("Contador: ");
lcd.print (contador);      //mostramos en el LCD el valor del contador

if (sensorValue > medida_activacion){
contador++;
delay(150);
}
delay(150);
lcd.clear();
}


gracias por la ayuda

fm

Es posible que estes teniendo lecturas erroneas o con ruido que hacen que tengas una falsa detección.

Para arreglarlo puedes filtrar un poco la señal. Lo mas fácil es tomar x medidas consecutivas y hacer la media, por ejemplo, 4 u 8 lecturas seguidasmedidas, haces la media y tomas como umbral un valor suficientemente alto para no confundirlo con una falsa detección.
   

nayma

estas teniendo en cuenta que una persona tarda 150 milisegundos en pasar, por que no haces que cuente cada vez que se activa, y se desactiva, y quitas lo de los milisegundos. Prueba a ver que pasa. De todas maneras puedes mirar por el serial que valores te da, y podrías detectar medidas falsas.

Lisergio

he hecho unas pruebas, haciendo 10 lecturas (una cada 10 ms) y después hago la media... funciona perfecto, no ha dado ningún fallo en mas de 7 horas....

el código lo he hecho sin bucles (el código del tirón), he probado un bucle for con un array pero no me ha funcionado... y tampoco se como hacer la media de los datos del array.

para llenar el array he escrito esto...(esto no me ha funcionado)

for (int x = 1; x =10 ; x++)
{
datos
  • = analogRead(sensorPin);
    }


    gracias por la ayuda....




Cheyenne

El IDE viene con un ejemplo para suavizar una toma de medidas mediante el promedio aritmético. La explicación puedes verla aquí http://arduino.cc/en/Tutorial/Smoothing
http://cuadricopterodiyarduino.blogspot.com/

fm

#5
Feb 27, 2012, 10:38 pm Last Edit: Feb 27, 2012, 10:41 pm by fm Reason: 1
Lo que está haciendo el programa del enlace es hacer la media continua de todas las medidas de forma acumulada un cierto número de iteraciones, en vez de hacer eso, es más simple implementar un filtro paso bajo con un coeficiente alpha que se pueda configurar.

De todas formas, para la lectura que está haciendo Lisergio, lo mejor es hacer un conjunto de medidas y tomar la media cada vez por conjunto de lecturas. Es igual a lo que comentas en el enlace pero todo en un bucle cerrado:

Code: [Select]

#define NUM_READINGS 8


En alguna parte del código hacer lo siguiente:

Code: [Select]

long sensorValue = 0;

for ( uint8_t i = 0; i < NUM_READINGS; i++ )
{
  sensorValue += analogRead ( sensorPin );
}

// Sacamos la media
sensorValue /= 8;

if ( sensorValue > medida_activacion )
{...}

Por otro lado yo usaría el mismo método para calcular medida_activacion, es decir tomar unos cuantos valores y quedarte con la media.
   

Go Up