.. 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.1_py: 4.1.1 Cámara ============================== Introducción ------------------- Aquí haremos una cámara con obturador. Cuando presiones el botón, la cámara tomará una foto mientras el LED parpadea. Componentes Necesarios -------------------------------- En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/3.1.15camera_list.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_led` - |link_led_buy| * - :ref:`cpn_button` - |link_button_buy| * - :ref:`cpn_camera_module` - |link_camera_buy| Diagrama Esquemático ----------------------- ============== =============== ======== === Nombre T-Board cableado físico wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 ============== =============== ======== === .. image:: ../img/4.1.1_camera_schematic.png :align: center Procedimientos Experimentales ---------------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/4.1.1_camera_circuit.png :width: 800 :align: center **Paso 2:** Para conectar el módulo de la cámara y completar la configuración, por favor consulta: :ref:`cpn_camera_module`. **Paso 3:** Entra en el 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. .. code-block:: cd ~/raphael-kit/python/ **Paso 5:** Ejecuta. .. code-block:: sudo python3 4.1.1_Camera.py Después de ejecutar el código: - Se abre una ventana con la vista previa en vivo de la cámara. - El programa espera a que se presione el botón. - Cuando el botón es presionado: - El LED parpadea tres veces. - La cámara captura una foto. - El LED permanece encendido durante 0.5 segundos como confirmación. - La imagen se guarda con un nombre basado en una marca temporal en ``/home//``. - Presiona ``Ctrl+C`` en cualquier momento para detener la vista previa, liberar los recursos de GPIO y salir del programa de forma segura. .. note:: También puedes abrir ``4.1.1_Camera.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. Si quieres descargar la foto a tu PC, por favor consulta :ref:`filezilla`. **Código** .. code-block:: python #!/usr/bin/env python3 import time import os import RPi.GPIO as GPIO from picamera2 import Picamera2, Preview # ---------------------------- # GPIO SETUP # ---------------------------- BUTTON_PIN = 18 # The push button is connected to GPIO18 LED_PIN = 17 # The LED is connected to GPIO17 GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbering # The button uses a 10K pull-up resistor externally. # When released → HIGH, when pressed → LOW. GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # LED is an output (HIGH → ON, LOW → OFF) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output(LED_PIN, GPIO.LOW) # Ensure LED is OFF at startup # ---------------------------- # USER DIRECTORY SETUP # ---------------------------- # Get the current logged-in username user = os.getlogin() # Build the path to the user's home directory (ex: /home/pi) user_home = os.path.expanduser(f"~{user}") # ---------------------------- # CAMERA SETUP # ---------------------------- # Create a Picamera2 object camera = Picamera2() # Create a preview configuration: # main → the main camera stream # size → resolution 800x600 # format → display format used by the preview window preview_config = camera.create_preview_configuration( main={"size": (800, 600), "format": "XRGB8888"} ) # Apply the configuration to the camera camera.configure(preview_config) # Start the preview window using QTGL (GPU-accelerated) camera.start_preview(Preview.QTGL) # Start the camera hardware camera.start() print("Ready! Press the button to take a photo...") # ---------------------------- # MAIN LOOP # ---------------------------- try: while True: # Check if button is pressed (LOW means pressed) if GPIO.input(BUTTON_PIN) == GPIO.LOW: print("Button pressed! Taking photo...") # Flash LED 3 times to warn before taking the photo for _ in range(3): GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.1) GPIO.output(LED_PIN, GPIO.LOW) time.sleep(0.1) # Build a unique filename using current date and time # Example: /home/pi/my_photo_20251201_143522.jpg timestamp = time.strftime("%Y%m%d_%H%M%S") filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg") # Capture the image camera.capture_file(filename) print(f"Photo saved to: {filename}") # Turn LED ON briefly to confirm capture GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW) # Debounce delay to prevent repeated triggers time.sleep(0.3) # Small delay to reduce CPU usage time.sleep(0.01) # ---------------------------- # CLEAN EXIT WHEN CTRL+C IS PRESSED # ---------------------------- except KeyboardInterrupt: print("\nCtrl+C received, exiting...") # ---------------------------- # CLEANUP SECTION # ---------------------------- finally: # Safely try to stop the camera preview try: camera.stop_preview() except: pass # Ignore errors if preview wasn't running # Safely close the camera device try: camera.close() except: pass # Reset GPIO pins to a safe state GPIO.cleanup() print("Program exited cleanly.") **Explicación del código** #. Verifica si el botón conectado a ``BUTTON_PIN`` está presionado. .. code-block:: python if GPIO.input(BUTTON_PIN) == GPIO.LOW: Como el botón usa una resistencia pull-up, su estado predeterminado es ``HIGH``. Cuando el botón se presiona, la señal cambia a ``LOW`` y se activa el proceso de captura de la foto. #. Hace parpadear el LED tres veces como retroalimentación visual antes de tomar una foto. .. code-block:: python for _ in range(3): GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.1) GPIO.output(LED_PIN, GPIO.LOW) time.sleep(0.1) Esto indica que la Raspberry Pi se está preparando para capturar una imagen. #. Genera un nombre de archivo único usando una marca temporal (timestamp) y captura una foto. .. code-block:: python timestamp = time.strftime("%Y%m%d_%H%M%S") filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg") camera.capture_file(filename) La marca temporal garantiza que cada foto tenga un nombre diferente. La imagen se guarda en el directorio personal del usuario. #. Enciende el LED durante 0.5 segundos para confirmar que se tomó la foto. .. code-block:: python GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW) Esta breve iluminación indica que la captura fue exitosa. #. Agrega una pequeña demora para evitar múltiples activaciones por una sola pulsación del botón. .. code-block:: python time.sleep(0.3) Este retardo de "debounce" asegura un funcionamiento confiable del botón. Imagen del Fenómeno ------------------------ .. image:: ../img/4.1.1camera.JPG :align: center