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