.. note::

    Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

    **Warum beitreten?**

    - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
    - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
    - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
    - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
    - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

    👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!

1.2.2 Passiver Summer
=========================

Einführung
---------------

In dieser Lektion lernen wir, wie man einen passiven Summer dazu bringt, Musik zu spielen.

Komponenten
----------------

.. image:: media/list_1.2.2.png


Schematische Darstellung
--------------------------

In diesem Experiment werden ein passiver Summer, ein PNP-Transistor und ein 1k-Widerstand zwischen der Basis des Transistors und GPIO verwendet, um den Transistor zu schützen.

Wenn GPIO17 unterschiedliche Frequenzen erhält, gibt der passive Summer unterschiedliche Töne aus. Auf diese Weise spielt der Summer Musik.

.. image:: media/image333.png


Experimentelle Verfahren
----------------------------------

Schritt 1: Bauen Sie die Schaltung auf.

.. image:: media/image106.png
    :width: 800



Für Benutzer in C-Sprache
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Schritt 2: Verzeichnis wechseln.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/c/1.2.2/

Schritt 3: Kompilieren.

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.2.2_PassiveBuzzer.c -lwiringPi

Schritt 4: Ausführen.

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Die Kode läuft, der Summer spielt ein Musikstück.

**Code**

.. code-block:: c

    #include <wiringPi.h>
    #include <softTone.h>
    #include <stdio.h>

    #define BuzPin    0

    #define  CL1  131
    #define  CL2  147
    #define  CL3  165
    #define  CL4  175
    #define  CL5  196
    #define  CL6  221
    #define  CL7  248

    #define  CM1  262
    #define  CM2  294
    #define  CM3  330
    #define  CM4  350
    #define  CM5  393
    #define  CM6  441
    #define  CM7  495

    #define  CH1  525
    #define  CH2  589
    #define  CH3  661
    #define  CH4  700
    #define  CH5  786
    #define  CH6  882
    #define  CH7  990

    int song_1[] = {CM3,CM5,CM6,CM3,CM2,CM3,CM5,CM6,CH1,CM6,CM5,CM1,CM3,CM2,
                    CM2,CM3,CM5,CM2,CM3,CM3,CL6,CL6,CL6,CM1,CM2,CM3,CM2,CL7,
                    CL6,CM1,CL5};

    int beat_1[] = {1,1,3,1,1,3,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,2,1,1,
                    1,1,1,1,1,1,3};


    int song_2[] = {CM1,CM1,CM1,CL5,CM3,CM3,CM3,CM1,CM1,CM3,CM5,CM5,CM4,CM3,CM2,
                    CM2,CM3,CM4,CM4,CM3,CM2,CM3,CM1,CM1,CM3,CM2,CL5,CL7,CM2,CM1
                    };

    int beat_2[] = {1,1,1,3,1,1,1,3,1,1,1,1,1,1,3,1,1,1,2,1,1,1,3,1,1,1,3,3,2,3};

    int main(void)
    {
        int i, j;
        if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen
            printf("setup wiringPi failed !");
            return 1;
        }

        if(softToneCreate(BuzPin) == -1){
            printf("setup softTone failed !");
            return 1;
        }

        while(1){
            printf("music is being played...\n");
            delay(100);
            for(i=0;i<sizeof(song_1)/4;i++){
                softToneWrite(BuzPin, song_1[i]);   
                delay(beat_1[i] * 500);
            }

            for(i=0;i<sizeof(song_2)/4;i++){
                softToneWrite(BuzPin, song_2[i]);   
                delay(beat_2[i] * 500);
            }   
        }

        return 0;
    }

**Code Erklärung**

.. code-block:: c

    #define  CL1  131
    #define  CL2  147
    #define  CL3  165
    #define  CL4  175
    #define  CL5  196
    #define  CL6  221
    #define  CL7  248

    #define  CM1  262
    #define  CM2  294


Diese Frequenzen jeder Note sind wie gezeigt. 
CL bezieht sich auf tiefe Note, CM mittlere Note, 
CH hohe Note, 1-7 entsprechen den Noten C, D, E, F, G, A, B.

