Electronique : Faire une mélodie avec un ESP32

30 juin 2018 rdorigny 0 commentaires

Je vais vous montrer comment réaliser une petite mélodie avec un ESP32, un amplificateur audio et un haut parleur.

C'est en cherchant sur le net que je me suis aperçu qu'il n'y avait rien sur ce sujet pour l'ESP32. C'est intéressant de savoir produire des sons (autrement qu'avec un buzzer) pour notifier un événement, aussi je vais vous montrer comment faire le montage et coder le microcontrôleur.





Le montage

J'ai déjà présenté dans un article précédent le LM386 qui est un amplificateur audio très performant. Nous allons prendre en compte le schéma avec un gain de 200 (cela va dépendre du rendement acoustique de votre haut parleur). Je vais utiliser un haut parleur de tablette de faible puissance, donc il faudra un bon gain pour compenser. Mais cela fonctionne avec un haut-parleur plus puissant, dans ce cas choisissez le montage avec un gain de 20 ou 50 selon ce que vous attendez comme volume dans votre application.



Pour l'ESP32, nous allons utiliser le GPIO 32 pour la transmission du signal vers 'étage d'amplification.



Le programme

C'est un code qui originellement a été écrit pour Arduino et que j'ai réadapté à l'ESP32.


/* Play Melody
 * -----------
 *
 * Program to play melodies stored in an array, it requires to know
 * about timing issues and about how to play tones.
 *
 * The calculation of the tones is made following the mathematical
 * operation:
 *
 *       timeHigh = 1/(2 * toneFrequency) = period / 2
 *
 * where the different tones are described as in the table:
 *
 * note         frequency       period  PW (timeHigh)   
 * c            261 Hz          3830    1915    
 * d            294 Hz          3400    1700    
 * e            329 Hz          3038    1519    
 * f            349 Hz          2864    1432    
 * g            392 Hz          2550    1275    
 * a            440 Hz          2272    1136    
 * b            493 Hz          2028    1014    
 * C            523 Hz          1912    956
 *
 * (cleft) 2005 D. Cuartielles for K3
 */

int speakerOut = 32;               
byte names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'};  
int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
byte melody[] = "2d2a1f2c2d2a2d2c2f2d2a2c2d2a1f2c2d2a2a2g2p8p8p8p";
// count length: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
//                                10                  20                  30
int count = 0;
int count2 = 0;
int count3 = 0;
int MAX_COUNT = 24;
int statePin = LOW;
int freq = 5000;
int ledChannel = 0;
int resolution = 8;

void setup() {
 //pinMode(ledPin, OUTPUT); 
 ledcSetup(ledChannel, freq, resolution);
 ledcAttachPin(speakerOut, ledChannel);
}

void loop() {
  //analogWrite(speakerOut, 0);  
  ledcWrite(ledChannel, 0);   
  for (count = 0; count < MAX_COUNT; count++) {
    statePin = !statePin;
    //digitalWrite(ledPin, statePin);
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          //analogWrite(speakerOut,500);
          ledcWrite(ledChannel, 500);
          delayMicroseconds(tones[count2]);
          //analogWrite(speakerOut, 0);
          ledcWrite(ledChannel, 0);
          delayMicroseconds(tones[count2]);
        } 
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          //analogWrite(speakerOut, 0);
          ledcWrite(ledChannel, 0);
          delayMicroseconds(500);
        }
      }
    }
  }
}
Le code est basé sur un signal PWM qui forme un signal son à partir d'une mélodie. C'est plutôt réussi, je trouve.

Conclusion

Voilà un petit programme pour faire un son que vous pouvez reprendre dans vos applications, il me sera super utile personnellement.







Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2018 www.doritique.fr par Robert DORIGNY