Produire un son avec un microcontrôleur
Texte légal : Points du programme concernés
Classe de 2nde
Micro-contrôleurs :
Utiliser un dispositif comportant un microcontrôleur pour produire un signal sonore.
Objectif
On propose ici d'utiliser une carte Micro:bit couplée à un HP afin de produire des sons. Trois méthodes sont proposées :
Alternance d'états hauts et bas d'une sortie numérique en ajustant la durée de chaque état en fonction de la fréquence du son à produire.
Utilisation de la fonction music.pitch permettant de générer un son d'une fréquence donnée.
music.pitch(fréquence, durée)
Création de mélodie à partir de notes mises sous forme de liste python.
La première méthode est davantage à même de faire réfléchir les élèves à la manière de générer un signal périodique tandis que les autres permettent d'obtenir rapidement un son de fréquence souhaitée, ou une note.
Le signal généré est nécessairement carré.
Méthode : Mise en œuvre et programmation
Le HP se câble très simplement entre la masse et une sortie numérique, soit à l'aide de pince crocodile soit directement avec des fiches banane qui peuvent s'insérer dans les 5 pins principaux de la carte.
On peut générer le signal carré ci-dessous avec une carte Micro:bit en alternant les états haut et bas de la sortie numérique.
from microbit import* #importe les fonctions du microbit
import time #importe la bibliothèque de temps
pin0.write_digital(0) #on met la sortie 0 à zéro
freq=440 #on affecte la valeur 440 pour la fréquence
T = 1/freq #à faire compléter pour calculer la période
demiT = 0.5*T #à faire compléter pour calculer la demi période#on lance
while True :
if button_a.was_pressed ():
while True : #lance le programme en boucle
pin0.write_digital(1) #on envoie une tension sur la sortie 0
time.sleep(demiT) #on attend pendant une demi période
pin0.write_digital(0) #on remet une tension nulle sur la sortie 0
time.sleep(demiT) #on attend pendant une demi période
if button_b.was_pressed(): #permet de quitter la boucle
break
Exemple : Exemple de questionnement élève
Cette méthode permet d'amener les élèves à exploiter le lien entre période et fréquence.
On peut leur fournir un programme où manque la relation permettant de calculer la demi-période à partir de la fréquence f.
À partir d'un document répertoriant les fréquences des notes de musique, proposer une modification du programme pour jouer la gamme.
On peut aussi proposer aux élèves de vérifier s'ils ont produit le son à la bonne fréquence à l'aide d'une application mobile permettant une analyse fréquentielle, par exemple Spectroid.
Complément : La méthode music.pitch
MicroPython sur le BBC micro:bit est fourni avec un module de musique et de son. On raccorde via des fiches bananes ou pince crocodile un HP sur les pins 0 et GND et la carte micro:bit. les pins 0 et GND aux entrées positives et négatives du haut-parleur.
La méthode music.pitch(fréquence,durée), permet de jouer une fréquence donnée pendant un durée exprimée en ms.
Le code suivant permet de jouer en boucle 3 Las d'octave différents chacun étant joué pendant 1 seconde.
from microbit import *
import music
while True:
music.pitch(220, 1000)
music.pitch(440, 1000)
music.pitch(880, 1000)
if button_a.was_pressed(): #condition permettant de sortir de la boucle infinie
break
Remarque : Commande de la fréquence à l'aide de l'accéléromètre
On peut utiliser l'accéléromètre de la carte afin de produire des sons de fréquences variables.
from microbit import *
import music
import math
while True:
music.pitch(abs(accelerometer.get_y()), 10)
if button_a.was_pressed():
break
Complément : Créer une mélodie
Avec la carte micro:bit, on peut également utiliser les notations musicales internationale.
A correspond au La
B correspond à Si
C corrrespond à Do et ainsi de suite en suivant l'alphabet jusqu'à G qui correspond à Sol.
Chaque note est représentée par une chaîne de caractères :
NOTE[octave][:durée]
Par exemple,"A1:4"
représente la note nomméeA
dans l’octave numéro 1 à jouer sur une durée de4
.
Pour créer une mélodie, il faut mettre les notes dans une liste.
Par exemple, voici comment faire jouer à MicroPython le début de «Frère Jacques»:
import music
tune = ["C4:4", "D4:4", "E4:4", "C4:4", "C4:4", "D4:4", "E4:4", "C4:4",
"E4:4", "F4:4", "G4:8", "E4:4", "F4:4", "G4:8"]
music.play(tune)
MicroPython permet de simplifier de telles mélodies. Il se rappellera de l’octave et de la durée jusqu’à ce qu'elles changent. Grâce à cela, l’exemple ci-dessus peut-être ré-écrit de cette façon:
import music
tune = ["C4:4", "D", "E", "C", "C", "D", "E", "C", "E", "F", "G:8",
"E:4", "F", "G:8"]
music.play(tune)
Remarque que l’octave et la durée ne changent que lorsqu’elles le doivent. Ça fait beaucoup moins à taper et c’est plus simple à lire.
Exemple : Exemples de mélodies
from microbit import *
import music
while True:
if button_a.is_pressed():
i = 0
while i<2 :
sw = [ "C4:6", "G:6", "F4:1",
"E:1","D:1", "C5:6", "G4:3", "F4:1", "E:1", "D:1", "C5:6", "G4:3",
"F:1", "E:1", "F:1", "D:6", "G3:1", "G4:1", "G3:1",
"C4:6", "G:6", "F4:1", "E:1", "D:1", "C5:6", "G4:3",
"F4:1", "E:1", "D:1", "C5:6", "G4:3", "F4:1", "E:1", "F:1",
"D:18"]
i+=1
music.play(sw)
if button_b.is_pressed():
IJ = ["B3:3", "C:1", "D4:2", "G:10", "A3:3", "B:1", "C:12",
"D4:3","E:1","F#:2","C5:10", "E4:3", "F#:1", "G:4", "A:4",
"B:4", ]
music.play(IJ)