Problema con interpretación de señal de sensor infrarrojo del tipo 1838

Saludos. He estado intentando implementar un contador de personas para una puerta utilizando sensores del tipo IR 1838 (véase imagen adjunta)

El problema radica en que cuando alguien pasa una vez, me registra varios eventos.  Quiero pensar que similar a un efecto rebote, pero aun usando retardos de tiempo este rebote no se va del todo.

¿Hay alguna manera mas eficiente de detectar la interrupción de trenes de pulsos ?
Adjunto el código que he desarrollado hasta ahora

/*Este código implementado en un Arduino Mega tiene la finalidad de determinar si alguien
 * pasa por una puerta e imprimir un mensaje de "Entrada" o "Salida" de acuerdo al sentido en que cruce
 * la persona. Se han utilizado 4 sensores IR 1838 para el monitoreo de la puerta,
 * estos trabajan con ráfagas de pulsos a 38 kHz. La salida de los mismos es un tren
 * de pulsos de aproximadamente 650 Hz, con un tiempo en alto de 920 uS y un tiempo
 * bajo de 620 uS. En caso de no recibir rafagas, el sensor da una salida a +5V.
 * Para el monitoreo de los sensores se ha utilizado interrupciones a nivel bajo,
 * como contadores que se reinician cada 100 mS. En caso de que alguien pase entre
 * los sensores, el conteo se vera interrumpido y de acuerdo a los sensores interrumpidos
 * se dictamina que alguien ha entrado o salido. */

//Declaracion de Pines
const int sensorIR1 = 18; // Sensor Superior Entrada
const int sensorIR2 = 19; // Sensor Superior Salida
const int sensorIR3 = 20; // Sensor Inferior Entrada
const int sensorIR4 = 21; // Sensor Inferior Salida
//Variables donde guardo los pulsos generados por cada sensor IR
volatile int Pulse1=0;
volatile int Pulse2=0;
volatile int Pulse3=0;
volatile int Pulse4=0;
int counterBl=0;
//Variable para indicar que alguien paso por la puerta
bool YaPase=false;
//Variables para calculo de tiempo
unsigned long tiempo_actual;
unsigned long tiempo_anterior;
void setup() {
  // put your setup code here, to run once:
  pinMode(sensorIR1,INPUT_PULLUP);
  pinMode(sensorIR2,INPUT_PULLUP);
  pinMode(sensorIR3,INPUT_PULLUP);
  pinMode(sensorIR4,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensorIR1),DS1,FALLING);
  attachInterrupt(digitalPinToInterrupt(sensorIR2),DS2,FALLING);
  attachInterrupt(digitalPinToInterrupt(sensorIR3),DS3,FALLING);
  attachInterrupt(digitalPinToInterrupt(sensorIR4),DS4,FALLING);
  Serial.begin(9600);
}

void loop() {
tiempo_actual=millis();
YaPase=false;
//Muestreo cada 100 mS
if(tiempo_actual-tiempo_anterior >=100) 
  { tiempo_anterior=tiempo_actual; 
// Si los sensores de la entrada han contado menos que los de la salida
// y la suma de los 4 variables contadoras es menor o igual de 240 pulsos
//  y la bandera que indica paso es falsa, entonces alguien entro.
 if( (Pulse1+Pulse3<Pulse2+Pulse4) && ((Pulse1+Pulse2+Pulse3+Pulse4)<=240) && YaPase==false)
  { 
    Serial.println("Entrada");
    YaPase=true;} 
// Si los sensores de la salida han contado menos que los de la entrada
// y la suma de los 4 variables contadoras es menor o igual de 240 pulsos
// y la bandera que indica paso es falsa alguien salio  
 if( (Pulse1+Pulse3>Pulse2+Pulse4) && ((Pulse1+Pulse2+Pulse3+Pulse4)<=240) && YaPase==false)
  { 
    Serial.println("Salida");
    YaPase=true; }
// Si alguien se queda parado en la puerta, entonces hay un bloqueo
  if(Pulse1<20 && Pulse2<20 &&Pulse3<20 && Pulse4<20)
  { counterBl++;
    if(counterBl>=30)
    { Serial.println("Bloqueo");
      counterBl=0; }
  }
  Pulse1=0; Pulse2=0; Pulse3=0; Pulse4=0; // Reinicio de contadores 
  }
}

/*Rutinas de interrupción. Solo incrementan la variable por cada flanco de bajada*/
void DS1()
{ Pulse1++;}

void DS2()
{  Pulse2++;}

void DS3()
{ Pulse3++;}

void DS4()
{  Pulse4++; }

De antemano, gracias.

Hi,
Ese sensor se usa en control remoto y la senal de salida puede ser de 38kz .o de 56kz.

tauro0221:
Hi,
Ese sensor se usa en control remoto y la senal de salida puede ser de 38kz .o de 56kz.

Si, eso estuve viendo, incluso venden el modulo ya hecho para ser usado con la librería IRremote. Lo que pasa es que estos sensores los tome de una barra contadora de pasajeros que al parecer usan los mismos sensores.

Hi,
El sensor se puede usar para detectar infrarojos pero tienes que programarlo del tal modo que cuando el sensor manda los pulso solamente usas el primero y no puedes seguir leyendolo a menos que detectes cuando esta no me acuerdo si normalmente esta a 5 voltios cuando no recibes pulsos o zero. Tienes que hacer una prueba para ver si cuando esta sin recibir senal infraroja el sensor se va a 5 voltios o se va zero voltios.

tauro0221:
Hi,
El sensor se puede usar para detectar infrarojos pero tienes que programarlo del tal modo que cuando el sensor manda los pulso solamente usas el primero y no puedes seguir leyendolo a menos que detectes cuando esta no me acuerdo si normalmente esta a 5 voltios cuando no recibes pulsos o zero. Tienes que hacer una prueba para ver si cuando esta sin recibir senal infraroja el sensor se va a 5 voltios o se va zero voltios.

La salida del sensor se va a 5V cuando no recibe, estoy intentando contar los pulsos cada 100 mS (Serian alrededor de 60) y si la cuenta es menor significa que alguien paso por la puerta. He observado en un osciloscopio y conforme pasa alguien, la salida no se va a 5 directamente, si no que el pulso positivo del tren aumenta (como si de un pwm se tratara)

Una barrera infrarroja es algo tan simple como un pulsador o botón.
Si interrumpes el haz, tiene que cambiar de estado.
Primero cerciórate que hace eso. Supongo que es el caso.

Luego mi consejo es que pongas dos barreras, una separada de la otra.
Entonces al ingresar una persona no habrá ingreso hasta que alguien pase de B1 a B2 y no habra egreso hasta que haya un cambio de B2 a B1.
claro que esto no discrimina a dos amigos o una pareja que pasa junta. No hay modo de hacerlo. Nada supera en este punto al molinete.

Moderador:
Por favor edita la primer imágen porque no se ve.
Jamás copies y pegues la imagen desde la busqueda de google. Debes ir a la pagina y tomar el enlace de la imagen y entonces copiarlo. Es mucho mas corto del que has puesto.
Lo vi al intentar corregirlo y no apunta a dicha imagen.

Hi,
Para mi ese sensor no sirve para tu aplicacion ya que envia varios pulsos cuando detecta los rayos infrarojos. Ahora podrias tratar de filtrar los pulsos anadiendole un condensador electrolitico para que filtre los pulso. Empieza con uno de 1ufd y ya que tienes un osciloscopio verifica que te filtra los pulsos y aumenta la capacidad del condensador hasta que veas solamente un pulso.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.