Problema con diseño de puerta detectora de sentido de personas

Saludos amigos.
He estado trabajando en el diseño de una puerta que detecta si una persona entra o sale de un cuarto. Estoy usando barreras de sensores las cuales están conformadas por LED IR , sensores infrarrojos que trabajan a 38 kHz y el CI detector de tono LM567. El caso es que no he podido hacerlo a funcionar del todo. Estoy utilizando Arduino para la detección de interrupción de del haz luminoso (Adjunto imagen).
Captura de pantalla (20).PNG
Los problemas que presento son los siguientes:
Hay veces que el LM567 se queda con salida en alto una vez que paso por el haz de luz (adjunto diagrama). Inicialmente hice cálculos de acuerdo a la frecuencia de salida del sensor (alrededor de 620 Hz), pero al final nunca detecto la frecuencia de acuerdo a los cálculos (R=14.6k, C=100 nF), así que tuve que usar un potenciómetro para poder ir ajustando las salidas. Si sirve de algo, las resistencias son de 4 bandas a +/- 5% de tolerancia y el capacitor C1 es cerámico. C2 y C3 son electrolíticos, de 1 uF y 2.2 uF respectivamente.

Captura.PNG

Con respecto a la programación en Arduino, he desarrollado el siguiente código, si bien hay veces que detecta bien el sentido de paso de personas, a veces no imprime los eventos o en su defecto los imprime mal (salidas en vez de entradas y viceversa). Adjunto codigo

Código:
/*Puerta detectora cruce de personas. Desarrollado en Arduino Mega 2560*/
//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

unsigned long tiempoPaso=0; // Variable de tiempo para evitar rebotes del sensor

// Variables indicadoras de entrada
bool StatusB1=false;   // Bandera Indicadora de cruce de barrera 1
bool StatusB2=false;  // Bandera indicadora de cruce de barrera 2
bool StatusB1B2=false; // Bandera indicadora de interrupcion total de puerta

// Variables indicadoras de salida
bool StatusBa=false; // Bandera Indicadora de cruce de barrera 2
bool StatusBb=false; // Bandera indicadora de cruce de barrera 2
bool StatusBaBb=false; // Bandera indicadora de interrupcion total de puerta

  

void setup() { 
  // put your setup code here, to run once:
  pinMode(sensorIR1,INPUT);
  pinMode(sensorIR2,INPUT);
  pinMode(sensorIR3,INPUT);
  pinMode(sensorIR4,INPUT);
  Serial.begin(9600);
  Serial.println("Listo");
}

