El siguiente ejemplo, emplearemos un microcontrolador Arduino NANO, un VR3 (Voice Recognition) y un shield SD-Card, para desarrollar un simple control de luces (u otras cosas) por intermedio de nuestra VOZ, pero con un plus extra para hacerlo mas practico: "Cuando indicamos una acción, tenemos una respuesta de nuestro microcontrolador por medio de mensajes de audio "...
Para este proyecto, vamos a requerir descargar e instalar en nuestro IDE las librerias:
- SoftwareSerial.h
- VoiceRecognitionV3.h
- SimpleSDAudio.h
En la imagen anterior, podemos ver que en mi caso particular, como no tenia un micrófono común, implemente un micrófono inalámbrico, y como amplificador para escuchar los mensajes de audio, use un parlante bluetooth con entrada auxiliar...
Como no tengo una voz de locutor, los audios los genere con el traductor de google que permite descargarlos.
Estos audios, hay que editarlos con el siguiente editor on-line: Convert audio to WAV
En teoría, según la librería, tenía que convertir los audios 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!!!
El circuito para este proyecto, es el siguiente:
CSS:
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//Ejemplo: Ctrl VOZ con respuesta audible - prof.martintorres@educ.ar - ETI Patagonia
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#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);
}
}
}
Un video corto de como funciona el proyecto:
PD: Recuerden que el modulo de reconocimiento de voz requiere de un entrenamiento y grabado/programacion de los comandos... acá les comparto el instructivo que implemente yo para aprender como hacer este trabajo: