Grabadora de Audio - VS1053

Hola a todos,

Primero soy muy nuevo en arduino pero en las ultimas semanas me e dedicado a aprender todo lo que puedo de este gran proyecto.

Ruego a la comunidad su ayuda, necesito crear una grabadora de audio para un proyecto empresarial e logrado algunas cosas pero quede detenido en lo fundamental el grabar audio los componentes que estoy usando son

Geeetech VS1053 MP3 player shield

Arduino UNO

Ya e logrado reproducir el audio que se almacena en la tarjeta SD pero no e logrado grabar el audio.

Ruego si alguien conoce sobre la tarjeta Geeetech VS1053 MP3 player shield, y un código ejemplo para grabar audio para mi seria de una gran ayuda ya que e buscado por toda la red y no encontrado nada e leído lo que hay sobre el componente pero no encuentro la forma de que grabe el audio del micrófono y lo almacene en la tarjeta SD

Agradezco a quien me pueda ayudar con este proyecto

Un saludo

¿Has probado esto?

Me genera todos estos errores

Arduino:1.8.9 (Windows 7), Tarjeta:"Arduino/Genuino Uno"

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:32:22: error: 'setstate' was not declared in this scope

       setstate(eofbit);

                      ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:36:29: error: 'getmode' was not declared in this scope

   if (c != '\r' || (getmode() & ios::binary)) return c;

                             ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:39:25: error: 'seekCur' was not declared in this scope

   if (s == 1) seekCur(-1);

                         ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: At global scope:

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:43:6: error: 'SdStreamBase' has not been declared

 void SdStreamBase::open(const char* path, ios::openmode mode) {

      ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: In function 'void open(const char*, ios_base::openmode)':

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:45:19: error: 'app' was not declared in this scope

   switch (mode & (app | in | out | trunc)) {

                   ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:45:25: error: 'in' was not declared in this scope

   switch (mode & (app | in | out | trunc)) {

                         ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:45:30: error: 'out' was not declared in this scope

   switch (mode & (app | in | out | trunc)) {

                              ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:51:10: error: the value of 'app' is not usable in a constant expression

     case app:

          ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:45:19: note: 'app' was not declared 'constexpr'

   switch (mode & (app | in | out | trunc)) {

                   ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:56:10: error: the value of 'in' is not usable in a constant expression

     case in:

          ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:45:25: note: 'in' was not declared 'constexpr'

   switch (mode & (app | in | out | trunc)) {

                         ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:68:10: error: the value of 'out' is not usable in a constant expression

     case out:

          ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:45:30: note: 'out' was not declared 'constexpr'

   switch (mode & (app | in | out | trunc)) {

                              ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:77:36: error: cannot call member function 'bool FatFile::open(const char*, oflag_t)' without object

   if (!SdBaseFile::open(path, flags)) goto fail;

                                    ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:78:15: error: 'setmode' was not declared in this scope

   setmode(mode);

               ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:79:9: error: 'clear' was not declared in this scope

   clear();

         ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:83:21: error: cannot call member function 'bool FatFile::close()' without object

   SdBaseFile::close();

                     ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:84:12: error: 'failbit' was not declared in this scope

   setstate(failbit);

            ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:84:19: error: 'setstate' was not declared in this scope

   setstate(failbit);

                   ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: At global scope:

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:88:6: error: 'SdStreamBase' has not been declared

 void SdStreamBase::putch(char c) {

      ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: In function 'void putch(char)':

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:89:30: error: 'getmode' was not declared in this scope

   if (c == '\n' && !(getmode() & ios::binary)) {

                              ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:90:15: error: 'write' was not declared in this scope

     write('\r');

               ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:92:10: error: 'write' was not declared in this scope

   write(c);

          ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:93:7: error: 'writeError' was not declared in this scope

   if (writeError) setstate(badbit);

       ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:93:28: error: 'badbit' was not declared in this scope

   if (writeError) setstate(badbit);

                            ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:93:34: error: 'setstate' was not declared in this scope

   if (writeError) setstate(badbit);

                                  ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: At global scope:

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:96:6: error: 'SdStreamBase' has not been declared

 void SdStreamBase::putstr(const char* str) {

      ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: In function 'void putstr(const char*)':

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:100:46: error: 'getmode' was not declared in this scope

     if (c == '\0' || (c == '\n' && !(getmode() & ios::binary))) {

                                              ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:101:30: error: 'write' was not declared in this scope

       if (n > 0) write(str, n);

                              ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:103:17: error: 'write' was not declared in this scope

       write('\r');

                 ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:109:7: error: 'writeError' was not declared in this scope

   if (writeError) setstate(badbit);

       ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:109:28: error: 'badbit' was not declared in this scope

   if (writeError) setstate(badbit);

                            ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:109:34: error: 'setstate' was not declared in this scope

   if (writeError) setstate(badbit);

                                  ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp: At global scope:

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:116:6: error: 'SdStreamBase' has not been declared

 bool SdStreamBase::seekoff(off_type off, seekdir way) {

      ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:116:28: error: 'off_type' was not declared in this scope

 bool SdStreamBase::seekoff(off_type off, seekdir way) {

                            ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:116:42: error: 'seekdir' was not declared in this scope

 bool SdStreamBase::seekoff(off_type off, seekdir way) {

                                          ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:116:53: warning: expression list treated as compound expression in initializer [-fpermissive]

 bool SdStreamBase::seekoff(off_type off, seekdir way) {

                                                     ^

C:\Program Files (x86)\Arduino\libraries\SdFat\SdStream.cpp:116:55: error: expected ',' or ';' before '{' token

 bool SdStreamBase::seekoff(off_type off, seekdir way) {

                                                       ^

exit status 1
Error compilando para la tarjeta Arduino/Genuino Uno.

Este informe podría contener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.

Hola a todos logre modificar el codigo para grabar tengo un nuevo problema, por medio de la consola de arduino graba perfecto pero al momento de armar el arduino con los pulsadores me pasa lo siguiente

  1. el play funciona correctamente pin 5 del ardunio
  2. el stop funciona correctamente pin 7 del arduino
  3. el rec no graba nada pin 8 del arduino

Como les digo por la consola de arduino me funciona perfecto pero no se que pasa que al armar con los pulsadores en la proto board no funciona el rec alguna ayuda

/**
 * \file RecorderDemo.ino
 *
 * \brief Example sketch of using the MP3Shield Arduino driver to record OGG.
 * \remarks comments are implemented with Doxygen Markdown format
 *
 * \author Miguel Moreto
 *
 * This sketch listens for commands from serial. The user can start recoring,
 * stop recording and play the recorded track.
 *
 * \note This example sketch was tested with a Teensy2.0++ board and a
 * generic MP3 module with VS1053b chipset. You can configure Teensyduino
 * as a mass storage device, so your SD card can be accessed in windows explorer.
 * It is very slow and cannot be safely removed but it is cool!
 */
#include <SPI.h>

//Add the SdFat Libraries
#include <SdFat.h>
#include <SdFatUtil.h>


#include <SFEMP3Shield.h>


#include <Bounce2.h>

// Pin definition:
#define PIN_PUSH_0 5 // Pushbutton Play pin
#define PIN_PUSH_1 7 // Pushbutton Stop pin
#define PIN_PUSH_2 8 // Pushbutton Rec pin
#define PIN_LED_REC 17 // Led to indicate recording
#define PIN_LED_OK 16  // Led to indicate ok status
#define PIN_LED_ERROR 15 // Led error.
#define PIN_AMP_SHUTDOWN 13 // Output pin to turn amplifier module on or off.


// bounce objects to debounce buttons.
Bounce PushButtonRotary = Bounce(PIN_PUSH_0, 10);  // 10 ms debounce
Bounce PushButtonStop = Bounce(PIN_PUSH_1,10);
Bounce PushButtonRec = Bounce(PIN_PUSH_2,10);

/**
 * \brief Object instancing the SdFat library.
 *
 * principal object for handling all SdCard functions.
 */
SdFat sd;

// Objects:
SFEMP3Shield MP3player;

// Using SDFatLib, limit the filenames to 8.3 format.
char trackname[] = "rec001.ogg";

/* 
 * Recorder plugin filename. This one is include in this demo folder.
 * If you whant to use other profile, consult Ogg Vorbis Encoder
 * application manual from VLSI:
 * http://www.vlsi.fi/fileadmin/software/VS10XX/VorbisEncoder170c.pdf
 * All the profile plugin files are stored in recorder_plugins.zip
 * included in SFEMP3Shield library plugins folder.
 */
char pluginfilename[] = "e44k1q05.vs"; // HiFi Voice Profile number 5: typical 87kbps

uint8_t ledstate = 0;

void setup() {

	Serial.begin(115200);

	// Play, stop and rec buttons.
	pinMode(PIN_PUSH_0, INPUT_PULLUP);
	pinMode(PIN_PUSH_1, INPUT_PULLUP);
	pinMode(PIN_PUSH_2, INPUT_PULLUP);
  
	// Output pins:
	pinMode(PIN_LED_OK,OUTPUT);
	pinMode(PIN_LED_REC,OUTPUT);
	pinMode(PIN_LED_ERROR,OUTPUT);
	pinMode(PIN_AMP_SHUTDOWN,OUTPUT);

	// Turn off the LEDs
	digitalWrite(PIN_LED_OK, LOW);
	digitalWrite(PIN_LED_REC, LOW);
	digitalWrite(PIN_LED_ERROR, LOW);
	digitalWrite(PIN_AMP_SHUTDOWN, LOW); // Turn off amplifier

	//Initialize the SdCard.
	if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();
	if(!sd.chdir("/")) sd.errorHalt("sd.chdir");

	StartMP3();

	// Binds a user defined function as a handler that is
	// executed at the end of recording.
	MP3player.bindEndRecordHandler(endRecordingHandler);

	help();
}

void loop()
{
	uint16_t result = 0;

	if (PushButtonRotary.update()) {
		if (PushButtonRotary.fallingEdge()){
			parse_menu('p');
		}
	}

	if (PushButtonStop.update()) {
		if (PushButtonStop.fallingEdge()){
			parse_menu('s');
		}
	}

	if (PushButtonRec.update()) {
		if (PushButtonRec.fallingEdge()){
			parse_menu('r');
		}
	}

	// If recorder is active, read data blocks from VS1053b chipset and
	// write them to track file.
	if (MP3player.isRecording()){
		result = MP3player.doRecordOgg();
		if (result > 0){ // Toogle rec led when one or more datablock (512B) are written.
			ledstate = ~ledstate;
			digitalWrite(PIN_LED_REC,ledstate); // Toogle rec led.
		}
		//Serial.println(result); // Print the number of databloks written.
	}

	// You can do something else here.


	if(Serial.available()) {
		parse_menu(Serial.read()); // get command from serial input
	}

  /* add main program code here */

}

/*
 * MP3 Player begin function. Restart VS1053 and load the firmware update.
 */
void StartMP3(){  
	uint8_t result; //result code,
	result = MP3player.begin();
	//check result, see readme for error codes.
	if(result != 0) {
		digitalWrite(PIN_LED_ERROR, HIGH); // Turn on error led
		Serial.print(F("Error code: "));
		Serial.print(result);
		Serial.println(F(" when trying to start MP3 player"));
		if ( result == 6 ) {
			Serial.println(F("Warning: patch file not found, skipping.")); // can be removed for space, if needed.
			Serial.println(F("Use the \"d\" command to verify SdCard can be read")); // can be removed for space, if needed.
		}
	}else{
		digitalWrite(PIN_LED_OK, HIGH); // Turn on ok led
	}
}


//------------------------------------------------------------------------------
/**
 * \brief Decode the Menu.
 *
 * Parses through the characters of the users input, executing corresponding
 * MP3player library functions and features then displaying a brief menu and
 * prompting for next input command.
 */
void parse_menu(byte key_command) {

  static uint8_t gain = 0;

  uint8_t result; // result code from some function as to be tested at later time.

  Serial.print(F("Received command: "));
  Serial.write(key_command);
  Serial.println(F(" "));

  //if s, stop the playing or recording the current track
  if(key_command == 's') {
    if(MP3player.isPlaying()){
	  MP3player.stopTrack();
	  Serial.println("Player stoped.");
	}
	if (MP3player.isRecording()){
	  Serial.println("Stoping recording...");
	  MP3player.stopRecording(); // Command to finish recording.
	  digitalWrite(PIN_LED_REC,LOW); // Turn off red led.
	}
	digitalWrite(PIN_AMP_SHUTDOWN, LOW); // Turn off amplifier
  } // 's' command
  else if(key_command == 'r'){ // If 'r', start recording.
    Serial.println("Start recording");
    MP3player.stopTrack(); // Stop playing if applicable.
	digitalWrite(PIN_LED_OK, LOW); // Turn off "ready to play" Led.
	result = MP3player.startRecordOgg(trackname, pluginfilename); // Start recording.
	if (result != 0){
		Serial.print("Error starting recorder: ");
		Serial.println(result);	
	}
  } // 'r' command
  else if (key_command == 'p'){ // If 'p', play recorded track.
    Serial.println("Restarting VS10xx...");	
	StartMP3(); // Restart MP3 in playing mode with latest patch.
	result = MP3player.playMP3(trackname);
	if (result != 0){
		Serial.print("Error playing track: ");
		Serial.println(result);
	}else{
		digitalWrite(PIN_AMP_SHUTDOWN, HIGH); // Turn on amplifier
		Serial.println("Playing...");	
	}
  } // 'p' command
  else if(key_command == 'h') { // Help
	  help();
  }
  else if(key_command == 'G') { // Help
	  if (gain < 63){
		  if(!MP3player.setRecGain(gain++)){
			  gain--;
			  Serial.println("Not recording.");
		  }else{
			  Serial.print("Gain setted to: ");
			  Serial.println(gain);
		  }
	  }
  }

  else if(key_command == 'g') { // Help
	  if (gain > 0){
		  if(!MP3player.setRecGain(gain--)){
			  gain++;
			  Serial.println("Not recording.");
		  }else{
			  Serial.print("Gain setted to: ");
			  Serial.println(gain);
		  }
	  }
  }
}

//------------------------------------------------------------------------------
/**
 * \brief Print Help Menu.
 *
 * Prints a full menu of the commands available along with descriptions.
 */
void help() {
  Serial.println("Arduino SFEMP3Shield Library OGG recorder Example:");
  Serial.println("SFEMP3Shield by Bill Porter & Michael P. Flaga");
  Serial.println("Recording functions by Miguel Moreto based on VLSI docs.");
  Serial.println("COMMANDS:");
  Serial.println(" [s] to stop recording or playing");
  Serial.println(" [r] start recording ogg file");
  Serial.println(" [p] play recorded track");
  Serial.println(" [G] increase gain");
  Serial.println(" [g] decrease gain");
}

/**
 * \brief Function executed once the recording ends.
 * 
 * A pointer to this function is passed to MP3player class by using 
 * the method bindEndRecordHandler(function);
 */

void endRecordingHandler(void) 
{
	Serial.println("Record finished");
	digitalWrite(PIN_LED_REC, LOW); // Turn off rec led
	digitalWrite(PIN_LED_OK, HIGH); // Turn on ok led
}

Hola a todos

Este es el error que me muestra cuando activo el pulsador en la proto board para que grabe el audio no se que pasa ya e revisado el codigo pero no se que mas hacer espero su ayuda

|500x186

la imagen no es visible, por favor edita tu imagen, no uses enlaces a Google Drive, dropbox, o sitios de almacenamiento de imagenes temporales porque en poco tiempo pueden desaparecer. Lo mejor es subirlas como adjunto y luego siguiendo la guia al final de las normas del foro copias el enlace de la imagen y la haces visible.

Hola a todos reenvió el mensaje al foro con la fotografía adjunta para que puedan ver el error que se me genera al activar el pulsador para que inicie la grabación del audio

"Este es el error que me muestra cuando activo el pulsador en la proto board para que grabe el audio no se que pasa ya e revisado el codigo pero no se que mas hacer espero su ayuda "

Sin título.jpg

No respondo respecto de tu error motivo del hilo sino tu error con las imagenes que no se ven, justamente se debe a que no puedes ir a imagenes de Google y capturar el enlace gigante que ahi aparece y pegarlo porque eso no funciona. En su lugar, lo descargas a tu pc, lo subes como adjunto, editas el post, copias antes el enlace de la imagen y al editar el post pegas dicho enlace como hice yo con tu caso.

Hola a todos bueno tanto hacer encontré una solución a mi error y la voy intentar explicar.

Cuando arme el circuito en la primera prueba lo hice sin los led indicadores que se señalan el código adjunto, luego de descartar código, arme el circuito tal cual como dice el código con los tres led indicadores y ahora el equipo funciona graba audio, da stop para finalizar el audio y da play para escucharlo, adjunto las fotos para que miren como arme el circuito.

Bueno pera las cosas no salieron tan fáciles como creía, cuando arme todo en la proto board los led indicadores funcionaban y el led rojo de rec parpadeaba indicando la grabación, al momento del armado final solo prende el led rojo de forma permanente.

Pero bueno eso creo que es mas un error de montaje que otra cosa.

El error que se me presenta es el siguiente.

Al hacer las pruebas el equipo graba sin error en teoría pero me sucede lo siguiente dado que lo necesito para que grabe por medio de un micrófono externo al conectar el micrófono a la entrada de la tarjeta este no graba por la entrada si no por el micrófono incorporado en la tarjeta como se muestra en las fotos.

Ahora que estoy en esta fase deseo encontrar como le digo al equipo que tome el audio por medio de la entrada de micrófono y no por el micrófono de la tarjeta ya que es fundamental para mi que este trabaje por medio de un micrófono externo.

Espero su ayuda y espero haberme echo entender de forma clara

IMG-20190424-WA0059.jpg

IMG-20190424-WA0060.jpg

IMG-20190424-WA0062.jpg

IMG-20190424-WA0064.jpg