Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Cómo usar el sensor de movimiento HC-SR501 PIR

En este tutorial, aprenderás cómo funciona el sensor de movimiento HC-SR501 PIR y cómo puedes usarlo con Arduino. Puedes encontrar sensores de infrarrojos pasivos (PIR) a tu alrededor, no sólo se utilizan con fines de seguridad, sino también en la mayoría de los sistemas de iluminación de activación automática.

En este artículo, hemos incluido un diagrama de cableado y códigos de ejemplo para que puedas empezar a experimentar con tu sensor. Después de cada ejemplo, desglosamos y explicamos cómo funciona el código, por lo que no debería tener problemas para modificarlo según sus necesidades.

Primero te mostraremos cómo puedes usar el HC-SR501 como una unidad autónoma. A continuación, lo conectaremos a un Arduino Uno y te mostraremos cómo usarlo como un simple sistema de alarma.

Este tutorial se centra en el sensor HC-SR501, pero también puedes utilizar el código proporcionado para sensores similares como el HC-SR505 o el AM312. La principal diferencia es que estos sensores más baratos tienen un rango de detección más pequeño y no tienen un potenciómetro para ajustar la sensibilidad y el retardo de tiempo. Veamos una introducción en vídeo:

Y ahora pasemos a la acción.

Lo qué necesitamos

¿Cómo funciona un sensor de movimiento PIR?

Los sensores de movimiento PIR consisten en dos partes principales: un elemento sensor piroeléctrico y una lente de fresnel. El elemento sensor piroeléctrico puede detectar la radiación infrarroja. Todos los objetos con una temperatura superior al cero absoluto (0 Kelvin / -273,15 °C) emiten energía térmica en forma de radiación infrarroja, incluyendo los cuerpos humanos.

funcionamiento sensor de movimiento - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Un sensor piroeléctrico tiene dos ranuras rectangulares hechas de un material que permite el paso de la radiación infrarroja. Detrás de ellas, hay dos electrodos separados del sensor infrarrojo, uno responsable de producir una salida positiva y el otro una salida negativa. La razón de esto es que estamos buscando un cambio en los niveles de IR y no en los niveles de IR del ambiente. Los dos electrodos están cableados de manera que se anulan entre sí. Si una mitad ve más o menos radiación IR que la otra, la salida oscilará hacia arriba o hacia abajo.

El circuito integrado de procesamiento de señales procesa esta señal y gira la clavija de salida del sensor a la posición HIGH o LOW.

funcionamiento sensor de movimiento 2 - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

La cúpula blanca delante del elemento sensor es una lente de fresnel. Esta lente enfoca la radiación infrarroja en el sensor.

sensor infrarojos - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

HC-SR501 Sensor de movimiento PIR

El sensor de movimiento PIR HC-SR501 está construido alrededor del IC del detector de movimiento PIR BISS0001 Micro Power. Este CI está desarrollado específicamente para procesar la señal de los sensores de movimiento PIR.

Si quitas la lente de Fresnel, verás el elemento sensor piroeléctrico RE200B. En el PCB también puedes encontrar un regulador de voltaje incorporado. Esto significa que puedes alimentar la placa con un gran rango de voltaje DC, típicamente se usan 5 V.

Las especificaciones del HC-SR501 se dan en la siguiente tabla, ten en cuenta que puede haber pequeñas diferencias entre los fabricantes.

Voltaje4.5 – 20 V
Corriente quiescente50 μA
Salida de nivelHIGH 3.3 V / LOW 0 V
TriggerL single trigger / H repeating trigger
Tiempo de demora3 – 300 s
Tiempo de bloqueo2.5 s (default)
TriggerL single trigger / H repeating trigger
Rango de medición3 – 7 m maximum
2 mm
Ángulo de medición< 110° cone angle
PCB medidas32.5 x 24 mm
Agujeros de montaje2 mm, 28.5 mm spacing
Dimensiones de la lente de Fresnel15 mm x 23 mm diameter
Temperatura de funcionamiento-15 – 70 °C

Para más información, puede consultar la siguiente hoja de datos o datasheet:

Datasheet del HC-SR501

HC-SR501 PIR Sensor Pinout

El HC-SR501 tiene un conector de 3 pines que lo conecta al mundo exterior. Las conexiones son las siguientes:

HC SR501 PIR Sensor Pinout - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

  • VCC es la fuente de alimentación del sensor PIR HC-SR501 al que conectamos la clavija de 5V del Arduino.
  • El pin de salida es una salida lógica TTL de 3,3V. BAJO indica que no se detecta movimiento, ALTO significa que se ha detectado algún movimiento.
  • GND debe ser conectado a la tierra de Arduino.

Cómo funciona el HC-SR501

En el reverso del tablero encontrarás dos potenciómetros y un jumper, con los que podrá ajustar varios parámetros:

HC SR501 pinout - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Ajuste de la sensibilidad (rango)

