En artículos anteriores (1 y 2) hemos explorado las características del reproductor de audio MP3 Music Maker Feather Wing de Adafruit.

En esta entrega vamos a hacer algunos experimentos conectándolo a un ARDUINO UNO.

Vale la pena destacar que en teoría todo sería más fácil si conectamos el Music Maker a un controlador Feather de Adafruit, pero lo intentamos y tuvimos algunos problemas. Luego les contamos sobre eso.

Esta publicación se basa en mucho en el video sobre el mismo tema ubicado acá: https://www.youtube.com/watch?v=EtmxK0SjqAY

También se basa en el tutorial inicial del Music Maker Featherwing ubicado acá: https://learn.adafruit.com/adafruit-music-maker-featherwing/overview

Materiales

  • 1x Music Maker Feather Wing de Adafruit
  • 1x Arduino UNO
  • 1x Placa de prototipado (Proto-board)
  • 12x Cables de conexión M/M de diversos colores.

La siguiente imagen muestra un diagrama de bloques que ejemplifica cada componente.

El controlador ejecuta un programa que se encarga de controlar al reproductor. Este controlador es programado mediante una PC y un software llamado el IDE de ARDUINO. Nótese que para controlar el reproductor, se usan dos canales de comunicación: uno de tipo SPI (para enviar comandos) y otro de tipo control (para «hablar» con los diferentes circuitos del reproductor MP3)

El reproductor lee la información de la tarjeta SD y ejecuta la música.

Figura 1 – Diagrama de Bloques

Conexiones

En la siguiente imagen mostramos un diagrama Frtizing de las conexiones que se necesitan.

Los pines 2,3,4,6,7 se utilizan para controlar los circuitos del chip reproductor de música y de la tarjeta SD.

Los pines 11,12,13 se utilizan para establecer una interface SPI (Interfase Periférica Serial en Inglés) que sirve para comunicar datos entre el controlador (ARDUINO UNO) y el reproductor (FEATHER WING)

Finalmente los pines 3.3V y GND se usan para alimentar los circuitos a 3.3V

(!) Una de las preocupaciones que teníamos con esta prueba es que las especificaciones del Feather Wing dicen que opera a 3V; pero los pines de datos del ARDUINO UNO operan a 5V. En nuestro experimento sin embargo el sistema operó de forma adecuada.

Figura 2 – Conexiones entre el ARDUINO UNO y el MUSIC MAKER.

Programación

El programa propuesto en el video está basado en el programa que viene como ejemplo en la librería de Adafruit VS1053

Haz clic para ver el programa
// ADAPTADO DEL TUTORIAL DE ADAFRUIT

// INCLUIR LIBRERIAS PARA SPI, MP3 and SD
#include <SPI.h>
#include <SD.h>
#include <Adafruit_VS1053.h>

/*PINES CONECTADOS A ARDUINO UNO*/
#define VS1053_RESET   -1     // PIN DE RESET DEL VS1053. -1 = NO SE USA.
#define VS1053_CS       7     // PIN DE SELECCION DE CHIP VS1053
#define VS1053_DCS      6     // PIN DE DATOS/COMANDOS DE CHIP VS1053
#define CARDCS          4     // PIN DE SELECCION DE TARJETA SD
#define VS1053_DREQ     3     // PIN DE SOLICITU DE INTERRUPCION/DATOS PARA CHIP VS1053

/*VALORES DE PINES DE REFERENCIA PARA CONEXION SPI*/
#define MIDI            2
#define MISO           12
#define MOSI           11
#define SCK            13

//INSTANCIAR EL MUSIC PLAYER
Adafruit_VS1053_FilePlayer musicPlayer = 
  Adafruit_VS1053_FilePlayer(VS1053_RESET, VS1053_CS, VS1053_DCS, VS1053_DREQ, CARDCS);

