.. note:: ¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook. Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte Experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprende y Comparte**: 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 nuevos. - **Promociones y Sorteos Festivos**: Participa en sorteos y promociones de temporada. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo. .. _4.1.4_py_pi5: 4.1.2 Cámara de Captura Automática ======================================= Introducción ---------------- Cuando estés fuera, las pequeñas ardillas en el bosque podrían visitar tu alféizar. ¡Hagamos una cámara de captura automática para dejar fotos de estas adorables criaturas! Componentes Necesarios -------------------------- En este proyecto, necesitamos los siguientes componentes. .. image:: ../python_pi5/img/4.1.4_automatic_capture_list.png :width: 800 :align: center Es definitivamente conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - COMPONENTES 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 DE COMPONENTES - 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 físico wiringPi BCM GPIO17 Pin 11 0 17 ============== ====== ======== === .. image:: ../python_pi5/img/4.1.4_automatic_capture_schematic.png :width: 400 :align: center Procedimientos Experimentales --------------------------------- Antes de este proyecto, necesitas asegurarte de completar :ref:`3.1.1_py_pi5` . **Paso 1:** Construye el circuito. .. image:: ../python_pi5/img/4.1.4_automatic_capture_circuit.png :width: 800 :align: center **Paso 2:** Entra en el Escritorio de Raspberry Pi. Es posible que necesites una pantalla para una mejor experiencia, consulta: `Conecta tu Raspberry Pi `_. O accede al escritorio de Raspberry Pi de forma remota, para un tutorial detallado consulta :ref:`remote_desktop`. **Paso 3:** Abre un Terminal y accede a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/python-pi5 **Paso 4:** Ejecuta. .. raw:: html .. code-block:: sudo python3 4.1.4_AutomaticCaptureCamera_zero.py Después de ejecutar el código, el PIR detectará el entorno circundante y si detecta que la pequeña ardilla pasa cerca, la cámara tomará una foto. El intervalo entre 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 para ajustar la distancia de detección. Para que el módulo PIR funcione mejor, necesitas girar ambos en sentido contrario a las agujas del reloj hasta el final. .. image:: ../python_pi5/img/4.1.4_PIR_TTE.png :width: 400 :align: center .. note:: También puedes abrir ``4.1.4_AutomaticCaptureCamera_zero.py`` en la ruta ``~/raphael-kit/python-pi5/`` con un IDE de Python, haz clic en el botón Run para ejecutar y detén el código con el botón Stop. .. warning:: Si recibe el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulte :ref:`faq_soc` **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-pi5``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto. .. raw:: html .. code-block:: python #!/usr/bin/env python3 from picamera2 import Picamera2, Preview from gpiozero import MotionSensor import time import os # Recupera el nombre de usuario actual y su directorio de inicio user = os.getlogin() user_home = os.path.expanduser(f'~{user}') # Inicializa la cámara camera = Picamera2() camera.start() # Inicializa el sensor de movimiento en el pin GPIO 17 pir = MotionSensor(17) try: i = 1 # Inicializa el contador de imágenes while True: if pir.motion_detected: # Captura una imagen cuando se detecta movimiento y la guarda con un número único camera.capture_file(f'{user_home}/capture%s.jpg' % i) print('The number is %s' % i) # Print the image count time.sleep(3) # Wait for 3 seconds before next detection i += 1 # Increment the image count else: print('waiting') # Print 'waiting' when no motion is detected time.sleep(0.5) # Check for motion every 0.5 seconds except KeyboardInterrupt: # Detiene la cámara si ocurre un KeyboardInterrupt camera.stop_preview() pass **Explicación del Código** #. Importa las clases ``Picamera2`` y ``Preview`` para el control de la cámara, la clase ``MotionSensor`` para la detección de movimiento, y las bibliotecas estándar ``time`` y ``os`` para el manejo del tiempo y las interacciones del sistema operativo. .. code-block:: python #!/usr/bin/env python3 from picamera2 import Picamera2, Preview from gpiozero import MotionSensor import time import os #. Recupera el nombre de usuario actual y el directorio de inicio para guardar las imágenes capturadas. .. code-block:: python # Recupera el nombre de usuario actual y el directorio de inicio user = os.getlogin() user_home = os.path.expanduser(f'~{user}') #. Inicializa la cámara y la pone en marcha. .. code-block:: python # Inicializa la cámara camera = Picamera2() camera.start() #. Inicializa un sensor de movimiento PIR conectado al pin GPIO 17. .. code-block:: python # Inicializa el sensor de movimiento en el pin GPIO 17 pir = MotionSensor(17) #. Inicializa un contador ``i`` para rastrear el número de imágenes capturadas. En un bucle infinito, verifica si se detecta movimiento. Si se detecta movimiento, captura una imagen, la guarda con un nombre único basado en el contador ``i``, imprime el número de la imagen y espera 3 segundos antes de volver a verificar el movimiento. El contador ``i`` se incrementa después de cada captura. .. code-block:: python try: i = 1 # Inicializa el contador de imágenes while True: if pir.motion_detected: # Captura una imagen cuando se detecta movimiento y la guarda con un número único camera.capture_file(f'{user_home}/capture%s.jpg' % i) print('The number is %s' % i) # Print the image count time.sleep(3) # Wait for 3 seconds before next detection i += 1 # Increment the image count #. Si no se detecta movimiento, imprime ``esperando`` y verifica el movimiento cada 0.5 segundos. .. code-block:: python try: ... while True: ... else: print('waiting') # Print 'waiting' when no motion is detected time.sleep(0.5) # Check for motion every 0.5 seconds #. Captura un KeyboardInterrupt (como Ctrl+C) para detener la vista previa de la cámara y salir del script de manera segura. .. code-block:: python except KeyboardInterrupt: # Detiene la cámara si ocurre un KeyboardInterrupt camera.stop_preview() pass