En este artículo vamos a profundizar sobre el reproductor de audio denominado Music Maker Feather Wing fabricado por la empresa Adafruit.

Este módulo implementa el chip codificador/decodificador VS1053 que soporta diversidad de formatos (MP3, AAC, Ogg Vorbis, WMA, MIDI, FLAC, WAV (PCM y ADPCM) que no solamente contiene funciones de reproducción, sino también permite realizar operaciones como ajuste de bajos y altos, y ajuste de volumen de manera digital.

El sistema puede ser controlado mediante una interfaz SPI que se integra fácilmente con otros módulos de control de la línea de productosFeather de Adafruit. También provee capacidad de iniciar (booteo) en modo MIDI para leer datos en formato clásico MIDI de 31250 Kbaudios, mediante una interfaz UART TX y actuar como una «máquina de percusión«

Especificaciones Básicas

  • Chip VS1053B con funcion codificador/decodificador (codec) para formatos Ogg Vorbis, MP3/MP2/MP1/MP4, AAC, WMA, FLAC, WAV/PCM y MIDI
  • Sonido estereofónico con filtros a tierra, lo que permite una conexión segura a parlates y audífonos.
  • Ranura para tarjeta micro-SD para formatos FAT16/FAT32 con un mínimo de 64MB
  • Máquina de secuenciación y sintetizador MIDI con docenas de instrumentos preprogramados.
  • Connector para audífonos de 1/8″

Mapa de Pines (Pinout)

Pinout de la plataforma Feather

microcomputers_Adafruit_Feather_32u4_Basic_Proto_v2.3-1.png
Tomado de la especificación oficial del fabricante en (enlace)

La plataforma Feather de Adafruit provee un conjunto bastante rico de micro-tarjetas o módulos electrónicos para diversas funciones, apilables entre sí, de forma que con un controlador se puedan manejar módulos apilados a este.

Se divide en dos grandes grupos: los controladores base (Feathers) y los dispositivos de extensión, denominados Wings.

Así la forma más recomendada de usar el Music Marker Feather Wing es apilándolo a un controlador Feather, por ejemplo el Adafruit Feather M0 Basic Proto; que es un controlador que a la vez contiene circuitería personalizable para prototipar.

Adafruit Feather M0 Basic Proto - ATSAMD21 Cortex M0
Tomado del sitio del fabricante (enlace)

Los controladores Feather tienen toda la circuitería estandarizada necesaria para alimentar y controlar los Wings. Por otro lado los Wings podrían ser usados sin un controlador Feather, pero se requiere toda la electrónica de regulación de voltajes y señales que ya los Feathers traen predispuesta; en especial la interfase de programación y control SPI.

Interfase SPI

feather_bottomamp.jpg
Imagen tomada del tutorial original del fabricante. (enlace)

Una interface SPI es un conjunto de pines que permiten intercambiar información con un dispositivo o un circuito integrado. Consta de una señal de sincronía o reloj (SCK) una de recibo de datos (MISO) y una de salida de datos (MOSI).

Se utiliza para implementar control personalizado de la tarjeta MicroSD y del chip codec VS1053. Se usan durante la transmisión de datos de la tarjeta Micro SD al chip codec. En modo MIDI estos pines no se usan.

  • SPI SCK
  • SPI MISO
  • SPI MOSI

Pines de Control

feather_controlpins.jpg
Tomado del Tutorial Oficial de Adafruit (enlace)

Estos pines se usan para regular la transmisión de datos de la tarjeta micro SD al chip codec VS1053. En modo MIDI estos pines no se usan.

  • XDCS – Es el pin de selección de datos para el VS1053
  • DREQ – Es el pin de solicitud de interrupción del VS1053
  • MP3CS – Es el pin de selección de chip del VS1053
  • SD CS – Es el pin de selección de la tarjeta Micro SD

Pines de Potencia

feather_powerpins.jpg
Tomado del tutorial oficial del fabricante. (enlace)

El módulo se alimenta de 3V aplicados a los pines 2 y 4 resaltados en la imagen anterior, donde el pin 2 es +3V y el pin 4 es tierra (GND).

feather_power.jpg
Tomado del tutorial oficial del fabricante. (enlace)

Para el modelo amplificado se usan los pines de USB o el VBAT para alimentar el amplificador.

Pin de datos MIDI

feather_midipin.jpg
Tomado del sitio oficial del fabricante (enlace).

La imagen anterior muestra el pin de datos receptor para modo MIDI

Conector de Audífonos de 3.5mm

feather_audioout.jpg
Tomado del sitio oficial del fabricante (enlace).

Se puede utilizar el conector convencional de audífonos de 3.5mm, o los pines L y R correspondientes para conectar el módulo a un amplificador o a unos audífonos.

Ganancia de Amplificación

feather_bottomamp.jpg
Tomado del sitio oficial del fabricante (enlace).

La ganancia predeterminada de amplificación es de 2 V/V (6dB).

El volumen puede controlarse programáticamente.

Los jumpers G0 y G1 pueden unirse para cambiar esta ganancia, pero no se recomienda hacerlo pues podría dañar los parlantes o dañar el amplificador.

Conectores de Inicialización

feather_bottomamp.jpg
Tomado del sitio oficial del fabricante (enlace).

La circuitería del módulo integra las funciones de reset a la plataforma Feather subyecente. Si se corta el jumper «Reset» se podrá redirigir la función reset del chip codec a cualquier otro pin de GPIO de la plataforma.

Instalación de Librerías de Software

Para controlar el chip codec VS1053 se cuenta con la librería «Adafruit VS1053» la cual puede ser instalada en un IDE moderno de ARDUINO mediante el gestor de librerias ubicado en Sketch > Include Library > Manage Libraries; allí buscamos VS1053 y seleccionamos del resultado la librería «Adafruit VS1053 Library» y hacemos clic en Instalar.

También puede ser descargada del siguiente enlace para instalarla de forma manual:

https://github.com/adafruit/Adafruit_VS1053_Library/archive/master.zip

Para instalar la librería en el sistrema ARDUINO IDE se puede usar este tutorial:

https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use

Ejemplo de Reproducción MP3

Paso #1: Almacene en su tarjeta micro SD algunos archivos MP3 de su preferencia.

Paso #2: Utilice el ejemplo «feather_player» ubicado en File > Examples > Adafruit VS1053 Library > feather_player

Haz clic para ver el programa
// Specifically for use with the Adafruit Feather, the pins are pre-set here!

// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <SD.h>
#include <Adafruit_VS1053.h>

// These are the pins used
#define VS1053_RESET   -1     // VS1053 reset pin (not used!)

// Feather ESP8266
#if defined(ESP8266)
  #define VS1053_CS      16     // VS1053 chip select pin (output)
  #define VS1053_DCS     15     // VS1053 Data/command select pin (output)
  #define CARDCS          2     // Card chip select pin
  #define VS1053_DREQ     0     // VS1053 Data request, ideally an Interrupt pin

// Feather ESP32
#elif defined(ESP32)
  #define VS1053_CS      32     // VS1053 chip select pin (output)
  #define VS1053_DCS     33     // VS1053 Data/command select pin (output)
  #define CARDCS         14     // Card chip select pin
  #define VS1053_DREQ    15     // VS1053 Data request, ideally an Interrupt pin

// Feather Teensy3
#elif defined(TEENSYDUINO)
  #define VS1053_CS       3     // VS1053 chip select pin (output)
  #define VS1053_DCS     10     // VS1053 Data/command select pin (output)
  #define CARDCS          8     // Card chip select pin
  #define VS1053_DREQ     4     // VS1053 Data request, ideally an Interrupt pin

// WICED feather
#elif defined(ARDUINO_STM32_FEATHER)
  #define VS1053_CS       PC7     // VS1053 chip select pin (output)
  #define VS1053_DCS      PB4     // VS1053 Data/command select pin (output)
  #define CARDCS          PC5     // Card chip select pin
  #define VS1053_DREQ     PA15    // VS1053 Data request, ideally an Interrupt pin

#elif defined(ARDUINO_NRF52832_FEATHER )
  #define VS1053_CS       30     // VS1053 chip select pin (output)
  #define VS1053_DCS      11     // VS1053 Data/command select pin (output)
  #define CARDCS          27     // Card chip select pin
  #define VS1053_DREQ     31     // VS1053 Data request, ideally an Interrupt pin

// Feather M4, M0, 328, nRF52840 or 32u4
#else
  #define VS1053_CS       6     // VS1053 chip select pin (output)
  #define VS1053_DCS     10     // VS1053 Data/command select pin (output)
  #define CARDCS          5     // Card chip select pin
  // DREQ should be an Int pin *if possible* (not possible on 32u4)
  #define VS1053_DREQ     9     // VS1053 Data request, ideally an Interrupt pin

#endif


Adafruit_VS1053_FilePlayer musicPlayer = 
  Adafruit_VS1053_FilePlayer(VS1053_RESET, VS1053_CS, VS1053_DCS, VS1053_DREQ, CARDCS);

void setup() {
  Serial.begin(115200);

  // if you're using Bluefruit or LoRa/RFM Feather, disable the radio module
  //pinMode(8, INPUT_PULLUP);

  // Wait for serial port to be opened, remove this line for 'standalone' operation
  while (!Serial) { delay(1); }
  delay(500);
  Serial.println("\n\nAdafruit VS1053 Feather Test");
  
  if (! musicPlayer.begin()) { // initialise the music player
     Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
     while (1);
  }

  Serial.println(F("VS1053 found"));
 
  musicPlayer.sineTest(0x44, 500);    // Make a tone to indicate VS1053 is working
  
  if (!SD.begin(CARDCS)) {
    Serial.println(F("SD failed, or not present"));
    while (1);  // don't do anything more
  }
  Serial.println("SD OK!");
  
  // list files
  printDirectory(SD.open("/"), 0);
  
  // Set volume for left, right channels. lower numbers == louder volume!
  musicPlayer.setVolume(10,10);
  
#if defined(__AVR_ATmega32U4__) 
  // Timer interrupts are not suggested, better to use DREQ interrupt!
  // but we don't have them on the 32u4 feather...
  musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int
#else
  // If DREQ is on an interrupt pin we can do background
  // audio playing
  musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT);  // DREQ int
#endif
  
  // Play a file in the background, REQUIRES interrupts!
  Serial.println(F("Playing full track 001"));
  musicPlayer.playFullFile("/track001.mp3");

  Serial.println(F("Playing track 002"));
  musicPlayer.startPlayingFile("/track002.mp3");
}

