.. note:: Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más profundamente en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas. **¿Por qué unirse?** - **Soporte experto**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Avances exclusivos**: Accede anticipadamente a nuevos anuncios de productos y adelantos exclusivos. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones y sorteos festivos**: Participa en sorteos y promociones navideñas. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo. .. _4.1.4_py: 4.1.4 Cámara de Captura Automática ======================================= Introducción ------------------ Cuando estés fuera, las pequeñas ardillas del bosque podrían visitar tu alféizar. ¡Vamos a hacer una cámara de captura automática para dejar fotos de estas pequeñas adorables! Componentes Necesarios --------------------------------- En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/3.1.18components.png :width: 800 :align: center Es muy conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ELEMENTOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado en los enlaces a continuación. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DEL COMPONENTE - ENLACE DE COMPRA * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_camera_module` - |link_camera_buy| * - :ref:`cpn_pir` - \- Diagrama Esquemático -------------------------- ============== =============== ======== === Nombre T-Board cableado físico wiringPi BCM GPIO17 Pin 11 0 17 ============== =============== ======== === .. image:: ../img/1.1.18_schematic.png :width: 400 :align: center Procedimientos Experimentales --------------------------------- Antes de este proyecto, debes asegurarte de haber completado :ref:`3.1.1_py`. **Paso 1:** Construye el circuito. .. image:: ../img/3.1.18fritzing.png :width: 800 :align: center **Paso 2:** Para conectar el módulo de la cámara y completar la configuración, consulta: :ref:`cpn_camera_module`. **Paso 3:** Ve al escritorio de Raspberry Pi. Puede que necesites una pantalla para una mejor experiencia, consulta: `Connect your Raspberry Pi `_. O accede al escritorio de Raspberry Pi de forma remota, para un tutorial detallado consulta :ref:`remote_desktop`. **Paso 4:** Abre una terminal y accede a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Paso 5:** Ejecuta. .. raw:: html .. code-block:: sudo python3 4.1.4_AutomaticCaptureCamera.py Después de que el código se ejecute, el PIR detectará el entorno circundante, y si detecta que una ardilla pasa, la cámara tomará una foto. El intervalo de las fotos es de 3 segundos, y el número total de fotos tomadas se mostrará en la ventana de impresión. Hay dos potenciómetros en el módulo PIR: uno es para ajustar la sensibilidad y el otro es para ajustar la distancia de detección. Para que el módulo PIR funcione mejor, necesitas girar ambos en sentido antihorario hasta el final. .. image:: ../img/PIR_TTE.png :width: 400 :align: center .. note:: También puedes abrir ``4.1.4_AutomaticCaptureCamera.py`` en la ruta ``~/raphael-kit/python/`` con un IDE de Python, hacer clic en el botón Ejecutar para correrlo, y detener el código con el botón Detener. **Código** .. note:: Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como ``raphael-kit/python``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto. .. raw:: html .. code-block:: python #!/usr/bin/env python3 import time import os import RPi.GPIO as GPIO from picamera2 import Picamera2 # ---------------------------- # USER DIRECTORY # ---------------------------- user = os.getlogin() user_home = os.path.expanduser(f'~{user}') # ---------------------------- # GPIO SETUP # ---------------------------- PIR_PIN = 17 # PIR motion sensor connected to GPIO17 GPIO.setmode(GPIO.BCM) GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # ---------------------------- # CAMERA SETUP # ---------------------------- camera = Picamera2() camera.start() print("Motion detection started. Press Ctrl+C to exit.") # ---------------------------- # MAIN LOOP # ---------------------------- try: i = 1 while True: if GPIO.input(PIR_PIN) == GPIO.HIGH: filename = f"{user_home}/capture{i}.jpg" camera.capture_file(filename) print(f"Motion detected. Saved image #{i}: {filename}") time.sleep(3) i += 1 else: print("waiting") time.sleep(0.5) # ---------------------------- # KEYBOARD INTERRUPT # ---------------------------- except KeyboardInterrupt: print("\nKeyboard interrupt received. Exiting program...") # ---------------------------- # CLEANUP # ---------------------------- finally: try: camera.close() except: pass GPIO.cleanup() print("Program exited cleanly.") **Explicación del código** #. Lee el directorio personal del usuario actual para guardar las imágenes capturadas. .. code-block:: python user = os.getlogin() user_home = os.path.expanduser(f'~{user}') Esto obtiene el nombre del usuario activo y construye la ruta completa a su directorio personal. #. Configura GPIO y establece el sensor PIR en ``GPIO17`` como entrada. .. code-block:: python PIR_PIN = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(PIR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) Usar una resistencia pull-down garantiza que el pin lea ``LOW`` cuando no se detecta movimiento. #. Inicializa la instancia de Picamera2 y enciende la cámara. .. code-block:: python camera = Picamera2() camera.start() La cámara se activa para poder capturar imágenes inmediatamente cuando se detecte movimiento. #. Detecta movimiento leyendo el estado de entrada del sensor PIR. .. code-block:: python if GPIO.input(PIR_PIN) == GPIO.HIGH: Cuando el PIR detecta movimiento, produce una señal ``HIGH``, lo que activa el proceso de captura. #. Captura una imagen y la guarda usando un número de archivo secuencial. .. code-block:: python filename = f"{user_home}/capture{i}.jpg" camera.capture_file(filename) Cada detección guarda una nueva imagen como ``capture1.jpg``, ``capture2.jpg``, etc. #. Espera tres segundos después de una captura activada por movimiento. .. code-block:: python time.sleep(3) Esto evita que se tomen múltiples imágenes demasiado rápido tras un solo evento de movimiento. #. Imprime “waiting” cuando no se detecta movimiento y vuelve a verificar después de una breve pausa. .. code-block:: python else: print("waiting") time.sleep(0.5) Esto asegura una monitorización constante sin consumir demasiados recursos de CPU. #. Maneja la interrupción por teclado (Ctrl+C) para salir del programa de forma segura. .. code-block:: python except KeyboardInterrupt: print("\nKeyboard interrupt received. Exiting program...") Se muestra un mensaje de salida limpia cuando el usuario detiene el programa manualmente. #. Libera la cámara y los recursos GPIO antes de salir. .. code-block:: python finally: camera.close() GPIO.cleanup() Esto garantiza que la cámara se apague correctamente y que todos los pines GPIO vuelvan a un estado seguro. Imagen del Fenómeno -------------------------- .. image:: ../img/4.1.4spycamera.JPG :align: center