void loop() { 
tiempoPaso=millis();

//Secuencia de subida
StatusB1=Barrera1(sensorIR1,sensorIR3);
StatusB1B2= Barrera3(sensorIR1,sensorIR2,sensorIR3,sensorIR4);
StatusB2=Barrera2(sensorIR2,sensorIR4);

if(StatusB1==true && StatusB1B2==true && StatusB2==true)   // Alguien esta en la puerta?
{ 
    if(!Barrera3(sensorIR1,sensorIR2,sensorIR3,sensorIR4))   // Termino de pasar?
     { Serial.println("Entrada);
       delay(500);}   
}

// Secuencia de bajada
StatusBa=Barrera2(sensorIR2,sensorIR4);                                        
StatusBaBb= Barrera3(sensorIR1,sensorIR2,sensorIR3,sensorIR4);
StatusBb=Barrera1(sensorIR1,sensorIR3);

if(StatusBa==true && StatusBaBb==true && StatusBb==true)  // Alguien esta en la puerta?
{ //Serial.println("Entre a la condicion"); 
     if(!Barrera3(sensorIR1,sensorIR2,sensorIR3,sensorIR4))  
     { Serial.println("Bajada");                                                        // Termino de pasar?
     delay(500);}   
}

  }

/*Funciones para la formacion de barreras IR*/
bool Barrera1(int pinSIR1, int pinSIR2)
{ bool cruceBarrera1=false;
  while(digitalRead(pinSIR1)==HIGH && digitalRead(pinSIR2)==HIGH && millis()-tiempoPaso<=60)  // Anti rebote de senal
  { cruceBarrera1=true;}
  tiempoPaso=millis();
  return cruceBarrera1;}

bool Barrera2(int pinSIR3, int pinSIR4)
{ bool cruceBarrera2=false;
  while(digitalRead(pinSIR3)==HIGH && digitalRead(pinSIR4)==HIGH && millis()-tiempoPaso<=60) // Anti rebote de señal
  { cruceBarrera2=true;}
  tiempoPaso=millis();
  return cruceBarrera2;}

bool Barrera3(int pinSIR1, int pinSIR2, int pinSIR3, int pinSIR4)
{ bool cruceBarrera3;
  if(digitalRead(pinSIR1)==HIGH && digitalRead(pinSIR2)==HIGH &&digitalRead(pinSIR3)==HIGH && digitalRead(pinSIR4)==HIGH)
  { cruceBarrera3=true; }
  else
   { cruceBarrera3=false;}
   return cruceBarrera3;
 }

Lo desarrolle así pensando en que se debe seguir una secuencia de E/S para determinar el sentido de paso. Espero puedan darme ayudarme o darme sugerencias en lo que puedo estar haciendo mal. Gracias de antemano.
 
No alcanzo a entender bien como es que haces la barrera...si el 567 esta usado como detector, quien es el que genera el tono emitido a detectar del otro lado?

Siempre lo he usado para detectar una señal de un audio recuperado de un receptor como por ejemplo llave de apagado/encendido de una estación repetidora remota, etc.

Debes prestar especial atención a los materiales empleados en VCO(R1, C1) porque si no son de alta calidad, varia la frecuencia y se te desajusta el detector.

Si quieres saber donde detectara la señal(que frecuencia) colocas un frecuencímetro en el pin 5 o 6 y mides la frecuencia en que esta el VCO.

Te sugiero que durante la prueba mandes a GND la señal de entrada del IC para que se quede relativamente estable para medir.

El programa no se programar C pero básicamente usando "banderas"(flags, variable de valor bit) para el paso de la primera y segunda barrera, solo tenes que comparar como fue el orden de activación para saber si entro o salió y proceder a bórralas para comparar el próximo paso.
 
Última edición:
No alcanzo a entender bien como es que haces la barrera...si el 567 esta usado como detector, quien es el que genera el tono emitido a detectar del otro lado?
Gracias por responder.
Los sensores dan como salida una onda cuadrada con una frecuencia alrededor de 600 Hz. De acuerdo a la hoja de datos del CI 567 arme el circuito RC correspondiente a la frecuencia esperada, para poder así trabajar esas frecuencias como entradas digitales (0= El sensor esta recibiendo haz de luz infrarroja, 1= Alguien ha interrumpido el haz).
Mediré la frecuencia de VCO y vere que obtengo.
 
Puedo estar equivocado porque nunca use uno pero tengo entendido que decodifica una portadora infrarroja a 38KHz pero le debes colocar la modulación el usuario y generalmente se usa en los controles remotos de aparatos electrónicos que modulan ancho de pulsos.

Desconocía que al recibir una haz de luz de un diodo infrarrojo sacaba por su salida una onda de 600Hz y no lo especifica en ninguna parte de la poca información que encontré sobre el sensor la cual adjunto.

PD: Efectivamente acabo de probar porque nunca use uno pero tengo( de ratón acumulativo no mas :) ) y solo reacciona a señales desde un infrarrojo modulado(probé con tres controles remotos diferentes) y no a solo un haz de luz infrarroja.
 

Adjuntos

  • VS1838.pdf
    333.6 KB · Visitas: 3
Última edición:

Dr. Zoidberg

Well-known-Papá Pitufo
Puedo estar equivocado porque nunca use uno pero tengo entendido que decodifica una portadora infrarroja a 38KHz pero le debes colocar la modulación el usuario y generalmente se usa en los controles remotos de aparatos electrónicos que modulan ancho de pulsos.

Desconocía que al recibir una haz de luz de un diodo infrarrojo sacaba por su salida una onda de 600Hz y no lo especifica en ninguna parte de la poca información que encontré sobre el sensor la cual adjunto.
Tal cual. Hay que modular la portadora de 38kHz para que el sensor la detecte y de ahí pueda extraer la señal "modulante". O sea, la señal que sale de los LEDs IR debe ser de 38kHz con algo montado encima para modularla, si nó, no va a funcionar. Pero bué, como no tengo la bola de cristal y quien hizo la consulta asume que las barreras están OK y no publica nada sobre ellas...no puedo imaginar de donde salen los 620 Hz que quiere recuperar...
 
El emisor infrarrojo debe emitir una luz modulada en 38 KHz con una señal cuadrada.

El receptor esta preparado para recibir esa luz intermitente por llamarla de alguna manera y recien ahi entregará una señal a la salida que sera idéntica a la modulación del emisor, pero siempre en 38 KHz
 
Tal cual. Hay que modular la portadora de 38kHz para que el sensor la detecte y de ahí pueda extraer la señal "modulante". O sea, la señal que sale de los LEDs IR debe ser de 38kHz con algo montado encima para modularla, si nó, no va a funcionar. Pero bué, como no tengo la bola de cristal y quien hizo la consulta asume que las barreras están OK y no publica nada sobre ellas...no puedo imaginar de donde salen los 620 Hz que quiere recuperar...
Estas tarjetas formaban parte de un sistema contador de pasajeros. La señal del transmisor infrarrojo la replicado usando un arduino a una frecuencia similar. Al parecer las enviaba como ráfagas de pulsos de 600 uS y un espacio de 1 mS entre ráfagas.
Adjunto imagenes.

