Ressource proposée par : F. GUERINET
Démarche pédagogique choisie :
1ère étape : Déterminer la fréquence des notes à partir de la représentation temporelle de la mélodie
- mesure de la période de chaque note à partir d’un fichier au format wav avec Audacity
- calcul de la fréquence
2ème étape : Programmation de la mélodie
- appropriation du programme (commenter les lignes du programme)
- programmation du reste de la mélodie
- modification de la mélodie (pauses, durée des notes)
Matériel nécessaire
Haut-parleur | Fil de connexion | Microcontrôleur (carte ArduinoTM) |
Cablage
On utilise une des sorties numériques de la carte à microcontrôleur, par exemple la n°6 dans le montage ci-contre.
Dans le cas de l’utilsation d’un shield, le câble reliera la haut-parleur et la borne D6.
Proposition n°1 : Construire un signal périodique via l’IDE du microcontrôleur
Une sortie numérique ne connaît que deux états possibles : HIGH (tension maximale) ou LOW (tension minimale). Pour produire un signal sonore périodique, il faut donc programmer la sortie numérique pour qu’elle soit 50 % de la période à la valeur HIGH et 50 % de la période à la valeur LOW.
void setup() { pinMode(6,OUTPUT); //on prépare le pin 6 en mode sortie } // La boucle (loop) est parcourue indéfiniment void loop() { digitalWrite(6, HIGH); // Met la sortie numérique 6 au niveau haut delayMicroseconds(1150); // attend 1150 µs, soit une demi-période digitalWrite(6, LOW); // Met la sortie numérique 6 au niveau bas delayMicroseconds(1150); // attend 1150 µs, soit une demi-période }
Si on souhaite jouer plusieurs notes d’une mélodie, il faut introduire une boucle « for » pour chaque note afin de déterminer la durée de chaque note et une pause entre celles-ci :
void setup() { pinMode(6,OUTPUT); //on prépare le pin 6 en mode sortie } // La boucle (loop) est parcourue indéfiniment void loop() { for (int i=0 ; i<217 ; i++) { digitalWrite(6, HIGH); // Met la sortie numérique 6 au niveau haut delayMicroseconds(1150); // attend 1150 µs, soit une demi-période digitalWrite(6, LOW); // Met la sortie numérique 6 au niveau bas delayMicroseconds(1150); // attend 1150 µs, soit une demi-période } delay(100); // attend 100 ms avant de jouer la note suivante for (int i=0 ; i<244 ; i++) { digitalWrite(6, HIGH); // Met la sortie numérique 6 au niveau haut delayMicroseconds(1025); // attend 1025 µs, soit une demi-période digitalWrite(6, LOW); // Met la sortie numérique 6 au niveau bas delayMicroseconds(1025); // attend 1025 µs, soit une demi-période } delay(100); // attend 100 ms avant de jouer la note suivante }
Proposition n°2 : Produire un son avec la fonction tone
La fonction tone(x,f,t)
génère un signal de fréquence f > 31 Hz sur la broche x pendant la durée t en millisecondes. Cependant, cette fonction ne peut gérer qu’une broche à la fois.
void setup() { pinMode(6, OUTPUT); //La broche 6 est la sortie utilisée } void loop() { tone(6,435,500); delay(500); tone(6,488,500); delay(500); }
L’enchaînement de notes devient beaucoup plus simple.
Proposition n°3 : Produire un son avec la fonction tone et un pilotage via un programme Python.
Il est également possible de piloter la carte à microcontrôleur ArduinoTM en langage Python.
Le code python fait appel aux modules time et microcontrôleurs qui contiennent respectivement les fonctions sleep
et son
.
Le programme pour jouer deux notes donne :
from microcontroleurs import arduino import time macarte = arduino("/dev/ttyACM1") #nom du port à adapter ###Creation d'un son for i in range(5): macarte.son(6,435,0.75) time.sleep(1) macarte.son(6,488,0.75) time.sleep(1) macarte.fermer()
Propositions d’activité expérimentale :
Situations inspirées de ressources issues de l’académie de Nantes
TP production d’un son (version Arduino) | |
TP production d’un son (version Python) |