Articles récents
Electronique : Faire une mélodie avec un ESP32
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.
© 2024 www.doritique.fr par Robert DORIGNY