.. note::

    Ciao e benvenuto nella Community di Appassionati di SunFounder per Raspberry Pi, Arduino ed ESP32 su Facebook! Immergiti nel mondo di Raspberry Pi, Arduino ed ESP32 insieme a tanti altri appassionati.

    **Perché Unirsi?**

    - **Supporto da Esperti**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
    - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
    - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci dei nuovi prodotti e a contenuti inediti.
    - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni Festive e Giveaway**: Partecipa a concorsi e promozioni festive.

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

.. _1.2.2_py_pi5:

1.2.2 Buzzer Passivo
========================

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

In questo progetto, impareremo a far suonare un buzzer passivo per riprodurre musica.

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

In questo progetto, abbiamo bisogno dei seguenti componenti.

.. image:: ../python_pi5/img/1.2.2_passive_buzzer_list.png

.. raw:: html

   <br/>

Schema Elettrico
-------------------

In questo esperimento vengono utilizzati un buzzer passivo, un transistor 
PNP e una resistenza da 1k tra la base del transistor e il GPIO per proteggere 
il transistor.

Quando al GPIO17 vengono assegnate frequenze diverse, il buzzer passivo emetterà 
suoni differenti; in questo modo, il buzzer riproduce musica.

============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17       Pin 11   0        17
============ ======== ======== ===

.. image:: ../python_pi5/img/1.2.2_passive_buzzer_schematic.png


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

**Passo 1**: Costruisci il circuito. (Il buzzer passivo ha una scheda verde sul retro.)

.. image:: ../python_pi5/img/1.2.2_PassiveBuzzer_circuit.png

**Passo 2: Cambia directory.**

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/python-pi5

**Passo 3: Esegui.**

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.2.2_PassiveBuzzer.py

Eseguendo il codice, il buzzer riproduce un brano musicale.

.. warning::

    Se compare l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, consulta :ref:`faq_soc` 

**Codice**

.. note::

    Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Prima di farlo, però, vai al percorso del codice sorgente, come ``davinci-kit-for-raspberry-pi/python-pi5``. Dopo aver modificato il codice, potrai eseguirlo direttamente per vedere il risultato.


.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   from gpiozero import TonalBuzzer
   from time import sleep

   # Inizializza un TonalBuzzer collegato al pin GPIO 17
   tb = TonalBuzzer(17)  # Aggiorna il numero di pin in base alla tua configurazione

   def play(tune):
       """
       Play a musical tune using the buzzer.
       :param tune: List of tuples (note, duration), where each tuple represents a note and its duration.
       """
       for note, duration in tune:
           print(note)  # Mostra in console la nota in riproduzione
           tb.play(note)  # Riproduce la nota con il buzzer
           sleep(float(duration))  # Ritarda per la durata della nota
       tb.stop()  # Interrompe la riproduzione al termine della melodia

   # Definisce una melodia come sequenza di note e durate
   tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
       ('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
       ('F#4', 0.2), ('G4', 0.2), (None, 0.6),
       ('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
       ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
       ('C4', 0.2), ('B4', 0.2), (None, 0.2),
       ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
       ('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
       ('A4', 0.2), ('G4', 0.2), ('E4', 0.2), 
       ('D4', 0.2), ('E4', 0.2)]  

   try:
       play(tune)  # Esegui la funzione play per avviare la melodia

   except KeyboardInterrupt:
       # Gestisce l'interruzione da tastiera per terminare il programma in modo sicuro
       pass



**Spiegazione del Codice**

#. Queste righe importano la classe ``TonalBuzzer`` dalla libreria ``gpiozero`` per controllare il buzzer e la funzione ``sleep`` dal modulo ``time`` per creare ritardi.
    
   .. code-block:: python  

       #!/usr/bin/env python3
       from gpiozero import TonalBuzzer
       from time import sleep
      

#. Questa riga inizializza un oggetto ``TonalBuzzer`` sul pin GPIO 17.
    
   .. code-block:: python
       
       # Inizializza un TonalBuzzer collegato al pin GPIO 17
       tb = TonalBuzzer(17)  # Aggiorna il numero di pin in base alla tua configurazione
      

#. La funzione ``play`` itera su una lista di tuple rappresentanti note musicali e le loro durate. Ogni nota viene riprodotta per la durata specificata e il buzzer si ferma al termine della melodia.
    
   .. code-block:: python  

       def play(tune):
           """
           Play a musical tune using the buzzer.
           :param tune: List of tuples (note, duration), where each tuple represents a note and its duration.
           """
           for note, duration in tune:
               print(note)  # Mostra in console la nota in riproduzione
               tb.play(note)  # Riproduce la nota con il buzzer
               sleep(float(duration))  # Ritarda per la durata della nota
           tb.stop()  # Interrompe la riproduzione al termine della melodia

#. La melodia è definita come sequenza di note (frequenza) e durate (secondi).
    
   .. code-block:: python

       # Definisce una melodia come sequenza di note e durate
       tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
           ('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
           ('F#4', 0.2), ('G4', 0.2), (None, 0.6),
           ('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
           ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
           ('C4', 0.2), ('B4', 0.2), (None, 0.2),
           ('F#4', 0.2), ('G4', 0.2), (None, 0.2),
           ('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
           ('A4', 0.2), ('G4', 0.2), ('E4', 0.2), 
           ('D4', 0.2), ('E4', 0.2)]  

#. La funzione ``play(tune)`` è chiamata all'interno di un blocco ``try``. Un'interruzione da tastiera (Ctrl+C) interromperà il programma in modo sicuro.
    
   .. code-block:: python  
       
       try:
           play(tune)  # Esegui la funzione play per avviare la melodia

       except KeyboardInterrupt:
           # Gestisce l'interruzione da tastiera per terminare il programma in modo sicuro
           pass