El HC-SR501 tiene una distancia máxima de detección (rango de detección) de 7 metros. Puedes ajustar la distancia de detección girando el potenciómetro de sensibilidad CW o CCW (ver imagen superior). Girando el potenciómetro en el sentido de las agujas del reloj se aumenta la distancia de detección a un máximo de 7 metros. Girándolo en sentido contrario a las agujas del reloj, la distancia de detección se reduce a un mínimo de 3 metros.

Ajuste del retardo de tiempo (Tx)

Este potenciómetro puede ser usado para ajustar el tiempo que la salida permanece HIGH para después de que se detecte el movimiento. Como mínimo, el retardo es de 3 segundos y como máximo, es de 300 segundos o 5 minutos. Gira el potenciómetro en el sentido de las agujas del reloj para aumentar el retardo y en sentido contrario para disminuirlo.

Saltador de selección del disparador

El puente (amarillo) puede usarse para seleccionar uno de los dos modos de disparo. Se puede configurar en L (disparo único) o en H (disparo repetido):

  • Disparador único: La salida se pondrá en HIGH tan pronto como se detecte el movimiento. Permanecerá en HIGH durante el tiempo establecido por el potenciómetro. Cualquier movimiento durante este período no se procesa y no reinicia el temporizador.
  • Disparador de repetición: Cada vez que se detecta un movimiento, el temporizador de retardo se reinicia.

La diferencia entre el modo de disparo simple y el de repetición se muestra en la siguiente figura.

diferencia de repetición - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Añadiendo un termistor y/o LDR al HC-SR501

Como se puede ver en la imagen de abajo, el HC-SR501 tiene almohadillas de soldadura para dos componentes adicionales. Estas almohadillas están típicamente etiquetadas como ‘RL’ y ‘RT’.

soldadura del HC SR501 - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

  • RL: Aquí puedes añadir una resistencia dependiente de la luz (LDR) o un fotoresistor que tiene una baja resistencia bajo una fuerte luz ambiental. Esto hace que el detector sea operacional sólo cuando el área de detección es suficientemente oscura.
  • RT: Esta almohadilla está destinada a un termistor. Si se añade esto, la sensibilidad del sensor es menos dependiente de la temperatura ambiente

Desafortunadamente, no se proporciona información adicional en las hojas de datos, por lo que no estamos del todo seguro de qué valores de componentes se deben utilizar.

Usando el sensor de movimiento HC-SR501 PIR como una unidad autónoma

Para la mayoría de las aplicaciones, puedes usar el HC-SR501 como una unidad autónoma. Puedes usar la señal de salida para activar cosas como relés y LEDs.

El cableado es muy simple como se puede ver en la imagen de abajo. Simplemente conecta el VCC y la GND a una batería y un LED rojo entre la clavija de salida y la tierra. El voltaje de salida es de 3,3 V, por lo que hemos añadido una resistencia limitadora de corriente de 68 Ω en serie con el LED.

conexión a batería del HC SR501 - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Ten en cuenta que después de encender el sensor, debes esperar de 30 a 60 segundos para que el sensor se inicialice. Durante este período, el LED podría parpadear un par de veces. Después de esperar un minuto, puedes agitar la mano frente al sensor y deberías poder ver que el LED se enciende.

Con esta configuración, es fácil probar la funcionalidad del sensor. También es un buen momento para jugar con los ajustes de sensibilidad y retardo, así como con los dos diferentes modos de disparo.

Cableado y conexiones del sensor de movimiento HC-SR501 PIR a Arduino UNO

Conectando el sensor de movimiento a un microcontrolador como el Arduino UNO, puedes usarlo para controlar todo tipo de cosas: LEDs, relés, motores, zumbadores, etc.

En el siguiente diagrama de cableado, puedes ver cómo conectarlo al Arduino. Puedes leer el sensor con uno de los pines de entrada/salida de propósito general (GPIO) del Arduino. En este ejemplo, lo conectamos al pin 2 digital. Los pines VCC y GND están conectados a 5 V y GND respectivamente.

conexión a Arduino Uno del HC SR501 - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Las conexiones también se dan en la tabla siguiente:

Conexiones del sensor de movimiento HC-SR501 PIR

HC-SR501 PIR Sensor de movimientoArduino
VCC5 V
OUTPin 2
GNDGND

Una vez que haya conectado el sensor, el siguiente paso es cargar un código de ejemplo.

Sensor de movimiento HC-SR501 PIR con código de ejemplo de Arduino UNO

Con el siguiente código de ejemplo, puede leer el sensor y controlar el LED de a bordo del Arduino (conectado al pin 13). Este código también puede ser usado para controlar simples relés para encender o apagar una luz más grande.

Puedes cargar el código de ejemplo con el IDE de Arduino. Para que este código funcione correctamente, es mejor poner el puente del modo de disparo en ‘H’ (modo de disparo repetido). También debes ajustar el potenciómetro de retardo al valor más bajo. Gíralo en sentido contrario a las agujas del reloj hasta el final.

El código leerá el estado del sensor (HIGH o LOW) y encenderá o apagará el LED de a bordo según corresponda. También imprimirá un mensaje al Monitor de Serie, al que puedes acceder en Herramientas o teclear (Ctrl+Mayús+M).

