Note

Bonjour et bienvenue dans la communauté des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez au cœur de Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprenez & Partagez : Échangez des astuces et des tutoriels pour perfectionner vos compétences.

  • Aperçus exclusifs : Accédez en avant-première aux nouvelles annonces de produits.

  • Réductions spéciales : Profitez de réductions exclusives sur nos nouveaux produits.

  • Promotions festives et cadeaux : Participez à des promotions spéciales et des concours pour gagner des cadeaux.

👉 Prêt à explorer et créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !

1.2.2 Buzzer Passif

Introduction

Dans cette leçon, nous allons apprendre à faire jouer de la musique à un buzzer passif.

Composants

_images/list_1.2.2.png

Schéma de circuit

Dans cette expérience, nous utilisons un buzzer passif, un transistor PNP et une résistance de 1kΩ placée entre la base du transistor et le GPIO pour protéger le transistor.

Lorsque le GPIO17 reçoit différentes fréquences, le buzzer passif émet des sons variés ; ainsi, le buzzer peut jouer de la musique.

_images/image333.png

Procédures Expérimentales

Étape 1 : Construisez le circuit.

_images/image106.png

Pour les utilisateurs de langage C

Étape 2 : Changez de répertoire.

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

Étape 3 : Compilez.

gcc 1.2.2_PassiveBuzzer.c -lwiringPi

Étape 4 : Exécutez.

sudo ./a.out

Une fois le code exécuté, le buzzer joue un morceau de musique.

Note

Si cela ne fonctionne pas après exécution, ou si un message d’erreur comme « wiringPi.h : Aucun fichier ou répertoire de ce type » s’affiche, veuillez consulter C code is not working?.

Code

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

Explication du code

#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

Ces définitions correspondent aux fréquences de chaque note. CL fait référence aux notes basses, CM aux notes moyennes, CH aux notes aiguës, et 1 à 7 correspondent aux notes Do, Ré, Mi, Fa, Sol, La, Si.

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

Le tableau song_1[] contient les fréquences musicales d’une chanson, tandis que beat_1[] correspond au rythme de chaque note de la chanson (chaque battement représente 0,5 seconde).

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

Cette fonction crée une tonalité contrôlée par logiciel sur la broche spécifiée. Vous pouvez utiliser n’importe quelle broche GPIO, et le numéro de broche sera celui utilisé dans la fonction wiringPiSetup(). La valeur de retour est 0 en cas de succès. Sinon, vous devez vérifier la variable globale errno pour voir ce qui a échoué.

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

Utilisez une boucle for pour jouer la mélodie song_1.

Dans la condition de jugement i < sizeof(song_1)/4, la division par 4 est utilisée car le tableau song_1[] est un tableau de type int et chaque élément occupe quatre octets.

Le nombre d’éléments dans song_1 (le nombre de notes) est obtenu en divisant sizeof(song_1) par 4.

Pour permettre à chaque note de jouer pendant beat * 500 ms, la fonction delay(beat_1[i] * 500) est appelée.

Le prototype de la fonction softToneWrite(BuzPin, song_1[i]) est :

void softToneWrite (int pin, int freq);

Cette fonction met à jour la fréquence de la tonalité sur la broche spécifiée. La tonalité continue à jouer jusqu’à ce que vous définissiez la fréquence à 0.

Pour les utilisateurs de Python

Étape 2 : Changez de répertoire.

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

Étape 3 : Exécutez.

sudo python3 1.2.2_PassiveBuzzer.py

Le code s’exécute et le buzzer joue un morceau de musique.

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez accéder au chemin du code source tel que davinci-kit-for-raspberry-pi/python.

import RPi.GPIO as GPIO
import time

Buzzer = 11

CL = [0, 131, 147, 165, 175, 196, 211, 248]         # Fréquences des notes basses en C majeur

CM = [0, 262, 294, 330, 350, 393, 441, 495]         # Fréquences des notes moyennes en C majeur

CH = [0, 525, 589, 661, 700, 786, 882, 990]         # Fréquences des notes aiguës en C majeur

song_1 = [  CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6], # Notes de la chanson 1
            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,                         # Durées des notes de la chanson 1, 1 représente 1/8 de temps
            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 de la chanson 2
            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,                         # Durées des notes de la chanson 2, 1 représente 1/8 de temps
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)                # Numérotation des GPIO par leur emplacement physique
    GPIO.setup(Buzzer, GPIO.OUT)    # Configurer le mode des broches en sortie
    global Buzz                                             # Assigner une variable globale pour remplacer GPIO.PWM
    Buzz = GPIO.PWM(Buzzer, 440)    # 440 est la fréquence initiale.
    Buzz.start(50)                                  # Démarrer la broche du buzzer avec un cycle de travail de 50%

def loop():
    while True:
        print ('\n    Playing song 1...')
        for i in range(1, len(song_1)):             # Jouer la chanson 1
            Buzz.ChangeFrequency(song_1[i]) # Changer la fréquence en fonction de la note de la chanson
            time.sleep(beat_1[i] * 0.5)             # Temporiser la note pour beat * 0.5s
        time.sleep(1)                                               # Attendre une seconde avant la prochaine chanson.

        print ('\n\n    Playing song 2...')
        for i in range(1, len(song_2)):     # Jouer la chanson 2
            Buzz.ChangeFrequency(song_2[i]) # Changer la fréquence en fonction de la note de la chanson
            time.sleep(beat_2[i] * 0.5)     # Temporiser la note pour beat * 0.5s

def destory():
    Buzz.stop()                 # Arrêter le buzzer
    GPIO.output(Buzzer, 1)      # Mettre la broche du buzzer à High
    GPIO.cleanup()                          # Libérer les ressources

if __name__ == '__main__':          # Le programme commence ici
    setup()
    try:
        loop()
    except KeyboardInterrupt:       # Lorsque 'Ctrl+C' est pressé, le programme destory() sera exécuté.
        destory()

Explication du code

CL = [0, 131, 147, 165, 175, 196, 211, 248]     # Fréquence des notes basses en C majeur
CM = [0, 262, 294, 330, 350, 393, 441, 495]     # Fréquence des notes moyennes en C majeur
CH = [0, 525, 589, 661, 700, 786, 882, 990]     # Fréquence des notes aiguës en C majeur

Ce sont les fréquences de chaque note. Le premier 0 permet de sauter CL[0] de sorte que les numéros 1 à 7 correspondent aux notes CDEFGAB.

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] ]

Ces tableaux contiennent les notes d’une chanson.

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 ]

Chaque battement représente une durée de ⅛ de temps, soit 0,5 seconde.

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

Définir la broche Buzzer comme broche PWM, puis fixer sa fréquence à 440. Buzz.start(50) est utilisé pour démarrer le PWM avec un cycle de travail de 50%.

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

Exécuter une boucle for, puis le buzzer jouera les notes dans le tableau song_1[] avec les durées dans le tableau beat_1[].

Maintenant, vous pouvez entendre le buzzer passif jouer de la musique.

Image du phénomène

_images/image107.jpeg