.. 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é unirte?**

    - **Soporte experto**: Resuelve problemas postventa 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**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
    - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
    - **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!

.. _3.1.1_py_pi5:

3.1.1 Módulo Fotográfico
=============================

Introducción
--------------------

En este kit, equipado con un módulo de cámara, intentemos tomar una foto con Raspberry Pi.

Componentes Necesarios
-------------------------------

En este proyecto, necesitamos los siguientes componentes.

.. image:: ../python_pi5/img/3.3.1_photograph_list.png
  :width: 800

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nombre	
        - ARTÍCULOS 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_camera_module`
        - |link_camera_buy|

Procedimientos Experimentales
-------------------------------------

**Paso 1:** Accede al Escritorio de Raspberry Pi. Es posible que necesites una pantalla para una mejor experiencia, consulta: `Connect your Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. O accede al escritorio de Raspberry Pi de forma remota, para un tutorial detallado consulta :ref:`remote_desktop`.

**Paso 2:** Abre una Terminal y ve a la carpeta del código.

.. code-block::

    cd ~/raphael-kit/python-pi5

**Paso 3:** Ejecuta.

.. code-block::

    sudo python3 3.1.1_PhotographModule_zero.py

Después de que el código se ejecute, la cámara tomará una foto. Ahora puedes ver la foto llamada ``my_photo.jpg`` en el directorio ``~``.

.. note::

    También puedes abrir ``3.1.1_PhotographModule.py`` en la ruta ``~/raphael-kit/python-pi5/`` con un IDE de Python, haz clic en el botón Ejecutar para ejecutar y detén el código con el botón Detener.

Si deseas descargar la foto a tu PC, consulta :ref:`filezilla`.

.. warning::

    Si recibe el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulte :ref:`faq_soc`

**Código**

.. code-block:: python

   #!/usr/bin/env python3    
   from picamera2 import Picamera2, Preview
   import os

   # Obtener el nombre de usuario actual
   user = os.getlogin()
   # Obtener la ruta al directorio principal del usuario
   user_home = os.path.expanduser(f'~{user}')

   # Crear una instancia de Picamera2
   camera = Picamera2()
   # Recuperar la configuración predeterminada de previsualización
   preview_config = camera.preview_configuration

   try:
       # Configurar tamaño y formato de previsualización
       preview_config.size = (800, 600)
       preview_config.format = 'XRGB8888'  
       # Iniciar la previsualización de la cámara en modo QTGL
       camera.start_preview(Preview.QTGL)
       # Iniciar la cámara
       camera.start()
       # Capturar y guardar una foto en el directorio principal del usuario
       camera.capture_file(f'{user_home}/my_photo.jpg')

   except KeyboardInterrupt:
       # Detener la previsualización de la cámara si ocurre una interrupción de teclado (por ejemplo, Ctrl+C)
       camera.stop_preview()
       pass


**Explicación del Código**

#. Importa las clases ``Picamera2`` y ``Preview`` de la biblioteca picamera2, y el módulo ``os`` para interacciones con el sistema operativo.

   .. code-block:: python

       #!/usr/bin/env python3    
       from picamera2 import Picamera2, Preview
       import os

#. Recupera el nombre de usuario actual y la ruta a su directorio principal.

   .. code-block:: python

       # Obtener el nombre de usuario actual
       user = os.getlogin()
       # Obtener la ruta al directorio principal del usuario
       user_home = os.path.expanduser(f'~{user}')

#. Crea una instancia de la clase ``Picamera2`` y recupera la configuración predeterminada de previsualización.

   .. code-block:: python

       # Crear una instancia de Picamera2
       camera = Picamera2()
       # Recuperar la configuración predeterminada de previsualización
       preview_config = camera.preview_configuration

#. Configura el tamaño y formato de la previsualización de la cámara. El tamaño se establece en 800x600 píxeles y el formato en ``XRGB8888``.

   .. code-block:: python

       try:
           # Configurar tamaño y formato de previsualización
           preview_config.size = (800, 600)
           preview_config.format = 'XRGB8888'

           ...

#. Inicia la previsualización de la cámara en modo QTGL y luego inicia la cámara.

   .. code-block:: python

       try:
           ...
           
           # Iniciar la previsualización de la cámara en modo QTGL
           camera.start_preview(Preview.QTGL)
           # Iniciar la cámara
           camera.start()

           ...

#. Captura una imagen con la cámara, guardándola en ``~/``.

   .. code-block:: python

       try:
           ...           
           
           # Capturar y guardar una foto en el directorio principal del usuario
           camera.capture_file(f'{user_home}/my_photo.jpg')

   .. note::
       Puedes usar la función ``camera.capture()`` y un bucle ``for`` juntos para lograr una captura continua. Utiliza la función ``delay`` para ajustar el intervalo de tiempo entre las tomas.

       .. code-block:: python

           for i in 5:
               camera.capture(f'{user_home}/my_photo%s.jpg' % i)

#. Este bloque de código maneja una interrupción de teclado (como Ctrl+C) deteniendo la previsualización de la cámara. La declaración ``pass`` se usa para manejar la excepción sin hacer nada más.

   .. code-block:: python

       except KeyboardInterrupt:
           # Detener la previsualización de la cámara si ocurre una interrupción de teclado (por ejemplo, Ctrl+C)
           camera.stop_preview()
           pass



