domingo, 2 de agosto de 2015

VS1053 simple audio player - reproductor de audio



Funcionamiento


Como se conecta



El ejemplo fue extraído de: learn.adafruit


  1. LINE 2: 
  2. MIC+: 
  3. MIC-:
  4. AGND: 
  5. 3V3
  6. 0
  7. 1
  8. 2
  9. 3
  10. 4
  11. 5
  12. 6
  13. 7
  14. TX
  15. RX
  16. SD CV

  1. ROUT
  2. LOUT
  3. AGND
  4. AGND
  5. GND - Cable negro. 
  6. DREQ - Cable azul - Arduino #3
  7. VCC - Cable rojo.
  8. 3V3
  9. GND
  10. MISO - Cable azul - Arduino #12 (Mega 50)
  11. MOSI - Cable amarillo - Arduino #11 (Mega 51)
  12. SCLK - Cable blanco - Arduino #13 (Mega 52)
  13. RST - Cable verde - Arduino #9
  14. CS - Cable naranja - Arduino #10
  15. SDCS - Cable amarillo - Arduino #4
  16. XDCS - Cable naranja - Arduino #8

Preparamos todo antes de comenzar
  • VCC - Cable rojo - 5V
  • GND - Cable negro - GND
VCC

 GND

Conectar SPY y RESET
  • CLK - Cable blanco - Arduino #13 (Mega 52)
  • MISO - Cable azul - Arduino #12 (Mega 50)
  • MOSI - Cable amarillo - Arduino #11 (Mega 51)
  • RST - Cable verde - Arduino #9
  • CS -  Cable naranja - Arduino #10
CLK - Cable blanco - Arduino #13 (Mega 52)

MISO - Cable azul - Arduino #12 (Mega 50)

MOSI - Cable amarillo - Arduino #11 (Mega 51)
RST - Cable verde - Arduino #9

CS - cable naranja - Arduino #10

Conectar el resto de las señales digitales

  • XDCS - Cable naranja - Arduino #8
  • SDCS - Cable amarillo - Arduino #4
  • DREQ - Cable azul - Arduino #3
XDCS - Cable naranja - Arduino #8
SDCS - Cable amarillo - Arduino #4

DREQ - Cable azul - Arduino #3

Conectar el auricular Jack

(En este paso es diferente dependiendo la versión que tengas)
Si es un breakout v2
  • AGND - Pin centro, tierra(ground) - Cable negro
  • LOUT - Pin izquierdo - Cable naranja
  • ROUT - Pint derecho - Cable amarillo







Para la versión v1
  • GBUF - Pin centro, tierra(ground) - Cable negro
  • LOUT - Pin izquierdo - Cable naranja
  • ROUT - Pint derecho - Cable amarillo
Nos tiene quedar algo así 



Bajamos la librería descargar
Luego vamos a nuestro Arduino software y elegimos:
Archivo -> Ejemplos -> Adafruit vs1003 library -> player_simple

Para poder usar este ejemplo es necesario que carguen .mp3 en la microsd
Estos se deben llamar track001.mp3 track002.mp3
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>

#define RESET 9      
#define CS 10        
#define DCS 8        
#define CARDCS A0     
#define DREQ A1       

#define REC_BUTTON 7

Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(RESET, CS, DCS, DREQ, CARDCS);

File recording;  // el archivo donde va a hacer grabado
#define RECBUFFSIZE 128  // 64 o 128 bytes.
uint8_t recording_buffer[RECBUFFSIZE];

void setup() {
  Serial.begin(9600);
  Serial.println("Test de grabación VS1053 Ogg ");

  // inicialización del reproductor
  if (!musicPlayer.begin()) {
    Serial.println("No se encontró el VS1053");
    while (1);  // No hace nada, solo sirve para el Arduino Leonardo
  }

  musicPlayer.sineTest(0x44, 500);    // Hace un tono indicando que funciona
 
  if (!SD.begin(CARDCS)) {
    Serial.println("La SD fallo o no se encuentra");
    while (1);  // No hace nada
  }
  Serial.println("SD OK!");
  
  // Ajusta el volumen de los canales izquierdo y derecho
  musicPlayer.setVolume(10,10);
  
  // Cuando presiono el boton graba!
  pinMode(REC_BUTTON, INPUT);
  digitalWrite(REC_BUTTON, HIGH);
  
  // Carga el plugin de la memoria SD
  if (! musicPlayer.prepareRecordOgg("v44k1q05.img")) {
     Serial.println("No se pudo cargar el plugin");
     while (1);    
  }
}

