sábado, 19 de noviembre de 2016

Jugando con un sensor PIR.


Los sensores PIR permiten captar el movimiento, casi siempre se utilizan para detectar si un ser humano se ha movido dentro del rango del sensor. 

Son pequeños, de bajo costo, bajo consumo de energía, fácil de usar y totalmente de estado sólido. Por tal motivo, se encuentran comúnmente en electrodomésticos y aparatos utilizados en los hogares o negocios. Se refieren a ellos normalmente como "PIR", "Passive Infrared", "piroeléctrico", o "sensores de movimiento IR".

Un  PIR básicamente es un sensor que puede detectar los niveles de radiación infrarroja. Todo cuerpo emite cierto nivel de radiación infrarroja, y cuanto más caliente, más radiación emite. El sensor en un detector de movimiento y esta dividido en dos mitades. La razón de ello es que estamos tratando de detectar movimiento (cambio) y no los niveles promedio de radiación infrarroja. Las dos mitades están cableados de manera que se anulan entre sí. Si uno ve más o menos radiación infrarroja que el otro, la salida se cambiará alta o baja.

El propio sensor PIR se puede adquirir por separado:
Pero naturalmente siempre es más cómodo de manejar con un pequeño circuito de estabilización y control, que permita usarlo como un sensor digital directo.

La mayoría de los PIR utilizan el circuito integrado BISS0001 (“Micro Poder Detector de movimiento PIR IC”), sin duda un chip muy barato. Este chip toma la salida del sensor y realiza diversos procesamientos en el mismo, para emitir un impulso de salida digital desde el sensor analógico.

Para muchos proyectos donde es necesario detectar cuando una persona ha salido o entrado en una determinada zona, los sensores PIR son geniales. Pero hay que tener en cuenta que los PIR no dirán cuántas personas están alrededor, o qué tan cerca están del sensor, la lente con frecuencia se fija a un cierto barrido y distancia, también hay que considerar que se puede activar con animales domésticos.

El otro elemento restante para que todo funcione es la óptica del sensor. Básicamente es una cúpula de plástico formada por lentes de fresnell, que divide el espacio en zonas, y enfoca la radiación infrarroja a cada uno de los campos del PIR.

De esta manera, cada uno de los sensores capta un promedio de la radiación infrarroja del entorno. Cuando un objeto entra en el rango del sensor, alguna de las zonas marcadas por la óptica recibirá una cantidad distinta de radiación, que será captado por uno de los campos del sensor PIR, disparando la alarma.


Y acá es donde deberíamos de enterarnos un poco sobre de las lentes cóncavas, fresnell y un montón de detalles varios que hacen al conocimiento general de los principios ópticos, pero no útil al momento de hacer funcionar un sensor PIR, pero si recomiendo buscar información al respecto en google, y particularmente dejo el siguiente link:


Donde encontrarán información tanto del sensor y de la lente, formulas matemáticas, así como algunos proyectos muy interesantes y simples (en inglés).

Otros links interesantes:


Y ya entrando en algo un poco más práctico, vamos a familiarizarnos con los pines, los preset´s y el jumper del sensor PIR:

Los pines:
  • GND: masa o 0v
  • VCC +5v
  • OUT es la señal de salida, este lo conectamos al arduino o a un led.
Nota: La salida es del tipo ON/OFF, con lo que puede alimentar a un led o pequeño relé inclusive, si nuestro proyecto es simplemente encender una luz de escalera por ejemplo, no necesitamos ningún arduino.
El pin de salida del modulo PIR es open-colector, esto quiere decir que tenemos que poner una resistencia de 10K a Vcc si queremos accionar un relé o un led. El arduino puede configurarse con una resistencia de pull-up en la entrada digital con lo que no hace falta ponerla físicamente. Cuando el PIR detecte movimiento la salida irá a +3V, y todos los arduinos leen señales de 3V.

Una vez alimentado el PIR, le toma aproximadamente 30 segundos en estabilizar al sensor propiamente dicho.


En varios sitios encontré que se puede alimentar desde 3V hasta 12V, tiene un regulador lo que me da cierta seguridad de decir que es correcto, pero me encuentro en la obligación de no recomendarlo. Con 5V está más que bien, 9V por si usa una batería de 9V y ya 12V puede hacer que se caliente demasiado el regulador y algo se queme (más vale prevenir...)


El jumper:

Tiene dos posiciones, H o L, conectando el jumper entre el pin central y la selección deseada o bien dejarlo sin conectar. He visto en Internet que recomiendan poner el jumper en la posición H para las primeras pruebas que arriba está rotulado como "Disparo Único", pero en algunos casos es más fiable sacar el jumper y dejarlo al aire (es cuestión de probar)

Cuando colocamos el sensor en la posición L, al detectar algo la salida se activará, y al poco se apagará (un segundo aproximadamente) y hará una cadencia tipo blinking LED dependiendo de lo que detecte. A este modo se le llama no retriggering y no suele ser demasiado interesante.

