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.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
COMPONENTI IN QUESTO KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTI |
LINK PER L’ACQUISTO |
|---|---|
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.
Procedure Sperimentali
Passo 1: Costruisci il circuito. (Il buzzer passivo ha una scheda verde sul retro.)
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