Arduino Nano - Sensor de movimiento

¿Alguna vez te has preguntado: “¿Cómo puede hacerlo?” cuando te encuentras con lugares con puertas automáticas, luces y escaleras mecánicas? Si es así, este tutorial no solo responderá a tu pregunta, sino que también te mostrará cómo hacer que eso ocurra utilizando Arduino Nano y un sensor de movimiento. ¡Comencemos!

Este tutorial explica cómo usar Arduino Nano con un sensor de movimiento. En detalle, aprenderemos:

Hardware Requerido

1×Official Arduino Nano
1×Alternatively, DIYables ATMEGA328P Nano Development Board
1×Cable USB A a Mini-B
1×Sensor de Movimiento HC-SR501
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para Arduino Nano
1×(Recomendado) Placa de Expansión Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentación para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Acerca del Sensor de Movimiento HC-SR501

Sensor de movimiento HC-SR501

El sensor PIR HC-SR501 es capaz de detectar el movimiento de personas (o animales). Se utiliza comúnmente en varias aplicaciones, como encender o apagar automáticamente una bombilla, abrir y cerrar una puerta, activar o desactivar una escalera mecánica y detectar a un intruso.

Pinout del sensor de movimiento

El sensor de movimiento HC-SR501 tiene 3 pines:

  • Pin GND: Debe conectarse a GND (0V)
  • Pin VCC: Debe conectarse a VCC (5V)
  • Pin OUTPUT: Este es un pin de salida y estará en nivel bajo cuando no se detecte movimiento, y en nivel alto cuando se detecte movimiento. Este pin debe conectarse al pin de entrada del Arduino.

El HC-SR501 tiene un jumper y dos potenciómetros que se utilizan para ajustar la configuración del sensor.

Pinout del sensor de movimiento HC-SR501

Cómo funciona

El sensor HC-SR501 es capaz de detectar el movimiento basándose en los cambios de la radiación infrarroja emitida por un objeto en movimiento. Para que el sensor HC-SR501 detecte el objeto, deben cumplirse dos criterios:

  • El objeto debe estar en movimiento o temblando
  • El objeto debe emitir radiación infrarroja

En consecuencia:

  • Si un objeto se está moviendo pero no emite rayos infrarrojos (p. ej., un robot o un coche de juguete), no será detectado por el sensor.
  • Si un objeto está emitiendo rayos infrarrojos pero no se está moviendo (p. ej., una persona que está de pie), no será detectado por el sensor.

Los humanos y los animales son fuentes de radiación infrarroja. En consecuencia, el sensor puede detectar sus movimientos.

Estado del pin de salida:

  • Cuando no hay ninguna persona (o animal) presente en el rango detectado del sensor, el pin de salida del sensor está en un nivel bajo.
  • Si una persona (o animal) entra en el rango detectado del sensor, el pin de salida pasará de nivel bajo a nivel alto, indicando que se ha detectado movimiento.
  • Cuando la persona (o animal) sale del rango detectado del sensor, el pin de salida pasará de nivel alto a nivel bajo, señalando que el movimiento ha terminado.

El video de arriba demuestra el funcionamiento básico de un sensor de movimiento. En la realidad, el sensor de movimiento puede operar de manera diferente dependiendo de la configuración (la cual se describe en la sección Usos Avanzados).

Detectar la presencia humana

El propio sensor no reconoce la presencia de humanos. Solo detecta el movimiento. Usamos un Arduino Nano para inferir la presencia de humanos a partir del movimiento detectado por el sensor, siguiendo esta regla:

  • Si se detecta movimiento, entonces hay personas presentes.
  • Si no se detecta movimiento, entonces no hay personas presentes.

Esta regla funciona de forma imperfecta en una situación práctica: cuando las personas están dentro del alcance del sensor pero no se mueven, no se detectará el movimiento. En consecuencia, el Arduino Nano concluirá que no hay personas presentes.

Por ejemplo, el sensor de movimiento de tu sala de reuniones está configurado para activar las luces cuando hay personas presentes. Cuando la reunión está en curso y nadie se está moviendo, el movimiento no se detecta y, por lo tanto, la presencia humana no se reconoce, lo que provoca que las luces se apaguen. Para volver a encenderlas, alguien necesita moverse.