/* Example code for HC-SR501 PIR motion sensor with Arduino. More info: https://descubrarduino.com */

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

Deberías ver la siguiente salida en el monitor de serie:

serial sensor de movimiento - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

Explicación del código:

El código es bastante simple y no necesitas ninguna biblioteca de Arduino para usar este sensor.

El código comienza con la definición de la clavija del sensor PIR y la clavija del LED. Los conectamos a los pines 2 y 13 de Arduino (LED de a bordo).

La sentencia #define se utiliza para dar un nombre a un valor constante. El compilador reemplazará cualquier referencia a esta constante con el valor definido cuando el programa sea compilado. Así que en cualquier lugar que se mencione pirPin, el compilador lo reemplazará con el valor 2 cuando el programa sea compilado.

También he creado dos variables, val y motionState, que son un entero y un booleano (true/false) respectivamente. La variable val se usa para almacenar la salida del sensor PIR (HIGH o LOW) y motionState se convertirá en true cuando se detecte movimiento y en false cuando no haya movimiento.

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

En el setup(), configuramos los pines como entrada o salida con la función pinMode(pin,mode). El pirPin es una entrada y el ledPin es una salida. También comenzamos la comunicación en serie a una velocidad de 9600 baudios. Asegúrate de que el monitor de serie también está configurado a 9600.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

En el loop(), primero lee el sensor con la función digitalRead(pin). Esta función devuelve HIGH o LOW.

// Read out the pirPin and store as val:
val = digitalRead(pirPin);

Cuando la output/val del sensor es HIGH, enciende el LED con la función digitalWrite(pin,valor).

// If motion is detected (pirPin = HIGH), do the following:
if (val == HIGH) {
  digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

  // Change the motion state to true (motion detected):
  if (motionState == false) {
    Serial.println("Motion detected!");
    motionState = true;
  }
}

A continuación, el motionState se cambia a true y el mensaje “¡Movimiento detectado!” o “Motion detected” se imprime en el monitor de la serie. Ten en cuenta que primero comprobamos el motionState actual, esto asegura que el mensaje sólo se imprime una vez por cada evento de movimiento.

Si ya no hay movimiento delante del sensor, val cambiará a LOW y el LED se apagará y se imprimirá el mensaje ‘¡Movimiento terminado!’ en el monitor en serie.

Crear un sistema de alarma con el sensor de movimiento PIR y el zumbador

Con algunos cambios simples, puedes crear un sistema de alarma con el HC-SR501 y un zumbador piezoeléctrico. Conecté el zumbador con una resistencia de 100 Ω entre el pin digital 5 y GND. Probablemente puedas usar el zumbador sin una resistencia (esto lo hace más fuerte), pero no sonará tan bien.

crear alarma con sensor de movimiento - Cómo usar el sensor de movimiento HC-SR501 PIR con Arduino

El código que se muestra a continuación es en su mayor parte el mismo que el del ejemplo anterior. Sólo hemos añadido una función para crear el sonido de alarma. Se puede cambiar el tono del zumbador cambiando el parámetro de entrada de la función de alarma (duración, frecuencia).

/* Example code to create an alarm system with HC-SR501 PIR motion sensor, buzzer and Arduino. More info: www.descubrearduino.com */

// Define connection pins:
#define buzzerPin 5
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
    alarm(500, 1000);  // Call the alarm(duration, frequency) function.
    delay(150);

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.
    noTone(buzzerPin); // Make sure no tone is played when no motion is detected.
    delay(150);

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

// Function to create a tone with parameters duration and frequency:
void alarm(long duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}

Qué debes considerar cuando se diseña un sistema de sensores PIR

Al igual que otros sensores PIR, el HC-SR501 necesita un tiempo para inicializar y ajustarse a los niveles de infrarrojos de la habitación. Esto lleva aproximadamente 1 minuto cuando se enciende por primera vez. Intenta eliminar cualquier movimiento delante del sensor durante este período.

El viento y una fuente de luz cercana al sensor pueden causar interferencias, así que intenta ajustar la configuración para evitarlo. Además, ten en cuenta que debes montar el sensor en posición horizontal, ya que la mayoría de los movimientos se producen en el plano horizontal (por ejemplo, al caminar).

Además del tiempo de retardo (Tx), el sensor también tiene un “tiempo de bloqueo” (Ti). Por defecto, el tiempo de bloqueo es de 2,5 segundos y no es muy fácil de cambiar (véase la hoja de datos de BISS0001). Cada vez que la salida pasa de HIGH a LOW, comienza el período de bloqueo. Durante este período de tiempo, el sensor no detectará ningún movimiento.

Cuando se diseña un sistema basado en el HC-SR501, hay que tener en cuenta estos períodos de retraso.

Conclusión

En este artículo, te hemos mostrado cómo funciona el sensor de movimiento HC-SR501 PIR y cómo puedes usarlo con Arduino. Esperamos que lo encuentres útil e informativo. Si lo hiciste, por favor, compártelo con un amigo al que también le gusta la electrónica.

Pin It on Pinterest

Shares