Pages: [1]   Go Down
Author Topic: Sensor proximidad por infrarrojos sharp  (Read 3156 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 189
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

   

0
Offline Offline
God Member
*****
Karma: 1
Posts: 524
Arduino inside
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 189
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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....



Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#define NUM_READINGS 8

En alguna parte del código hacer lo siguiente:

Code:
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.
« Last Edit: February 27, 2012, 04:41:12 pm by fm » Logged

   

Pages: [1]   Go Up
Jump to: