Problemas en proyecto con librerias VR3+SD+TMRpcm

Hola, como están? Adquirí un modulo VoiceRecognitionV3 y me puse a jugar con él con el ejemplo de @EvAduina ... Con este ejemplo y otros que hay en el foro y dando vuelta por internet/YouTube, entendí bien como grabar los comandos de voz y cargarlos.
El problema arranco cuando eh querido hacer un poco mas grande el proyecto adicionando un modulo SD para reproducir audio en formato ".wav".
Inicialmente la idea era tener una respuesta de "VOZ" al activar / desactivar / o que no reconozca algún comando, así que fusioné el ejemplo que tenia y había probado de reproducir audio con el proyecto de @EvAduina y no me funcionó...
El mensaje luego de compilar es este:

El Sketch usa 15204 bytes (49%) del espacio de almacenamiento de programa. El máximo es 30720 bytes.
Las variables Globales usan 1711 bytes (83%) de la memoria dinámica, dejando 337 bytes para las variables locales. El máximo es 2048 bytes.
Poca memoria disponible, se pueden producir problemas de estabilidad.

El cuerpo del programa que hice fusionando ambos ejemplos es este:

#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <SD.h>                 // need to include the SD library
#define SD_ChipSelectPin 4     //using digital pin 4 on arduino nano 328
#include <TMRpcm.h>           //  also need to include this library...
#include <SPI.h> 
TMRpcm tmrpcm;   // create an object for use in this sketch


/**
  Connection
  Arduino    VoiceRecognitionModule
   2   ------->     TX
   3   ------->     RX
*/
VR myVR(2, 3);   // 2:RX 3:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

int lampara = 13;
int foco = 12;
int foco2 = 11;
int tele = 10;
int humi = 9;


#define strong    (1)
#define weak   (3)
#define mbde (2)
#define on (0)

#define bad (4)

/**
  @brief   Print signature, if the character is invisible,
           print hexible value instead.
  @param   buf     --> command length
           len     --> number of parameters
*/
void printSignature(uint8_t *buf, int len)
{
  int i;
  for (i = 0; i < len; i++) {
    if (buf[i] > 0x19 && buf[i] < 0x7F) {
      Serial.write(buf[i]);
    }
    else {
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible,
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized.
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if (buf[0] == 0xFF) {
    Serial.print("NONE");
  }
  else if (buf[0] & 0x80) {
    Serial.print("UG ");
    Serial.print(buf[0] & (~0x80), DEC);
  }
  else {
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if (buf[3] > 0) {
    printSignature(buf + 4, buf[3]);
  }
  else {
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);

  Serial.begin(115200);
  Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");

  pinMode(lampara, OUTPUT);
  pinMode(foco, OUTPUT);
  pinMode(foco2, OUTPUT);
  pinMode(tele, OUTPUT);
  pinMode(humi, OUTPUT);

/// configuracion tarjeta SD y audis wav ///
  tmrpcm.speakerPin = 9; //11 on Mega, 9 on Uno, Nano, etc
 
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
  return;   // don't do anything more if not
  }
 tmrpcm.volume(1);
 tmrpcm.play("1.wav"); //the sound file "1" will play each time the arduino powers up, or is reset
////////////////////////////////////////////

  if (myVR.clear() == 0) {
    Serial.println("Recognizer cleared.");
  } else {
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while (1);
  }

  if (myVR.load((uint8_t)strong) >= 0) {
    Serial.println("strong");

  }

  if (myVR.load((uint8_t)weak) >= 0) {
    Serial.println("weak");

  }

  if (myVR.load((uint8_t)mbde) >= 0) {
    Serial.println("mbde");

  }

  if (myVR.load((uint8_t)on) >= 0) {
    Serial.println("on");

  }

  if (myVR.load((uint8_t)bad) >= 0) {
    Serial.println("bad");

  }
}

void loop()
{
  int ret;
  ret = myVR.recognize(buf, 50);
  if (ret > 0) {
    switch (buf[1]) {
      case weak:
        if (digitalRead(tele) == 0) {
          digitalWrite(tele, HIGH);
          Serial.println("Television Encendida");
        }
        else {
          digitalWrite(tele, LOW);
          Serial.println("Television Apagada");
        }
        break;

      case bad:
        if (digitalRead(humi) == 0) {
          digitalWrite(humi, HIGH);
          Serial.println("Deshumidificador Encendido");
          tmrpcm.play("6.wav");
        }
        else {
          digitalWrite(humi, LOW);
          Serial.println("Deshumidificador Apagado");
        }
        break;


      case strong:
        if (digitalRead(foco) == 0) {
          digitalWrite(foco, HIGH);
          Serial.println("Foco Encendido");
          tmrpcm.play("4.wav");
          
        }
        else {
          digitalWrite(foco, LOW);
          Serial.println("Foco Apagado");
          
        }
        break;


      case on:
        if (digitalRead(lampara) == 0) {
          digitalWrite(lampara, HIGH);
          Serial.println("Lampara Encendida ;)");
          tmrpcm.play("5.wav");
        }
        else {
          digitalWrite(lampara, LOW);
          Serial.println("Lampara Apagada ;)");
        }
        break;


      case mbde:
        if (digitalRead(foco2) == 0) {
          digitalWrite(foco2, HIGH);
          Serial.println("Foco2 encendido ;)");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(foco2, LOW);
          Serial.println("Foco2 Apagado ;)");
        }

        break;

      default:
        Serial.println("Record function undefined");
        break;
    }
    /** voice recognized */
    printVR(buf);
  }
}

Al iniciar, se puede ver por el terminal serial que reconoce los comandos de voz cuando hablo, pero no funciona el reproductor de voz... La consulta concreta es:
Habrá problemas de compatibilidad / conflicto entre librerias o estoy haciendo algo mal?

Saludos desde la Patagonia

Código corregido

Tu publicación fue ** MOVIDA ** a su ubicación actual ya que es más adecuada.

¿Podría también tomarse unos minutos para Aprenda a usar el foro .

Aquí puede encontrar más ayuda general y consejos para la resolución de problemas.

Ya me pongo a leer tus recomendaciones para ver cómo publicar en el foro; Millón de disculpas

Te sugiero que cambies tu placa, el Uno/Nano o similar que estás usando se está quedando muy corto, deberías probarlo al menos en Mega, lo que además te evita tener que usar SoftwareSerial para tener un puerto serie virtual, ya que tiene 4 puertos serie "reales".
Ten en cuenta que el código que usaste de ejemplo, si bien corre en el Nano, no usa el reproductor ni la SD, obviamente tampoco las librerías asociadas, o sea que tiene suficiente espacio. No es tu caso...

Saludos

1 Like

Hola gatul; No tengo un mega, pero si a la mano un esp8266. Voy a probar con los pocos pines que tiene (por lo menos la reproducción del sonido y el VR3, y si logro hacerlo funcionar, después veré de sumarle un expansor IO i2c para controlar los relay.
Hoy a la tard modifiqué y logré hacerlo funcionar, pero no es estable. Mañana comparto acá lo que depure.
Soy nuevo con Arduino, mis comienzos fueron con los dino8051 en basic y después, toda la vida trabajé con PIC en ASM, basic y hace poco gracias a Arduino, también en C (por ahí me pegó algunos mareos, pero salen adelante jajajaja).
Gracias por contestar

Bien, como prometí, acá volví para subir lo que había corregido y funciono erráticamente. Esa inestabilidad, al parecer es por lo mismo que menciona gatul. Estas son las lineas del sketch que mejor me respondió

// Proyecto: Control Domotico V1.1   
// ETI Patagonia - prof.martintorres@educ.ar                             
// Arduino NANO + Modulo Elechouse Voice Recognition V3 + Reproductor de sonido .wav con SD
// https://forum.arduino.cc/t/problemas-en-proyecto-con-librerias-vr3-sd-tmrpcm/950833/4  


#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <SD.h>                 // need to include the SD library
#define SD_ChipSelectPin 4     //using digital pin 4 on arduino nano 328
#include <TMRpcm.h>           //  also need to include this library...
#include <SPI.h> 
TMRpcm tmrpcm;   // create an object for use in this sketch


/**
  Connection
  Arduino    VoiceRecognitionModule
   2   ------->     TX
   3   ------->     RX
*/
VR myVR(2, 3);   // 2:RX 3:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

int Ralarma = 13;
int Rcocina = 12;
int Rcomedor = 11;
int Rliving = 10;
//int Rdesactivar = 9;

#define encender   (0)
#define apagar     (1)
#define alarma     (2)
#define cocina     (3)
#define comedor    (4)
#define living     (5)
#define desactivar (6)

/**
  @brief   Print signature, if the character is invisible,
           print hexible value instead.
  @param   buf     --> command length
           len     --> number of parameters
*/
void printSignature(uint8_t *buf, int len)
{
  int i;
  for (i = 0; i < len; i++) {
    if (buf[i] > 0x19 && buf[i] < 0x7F) {
      Serial.write(buf[i]);
    }
    else {
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible,
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized.
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if (buf[0] == 0xFF) {
    Serial.print("NONE");
  }
  else if (buf[0] & 0x80) {
    Serial.print("UG ");
    Serial.print(buf[0] & (~0x80), DEC);
  }
  else {
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if (buf[3] > 0) {
    printSignature(buf + 4, buf[3]);
  }
  else {
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);
 Serial.begin(115200);
 Serial.println ("-----------------------");
 Serial.println ("-Control Domotico V1.1-");
 Serial.println ("-----------------------");

  pinMode(Ralarma, OUTPUT);
  pinMode(Rcocina, OUTPUT);
  pinMode(Rcomedor, OUTPUT);
  pinMode(Rliving, OUTPUT);
  //pinMode(Rdesactivar, OUTPUT);
 
/// configuracion tarjeta SD y audis wav ///
  tmrpcm.speakerPin = 9; //11 on Mega, 9 on Uno, Nano, etc
 
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
  return;   // don't do anything more if not
  }
 tmrpcm.volume(1);
 tmrpcm.play("1.wav"); //the sound file "1" will play each time the arduino powers up, or is reset
////////////////////////////////////////////

  if (myVR.clear() == 0) {
    Serial.println("Reconocimiento limpio!");
  } else {
    Serial.println("sin VR_V3");
    while (1);
  }

 if (myVR.load((uint8_t)encender) >= 0) {
    Serial.println("encender");

  }

   if (myVR.load((uint8_t)apagar) >= 0) {
    Serial.println("apagar");

  }
  
  if (myVR.load((uint8_t)alarma) >= 0) {
    Serial.println("alarma");

  }

  if (myVR.load((uint8_t)cocina) >= 0) {
    Serial.println("cocina");

  }

  if (myVR.load((uint8_t)comedor) >= 0) {
    Serial.println("comedor");

  }

  if (myVR.load((uint8_t)living) >= 0) {
    Serial.println("living");

  }

 if (myVR.load((uint8_t)desactivar) >= 0) {
    Serial.println("desactivar");
 }
}

void loop()
{
  int ret;
  ret = myVR.recognize(buf, 50);
  if (ret > 0) {
    switch (buf[1]) {
       
        case alarma:
        if (digitalRead(Ralarma) == 0) {
          digitalWrite(Ralarma, HIGH);
          Serial.println("Alarma Encendida");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(Ralarma, LOW);
          Serial.println("Alarma Apagada");
        }
        
        break;

        case cocina:
        if (digitalRead(Rcocina) == 0) {
          digitalWrite(Rcocina, HIGH);
          Serial.println("Iluminacion Cocina Encendida");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(Rcocina, LOW);
          Serial.println("Iluminacion Cocina Apagada");
        }
        
        break;

        case comedor:
        if (digitalRead(Rcomedor) == 0) {
          digitalWrite(Rcomedor, HIGH);
          Serial.println("Iluminacion Comedor Encendida");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(Rcomedor, LOW);
          Serial.println("Iluminacion Comedor Apagada");
        }
        
        break;  


      case living:
        if (digitalRead(Rliving) == 0) {
          digitalWrite(Rliving, HIGH);
          Serial.println("Iluminacion Living Encendida");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(Rliving, LOW);
          Serial.println("Iluminacion Living Apagada");
        }
        
        break;


         /**case desactivar:
        if (digitalRead(foco2) == 0) {
          digitalWrite(foco2, HIGH);
          Serial.println("Foco2 encendido ;)");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(foco2, LOW);
          Serial.println("Foco2 Apagado ;)");
        }

        break;

      default:
        Serial.println("Record function undefined");
        break;
    }
*/
    /** voice recognized */
    printVR(buf);
  }
}
}

Sumo un video para ver los errores que presenta... El VR3 reconoce los comandos y se puede ver en el terminal del IDE, pero las acciones a tomar no funcionan. Por ejemplo, en las líneas de los "case", living es la única que funciona bien, y el resto de los "cases" no cambian de estado.... El otro error es que la reproducción de sonido es esporádica...

Ahora a la tarde le voy a invertir un buen tiempo para ver si con lo poco que sé, logro migrar todo esto al ESP8266.

EDIT1: me tope con un problema, la libreria TMRpcm no es compatible con el ESP8266... estoy usando el buscador del foro, vamos a ver que encuentro

Bien, revolví bastante el buscador y Google tratando de encontrar una librería para el ESP8266 que pueda sustituir la librería TMRpcm, pero no encontré nada, o por lo menos, algo que me funcione; Así que volví al nano y probé la librería "SimpleSDAudio.h" y el sketch quedo mas liviano y ya funciona perfecta la parte de reconocimiento de voz, pero no logre sacar audio por el pin 9... si lo conecto en el pin 10, cuando activo u comando de voz se escucha una portadora pero sin audio, y cuando menciono el comando para desactivar esa función, se deja de escuchar la portadora...
tengo que leer mas el repositorio, quizás grabe y convertí mal los archivos ".wav" (8bits - 16.000hz - estéreo), además también leí que los nombres de los archivos deben de se cortos (hasta 8 caracteres) y yo los tenia largos (en el codigo de ejemplo ya estan corregidos)... mañana (hoy la tarde) será otro día. Les comparto lo que llevo hasta ahora

#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <SimpleSDAudio.h>
/**
  Connection
  Arduino    VoiceRecognitionModule
   2   ------->     TX
   3   ------->     RX
*/
VR myVR(2, 3);   // 2:RX 3:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

int Ralarma = 13;
int Rcocina = 12;
int Rcomedor = 11;
int Rliving = 10;
//int Rdesactivar = 9;

#define encender   (0)
#define apagar     (1)
#define alarma     (2)
#define cocina     (3)
#define comedor    (4)
#define living     (5)
#define desactivar (6)

void printSignature(uint8_t *buf, int len)
{
  int i;
  for (i = 0; i < len; i++) {
    if (buf[i] > 0x19 && buf[i] < 0x7F) {
      Serial.write(buf[i]);
    }
    else {
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if (buf[0] == 0xFF) {
    Serial.print("NONE");
  }
  else if (buf[0] & 0x80) {
    Serial.print("UG ");
    Serial.print(buf[0] & (~0x80), DEC);
  }
  else {
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if (buf[3] > 0) {
    printSignature(buf + 4, buf[3]);
  }
  else {
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup(void) {
  /** initialize */
myVR.begin(9600);
 Serial.begin (115200);//Velocidad del puerto serial
  // SdPlay.setSDCSPin(10); // Habilitar SÓLO si su tarjeta SD no está en el pin número 4 
 SdPlay.init(SSDA_MODE_HALFRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER);

 
Serial.println("---------------------------------------------------------------");
Serial.println("Modulo Elechouse Voice Recognition V3 + Reproductor de voz SD \r\nControl Domotico V1.1");
Serial.println("Torres Alejandro Martin-ETI Patagonia-prof.martintorres@educ.ar");
Serial.println("---------------------------------------------------------------");

  pinMode(Ralarma, OUTPUT);
  pinMode(Rcocina, OUTPUT);
  pinMode(Rcomedor, OUTPUT);
  pinMode(Rliving, OUTPUT);
  //pinMode(Rdesactivar, OUTPUT);


////////////////////////////////////////////

  if (myVR.clear() == 0) {
    Serial.println("Comandos cargados:");
  } else {
    Serial.println("No se encuentra el modulo de reconocimiento de voz V3");
    Serial.println("Por favor verificar la conexion y haga reset del equipo");
    while (1);
  }

 if (myVR.load((uint8_t)encender) >= 0) {
    Serial.println("encender");

  }

   if (myVR.load((uint8_t)apagar) >= 0) {
    Serial.println("apagar");

  }
  
  if (myVR.load((uint8_t)alarma) >= 0) {
    Serial.println("alarma");

  }

  if (myVR.load((uint8_t)cocina) >= 0) {
    Serial.println("cocina");

  }

  if (myVR.load((uint8_t)comedor) >= 0) {
    Serial.println("comedor");

  }

  if (myVR.load((uint8_t)living) >= 0) {
    Serial.println("living");

  }

 if (myVR.load((uint8_t)desactivar) >= 0) {
    Serial.println("desactivar");
 }
}

void loop()
{
  int ret;
  ret = myVR.recognize(buf, 50);
  if (ret > 0) {
    switch (buf[1]) {
      case alarma:
          
        if (digitalRead(Ralarma) == 0) {
          digitalWrite(Ralarma, HIGH);
          Serial.println("Alarma Encendida");
          SdPlay.setFile("falari.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
          }
//        if (digitalRead(Ralarma) == 1) {
//          digitalWrite(Ralarma, LOW);
//          Serial.println("Alarma Apagada");  
//        }
        else {
          digitalWrite(Ralarma, LOW);
          Serial.println("Alarma Apagada");
          SdPlay.setFile("falaro.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
        }
        break;
                
       case cocina:
        if (digitalRead(Rcocina) == 0) {
          digitalWrite(Rcocina, HIGH);
          Serial.println("Iluminacion Cocina Encendida");
          SdPlay.setFile("flucesi.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
        }
//        if (digitalRead(Rcocina) == 1) {
//          digitalWrite(Rcocina, LOW);
//          Serial.println("Iluminacion Cocina Apagada");
//        }
        else {
          digitalWrite(Rcocina, LOW);
          Serial.println("Iluminacion Cocina Apagada");
          SdPlay.setFile("fluceso.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
        }
        break;


      case comedor:
        if (digitalRead(Rcomedor) == 0) {
          digitalWrite(Rcomedor, HIGH);
          Serial.println("Iluminacion Comedor Encendida");
           SdPlay.setFile("flucesi.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
          }
//         if (digitalRead(Rcomedor) == 1) {
//          digitalWrite(Rcomedor, LOW);
//          Serial.println("Iluminacion Comedor Apagada");
//         } 
        else {
          digitalWrite(Rcomedor, LOW);
          Serial.println("Iluminacion Comedor Apagada");
          SdPlay.setFile("fluceso.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
         } 
        break;


      case living:
        if (digitalRead(Rliving) == 0) {
          digitalWrite(Rliving, HIGH);
          Serial.println("Iluminacion Living Encendida");
           SdPlay.setFile("flucesi.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
        }
//         if (digitalRead(Rliving) == 1) {
//          digitalWrite(Rliving, LOW);
//          Serial.println("Iluminacion Living Apagada");
//        }
        else {
          digitalWrite(Rliving, LOW);
          Serial.println("Iluminacion Living Apagada");
          SdPlay.setFile("fluceso.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(500);
          SdPlay.stop();
        }
        
        break;


         /**case desactivar:
        if (digitalRead(foco2) == 0) {
          digitalWrite(foco2, HIGH);
          Serial.println("Foco2 encendido ;)");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(foco2, LOW);
          Serial.println("Foco2 Apagado ;)");
        }

        break;

      default:
        Serial.println("Record function undefined");
        break;
    }
*/
    /** voice recognized */
    printVR(buf);
  }
}
}

En la documentación de la librería dice

For full rate use -r 62500 @ 16MHz, -r 31250 @ 8 MHz
For half rate use -r 31250 @ 16MHz, -r 15625 @ 8 MHz

Revisa eso porque 16000 no sería una samplerate admitida.

Además ten en cuenta que la extensión del archivo también varía según la samplerate

8-Bit
.AFM - Fullrate, mono
.AFS - Fullrate, stereo
.AHM - Halfrate, mono
.AHS - Halfrate, stereo

16-Bit
.BFM - Fullrate, mono
.BFS - Fullrate, stereo (not supported)
.BHM - Halfrate, mono
.BHS - Halfrate, stereo

Saludos

1 Like

Encontré los dos errores que estaba cometiendo!!!
Por un lado, use una página para convertir los audios.
En teoría tenía que convertirlos en 8bits-mono-16000Khz... Al compilar, cuando reproducía el audio, se escuchaba acelerado.
Se me ocurrió convertirlos en wav de 8bits-mono-16000Khz y al compilar, al momento de reproducir audio, se escuchó perfecto!!!
Me quedaba un error por corregir, que era el funcionamiento erratico de las respuestas a los comandos. Le saque todos los diálogos del terminal serial para ahorrar recursos y sobre la marcha, me di cuenta que la asignación de los relay, estaban afectados a la SD, así que cambié a los pines 5-6-7 y 8, compile el sketch y quedó funcionando!!!
Ahora subo el sketch y video.
Esta es la primera parte de la idea que tengo :thinking: después tengo que pensar en el tema de la respuesta a los comandos que no entiende (no recuerdo cómo encontrarlo en el buffet del vr3) , y mejorar las órdenes y respuestas para que pueda dar órdenes de otra manera:
Comando de voz: Alarma ---> entra en un bucle y espera a que diga el comando de voz "activar" o "desactivar"...
Lo mismo para las luces, etc etc ...
Gracias a todos, en un rato comparto todo

¡Excelente!
¡Felicitaciones!
Dale, muéstranos como funciona el "engendro". :wink:

Saludos

1 Like

Bien, como prometí, acá esta la primera parte del proyecto funcionando bien

Como mencioné anteriormente, use una pagina para hacer la conversión de los archivos:

Yo no se si es la pagina o la ultima librería de "SimpleSDAudio" el que tiene el bug, ya que en la wiki leí que si se trabaja con un Arduino UNO o NANO configurado en MODE_HALFRATE y MODE_MONO, los audios tiene que tener formato ".wav" - "8bits" - "mono" - "16000hz", y solo funcionó con la configuración ".wav" - "8bits" - "estereo" - "16000hz"...
Por las dudas aclaro esto de la página o versión de librería (SimpleSDAudio v1.03) que use, ya que si alguien quiere hacerlo con software u otra pagina, tiene que ver este tema para que funcione bien.

#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <SimpleSDAudio.h>
/**
  Connection
  Arduino    VoiceRecognitionModule
   2   ------->     TX
   3   ------->     RX
*/
VR myVR(2, 3);   // 2:RX 3:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

int Ralarma = 5;
int Rcocina = 6;
int Rcomedor = 7;
int Rliving = 8;
//int Rdesactivar = 9;

#define encender   (0)
#define apagar     (1)
#define alarma     (2)
#define cocina     (3)
#define comedor    (4)
#define living     (5)
#define desactivar (6)

void printSignature(uint8_t *buf, int len)
{
  int i;
  for (i = 0; i < len; i++) {
    if (buf[i] > 0x19 && buf[i] < 0x7F) {
      Serial.write(buf[i]);
    }
    else {
//      Serial.print("[");
//      Serial.print(buf[i], HEX);
//      Serial.print("]");
    }
  }
}

void printVR(uint8_t *buf)
{
 // Serial.println("VR Index\tGroup\tRecordNum\tSignature");

 // Serial.print(buf[2], DEC);
 // Serial.print("\t\t");

  if (buf[0] == 0xFF) {
//    Serial.print("NONE");
  }
  else if (buf[0] & 0x80) {
 //   Serial.print("UG ");
 //   Serial.print(buf[0] & (~0x80), DEC);
  }
  else {
 //   Serial.print("SG ");
 //   Serial.print(buf[0], DEC);
  }
//  Serial.print("\t");

//  Serial.print(buf[1], DEC);
//  Serial.print("\t\t");
  if (buf[3] > 0) {
    printSignature(buf + 4, buf[3]);
  }
  else {
//    Serial.print("NONE");
  }
//  Serial.println("\r\n");
}

void setup(void) {
  /** initialize */
myVR.begin(9600);
 Serial.begin (115200);//Velocidad del puerto serial
  // SdPlay.setSDCSPin(10); // Habilitar SÓLO si su tarjeta SD no está en el pin número 4 
 SdPlay.init(SSDA_MODE_HALFRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER);

 Serial.println("-LISTO!-");


  pinMode(Ralarma, OUTPUT);
  pinMode(Rcocina, OUTPUT);
  pinMode(Rcomedor, OUTPUT);
  pinMode(Rliving, OUTPUT);
  //pinMode(Rdesactivar, OUTPUT);


////////////////////////////////////////////

  if (myVR.clear() == 0) {
    Serial.println("Comandos cargados:");
  } else {
 //   Serial.println("No se encuentra el modulo de reconocimiento de voz V3");
 //   Serial.println("Por favor verificar la conexion y haga reset del equipo");
    while (1);
  }

 if (myVR.load((uint8_t)encender) >= 0) {
  //  Serial.println("encender");

  }

   if (myVR.load((uint8_t)apagar) >= 0) {
  //  Serial.println("apagar");

  }
  
  if (myVR.load((uint8_t)alarma) >= 0) {
   // Serial.println("alarma");

  }

  if (myVR.load((uint8_t)cocina) >= 0) {
   // Serial.println("cocina");

  }

  if (myVR.load((uint8_t)comedor) >= 0) {
    //Serial.println("comedor");

  }

  if (myVR.load((uint8_t)living) >= 0) {
    //Serial.println("living");

  }

 if (myVR.load((uint8_t)desactivar) >= 0) {
    //Serial.println("desactivar");
 }
}

void loop()
{
  int ret;
  ret = myVR.recognize(buf, 50);
  if (ret > 0) {
    switch (buf[1]) {
      case alarma:
        if (digitalRead(Ralarma) == 0) {
          digitalWrite(Ralarma, HIGH);
          Serial.println("Alarma Encendida");
          SdPlay.setFile("alari.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
             }
        else {
          digitalWrite(Ralarma, LOW);
          Serial.println("Alarma Apagada");
          SdPlay.setFile("alaro.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
             }
        break;
       case cocina:
        if (digitalRead(Rcocina) == 0) {
          digitalWrite(Rcocina, HIGH);
          Serial.println("Iluminacion Cocina Encendida");
          SdPlay.setFile("lucesi.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
             }
        else {
          digitalWrite(Rcocina, LOW);
          Serial.println("Iluminacion Cocina Apagada");
          SdPlay.setFile("luceso.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
             }
break;
       case comedor:
        if (digitalRead(Rcomedor) == 0) {
          digitalWrite(Rcomedor, HIGH);
          Serial.println("Iluminacion Comedor Encendida");
          SdPlay.setFile("lucesi.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
             }
        else {
          digitalWrite(Rcomedor, LOW);
          Serial.println("Iluminacion Comedor Apagada");
          SdPlay.setFile("luceso.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
                    
         } 
break;
       case living:
        if (digitalRead(Rliving) == 0) {
          digitalWrite(Rliving, HIGH);
          Serial.println("Iluminacion Living Encendida");
          SdPlay.setFile("lucesi.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
             }
        else {
          digitalWrite(Rliving, LOW);
          Serial.println("Iluminacion Living Apagada");
          SdPlay.setFile("luceso.wav");//con setFile vamos a cargar el archivo que queremos reproducir
          SdPlay.play(); // play reproduciomos el archivo  
          delay(1400);
          SdPlay.stop();
            }
break;


         /**case desactivar:
        if (digitalRead(foco2) == 0) {
          digitalWrite(foco2, HIGH);
          Serial.println("Foco2 encendido ;)");
          tmrpcm.play("3.wav");
        }
        else {
          digitalWrite(foco2, LOW);
          Serial.println("Foco2 Apagado ;)");
        }

        break;

      default:
        Serial.println("Record function undefined");
        break;
    }
*/
    /** voice recognized */
    printVR(buf);
  }
}
}

Elconexionado del hardware esta dado de esta manera:

VR3pin --- NANO/UNOpin
TX ---------- 2
RX ---------- 3
GND------- GND
VCC-------- 5v

Shield SDpin --- NANO/UNOpin
MISO -------------- 12
MOSI -------------- 11
SCK ---------------- 13
CS ------------------- 4
5VCC --------------- 5v
GND --------------- GND

Shield 4RELAYpin --- NANO/UNOpin
R1 -------------------------- 5
R2 -------------------------- 6
R3 -------------------------- 7
R4 -------------------------- 8
GND ----------------------- GND
VCC------------------------- 5v

Subo también el diagrama de conexiones o se entiende?
Si no les molesta a los moderadores, me gustaría saber si puedo seguir usando este hilo para seguir subiendo las actualizaciones del proyecto.; Desde yá, muchas gracias a todos por sus portes!!!

Moderador:
Desde ya que puedes, esa es la idea. Ir mostrando como empieza una idea con todos sus problemas y como se van resolviendo, sea por tu cuenta o con ayuda del foro.

1 Like

@eti_patagonia te recomiendo Audacity, tiene versiones para Windows, Linux y Mac, es muy sencillo de usar y puedes convertir a casi cualquier formato de audio.
No es simplemente un conversor, es un editor de audio así que te puede servir para grabar, cortar, y demás tareas que necesites hacer con tus audios.
Y lo más importante, a pesar de su gran calidad es gratis. :wink:

Saludos

PD: Otra opción, en la carpeta de la librería deberías tener WinSox que es un conversor por línea de comandos que gentimente el autor incluyó con la misma, fijate en la documentación de la librería para más datos.

1 Like

Seeee, Winsox fue lo primero que intenté usar, pero en mí win10 el archivo ".bat" no funcionó. Genera una carpeta y dentro de esta no hay nada. Probé desde la consola cmd, probé como administrador, etc etc, y nada. Me volví mono hasta que preferí buscarle la vuelta por el lado de los conversores online.
Tengo ese software editor de audio gratuito que mencionas, pero sinceramente no lo se usar. Me voy a tomar un buen rato para ver tutoriales

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.