Il est possible de faire de la synthèse de son assez sophistiquée grâce au STM32, mais nous nous limiterons à la génération d'un signal PWM dont nous ferons varier la fréquence, afin d'obtenir un résultat similaire à l'utilisation des instructions "tone" et "noTone" sur une carte Arduino.
Le circuit

Voici le schéma du circuit que j'ai utilisé. Le potentiomètre est facultatif: il permet de contrôler le volume sonore.
Plutôt qu'un MOSFET, vous pouvez utiliser un transistor NPN avec une résistance de quelques kΩ à sa base (plus de détails ici).
Le script
Voici un script programmé dans mbed. Après avoir défini la pin D9 comme une sortie PWM au moyen de la fonction PWMOut, on peut régler sa période et son rapport cyclique. La période est liée à la hauteur de la note jouée, alors que le rapport cyclique permet de contrôler le volume.
La constante "note" est un tableau contenant la fréquence associée aux 11 notes contenues dans un octave.
La mélodie se trouve dans la constante "melodie". Il s'agit d'un tableau bi-dimensionnel contenant chacune des notes devant être jouée, de façon séquentielle. Chaque note comporte trois paramètres: la valeur de la note (0 pour do, 1 pour do#, 2 pour ré, jusqu'à 11 pour si), le numéro de l'octave (1 pour l'octave le plus grave, 2 pour l'octave suivant, etc.), et finalement la durée de la note (1 pour une croche, 2 pour une noire, 4 pour une ronde).
Vous pouvez facilement modifier le contenu de la constante "melodie" afin de faire jouer autre chose par votre carte Nucleo, sans avoir à changer quoi que ce soit au reste du programme.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************************************** | |
On joue une mélodie PWM avec un haut-parleur branché à la pin D9 du SMT32 Nucleo. | |
Plus de détails: | |
https://electroniqueamateur.blogspot.com/2017/05/jouer-une-melodie-avec-le-stm32-nucleo.html | |
****************************************************************************/ | |
#include "mbed.h" | |
PwmOut sortieSon(D9); // la pin D9 émettra la mélodie | |
const int tempo = 250; // nombre de demi-temps par seconde | |
// fréquence associée à chaque note | |
// do, do#, ré, ré#, mi, fa, fa#, sol, sol#, la, la#, si | |
const float note[12]= {65.41, 69.30, 73.42, 77.78, 82.41, 87.31, 92.50, 98.00, 103.83, 110.00, 116.54, 123.47 | |
}; | |
// chaque note de la mélodie comporte 3 paramètres: | |
// note (de 0 à 11: 0 pour do, 1 pour do#, etc) | |
// octave (1 à 3) | |
// durée (1 pour croche, 2 pour noire, 4 pour ronde) | |
const int melodie[48][3] = { {7,1,4},{10,1,1},{1,2,1},{7,2,1},{10,2,1},{1,3,1}, | |
{10,1,3},{1,2,1},{5,2,1},{10,2,1},{1,3,1},{5,3,1}, | |
{5,1,3},{8,1,1},{0,2,1},{5,2,1},{8,2,1},{0,3,1}, | |
{0,1,3},{3,1,1},{7,1,1},{0,2,1},{3,2,1},{7,2,1}, | |
{1,1,3},{5,1,1},{8,1,1},{1,2,1},{5,2,1},{8,2,1}, | |
{10,1,3},{1,2,1},{5,2,1},{10,2,1},{1,3,1},{5,3,1}, | |
{3,1,3},{7,1,1},{10,1,1},{3,2,1},{7,2,1},{10,2,1}, | |
{8,1,3},{0,2,1},{3,2,1},{8,2,1},{0,3,1},{3,3,1}, | |
}; | |
void joue (int laNote, int octave, int duree) | |
{ | |
sortieSon.period(1.0/note[laNote]/(octave * 1.0)); | |
sortieSon =0.5; //rapport cyclique 50% : volume maximal | |
wait(duree*.9*60.0/tempo); | |
sortieSon=0.0; // rapport cyclique 0%: volume nul | |
wait(duree*.1*60.0/tempo); // court silence entre deux notes consécutives | |
} | |
int main() | |
{ | |
for ( int i = 0; i < 48 ; i++ ) { | |
joue(melodie[i][0],melodie[i][1],melodie[i][2]); | |
} | |
} | |
Vidéo de la carte Nucleo en action
Yves Pelletier (Twitter, Facebook)
Aucun commentaire:
Enregistrer un commentaire