Sin embargo, este problema no es grave y el sensor es económico. Por lo tanto, se utiliza ampliamente para detectar personas en muchas aplicaciones.

Arduino Nano - Sensor de Movimiento HC-SR501

Conecta el pin de entrada digital de un Arduino al pin de salida del sensor HC-SR501. Usando el código de Arduino Nano, podemos comprobar el valor del pin de salida para detectar movimiento.

Diagrama de Cableado

Diagrama de cableado del sensor de movimiento para Arduino Nano

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

Configuración inicial

Time Delay AdjusterScrew it in anti-clockwise direction fully.
Detection Range AdjusterScrew it in clockwise direction fully.
Repeat Trigger SelectorPut jumper as shown on the image.
Configuración inicial del sensor de movimiento de Arduino

Cómo programar para un sensor de movimiento

  • Configura un pin de Arduino como una entrada digital utilizando la función pinMode().
pinMode(MOTION_SENSOR_PIN, INPUT);
  • Verifica el estado del pin OUTPUT del sensor con la función digitalRead().
motion_state = digitalRead(MOTION_SENSOR_PIN);
  • Identificar cuándo comienza el movimiento (el estado del pin cambia de LOW a HIGH).
prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); }
  • Identificar cuándo el estado del pin ha cambiado de ALTO a BAJO, indicando que el movimiento se ha detenido.
prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); }

Código de Arduino Nano

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-motion-sensor */ #define MOTION_SENSOR_PIN 2 // The Arduino Nano pin connected to the OUTPUT pin of motion sensor int motion_state = LOW; // current state of pin int prev_motion_state = LOW; // previous state of pin void setup() { Serial.begin(9600); // Initialize the Serial to communicate with the Serial Monitor. pinMode(MOTION_SENSOR_PIN, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); // TODO: turn on alarm, light or activate a device ... here } else if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); // TODO: turn off alarm, light or deactivate a device ... here } }

Pasos R\u00e1pidos

  • Copia el código anterior y ábrelo en el IDE de Arduino.
  • Haz clic en el botón Subir en el IDE de Arduino para compilar y subir el código al Arduino Nano.
  • Abre el Monitor Serial.
  • Mueve tu mano dentro del rango del sensor.
  • Comprueba la salida en el Monitor Serial.
COM6
Send
Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Usos Avanzados

Esta sección se dedica al conocimiento profundo. NO se preocupe si no lo entiende. Omita esta sección si lo abruma y vuelva otro día. Continúe leyendo con las siguientes secciones.

Como se indicó previamente, podemos modificar la configuración del sensor utilizando un jumper y dos potenciómetros.

Ajustador del rango de detección

Este potenciómetro puede cambiar la distancia a la que se puede detectar algo (aproximadamente entre 3 y 7 metros).

  • Girar completamente hacia la derecha hace que detecte cosas a una distancia de hasta 3 metros.
  • Girar completamente hacia la izquierda hace que detecte cosas a una distancia de hasta 7 metros.
Rango de detección del sensor de movimiento

Podemos usar el potenciómetro para establecer un rango de valores entre 3 m y 7 m.

Ajustador de retardo de tiempo

Este potenciómetro se utiliza para modificar el retardo de tiempo:

  • Cuando se gira completamente en sentido horario, el retraso es aproximadamente 5 minutos.
  • Cuando se gira completamente en sentido antihorario, el retraso es aproximadamente 3 segundos.

La sección siguiente proporciona una explicación del concepto de retardo temporal en conjunto con Repeat Trigger.

Ajustar el retardo de tiempo del sensor de movimiento

Selector de disparadores de repetición

Existe un puente que se utiliza para elegir entre modos de disparo: disparo único o disparo repetible.

Selección de disparador del sensor de movimiento

Tomemos como referencia la configuración de retardo de tiempo, que se establece mediante el Ajustador de Retardo de Tiempo, como time_delay. Si te desplazas dentro del rango del sensor durante un periodo de tiempo prolongado (conocido como motion_time) que es varias veces más largo que time_delay:

  • En modo de disparo único: el estado del pin de salida se alternará entre LOW y HIGH varias veces. La duración HIGH será igual a time_delay mientras que la duración LOW está fija en 3 segundos.