WhatsApp Image 2021-02-18 at 4.11.33 PM.jpegWhatsApp Image 2021-02-18 at 4.11.33 PM (3).jpegWhatsApp Image 2021-02-18 at 4.11.33 PM (1).jpegWhatsApp Image 2021-02-18 at 4.11.33 PM (3).jpegWhatsApp Image 2021-02-18 at 4.11.33 PM (2).jpeg
Esa parte la sustituí por un LED IR

La salida del sensor se muestra tal cual. Al parecer esas salidas las interpretaba un microcontrolador o algo así por el estilo.

WhatsApp Image 2021-02-18 at 4.11.35 PM.jpegWhatsApp Image 2021-02-18 at 4.11.34 PM.jpeg

Si se aumenta la frecuencia del emisor, el receptor cambia su frecuencia de salida. No se si la salida del emisor corresponda a una modulacion en algun formato o algo asi
 

Dr. Zoidberg

Well-known-Papá Pitufo
A ver....
Si mandás pulsos de 38kHz durante 600us van pasar 22.8 pulsos, asi que la ventana debe ser un poquito mas grande.
Cuando el micro no reciba esa cantidad de pulsos en el tiempo de la ventana --> debe informar que hubo una interrupcion.
Es así de fácil...
 
Señor, me temo que usted está utilizando ese integrado inutilmente....No veo que nada module la portadora del emisor...Ese chip es un generador de tonos y un detector de tonos de presición....Me parece que SONAMOS :unsure: :giggle: si se me premite la humorada. Adhiero a el aporte de papá pitufo. De paso...¿será que el micro es muy lento para VER todo el panorama a tiempo ? La propagación le está ganando parece. En los PLC de bajo costo, es comun que una entrada comun, sea incapaz de VER cualquier EVENTO que sea mas rápido que 20 milisegundos (50hrz)...Fíjese por ese lado tambien. Exitos
 
Última edición:
Por lo pronto, se requiere de un diagrama completo de tu proyecto, ya que así, solo estaremos adivinando.

En alguno de mis propios proyectos, que era una cosa similar; una barrera para saber si entran o salen objetos, utilice los receptores infrarrojos TSOP1738 que son prácticamente lo mismo que se ve en la foto con el que inicia el tema. Y como han dicho o, no se ha explanado o, no sabemos como se esta generando el haz de luz infrarroja a 38 khz para que los receptores puedan dar acuse de su ausencia o presencia; que es el meollo de este tema. En mi caso, que todo estaba programado en un microcontrolador PIC, por medio de una salida PWM ajustada justo a los 38 khz colocando 2 emisores infrarrojos (en mi barrera solo requeríamos dos TSOP1738) en serie, debidamente manejados por un transistor de potencia, logre la barrera infrarroja entre los emisores y los receptores, de tal suerte, que en la salida de los TSOP1738 era muy clara la presencia/ausencia si algo cortaba dicha barrera infrarroja. Lo demás, es historia de programación que al parecer aquí se usa Arduino.

Bien podrías iniciar, fabricando con un LM555; un emisor o transmisor infrarrojo que oscile a los 38 khz requeridos y partes de ahí para conocer realmente los TSOP1738. Yo considero que no requieres de los LM567 para nada; si analizas el diagrama a bloques del receptor, ya viene embebida la función que pretendes con el lm567, es decir seria redundante.

1613696393855.png



Saludos
 
Última edición:
Y como han dicho o, no se ha explanado o, no sabemos como se esta generando el haz de luz infrarroja a 38 khz para que los receptores puedan dar acuse de su ausencia o presencia; que es el meollo de este tema. En mi caso, que todo estaba programado en un microcontrolador PIC, por medio de una salida PWM
Gracias por responder. Con respecto a la señal infrarroja de 38 kHz, he estado utilizando otro Arduino (al igual que tú hiciste, usando salida PWM), copié la salida de uno de las tarjetas transmisores que publique anteriormente en este hilo. Intentaré conseguir ese sensor y hacer pruebas con el.
 
Gracias por responder. Con respecto a la señal infrarroja de 38 kHz, he estado utilizando otro Arduino (al igual que tú hiciste, usando salida PWM), copié la salida de uno de las tarjetas transmisores que publique anteriormente en este hilo. Intentaré conseguir ese sensor y hacer pruebas con el.
No necesitas conseguir otro "sensor" los tuyos están correctos, lo que necesitas es hacer las pruebas correspondientes con los tuyos, y no considero que requieras de otro Arduino para generar el PWM, todo lo puedes hacer en un solo código y en un solo microcontrolador, es decir; generar la frecuencia de 38 KHZ con una Timer/Interrupción; para que siempre este presente en el pin de tu elección. Y por ultimo, con simples IF´s (no considero que requieras mas interrupciones o complicaciones) determinar el estado y cumplimento de lo que sucede en los pines a donde conectes las salidas de los Receptores infrarrojos.

Saludos
 
Arriba