Nota

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

Perché unirti a noi?

  • Supporto Esperto: Risolvi i problemi post-vendita e 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 alle anteprime.

  • 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 [Qui] e unisciti subito!

1.2.2 Buzzer Passivo

Introduzione

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

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

../_images/list_1.2.2.png

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

Nome

COMPONENTI NEL KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link seguenti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Cicalino

ACQUISTA

Transistor

ACQUISTA

Schema Elettrico

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

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

../_images/image333.png

Procedure Sperimentali

Passo 1: Costruisci il circuito. (Il buzzer passivo ha un circuito stampato verde sul retro.)

../_images/image106.png

Passo 2: Cambia la directory.

cd ~/raphael-kit/c/1.2.2/

Passo 3: Compila.

gcc 1.2.2_PassiveBuzzer.c -lwiringPi

Passo 4: Esegui.

sudo ./a.out

Dopo l’esecuzione del codice, il buzzer riprodurrà un brano musicale.

Nota

Se il codice non funziona dopo l’esecuzione o appare l’errore: "wiringPi.h: No such file or directory", fai riferimento a Installa e Controlla wiringPi.

Codice

#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){ //quando l'inizializzazione di wiring fallisce, stampa messaggio a schermo
        printf("setup wiringPi failed !");
        return 1;
    }

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

    while(1){
        printf("music is being played...\n");

        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;
}

Spiegazione del Codice

#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

Queste sono le frequenze di ciascuna nota, come indicato. CL si riferisce alla nota bassa, CM alla nota media, CH alla nota alta, 1-7 corrispondono alle note C, D, E, F, G, A, B.

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};

L’array song_1[] memorizza uno spartito musicale di una canzone, mentre beat_1[] si riferisce al ritmo di ciascuna nota nella canzone (0,5 secondi per ogni battito).

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

Questa funzione crea un tono controllato via software sul pin. Puoi utilizzare qualsiasi pin GPIO, e la numerazione del pin sarà quella della funzione wiringPiSetup() utilizzata. Il valore restituito è 0 per il successo. In caso contrario, è necessario controllare la variabile globale errno per vedere cosa è andato storto.

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

Utilizzare un ciclo for per riprodurre song_1.

Nella condizione di giudizio, i<sizeof(song_1)/4, «dividere per 4» viene utilizzato perché l’array song_1[] è un array di tipo intero e ogni elemento occupa quattro byte.

Il numero di elementi in song_1 (il numero di note musicali) viene ottenuto dividendo sizeof(song_1) per 4.

Per fare in modo che ogni nota suoni per beat * 500ms, viene chiamata la funzione delay(beat_1[i] * 500).

Il prototipo della funzione softToneWrite(BuzPin, song_1[i]) è:

void softToneWrite (int pin, int freq);

Questa funzione aggiorna la frequenza del tono sul pin specificato. Il tono continua a suonare fino a quando non si imposta la frequenza su 0.

Immagine del Fenomeno

../_images/image107.jpeg