Produire un son avec un microcontrôleur

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éthodeMise 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.

Signal carré - Période et demi-périodeInformations[1]
1
from microbit import*  	#importe les fonctions du microbit
2
import time			    #importe la bibliothèque de temps
3
4
pin0.write_digital(0)		#on met la sortie 0 à zéro
5
freq=440                    		 #on affecte la valeur 440 pour la fréquence
6
T = 1/freq		           	 #à faire compléter pour calculer la période
7
demiT = 0.5*T		        	#à faire compléter pour calculer la demi période#on lance
8
9
while True :
10
    if button_a.was_pressed ():
11
        while True :                    			#lance  le programme en boucle
12
                pin0.write_digital(1)		#on envoie une tension sur la sortie 0
13
                time.sleep(demiT)			#on attend pendant une demi période
14
                pin0.write_digital(0)		#on remet une tension nulle sur la sortie 0 
15
                time.sleep(demiT)			#on attend pendant une demi période
16
                if button_b.was_pressed():       #permet de quitter la boucle
17
                    break

ExempleExemple 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émentLa 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.

1
from microbit import *
2
import music
3
4
while True:
5
    music.pitch(220, 1000)
6
    music.pitch(440, 1000)
7
    music.pitch(880, 1000)
8
    if  button_a.was_pressed():  #condition permettant de sortir de  la boucle infinie
9
        break

RemarqueCommande 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.

1
from microbit import * 
2
import music
3
import math
4
5
while True:
6
    music.pitch(abs(accelerometer.get_y()), 10)
7
    if button_a.was_pressed():
8
        break

ComplémentCré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éeAdans 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»:

1
import music
2
3
tune = ["C4:4", "D4:4", "E4:4", "C4:4", "C4:4", "D4:4", "E4:4", "C4:4",
4
        "E4:4", "F4:4", "G4:8", "E4:4", "F4:4", "G4:8"]
5
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:

1
import music
2
3
tune = ["C4:4", "D", "E", "C", "C", "D", "E", "C", "E", "F", "G:8",
4
        "E:4", "F", "G:8"]
5
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.

ExempleExemples de mélodies

1
from microbit import *
2
import music
3
4
while True:
5
    if button_a.is_pressed():
6
        i = 0
7
        while i<2 :
8
            sw = [ "C4:6", "G:6", "F4:1",
9
            "E:1","D:1", "C5:6", "G4:3", "F4:1", "E:1", "D:1", "C5:6", "G4:3",
10
            "F:1", "E:1", "F:1", "D:6", "G3:1", "G4:1", "G3:1",
11
            "C4:6", "G:6", "F4:1", "E:1", "D:1", "C5:6", "G4:3",
12
            "F4:1", "E:1", "D:1", "C5:6", "G4:3", "F4:1", "E:1", "F:1",
13
            "D:18"]
14
            i+=1
15
            music.play(sw)
16
17
    if button_b.is_pressed():
18
        IJ = ["B3:3", "C:1", "D4:2", "G:10", "A3:3", "B:1", "C:12",
19
        "D4:3","E:1","F#:2","C5:10", "E4:3", "F#:1", "G:4", "A:4",
20
        "B:4", ]
21
        music.play(IJ)