modo de disparo único del sensor de movimiento
  • Modo de disparo repetible: El estado del pin de salida permanecerá en ALTO durante un período de (motion_time + time_delay).
modo de disparo repetible del sensor de movimiento

Pruebas

  • Modo de disparo único:
    • Coloca el puente para seleccionar el modo de disparo único
    • Mueve tu mano frente al sensor durante unos 10 segundos.
    • Aleja tu mano del área del sensor
    • Espera 3 segundos; deberías observar la salida en el monitor serie como se muestra a continuación:
    COM6
    Send
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Modo de disparo repetible:

    • Coloca el jumper para seleccionar el modo de disparo repetible
    • Mueve la mano frente al sensor durante unos 10 segundos
    • Aleja la mano del alcance del sensor
    • Espera 3 segundos; la salida será visible en el monitor serie como éste:
    COM6
    Send
    Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Podemos observar que cuando está en el modo de disparo único, el sensor se activará dos o tres veces. En cambio, cuando está en el modo de disparo repetible, el sensor solo se disparará una vez.

    ※ Nota:

    Durante el tiempo LOW (3 segundos, un valor fijo e inajustable), el sensor no puede detectar ningún movimiento. Esto no provoca ningún problema en la práctica.

    Se recomienda utilizar el modo de disparo repetible.

    En muchos escenarios reales:

    • Encendemos o activamos dispositivos o máquinas tan pronto como hay una persona presente.
    • NO apagamos o desactivamos dispositivos o máquinas inmediatamente después de que ya no haya una persona presente. Apagamos o desactivamos dispositivos o máquinas después de que haya pasado cierta cantidad de tiempo.

    Cómo usar el retardo de tiempo

    Si no se detecta ninguna persona, el sistema de automatización esperará un periodo de tiempo antes de tomar medidas.

    El sensor de movimiento tiene un ajustador de retardo de tiempo que puede usarse para establecer el retardo en un mínimo de 3 segundos y un máximo de 5 minutos. Además, el código de Arduino Nano se puede usar para establecer cualquier valor para el retardo.

    Si no especificamos un tiempo de espera en el código del Arduino Nano, el tiempo de espera será equivalente al retardo establecido en el sensor.

    Si se establece un tiempo de espera en el código del Arduino Nano, será la suma del retardo en la configuración del sensor y del retardo en el código del Arduino Nano.

    Establecer el retardo de tiempo en el código de Arduino Nano

    /* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-motion-sensor */ #define MOTION_SENSOR_PIN 2 // The Arduino Nano pin connected to the OUTPUT pin of motion sensor int motion_state = LOW; // current state of pin int prev_motion_state = LOW; // previous state of pin const unsigned long DELAY_TIME_MS = 30000; // 30000 miliseconds ~ 30 seconds bool delay_enabled = false; unsigned long delay_start_ms; void setup() { Serial.begin(9600); // Initialize the Serial to communicate with the Serial Monitor. pinMode(MOTION_SENSOR_PIN, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { prev_motion_state = motion_state; // store state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delay_enabled = false; // disable delay // TODO: turn on alarm, light or activate a device ... here } else if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); delay_enabled = true; // enable delay delay_start_ms = millis(); // set start time } if (delay_enabled == true && (millis() - delay_start_ms) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delay_enabled = false; // disable delay // TODO: turn off alarm, light or deactivate a device ... here } }

    Si se habilita el modo de disparo repetible, entonces el retardo en el código será de 30 segundos más time_delay, que se establece en la configuración del sensor a través del Ajustador de Retardo de Tiempo.

Rétate a ti mismo

Utilice el sensor de movimiento para realizar uno de estos proyectos:

  • Enciende la luz al entrar en tu habitación y apágala después de 30 segundos de haber salido. Tip: Consulta Arduino Nano - Relay.
  • Activa una alarma cuando alguien se aproxime a tus bienes más preciados. Tip: Consulta Arduino Nano - Piezo Buzzer.

Referencias de Funciones

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!