Si lo ponemos en H o lo dejamos libre, cuando detecte movimiento la salida se activará y se mantendrá así durante un tiempo (Llamado retrigger mode) y suele ser más conveniente en la mayoría de los circuitos prácticos.

Los preset´s:

Para ajustar la sensibilidad podemos usar el preset correspondiente, girando en sentido horario aumentamos la sensibilidad

El segundo preset ajusta el tiempo que estará activa la señal de detección después de que ésta haya desaparecido. Pero parece que también afecta al retraso con que inicia la detección, así que es cuestión de jugar para encontrar un punto adecuado según corresponda a las desarrollo decidido.


Algunos ejemplos con arduino:

En Internet hay muchísimos ejemplos, yo he recopilado tres, que me parecen son más que representativos del uso de un sensor PIR asociado a un arduino.

Para probar los dos primeros códigos, se requiere conectar el sensor al arduino de la siguiente forma:

Y los mencionados códigos son los siguientes:

  • El código necesario para realizar la lectura del sensor es realmente muy simple. Se trata de leer la salida del PIR, y hacer parpadear el LED mientras la señal esté activa.
const int LEDPin = 13;

const int PIRPin = 2;
void setup() {
  pinMode(LEDPin, OUTPUT);
  pinMode(PIRPin, INPUT);
}
void loop() {
  if (digitalRead(PIRPin) == HIGH) {
    digitalWrite(LEDPin, HIGH);
    delay(50);
    digitalWrite(LEDPin, LOW);
    delay(50);
  }
  else digitalWrite(LEDPin, LOW);
}

  • Si quisiéramos ejecutar una acción una única vez al detectar movimiento, en lugar de todo el tiempo que la señal este activa, usaríamos el siguiente código.
const int LEDPin = 13;       //pin para el LED

const int PIRPin = 2;        //pin de entrada
int pirState = LOW;          //de inicio no hay movimiento
int val = 0;                 //estado del pin
void setup() {
  pinMode(LEDPin, OUTPUT); 
  pinMode(PIRPin, INPUT);
  Serial.begin(9600);
}
void loop() {
  
  val = digitalRead(PIRPin);
  
  if (val == HIGH) {            //si está activado
    digitalWrite(LEDPin, HIGH); //LED ON
    if(pirState == LOW) {   //si previamente estaba apagado
      Serial.println("Sensor activado");
      pirState = HIGH;
    }
  } else {                     //si esta desactivado
    digitalWrite(LEDPin, LOW); //LED OFF
    if(pirState == HIGH) {//si previamente estaba encendido
      Serial.println("Sensor parado");
      pirState = LOW;
    }
  }
}

  • Y el tercer ejemplo, que más que ejemplo ya de por si solo es una aplicación, lamento que mis conocimientos en música sean muy limitados, el proyecto original se encuentra en:

https://diyhacking.com/arduino-motion-sensor-tutorial/
Requiere de la siguiente configuración de conexionado:
O sea, sumamos un buzzer. 
El código a cargar en el arduino es el siguiente:
/*
Arduino Motion Sensor Burglar Alarm Project
by Arvind Sanjeev
Please check out  http://diyhacking.com for the tutorial of this project.
DIY Hacking
*/

int speakerOut=9;//Piezo buzzer's positive terminal is connected to digital pin 9               
byte names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'};  
int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
byte melody[] = "2d2a1f2c2d2a2d2c2f2d2a2c2d2a1f2c2d2a2a2g2p8p8p8p";
// count length: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
//                                10                  20                  30
int count = 0;
int count2 = 0;
int count3 = 0;
int MAX_COUNT = 24;
int statePin = LOW;
void siren();

 volatile byte intruder;
 void setup() {
   Serial.begin(115200);
   //Initialize the intterrupt pin for the motion sensor (Arduino digital pin 2)
   attachInterrupt(0, intruder_detect, RISING);
   intruder = 0;
 }
 void loop() { }

 //This function is called whenever an intruder is detected by the arduino
 void intruder_detect() {
   intruder++;
   Serial.println("Intruder detected");
   for(int i=0; i<3; i++) siren();//Play the alarm three times
 }

 //This function will make the alarm sound using the piezo buzzer
 void siren() {
  for (count = 0; count < MAX_COUNT; count++) {
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          analogWrite(speakerOut,1023);
          delayMicroseconds(tones[count2]);
          analogWrite(speakerOut, 0);
          delayMicroseconds(tones[count2]);
        } 
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          analogWrite(speakerOut, 0);
          delayMicroseconds(100);
        }
      }
    }
  }
}

En el siguiente link se lo puede observar en funcionamiento (enciendan los parlantes):
https://www.youtube.com/watch?v=TB5vpSCyiSA



No hay comentarios.:

Publicar un comentario