void loop() {
  Serial.print(".");
  // File is playing in the background
  if (musicPlayer.stopped()) {
    Serial.println("Done playing music");
    while (1) {
      delay(10);  // we're done! do nothing...
    }
  }
  if (Serial.available()) {
    char c = Serial.read();
    
    // if we get an 's' on the serial console, stop!
    if (c == 's') {
      musicPlayer.stopPlaying();
    }
    
    // if we get an 'p' on the serial console, pause/unpause!
    if (c == 'p') {
      if (! musicPlayer.paused()) {
        Serial.println("Paused");
        musicPlayer.pausePlaying(true);
      } else { 
        Serial.println("Resumed");
        musicPlayer.pausePlaying(false);
      }
    }
  }
  delay(100);
}



/// File listing helper
void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       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();
   }
}

Paso #3: Al ejecutar el programa, abra el monitor serial de IDE ARDUINO. El sistema listará los archivos encontrados en la tarjeta Micro-SD y ejecutará el primer archivo.

Sintetización MIDI

feather_solderjumper.jpg

Al soldar el jumper MIDI se configura el módulo para arrancar en modo MIDI.

Paso #1 – Ahora abriremos el ejemplo en File > Examples > Adafruit VS1053 Library > player_miditest

Paso #2 – Al subirlo al controlador se ejecuta una melodía en la Ocarina.

Referencia de Librería

La siguiente página contiene documentación sobre la librería VS1053

https://learn.adafruit.com/adafruit-music-maker-featherwing/library-reference

 6,329 total views,  1 views today

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

Autor

Comentarios

Escribe una respuesta o comentario

Tu dirección de correo electrónico no será publicada.

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