.. code-block:: c

    int song_1[] = {CM3,CM5,CM6,CM3,CM2,CM3,CM5,CM6,CH1,CM6,CM5,CM1,CM3,CM2,
                    CM2,CM3,CM5,CM2,CM3,CM3,CL6,CL6,CL6,CM1,CM2,CM3,CM2,CL7,
                    CL6,CM1,CL5};
    int beat_1[] = {1,1,3,1,1,3,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,2,1,1,
                    1,1,1,1,1,1,3};

Das Array ``song_1[]`` speichert eine Musikpartitur eines Gelieds, 
in der sich ``beat_1[]`` auf der Schlage jeder Note im Gelied bezieht (0,5 S für jeder Schlage).

.. code-block:: c

    if(softToneCreate(BuzPin) == -1){
            printf("setup softTone failed !");
            return 1;
        
Dadurch wird ein softwaregesteuerter Ton Pin erstellt. 
Sie können einen beliebigen GPIO-Pin verwenden. 
Die Pin-Nummerierung entspricht der von Ihnen verwendeten Funktion ``wiringPiSetup()`` . 
Der Rückgabewert ist 0 für Erfolg. Alles andere und Sie sollten die globale Fehlerbehebung überprüfen, 
um festzustellen, was schief gelaufen ist.

.. code-block:: c

    for(i=0;i<sizeof(song_1)/4;i++){
        softToneWrite(BuzPin, song_1[i]);   
        delay(beat_1[i] * 500);
    }


Verwenden Sie eine for-Anweisung, um ``song_1`` abzuspielen.

In der Urteilsbedingung wird ``i<sizeof(song_1)/4`` , „devide by 4“ verwendet, 
da das Array ``song_1[]`` ein Array des Datentyps ganzer Nummer ist und jedes Element vier Bytes in Anspruch nimmt.

Die Anzahl der Elemente in ``song_1`` (die Anzahl der Noten) wird erhalten, 
indem ``sizeof(song_4)`` um 4 geteilt wird.

Damit jede Note für ``beat * 500ms`` gespielt werden kann, wird die ``delay(beat_1[i]*500)`` aufgerufen.

Der Prototyp von ``softToneWrite(BuzPin, song_1[i])`` :

.. code-block:: c

    void softToneWrite (int pin, int freq);

Dadurch wird der Tonfrequenzwert am angegebenen Pin aktualisiert. Der Ton hört erst auf zu spielen, wenn Sie die Frequenz auf 0 eingestellen.

Für Python-Sprachbenutzer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Schritt 2: Verzeichnis wechseln.

.. raw:: html

   <run></run>

.. code-block::

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

Schritt 3: Ausführen.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.2.2_PassiveBuzzer.py

Die Kode läuft, der Summer spielt ein Musikstück.

**Code**

.. note::

    Sie können den folgenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen** . Zuvor müssen Sie jedoch zu einem Quellcodepfad wie ``davinci-kit-for-raspberry-pi/python`` gehen.
   
.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time

    Buzzer = 11

    CL = [0, 131, 147, 165, 175, 196, 211, 248]		# Frequency of Bass tone in C major

    CM = [0, 262, 294, 330, 350, 393, 441, 495]		# Frequency of Midrange tone in C major

    CH = [0, 525, 589, 661, 700, 786, 882, 990]		# Frequency of Treble tone in C major

    song_1 = [	CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6], # Notes of song1
                CH[1], CM[6], CM[5], CM[1], CM[3], CM[2], CM[2], CM[3], 
                CM[5], CM[2], CM[3], CM[3], CL[6], CL[6], CL[6], CM[1],
                CM[2], CM[3], CM[2], CL[7], CL[6], CM[1], CL[5]	]

    beat_1 = [	1, 1, 3, 1, 1, 3, 1, 1, 			# Beats of song 1, 1 means 1/8 beat
                1, 1, 1, 1, 1, 1, 3, 1, 
                1, 3, 1, 1, 1, 1, 1, 1, 
                1, 2, 1, 1, 1, 1, 1, 1, 
                1, 1, 3	]

    song_2 = [	CM[1], CM[1], CM[1], CL[5], CM[3], CM[3], CM[3], CM[1], # Notes of song2
                CM[1], CM[3], CM[5], CM[5], CM[4], CM[3], CM[2], CM[2], 
                CM[3], CM[4], CM[4], CM[3], CM[2], CM[3], CM[1], CM[1], 
                CM[3], CM[2], CL[5], CL[7], CM[2], CM[1]	]

    beat_2 = [	1, 1, 2, 2, 1, 1, 2, 2, 			# Beats of song 2, 1 means 1/8 beat
                1, 1, 2, 2, 1, 1, 3, 1, 
                1, 2, 2, 1, 1, 2, 2, 1, 
                1, 2, 2, 1, 1, 3 ]

    def setup():

        GPIO.setmode(GPIO.BOARD)		# Numbers GPIOs by physical location
        GPIO.setup(Buzzer, GPIO.OUT)	# Set pins' mode is output
        global Buzz						# Assign a global variable to replace GPIO.PWM 
        Buzz = GPIO.PWM(Buzzer, 440)	# 440 is initial frequency.
        Buzz.start(50)					# Start Buzzer pin with 50% duty cycle

    def loop():
        while True:
            print ('\n    Playing song 1...')
            for i in range(1, len(song_1)):		# Play song 1
                Buzz.ChangeFrequency(song_1[i])	# Change the frequency along the song note
                time.sleep(beat_1[i] * 0.5)		# delay a note for beat * 0.5s
            time.sleep(1)						# Wait a second for next song.

            print ('\n\n    Playing song 2...')
            for i in range(1, len(song_2)):     # Play song 1
                Buzz.ChangeFrequency(song_2[i]) # Change the frequency along the song note
                time.sleep(beat_2[i] * 0.5)     # delay a note for beat * 0.5s

    def destory():
        Buzz.stop()                 # Stop the buzzer
        GPIO.output(Buzzer, 1)      # Set Buzzer pin to High
        GPIO.cleanup()				# Release resource

    if __name__ == '__main__':		# Program start from here
        setup()
        try:
            loop()
        except KeyboardInterrupt:  	# When 'Ctrl+C' is pressed, the program destroy() will be executed.
            destory()

