Buzzer

L’objectif de cette activité est de faire fonctionner un buzzer avec un Arduino.
 
Dans un premier temps, le buzzer devra émettre un son dont la fréquence varie en fonction de la position d’un potentiomètre.
 
Dans la deuxième partie, l’objectif est de générer un signal sonore dont la fréquence est modulée (façon sirène de police) lors de l’appui sur un bouton poussoir.
 
Matériel nécessaire :
  • Microcontrôleur Arduino
  • Ordinateur avec Python et une IDE ARduino
  • Buzzer passif (HYDZ)
  • Potentiomètre 10kΩ
  • Bouton poussoir
 
Suite logicielle utilisée : FirmataExpress + pymata4
 

Variation de fréquence au potentiomètre

Câbler sur la platine de prototypage un buzzer (sur un port numérique compatible PWM) et un potentiomètre (voir les potentiomètres).
 
On se propose d’utiliser le programme suivant (incomplet) :
from pymata4 import pymata4
import time

# Objet représentant la carte Arduino
carte = pymata4.Pymata4()

# Constantes
DELAY = 0.01 # période de la boucle infinie (s)
OUT_PIN = 3
A_IN_PIN = 0

F_MINI = 50   # fréquence minimale (Hz)
F_MAXI = 3000 # fréquence maximale (Hz)

# Initialisation ....................................
carte.set_pin_mode_digital_output(OUT_PIN)
carte.set_pin_mode_analog_input(A_IN_PIN)


# Fonction de test
def loop():
    N = carte.analog_read(A_IN_PIN)[0]
    f = ????????? # fréquence en fonction de N ... et des constantes
    carte.play_tone_continuously(OUT_PIN, f)

    time.sleep(DELAY)

# Lancement du programme ............................
try:
    # Boucle infinie ................................
    while True:
        loop()
except KeyboardInterrupt:
    carte.play_tone_off(OUT_PIN)
    carte.shutdown()
    sys.exit(0)
finally:
    carte.shutdown()  

Analyse du programme

Sur quel port de l’Arduino doit être connecté le buzzer ?
×
Sur quel port de l’Arduino doit être connectée la borne centrale du potentiomètre ?
×
Quelle constante du programme contient le nom de ce port ?
×
Quelle méthode de la classe Pymata4 permet-elle de spécifier le « mode » (entrée ou sortie) d’un port analogique ?
Une méthode est une fonction « intégrée » à un objet, que l’on appelle en écrivant le nom de l’objet, suivi d’un point, suivi du nom de la méthode.

Par exemple sur les lignes 16, 17, 22, 24, 34, 35 et 38 du programme proposé.

×
À quelle ligne du programme la valeur représentant la position du potentiomètre est-elle acquise ?
×
À quelle ligne du programme le son est-il généré ?
×

 

Finalisation du programme

Le buzzer est capable de générer des sons à une fréquence f comprise entre 50Hz et 3000Hz.
Le port analogique sur lequel est connecté le potentiomètre, permet au programme d’obtenir une valeur N comprise entre 0 et 1023 (convertisseur A/N de 10 bits : 210 valeurs possibles) ligne 22
Il va falloir trouver la « formule » permettant de calculer une fréquence f en fonction de la « position » du potentiomètre N et les constantes F_MINI et F_MAXI (ligne 23)
 
Compléter le programme (ligne 23) (remplacer les ???????) pour que l’action sur le potentiomètre modifie la fréquence du Buzzer.
 

 

On constate que la fréquence semble augmenter plus rapidement dans les graves que dans les aiguës. Ceci est dû au fait qu’une augmentation d’une valeur \(\Delta f\) de la fréquence modifie plus fortement la note entendue dans les basses fréquences que dans les hautes fréquences :

Par exemple, pour une augmentation de la fréquence de 10 Hz :

  • basses fréquences : de 50Hz à 60Hz → +20%,
  • hautes fréquences : de 2500 à 2510Hz → +0.4% seulement, très peu audible.

 

Pour éviter cela, il faut provoquer une variation logarithmique de la fréquence plutôt que linéaire :

La grandeur qui évolue linéairement n’est plus \(f\), mais \(\log(f)\).

Consulter le cours sur la fonction logarithme. En déduire quelle est la fonction réciproque de la fonction \(\log\).

En début de programme, ajouter la ligne suivante :

from math import log10

(log10 est la version Python de la fonction \(\log\))

À la ligne 23, remplacer f = ... par logf = ... , ainsi que F_MINI par log10(F_MINI) et F_MAXI par log10(F_MAXI).

 

Modifier l’expression de f (ajouter une ligne 24) en fonction de logf. Tester le programme.

 

Modulation de fréquence

Mise en œuvre d’un bouton

On souhaite à présent émettre une note de musique en appuyant sur un bouton poussoir.

Remplacer le potentiomètre par un bouton poussoir.
 
Modifier le programme pour émettre la note LA (440 Hz) lorsque le bouton est pressé (le son doit cesser quand le bouton est relâché !).

Pour connaitre les commandes permettant de lire la valeur d’un port numérique, consulter la documentation de pymata4.

 

Modulation de la fréquence

Au lieu d’émettre une fréquence constante, on souhaite à présent la moduler selon une loi sinusoïdale (voir Les signaux physiques), toujours avec une échelle de fréquence logarithmique :

Élaborer la loi reliant la fréquence \(f\) (en Hz) aux valeurs caractéristiques du signal : F_MINI, F_MAXI et sa période \(T\) (en seconde). Implémenter cette loi en langage Python (on créera pour l’occasion une variable globale t pour signifier le temps, qu’on incrémentera à chaque période de la boucle).

 

Terminer le programme pour que lorsqu’on appuie sur le bouton poussoir, le son généré ait une fréquence modulée de F_MINI à F_MAXI par période de \(T = 2\) secondes.

 

 

Autres activités …

Suite : télémètre à ultrasons

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *