A comunicação entre o Shield WiFi ESP8266 com o Arduino…
Como usar com Arduino – Módulo YX6300 Leitor de Cartão com Saída de Áudio P2
– Descrição:
O Módulo YX6300 Leitor de Cartão com Saída de Áudio P2 é um dispositivo capaz de reproduzir faixas de áudio em formato MP3 ou WAV de 8kHz a 48kHz. Este módulo suporta micro cartão SD / SDHC formatado em FAT32 / FAT16.
O Módulo YX6300 Leitor de Cartão com Saída de Áudio P2 ou Serial MP3 Player v1.0 YX5300 como também é conhecido, possui saída de áudio P2 estéreo e aceita conexão de um fone de ouvido ou alto falante, por exemplo.
O controle Módulo YX6300 Leitor de Cartão com Saída de Áudio P2 é feito utilizando comandos seriais TTL UART RS232, logo, fica fácil conectá-lo ao Arduino ou a qualquer outra plataforma embarcada que possua comunicação serial.
– Especificações e características:
– Controlador: YX6300
– Tensão de operação: 3,2 a 5,2VDC
– Tipo de cartão suportado: micro SD / SDHC
– Formatação do cartão: FAT32 / FAT16
– Saída de áudio: conector P2 estéreo
– Arquivos de áudio suportados: MP3 e WAV
– Taxa de amostragem de áudio: 8KHz a 48KHz
– Interface de comunicação: serial TTL a 9600 bps
– Temperatura de operação:-40º a 85 º celsius
– Datasheet:
– Aplicações:
Projetos com Arduino ou outras plataformas microcontroladas em que seja necessário fazer a reprodução de faixas de áudio a partir de comunicação serial.
– Proposta da prática:
Utilizar o Módulo YX6300 Leitor de Cartão com Saída de Áudio P2 em conjunto com o Arduino para reproduzir em uma caixa de som as faixas de áudio armazenadas em um cartão de memória inserido no módulo. O controle do módulo será realizado através do monitor serial do ambiente de programação do Arduino.
1) Formate o cartão de memória em FAT32 e em seguida crie na raiz do cartão uma pasta chamada 01.
2) Cada arquivo de áudio deverá iniciar com a numeração de três dígitos, por exemplo, 001 002 003 004… 010 011… 026 027 e assim sucessivamente. O requisito principal é que cada arquivo inicie com um número de três dígitos. Se após a numeração você quiser colocar uma palavra para identificar cada gravação, fique à vontade.
3) Copie os arquivos de áudio para a pasta 01 do cartão de memória.
4) A biblioteca responsável por fazer as execuções do áudio através do Módulo YX6300, utiliza como padrão a numeração em base octal. Portanto, quando for usar a função da biblioteca que executa um arquivo de áudio específico e a numeração do arquivo for 008 ou acima, deverá fazer a conversão de base decimal para octal. Para executar o áudio 008, por exemplo, deverá passar como parâmetro o número 010 (8 decimal convertido em octal é igual a 10), para o áudio 009 deverá passar o número 011 (9 decimal convertido em octal é igual a 11), para o áudio 015 deverá passar o número 017 (15 decimal convertido em octal é igual a 17) e assim sucessivamente. Para os áudios de 001 a 007 não é preciso fazer nenhuma conversão de base. No link abaixo você pode fazer as conversões de decimal para octal:
5) Na imagem a seguir você pode ver como devem ficar os arquivos de áudio na pasta 01 do cartão de memória:
– Lista dos itens necessários:
01 – Arduino com Cabo USB
01 – Módulo YX6300 Leitor de Cartão com Saída de Áudio P2
01 – Micro Cartão de Memória
04 – Cabos Jumper macho-fêmea
01 – Fone de ouvido / Caixa de som com conector P2 macho
– Esquema de ligação da prática:
– Tutorial de instalação e configuração do ambiente de programação do Arduino:
Arduino – Instalação e Configuração da IDE no Windows
– Biblioteca:
– Importando bibliotecas para o ambiente de programação do Arduino:
Arduino – Importando bibliotecas para a IDE
– Código:
OBS: este código é o exemplo que está disponível a biblioteca MD_YX5300.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 |
// Test program for the MD_YX5300 library // // Menu driven interface using the Serial Monitor to test individual functions. // #include <MD_YX5300.h> // Connections for serial interface to the YX5300 module #define ARDUINO_RX 5 // connect to TX of MP3 Player module #define ARDUINO_TX 6 // connect to RX of MP3 Player module // Define global variables MD_YX5300 mp3(ARDUINO_RX, ARDUINO_TX); bool bUseCallback = false; // use callbacks? bool bUseSynch = false; // use synchronous? void cbResponse(const MD_YX5300::cbData *status) // Used to process device responses either as a library callback function // or called locally when not in callback mode. { if (bUseCallback) Serial.print(F("\nCback status: ")); else Serial.print(F("\nSync Status: ")); switch (status->code) { case MD_YX5300::STS_OK: Serial.print(F("STS_OK")); break; case MD_YX5300::STS_TIMEOUT: Serial.print(F("STS_TIMEOUT")); break; case MD_YX5300::STS_VERSION: Serial.print(F("STS_VERSION")); break; case MD_YX5300::STS_CHECKSUM: Serial.print(F("STS_CHECKSUM")); break; case MD_YX5300::STS_TF_INSERT: Serial.print(F("STS_TF_INSERT")); break; case MD_YX5300::STS_TF_REMOVE: Serial.print(F("STS_TF_REMOVE")); break; case MD_YX5300::STS_ERR_FILE: Serial.print(F("STS_ERR_FILE")); break; case MD_YX5300::STS_ACK_OK: Serial.print(F("STS_ACK_OK")); break; case MD_YX5300::STS_FILE_END: Serial.print(F("STS_FILE_END")); break; case MD_YX5300::STS_INIT: Serial.print(F("STS_INIT")); break; case MD_YX5300::STS_STATUS: Serial.print(F("STS_STATUS")); break; case MD_YX5300::STS_EQUALIZER: Serial.print(F("STS_EQUALIZER")); break; case MD_YX5300::STS_VOLUME: Serial.print(F("STS_VOLUME")); break; case MD_YX5300::STS_TOT_FILES: Serial.print(F("STS_TOT_FILES")); break; case MD_YX5300::STS_PLAYING: Serial.print(F("STS_PLAYING")); break; case MD_YX5300::STS_FLDR_FILES: Serial.print(F("STS_FLDR_FILES")); break; case MD_YX5300::STS_TOT_FLDR: Serial.print(F("STS_TOT_FLDR")); break; default: Serial.print(F("STS_??? 0x")); Serial.print(status->code, HEX); break; } Serial.print(F(", 0x")); Serial.print(status->data, HEX); } void setCallbackMode(bool b) { bUseCallback = b; Serial.print(F("\n>Callback ")); Serial.print(b ? F("ON") : F("OFF")); mp3.setCallback(b ? cbResponse : nullptr); } void setSynchMode(bool b) { bUseSynch = b; Serial.print(F("\n>Synchronous ")); Serial.print(b ? F("ON") : F("OFF")); mp3.setSynchronous(b); } char getNextChar(bool block = false) { char c = '\0'; if (!block) return(Serial.available() ? Serial.read() : c); while (c == '\0') { if (Serial.available()) c = Serial.read(); } return(c); } uint8_t c2i(char c) { if (c < '0' || c > '9') return(0); return(c - '0'); } uint16_t getNum(char c, uint8_t dig) { uint16_t v = c2i(c); if (c != '\0') dig--; // first digit was passed in for (uint8_t i = 0; i < dig; i++) v = (v * 10) + c2i(getNextChar(true)); return(v); } void help(void) { Serial.print(F("\n[MD_YX5300 Test Menu]")); Serial.print(F("\nh,?\thelp")); Serial.print(F("\n\np!\tPlay")); Serial.print(F("\npyyy\tPlay file index yyy (0-255)")); Serial.print(F("\npp\tPlay Pause")); Serial.print(F("\npz\tPlay Stop")); Serial.print(F("\np>\tPlay Next")); Serial.print(F("\np<\tPlay Previous")); Serial.print(F("\nptxxyyy\tPlay Track folder xx, file yyy")); Serial.print(F("\npfxx\tPlay loop folder xx")); Serial.print(F("\npxaa\tPlay shuffle folder aa")); Serial.print(F("\npryyy\tPlay loop file index yyy")); Serial.print(F("\n\nv+\tVolume up")); Serial.print(F("\nv-\tVolume down")); Serial.print(F("\nvxx\tVolume set xx (max 30)")); Serial.print(F("\nvb\tVolume Mute on (b=1), off (b=0)")); Serial.print(F("\n\nqe\tQuery equalizer")); Serial.print(F("\nqf\tQuery current file")); Serial.print(F("\nqs\tQuery status")); Serial.print(F("\nqv\tQuery volume")); Serial.print(F("\nqx\tQuery folder count")); Serial.print(F("\nqy\tQuery total file count")); Serial.print(F("\nqzxx\tQuery files count in folder xx")); Serial.print(F("\n\ns\tSleep")); Serial.print(F("\nw\tWake up")); Serial.print(F("\nen\tEqualizer type n")); Serial.print(F("\nxb\tPlay Shuffle on (b=1), off (b=0)")); Serial.print(F("\nrb\tPlay Repeat on (b=1), off (b=0)")); Serial.print(F("\nz\tReset")); Serial.print(F("\nyb\tSynchronous mode on (b=1), off (b=0)")); Serial.print(F("\ncb\tCallback mode on (b=1), off (b=0)")); Serial.print(F("\n\n")); } bool processPlay(void) // Process the second level character(s) for the Play options { char c = getNextChar(true); switch (toupper(c)) { case '!': Serial.print(F("\n> Play Start")); return(mp3.playStart()); case 'P': Serial.print(F("\n>Play Pause")); return(mp3.playPause()); case 'Z': Serial.print(F("\n>Play Stop")); return(mp3.playStop()); case '>': Serial.print(F("\n>Play Next")); return(mp3.playNext()); case '<': Serial.print(F("\n>Play Prev")); return(mp3.playPrev()); case '0'...'9': { uint8_t t = getNum(c, 3); Serial.print(F("\n>Play Track ")); Serial.print(t); return(mp3.playTrack(t)); } case 'T': { uint8_t fldr = getNum('\0', 2); uint8_t file = getNum('\0', 3); Serial.print(F("\n>Play Specific Fldr ")); Serial.print(fldr); Serial.print(F(", ")); Serial.print(file); return(mp3.playSpecific(fldr, file)); } case 'F': { uint8_t fldr = getNum('\0', 2); Serial.print(F("\n>Play Folder ")); Serial.print(fldr); return(mp3.playFolderRepeat(fldr)); } case 'X': { uint8_t fldr = getNum('\0', 2); Serial.print(F("\n>Play Shuffle Folder ")); Serial.print(fldr); return(mp3.playFolderShuffle(fldr)); } case 'R': { uint8_t file = getNum('\0', 3); Serial.print(F("\n>Play File repeat ")); Serial.print(file); return(mp3.playTrackRepeat(file)); } default: Serial.print(F("\n>Play ?")); Serial.print(c); break; } return(false); } bool processVolume(void) // Process the second level character(s) for the Volume options { char c = getNextChar(true); switch (toupper(c)) { case '+': Serial.print(F("\n>Volume Up")); return(mp3.volumeInc()); case '-': Serial.print(F("\n>Volume Down")); return(mp3.volumeDec()); case 'M': { uint8_t cmd = getNum('\0', 1); Serial.print(F("\n>Volume Enable ")); Serial.print(cmd); return(mp3.volumeMute(cmd != 0)); } default: { uint16_t v = getNum(c, 2); Serial.print(F("\n>Volume ")); Serial.print(v); return(mp3.volume(v)); } } return(false); } bool processQuery(void) // Process the second level character(s) for the Query options { char c = getNextChar(true); switch (toupper(c)) { case 'E': Serial.print(F("\n>Query Equalizer")); return(mp3.queryEqualizer()); case 'F': Serial.print(F("\n>Query File")); return(mp3.queryFile()); case 'S': Serial.print(F("\n>Query Status")); return(mp3.queryStatus()); case 'V': Serial.print(F("\n>Query Volume")); return(mp3.queryVolume()); case 'X': Serial.print(F("\n>Query Folder Count")); return(mp3.queryFolderCount()); case 'Y': Serial.print(F("\n>Query Tracks Count")); return(mp3.queryFilesCount()); case 'Z': { uint8_t fldr = getNum('\0', 2); Serial.print(F("\n>Query Folder Files Count ")); Serial.print(fldr); return(mp3.queryFolderFiles(fldr)); } default: Serial.print(F("\n>Query ?")); Serial.print(c); } return(false); } bool processCmd(void) // Process the top level character(s) for the main menu { bool bRet = false; char c = getNextChar(); if (c != '\0') { switch (toupper(c)) { case '?': case 'H': help(); break; case 'P': bRet = processPlay(); break; case 'V': bRet = processVolume(); break; case 'Q': bRet = processQuery(); break; case 'S': Serial.print(F("\n>Sleep")); bRet = mp3.sleep(); break; case 'W': Serial.print(F("\n>Wake up")); bRet = mp3.wakeUp(); break; case 'Z': Serial.print(F("\n>Reset")); bRet = mp3.reset(); break; case 'E': { uint8_t e = getNum('\0', 1); Serial.print(F("\n>Equalizer ")); Serial.print(e); return(mp3.equalizer(e)); } case 'X': { uint8_t cmd = getNum('\0', 1); Serial.print(F("\n>Shuffle ")); Serial.print(cmd); return(mp3.shuffle(cmd != 0)); } case 'R': { uint8_t cmd = getNum('\0', 1); Serial.print(F("\n>Repeat ")); Serial.print(cmd); return(mp3.repeat(cmd != 0)); } case 'Y': { uint8_t cmd = getNum('\0', 1); setSynchMode(cmd != 0); } break; case 'C': { uint8_t cmd = getNum('\0', 1); setCallbackMode(cmd != 0); } break; default: Serial.print(F("\n>Command ?")); Serial.print(c); break; } } return(bRet); } void setup() { Serial.begin(9600); mp3.begin(); help(); setCallbackMode(bUseCallback); setSynchMode(bUseSynch); } void loop() { if (processCmd() && !bUseCallback) cbResponse(mp3.getStatus()); mp3.check(); } |
– Resultado final:
Gostou desta prática? Então deixa seu comentário, dúvida ou sugestão aí embaixo!
Loja online: https://www.masterwalkershop.com.br
Fan page no Facebook: https://www.facebook.com/masterwalkershop
Nos ajude a espalhar conhecimento clicando no botão de compartilhar (f Like) que está mais abaixo.
Obrigado e até a próxima!
Seu feedback é muito importante! Que tal dar uma nota para esta postagem?! Faça sua avaliação aqui embaixo.
Postagem anterior: Jarvis – Feedback / Confirmação das ações executadas no Arduino
não consigo fazer funcionar o sketch ele dá o seguinte erro Compilation terminated.
exit stetus 1 MD_yx5300.h:no such file or diretctory.
pode me ajudar
Olá Claudio.
Agradeço pelo comentário!
Pela descrição do erro, falta instalar a biblioteca corretamente.
Na descrição do tutorial tem a biblioteca para download.
hi, i used to module yx6300 interface with arduino nano, but if i use common source then it’s OK, i use arduino nano with adapter and speaker on another source then it’s wrong, i can’t hear anything. Can you help me?
Hi Vu.
Do you use which adapter with nano?