.. note::

    Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

    **Perché Unirsi?**

    - **Supporto Tecnico Esperto**: Risolvi i problemi post-vendita e affronta le sfide tecniche con l'aiuto della nostra comunità e del nostro team.
    - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
    - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
    - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni festive.

    👉 Sei pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso!

.. _3.1.1_py_pi5:

3.1.1 Modulo Fotografia
==========================

Introduzione
--------------

In questo kit, dotato di un modulo fotocamera, proviamo a scattare una foto con Raspberry Pi.

Componenti Necessari
----------------------

In questo progetto, abbiamo bisogno dei seguenti componenti. 

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

È decisamente conveniente acquistare un kit completo, ecco il link: 

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

    *   - Nome	
        - COMPONENTI NEL KIT
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link sottostanti.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK PER L'ACQUISTO

    *   - :ref:`cpn_camera_module`
        - |link_camera_buy|

Procedure Sperimentali
-------------------------

**Passo 1:** Accedi al desktop di Raspberry Pi. Potresti aver bisogno di uno schermo per un'esperienza migliore, fai riferimento a: `Collega il tuo Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. Oppure accedi al desktop di Raspberry Pi da remoto, per un tutorial dettagliato consulta :ref:`remote_desktop`.

**Passo 2:** Apri un Terminale e vai nella cartella del codice.

.. code-block::

    cd ~/raphael-kit/python-pi5

**Passo 3:** Esegui il comando.

.. code-block::

    sudo python3 3.1.1_PhotographModule_zero.py

Dopo l'esecuzione del codice, la fotocamera scatterà una foto. Ora puoi vedere la foto chiamata ``my_photo.jpg`` nella directory ``~``.

.. note::

    Puoi anche aprire ``3.1.1_PhotographModule.py`` nel percorso ``~/raphael-kit/python-pi5/`` con un IDE Python, fare clic sul pulsante Esegui per avviare e utilizzare il pulsante Stop per interrompere il codice.

Se desideri scaricare la foto sul tuo PC, fai riferimento a :ref:`filezilla`.

.. warning::

    Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`. 

**Code**

.. code-block:: python

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

   # Ottieni il nome dell'utente attualmente connesso
   user = os.getlogin()
   # Ottieni il percorso della directory home dell'utente
   user_home = os.path.expanduser(f'~{user}')

   # Crea un'istanza di Picamera2
   camera = Picamera2()
   # Recupera la configurazione di anteprima predefinita
   preview_config = camera.preview_configuration

   try:
       # Imposta le dimensioni e il formato dell'anteprima
       preview_config.size = (800, 600)
       preview_config.format = 'XRGB8888'  
       # Avvia l'anteprima della fotocamera in modalità QTGL
       camera.start_preview(Preview.QTGL)
       # Avvia la fotocamera
       camera.start()
       # Cattura e salva una foto nella directory home dell'utente
       camera.capture_file(f'{user_home}/my_photo.jpg')

   except KeyboardInterrupt:
       # Interrompe l'anteprima della fotocamera se si verifica un'interruzione da tastiera (ad esempio, Ctrl+C)
       camera.stop_preview()
       pass


**Spiegazione del Codice**

#. Importa le classi ``Picamera2`` e ``Preview`` dalla libreria picamera2, e il modulo ``os`` per interagire con il sistema operativo.

   .. code-block:: python

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

#. Recupera il nome dell'utente attualmente connesso e il percorso della sua directory home.

   .. code-block:: python

       # Ottieni il nome dell'utente attualmente connesso
       user = os.getlogin()
       # Ottieni il percorso della directory home dell'utente
       user_home = os.path.expanduser(f'~{user}')

#. Crea un'istanza della classe ``Picamera2`` e recupera la configurazione di anteprima predefinita.

   .. code-block:: python

       # Crea un'istanza di Picamera2
       camera = Picamera2()
       # Recupera la configurazione di anteprima predefinita
       preview_config = camera.preview_configuration

#. Imposta la dimensione e il formato dell'anteprima della fotocamera. La dimensione è impostata su 800x600 pixel e il formato è impostato su ``XRGB8888``.

   .. code-block:: python

       try:
           # Imposta le dimensioni e il formato dell'anteprima
           preview_config.size = (800, 600)
           preview_config.format = 'XRGB8888'

           ...

#. Avvia l'anteprima della fotocamera in modalità QTGL, quindi avvia la fotocamera stessa.

   .. code-block:: python

       try:
           ...
           
           # Avvia l'anteprima della fotocamera in modalità QTGL
           camera.start_preview(Preview.QTGL)
           # Avvia la fotocamera
           camera.start()

           ...

#. Cattura un'immagine dalla fotocamera, memorizzandola in ``~/``.

   .. code-block:: python

       try:
           ...           
           
           # Cattura e salva una foto nella directory home dell'utente
           camera.capture_file(f'{user_home}/my_photo.jpg')

   .. note::
       Puoi utilizzare la funzione ``camera.capture()`` insieme al ciclo ``for`` per ottenere uno scatto continuo. E utilizzare la funzione ``delay`` per regolare l'intervallo di tempo tra gli scatti.

       .. code-block:: python

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

#. Questo blocco di codice gestisce un'interruzione da tastiera (come Ctrl+C) interrompendo l'anteprima della fotocamera. L'istruzione ``pass`` viene utilizzata per gestire l'eccezione senza fare nulla.

   .. code-block:: python

       except KeyboardInterrupt:
           # Interrompe l'anteprima della fotocamera se si verifica un'interruzione da tastiera (ad esempio, Ctrl+C)
           camera.stop_preview()
           pass


