domingo, 2 de agosto de 2015

vs1053 grabador de sonido audio ogg mp3 adafruit


Comencemos hablando sobre que es Ogg.
Ogg es un formato contenedor libre y abierto, desarrollado y mantenido por la Fundación Xiph.Org que no está restringido por las patentes de software, y está diseñado para proporcionar una difusión de flujo eficiente y manipulación de multimedios digitales de alta calidad.

El formato contenedor Ogg puede multiplexar varios flujos independientes para audio, vídeo, texto (como subtítulos) y metadatos. En el marco multimedia Ogg, Theora ofrece una capa de vídeo con pérdidas.

Debido a que el formato de Ogg es libre, varios códecs de Ogg se han incorporado en una serie de diferentes reproductores de medios libres y propietarios, así como reproductores de medios portátiles y receptores GPS de diferentes fabricantes

Fuente: Wikipedia
Producto vs1053
Ejemplo extraído de learn.adafruit pdf foro_ayuda
VS1053 datasheet
Hay que descargar v44k1q05.img a la microsd

El ejemplo record_ogg example sketch convierte el VS1053en un dispostivo que puede grabar en OGG en la micro-SD en tiempo real.

Este es el ejemplo que nos provee learn.adafruit


Pero nosotros utilizaremos los aprendido en

Comencemos con el cableado (wiring)
Power y ground (tierra)
  • VCC - 5V Arduino
  • GND - GND Arduino
SPI basic connections (Serial Interface peripheral)
  • SLCK - Arduino #13
  • MOSI - Arduino #11
  • MISO - Arduino #12
  • CS - Arduino #10
Señales de controles adicionales
  • SDCS - Arduino A0
  • XDCS - Arduino #8
  • RST - Arduino #9
  • DREQ - Arduino A1
Momentáneamente Boton de Comienzo/Parar (Start/Stop button momentary) 
  • desde el Arduino #7 a GND


Respecto al tutorial simple audio player solo han cambiado el SCDS y DREQ de señales digitales a señales analógicas. Todo lo demás sigue igual.







Fotos reales





#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;
}

2 comentarios:

  1. hola, en verdad estoy intentando utilizar este codigo, pero no he podido escuchar lo que grabo, ya que me guarda archivos ogg, pero a la hora de reproducirlos, no son conciderados por el reproductor, intente con otros programas pero al parecer es un problema de generar los archivos. Realmente les funciono?

    ResponderEliminar
  2. Tengo un problema con la grabación ya que me sale con un sonido borroso talvez me puedes ayudar

    ResponderEliminar