Dans cet article, j'utilise un module ESP32, un module VS1053 et un lecteur de carte SD pour jouer des fichiers mp3 préalablement enregistrés sur une carte SD.
Matériel
Mon module ESP32 sera, comme d'habitude, programmé au moyen de l'IDE Arduino.Le VS1053 de VLSI Solutions est un circuit intégré spécialement conçu pour décoder les principaux formats de fichiers musicaux: Ogg Vorbis, mp3, AAC, WMA, FLAC, MIDI...
J'ai utilisé un module fabriqué en Chine qu'on trouve facilement sur les sites de vente en ligne. Le mien porte la mention "LCSOFT STUDIO VS1003/1053 MP3 CODEC". Adafruit et Sparkfun ont également mis au point leur propre modèle.
Une prise jack permet de brancher un casque d'écoute au module VS1053, ou encore des enceintes amplifiée.
Tout comme le VS1053, le module lecteur de cartes SD communique avec le microcontrôleur par le protocole SPI, à un niveau logique de 3,3 V.
Connexions
Le module VS1053 est branché à l'ESP32 de la façon suivante:
- Broche 5V du VS1053 : Broche VIN (5V) de l'ESP32
- Broche DGND du VS1053 : Broche GND de l'ESP32
- Broche MISO du VS1053 : Broche D19 de l'ESP32
- Broche MOSI du VS1053 : Broche D23 de l'ESP32
- Broche SCK du VS1053 : Broche D18 de l'ESP32
- Broche DREQ du VS1053 : Broche D4 de l'ESP32
- Broche XRST du VS1053 : Broche EN de l'ESP32
- Broche XCS du VS1053 : Broche D5 de l'ESP32
- Broche XDCS du VS1053 : Broche RX2 - D16 de l'ESP32
...alors que le module carte SD est branché à l'ESP32 de cette façon:
- Broche GND du module carte SD : broche GND de l'ESP32
- Broche 5 V du module carte SD : broche VIN (5V) de l'ESP32
- Broche CS du module carte SD : broche D22 de l'ESP32
- Broche MOSI du module carte SD : broche D23 de l'ESP32
- Broche SCK du module carte SD : broche D18 de l'ESP32
- Broche MISO du moudle caret SD : broche D19 de l'ESP32
Installation de la bibliothèque ESP VS1053
J'ai installé la bibliothèque ESP VS1053 mise au point par Baldram; elle est également compatible avec l'ESP8266.
Préparation de la carte SD
J'ai copié quelques fichiers MP3 à la racine de la carte SD.
Sketch #1 : jouer un fichier mp3
Dans ce premier exemple de sketch, un fichier mp3 est joué au complet. Le chemin d'accès de ce fichier doit être écrit dans le sketch (constante "nomFichier"). Il sera facile de modifier programme pour jouer un fichier différent selon le bouton appuyé par l'utilisateur, saluer un visiteur lorsque sa présence est détectée, etc.
-
/******************************************************* | |
Lecture d'un fichier mp3 enregistré sur une carte SD. | |
(ESP32 - module VS1053 - Module carte SD) | |
Nécessite la bibliothèque ESP VS1053 de Baldram: | |
https://github.com/baldram/ESP_VS1053_Library | |
Plus d'infos: | |
https://electroniqueamateur.blogspot.com/2021/03/esp32-et-vs1053-ecouter-les-fichiers.html | |
********************************************************/ | |
#include "FS.h" | |
#include "SD.h" | |
#include "SPI.h" | |
#include <VS1053.h> | |
// définition des broches | |
// MISO: D19 MOSI: D23 SCK: D18 | |
#define VS1053_CS 5 | |
#define VS1053_DCS 16 | |
#define VS1053_DREQ 4 | |
#define SDCARD_CS 22 | |
const char *nomFichier = "/nom_du_fichier.mp3"; // chemin d'accès du fichier mp3 sur la carte SD | |
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ); | |
void lecturemp3() { | |
File fichiermp3; | |
const int BUFFSIZE = 64; | |
uint8_t mp3buff[BUFFSIZE]; | |
uint8_t bytesread = 0; | |
Serial.println("Debut de la lecture du fichier mp3"); | |
fichiermp3 = SD.open(nomFichier); | |
if (!fichiermp3){ | |
Serial.println("Fichier introuvable"); | |
} | |
do { | |
if (fichiermp3) { | |
bytesread = fichiermp3.read(mp3buff, BUFFSIZE); | |
} | |
player.playChunk(mp3buff, bytesread); | |
} while (bytesread); | |
fichiermp3.close(); | |
Serial.println("Fin de la lecture du fichier mp3"); | |
} | |
void setup() { | |
Serial.begin(115200); | |
delay(10); | |
Serial.println(""); | |
Serial.println("Lecture d'un fichier mp3 sur une carte SD"); | |
if (!SD.begin(SDCARD_CS)) { | |
Serial.println("Pas de carte SD ?"); | |
return; | |
} | |
// initialisation du VS1053 | |
player.begin(); | |
player.switchToMp3Mode(); | |
player.setVolume(90); | |
lecturemp3(); | |
} | |
void loop() { | |
} |
-
Sketch #2: lecture de tous les fichiers mp3 présents sur la carte SD
Ce deuxième sketch fait jouer successivement tous les fichiers qui se trouvent à la racine de la carte SD, peu importe leur nom. J'ai également ajouté quelques commandes qui peuvent être envoyées à l'ESP32 par le moniteur série: "n" pour passer à la piste suivante, "p" pour mettre en pause, "+" pour augmenter le volume sonore, etc.
-
/******************************************************* | |
Lecture de tous les fichiers mp3 enregistrés sur une carte SD. | |
(ESP32 - module VS1053 - Module carte SD) | |
Nécessite la bibliothèque ESP VS1053 de Baldram: | |
https://github.com/baldram/ESP_VS1053_Library | |
Plus d'infos: | |
https://electroniqueamateur.blogspot.com/2021/03/esp32-et-vs1053-ecouter-les-fichiers.html | |
********************************************************/ | |
#include "FS.h" | |
#include "SD.h" | |
#include "SPI.h" | |
#include <VS1053.h> | |
// définition des broches | |
// MISO: D19 MOSI: D23 SCK: D18 | |
#define VS1053_CS 5 | |
#define VS1053_DCS 16 | |
#define VS1053_DREQ 4 | |
#define SDCARD_CS 22 | |
#define NOMBRE_DE_FICHIERS 25 // nombre maximal de fichiers considérés | |
char listeFichiers [NOMBRE_DE_FICHIERS] [16]; | |
int volume = 90; // 0 à 100 | |
int numeroCourant = 0; | |
int nombreTotal = 0; | |
bool enPause = 0; // 1 si l'utilisateur a arrêté la lecture | |
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ); | |
File fichiermp3; | |
const int BUFFSIZE = 64; | |
uint8_t mp3buff[BUFFSIZE]; | |
// on fait l'inventaire des fichiers présents à la racine de la carte SD | |
void listDir(fs::FS &fs, const char * dirname, uint8_t levels) { | |
Serial.println("------"); | |
int numero = 0; | |
File root = fs.open(dirname); | |
if (!root) { | |
Serial.println("Echec de lecture de la carte SD"); | |
return; | |
} | |
if (!root.isDirectory()) { | |
Serial.println("Pas un repertoire"); | |
return; | |
} | |
File file = root.openNextFile(); | |
while (file) { | |
if (!file.isDirectory()) { | |
if (numero < NOMBRE_DE_FICHIERS) { | |
strcpy(listeFichiers[numero], file.name()); | |
numero++; | |
} | |
} | |
file = root.openNextFile(); | |
} | |
nombreTotal = numero - 1; | |
Serial.println("Liste des fichiers sur la carte SD:"); | |
for (int i = 0; i < numero; i++) { | |
Serial.print("\t"); | |
Serial.println(listeFichiers[i]); | |
} | |
Serial.println("------"); | |
} | |
// on passe au fichier suivant | |
void prochainePiste() { | |
if (fichiermp3) { // un fichier est déjà ouvert | |
fichiermp3.close(); | |
if (numeroCourant < nombreTotal) { | |
numeroCourant++; | |
} | |
else { | |
numeroCourant = 0; // retour au premier fichier | |
} | |
} | |
fichiermp3 = SD.open(listeFichiers[numeroCourant]); | |
Serial.println(listeFichiers[numeroCourant]); | |
} | |
void setup() { | |
Serial.begin(115200); | |
delay(10); | |
Serial.println(""); | |
Serial.println("Lecteur de fichiers mp3 sur carte SD"); | |
if (!SD.begin(SDCARD_CS)) { | |
Serial.println("Pas de carte SD ?"); | |
return; | |
} | |
listDir(SD, "/", 0); | |
// initialisation du VS1053 | |
player.begin(); | |
player.switchToMp3Mode(); | |
player.setVolume(volume); | |
Serial.println("Controles:"); | |
Serial.println("\tn: passer a la prochaine piste"); | |
Serial.println("\tp: mettre en pause / reprendre la lecture"); | |
Serial.println("\t+/-: controle du volume"); | |
Serial.println("------"); | |
} | |
void loop() { | |
if (Serial.available()) { | |
char c = Serial.read(); | |
// n: prochaine chanson | |
if (c == 'n') { | |
Serial.println("Prochaine piste"); | |
prochainePiste(); | |
} | |
// p: mettre en pause / reprendre | |
if (c == 'p') { | |
enPause = !enPause; | |
Serial.println("Mettre en pause / reprendre"); | |
} | |
// +: augmenter le volume | |
if (c == '+') { | |
if (volume < 100) { | |
Serial.println("Plus fort"); | |
volume++; | |
player.setVolume(volume); | |
} | |
} | |
// -: diminuer le volume | |
if (c == '-') { | |
if (volume > 0) { | |
Serial.println("Moins fort"); | |
volume--; | |
player.setVolume(volume); | |
} | |
} | |
} | |
if (!enPause) { | |
uint8_t bytesread = 0; | |
if (fichiermp3) { | |
bytesread = fichiermp3.read(mp3buff, BUFFSIZE); | |
} | |
if (bytesread) { | |
player.playChunk(mp3buff, bytesread); | |
} | |
else { // nous sommes arrivés à la fin du fichier | |
prochainePiste(); | |
} | |
} | |
} |
-
À lire également:
- ESP32 et VS1053: écouter la radio sur internet
- Lecture de fichiers mp3 avec Arduino Uno et VS1053
- Autres projets impliquant l'ESP32
Ami, j'aimerais tester le microphone. Avez-vous un code que je peux prononcer dans le microphone et générer un fichier enregistré sur la carte SD ? reconnaissant. sergio1791 <@>bol<.>com<.>br
RépondreSupprimer