Buzzer
- Microcontrôleur Arduino
- Ordinateur avec Python et une IDE ARduino
- Buzzer passif (HYDZ)
- Potentiomètre 10kΩ
- Bouton poussoir
Variation de fréquence au potentiomètre
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
Pymata4
permet-elle de spécifier le « mode » (entrée ou sortie) d’un port analogique ?
Finalisation du programme
f
comprise entre 50Hz et 3000Hz.N
comprise entre 0 et 1023 (convertisseur A/N de 10 bits : 210 valeurs possibles) ligne 22f
en fonction de la « position » du potentiomètre N
et les constantes F_MINI
et F_MAXI
(ligne 23)???????
) 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)\).
En début de programme, ajouter la ligne suivante :
from math import log10
(log10
est la version Python de la fonction \(\log\))
f = ...
par logf = ...
, ainsi que F_MINI
par log10(F_MINI)
et F_MAXI
par log10(F_MAXI)
.
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.
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 :
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).
F_MINI
à F_MAXI
par période de \(T = 2\) secondes.
Autres activités …
Suite : télémètre à ultrasons …