uint8_t isRecording = false;

void loop() {  
  if (!isRecording && !digitalRead(REC_BUTTON)) {
    Serial.println("Comienzo grabar");
    isRecording = true;
    
    // Me fijo si ya existe el archivo y lo incremento
    char filename[15];
    strcpy(filename, "RECORD00.OGG");
    for (uint8_t i = 0; i < 100; i++) {
      filename[6] = '0' + i/10;
      filename[7] = '0' + i%10;
      // Si no existe crea el archivo y lo escribe
      if (! SD.exists(filename)) {
        break;
      }
    }
    Serial.print("Grabación número: "); Serial.println(filename);
    recording = SD.open(filename, FILE_WRITE);
    if (! recording) {
       Serial.println("No se pudo abrir el archivo");
       while (1);
    }
    musicPlayer.startRecordOgg(true); // uso del micrfono
  }
  if (isRecording)
    saveRecordedData(isRecording);
  if (isRecording && !digitalRead(REC_BUTTON)) {
    Serial.println("Fin de grabación");
    musicPlayer.stopRecordOgg();
    isRecording = false;
    // elmina todos los datos
    saveRecordedData(isRecording);
    // cerrar 
    recording.close();
    delay(1000);
  }
}

uint16_t saveRecordedData(boolean isrecord) {
  uint16_t written = 0;
  
  // lee cuantas palabras quedan
  uint16_t wordswaiting = musicPlayer.recordedWordsWaiting();
  
  // procesa cuando hay mas de 256 (512 bytes)  palabras por cada vez, para aumentar la velocidadat a time
  while (wordswaiting > 256) {
    for (int x=0; x < 512/RECBUFFSIZE; x++) {
      // llenar el buffer
      for (uint16_t addr=0; addr < RECBUFFSIZE; addr+=2) {
        uint16_t t = musicPlayer.recordedReadWord();
        recording_buffer[addr] = t >> 8; 
        recording_buffer[addr+1] = t;
      }
      if (! recording.write(recording_buffer, RECBUFFSIZE)) {
            Serial.print("No se pudo grabar1"); Serial.println(RECBUFFSIZE); 
            while (1);
      }
    }
    // llenar 512 bytes a la vez
    recording.flush();
    written += 256;
    wordswaiting -= 256;
  }
  
  wordswaiting = musicPlayer.recordedWordsWaiting();
  if (!isrecord) {
    Serial.print(wordswaiting); Serial.println(" restante");
    // terminando la grabación
    uint16_t addr = 0;
    for (int x=0; x < wordswaiting-1; x++) {
      // llenar el buffer
      uint16_t t = musicPlayer.recordedReadWord();
      recording_buffer[addr] = t >> 8; 
      recording_buffer[addr+1] = t;
      if (addr > RECBUFFSIZE) {
          if (! recording.write(recording_buffer, RECBUFFSIZE)) {
                Serial.println("No se pudo grabar2");
                while (1);
          }
          recording.flush();
          addr = 0;
      }
    }
    if (addr != 0) {
      if (!recording.write(recording_buffer, addr)) {
        Serial.println("No se pudo grabar3"); while (1);
      }
      written += addr;
    }
    musicPlayer.sciRead(VS1053_SCI_AICTRL3);
    if (! (musicPlayer.sciRead(VS1053_SCI_AICTRL3) & _BV(2))) {
       recording.write(musicPlayer.recordedReadWord() & 0xFF);
       written++;
    }
    recording.flush();
  }

  return written;
}

No hay comentarios:

Publicar un comentario