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