//FUNCION SETUP SE EJECUTA SOLO UNA VEZ AL INICIAR EL PROGRAMA
void setup() {
  //INICIALIZAMOS EL PUERTO SERIAL (para poder tener resultados en la pantalla de monitor serial)
  Serial.begin(115200);
  delay(2000); //Esperamos 2 segundos para que el puerto responda.
  
  Serial.println("\n\nAdafruit VS1053 Feather Test");

  //INICIALIZAMOS EL MUSIC PLAYER
  if (! musicPlayer.begin()) {
     Serial.println(F("NO SE ENCONTRÓ EL VS1053. ¿Están bien conectados los pines?"));
     while (1);
  }

  Serial.println(F("ENCONTRÉ EL VS1053"));

  //GENERAMOS UN TONO DE VERIFICACIÓN....
  musicPlayer.setVolume(3,3); //VOLUMEN (EL MAS ALTO SERÍA 0,0)
  musicPlayer.sineTest(0x44, 2000);

  //INICIALIZAMOS LA TARJETA SD
  if (!SD.begin(CARDCS)) {
    Serial.println(F("LA TARJETA SD HA FALLADO O NO HAY TARJETA. ¿Será que la tarjeta es de tecnología muy reciente o muy grande?"));
    while (1);  // PARALIZAR
  }
  Serial.println("SD OK!");
  
  // LISTAR ARCHIVOS DE LA TARJETA SD
  printDirectory(SD.open("/"), 0);
  
  // SUBIMOS EL VOLUMEN AL MAXIMO
  musicPlayer.setVolume(0,0);

  //DEFINIMOS PUERTO DE INTERRUPCIONES
  musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT);  // DREQ int
    
  // REPRODUCIMOS UN ARCHIVO COMPLETO, SE REQUIERE EL USO DE INTERRUPCIONES PARA PARAR!!!
  Serial.println(F("Playing full track 001"));
  musicPlayer.playFullFile("/TRACK001.mp3");

  // REPRODUCIMOS UN ARCHIVO EN EL BACKGROUND
  Serial.println(F("Playing track 002"));
  musicPlayer.startPlayingFile("/TRACK002.mp3");
}

void loop() {
  //ACA IMPLEMENTAMOS LÓGICA DE CONTROL DEL BACKGROUND
  Serial.print(".");

  //DETERMINAR SI EL MUSICPLAYER ESTÁ DETENIDO...
  if (musicPlayer.stopped()) {
    Serial.println("HE TERMINADO DE REPRODUCIR MUSICA");

    //CICLO ETERNO QUE NO HACE NADA:
    while (1) {
      delay(10);  
    }
  }

  //DETERMINAR SI HAY DATOS EN EL PUERTO SERIAL ENVIADOS AL ARDUINO UNO.
  if (Serial.available()) {
    char c = Serial.read();
    
    // SI EL COMANDO ES LA LETRA 's' DETENEMOS LA EJECUCIÓN
    if (c == 's') {
      musicPlayer.stopPlaying();
    }
    
    // SI EL COMANDO ES UNA 'p' HACEMOS PAUSA O LA QUITAMOS
    if (c == 'p') {
      if (! musicPlayer.paused()) {
        Serial.println("Paused");
        musicPlayer.pausePlaying(true);
      } else { 
        Serial.println("Resumed");
        musicPlayer.pausePlaying(false);
      }
    }
  }
  delay(100);
}

/// HACE UNA LISTA DE TODOS LOS ARCHIVOS EN LA TARJETA SD
void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // NO HAY MÁS ARCHIVOS
       Serial.println("** NO HAY MÁS ARCHIVOS**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}

Notas Importantes

  1. Archivos: En las líneas 63 y 67 queda claro que se necesita que haya un archivo de nombre «TRACK001.mp3» y otro de nombre «TRACK002.mp3» en la carpeta raíz de la tarjeta SD.
  2. Problemas SD: Las primeras pruebas con una tarjeta SD de 32GB con tecnología SAMSUNG EVO Plus presentaron problemas aleatorios que detenían el sistema repentinamente.
  3. Tarjeta SD Funcional: Al usar una tarjeta de 128MB marca NOKIA no tuvimos problema alguno. Es posible que la moderna tecnología de la primera tarjeta que tratamos causara problemas con el lector.
  4. Conector de Audífonos: También es importante destacar que el conector de audífonos de 4 canales (los que traen los celulares) no funciona bien en el reproductor, hay que introducirlo a medio camino para que suene bien. El conector que si funciona es el de tres canales (L/R/GND) que no trae conexion de micrófono ni circuitería de control de volumen.

Retos

¿Qué tal modificar el programa para que ejecute el primer archivo MP3 que aparece en la raiz de la tarjeta SD?

¿Y si hacemos que ejecute de forma continua sin parar todos los archivos MP3 que vengan en la tarjeta SD?

460 total views, 3 views today

0Shares
Última modificación: marzo 24, 2019

Autor

Comentarios

Comenta o responde a los comentarios

Tu dirección de correo no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.