Nota

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

Perché unirti a noi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia consigli 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 omaggi: Partecipa a omaggi e promozioni festive.

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

1.2.2 Buzzer Passivo

Introduzione

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

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 IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Cicalino

ACQUISTA

Transistor

ACQUISTA

Schema di Collegamento

In questo esperimento, un buzzer passivo, un transistor PNP e una resistenza da 1k sono utilizzati 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 riprodurrà musica.

../_images/image333.png

Procedure Sperimentali

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

../_images/image106.png

Passo 2: Cambia directory.

cd ~/raphael-kit/c/1.2.2/

Passo 3: Compila il codice.

gcc 1.2.2_PassiveBuzzer.c -lwiringPi

Passo 4: Esegui il file.

sudo ./a.out

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

Nota

Se dopo l’esecuzione non funziona o appare l’errore: "wiringPi.h: No such file or directory", consulta Installazione e verifica di 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){ //se l'inizializzazione di wiring fallisce, stampa un 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 musicale. CL indica la nota bassa, CM la nota media e CH la nota alta, con 1-7 che 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 la sequenza musicale di una canzone, mentre beat_1[] si riferisce al ritmo di ciascuna nota (0.5s per ogni battito).

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

Questo crea un pin per il tono controllato via software. Puoi utilizzare qualsiasi pin GPIO, e la numerazione dei pin sarà quella della funzione wiringPiSetup() che hai utilizzato. Il valore restituito è 0 per il successo. In caso contrario, dovresti controllare la variabile globale errnovariable per vedere cosa è andato storto.

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

Usiamo un ciclo for per riprodurre la song_1.

Nella condizione del ciclo, i<sizeof(song_1)/4, la divisione per 4 è necessaria perché l’array song_1[] è un array di interi e ogni elemento occupa quattro byte.

Il numero di elementi in song_1 (cioè il numero di note musicali) si ottiene dividendo sizeof(song_1) per 4.

Per far sì che ogni nota venga riprodotta 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 il valore di frequenza del tono sul pin dato. Il tono non smetterà di suonare finché non si imposta la frequenza su 0.

Immagine del Fenomeno

../_images/image107.jpeg