RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.

Control de un PIC por voz


















Para el control del PIC mediante órdenes verbales vamos a emplear el módulo EasyVR de Veear al que previamente le hemos creado las voces a reconocer (voces definidas por el usuario SD) y la tabla de sonidos a emplear. Aunque la enseñanza de estas voces se puede realizar desde código en el PIC, resulta más sencilla la enseñanza mediante el software EasyVR Commander a través del PC, tal como se ha explicado en el artículo correspondiente.

El ejemplo, meramente didáctico, va a consistir en reconocer voces, ya sean SI o SD, contenidas en uno de los grupos o wordset del EasyVR, reconocer parejas de voces mediante la combinación de 2 grupos y reproducir textos hablados. En el caso de voces SD, en un LCD aparecerá la etiqueta de la voz reconocida y la posición que ocupa dentro de su grupo. En el caso de voces SI, tan solo aparecerá la posición. Si se produce algún error en el reconocimiento de las voces, se mostrará el código del error y su descripción. Cada vez que se solicita el reconocimiento de una nueva voz, se indica en un mensaje de texto y simultáneamente con la reproducción de una frase. Todas estas opciones serán elegidas individualmente o de forma combinada según el estado de las entradas en el puerto A.
























Este sería el procedimiento para la ejecución de un comando del PIC sobre el EasyVR:


comando = 'l';            //Comando a emplear (l = idioma) 
argumento = 4;            //Argumento del comando (4 = español)
   
putc(comando);            //Envía comando elegido 
putc(argumento+'A');      //Envío del argumento en su equivalente ASCII

Respuesta=getc();         //Recibe la respuesta del EasyVR

Para el reconocimiento de voces...

comando = 'd';          //Comando a emplear (d = reconocimiento voces SD)
grupo = 3;              //Elección del grupo 3

putc(comando);            //Envía comando reconocimiento voces SD
putc(grupo+'A');          //Envío del argumento (Grupo)
respuesta=getc();         //Recibe respuesta del EasyVR
if (respuesta == 'r'){    //Si se ha reconocido la voz
   putc(' ');             //Solicita siguiente dato
   respuesta=getc();      //Recibe posición en el grupo
   posicion = respuesta;  //guarda la posición obtenida
}
if (respuesta == 'e'){    //Si no se ha reconocido la voz
   putc(' ');             //Solicita siguiente dato
   respuesta=getc();      //Recibe 1º dato de error de 4 bits
   error=respuesta;       //Guarda el dato de error
   putc(' ');             //Solicita siguiente dato
   respuesta=getc();      //Recibe 2º dato de error de 4 bits
   error=(error<<4)|(respuesta); //Transforma error en un byte de 8 bits
}

Obtenida la posición o el error, los gestionaremos para hacer la función deseada sobre el PIC. En el caso de reconocimiento de voces SI el procedimiento sería el mismo pero utilizando su correspondiente comando ('i'). La respuesta en caso de  reconocimiento sería 's'.

Con este otro código, reproduciremos un sonido o frase de la tabla de sonidos:

int16 indice = 1;          //Posición del sonido a reproducir en la tabla
volumen = 30;              //Volumen de la reproducción (entre 0 y 31)

indice_bajo=make8(indice,0);    //Parte alta de indice a indice_bajo
indice_alto=make8(indice,1);    //Parte alta de indice a indice_alto
putc('w');                      //Envía comando
putc(indice_alto+'A');          //Envía byte más peso del indice(8 bits)
putc(indice_bajo+'A');          //Envía byte más peso del indice(8 bits)
putc(volumen+'A');              //Envía el nivel de volumen
respuesta=getc();               //Recibe un dato del EasyVR

Para leer la etiqueta asociada a una voz SD:

int i=0;                        //Indice del buffer
int grupo = 3;                  //nº de grupo  
int posicion = 6;               //posición en el grupo
char etiqueta [16];             //Buffer etiqueta; max.16
    
putc('p');                      //Envía comando "lectura etiqueta"
putc(Grupo+'A');                //Envía el número de grupo
putc(posicion+'A');             //Envía posición en el grupo
respuesta=getc();               //Recibe un dato del EasyVR
putc(' ');                      //Solicita siguiente dato
respuesta=getc();               //Recibe un dato del EasyVR
putc(' ');                      //Solicita siguiente dato
respuesta=getc();               //Recibe un dato del EasyVR
putc(' ');                      //Solicita siguiente dato
respuesta=getc()-'A';           //Recibe nº de caracteres de la etiqueta
n_caracteres=respuesta;         //Guarda nº caracteres de la etiqueta
//Llena el buffer con los caracteres de la etiqueta
for(i=0;i<n_caracteres;i++) {
      putc(' ');                //Solicita siguiente carácter
      etiqueta[i]=getc();       //Llena el buffer
   }

Finalmente el procedimiento para obtener el nº de etiquetas dentro de un grupo de voces SD:

int grupo = 3;                  //nº de grupo 

putc('c');                      //Envía comando
putc(Grupo+'A');                //Envia nº de grupo
respuesta=getc();               //Recibe un dato del EasyVR
putc(' ');                      //Solicita siguiente dato
respuesta=getc()-'A';           //Recibe nº de etiquetas del grupo

El programa completo que se muestra para el ejemplo de funcionamiento está estructurado con llamadas a funciones para poderlo emplear como plantilla para otros proyectos cambiando tan solo el código contenido en la función main.

[+/-] Ver / Ocultar programa completo en C

En este vídeo se muestra el resultado. Se intenta reconocer voces de dos grupos diferentes. En uno de ellos hay contenidas voces de dirección y en el otro números. Deliberadamente se le hace reconocer un número (el nº 11) que no existe en el grupo para ver el mensaje de error asociado sobre el LCD.



Descarga del proyecto:

Control PIC por voz.


El proyecto contenido en el artículo ha sido diseñado con la versión v4.084 de CCS PIC C COMPILER


Artículo relacionado >> Configuración del módulo EasyVR


No hay comentarios:

Related Posts Plugin for WordPress, Blogger...

CONTACTA - (Haz referencia del artículo sobre el que trata la consulta o comentario)