**Code Erklärung**

.. code-block:: python

    CL = [0, 131, 147, 165, 175, 196, 211, 248]     # Frequency of Bass tone in C major
    CM = [0, 262, 294, 330, 350, 393, 441, 495]     # Frequency of Midrange tone in C major
    CH = [0, 525, 589, 661, 700, 786, 882, 990]     # Frequency of Treble tone in C major     

Dies sind die Frequenzen jeder Note. 
Die erste 0 ist das Überspringen von ``CL[0]`` , so dass die Nummer 1-7 dem CDEFGAB des Tons entspricht.

.. code-block:: python

    song_1 = [  CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6], 
                CH[1], CM[6], CM[5], CM[1], CM[3], CM[2], CM[2], CM[3],
                CM[5], CM[2], CM[3], CM[3], CL[6], CL[6], CL[6], CM[1],
                CM[2], CM[3], CM[2], CL[7], CL[6], CM[1], CL[5] ]

Diese Arrays sind die Noten eines Gelieds.

.. code-block:: python

    beat_1 = [  1, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1,
                1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
                1, 1, 3 ]

Jeder Klangschlage (jede Nummer) repräsentiert den ⅛-Schlage oder 0.5s

.. code-block:: python

    Buzz = GPIO.PWM(Buzzer, 440)
    Buzz.start(50)  

Definieren Sie den Pin-Summer als PWM-Pin, 
stellen Sie dann seine Frequenz auf 440 ein und ``Buzz.start(50)`` wird zum Ausführen von PWM verwendet. 
Und stellen Sie auch den Arbeitszyklus auf 50% ein.

.. code-block:: python

    for i in range(1, len(song_1)): 
                Buzz.ChangeFrequency(song_1[i]) 
                time.sleep(beat_1[i] * 0.5)  

Führen Sie eine for-Schleife aus, 
dann spielt der Summer die Noten im Array ``song_1[]`` mit den Schlagen im Array ``beat_1[]``.

Jetzt können Sie den passiven Summer Musik spielen hören.

Phänomen Bild
------------------

.. image:: media/image107.jpeg