Siguenos en ...

Google+facebooktwitter

youtubepinterest RSS aquihayapuntes

Últimos Tutoriales

Licencia

Creative Commons

 

Todo el contenido de este sitio está bajo una licencia de Creative Commons

 

Comandar un PIC a través de la voz

 ¿Cómo se programa?

 

Para saber cómo realizar el programa en C que irá programado en el Microcontrolador primeramente deberemos conocer el protocolo de comunicación que implementa el módulo EasyVR  para comunicarse con él, como he comentado anteriormente esa comunicación se realizará a través de un puerto serie asíncrono según se muestra en la figura de abajo:

 

Conexión UART

 

El protocolo de comunicación sólo usa caracteres ASCII imprimibles, que pueden dividirse en dos grupos principales:
 

  •  Los caracteres que se utilizan para los comandos que recibe el módulo así como la respuesta que da el módulo a esos comandos, ambos serán siempre caracteres en minúscula. 
  • Los caracteres que se utilizan para enviar los parámetros de los comandos transmitidos como los recibidos serán siempre caracteres en mayúscula.  

 
Cada comando que se transmite por la línea Tx (del Host-MCU al EasyVR) con los parámetros necesarios (cero o mas caracteres) genera la correspondiente respuesta por parte del EasyVR que será recibida por el Host-MCU por la línea Rx, esta respuesta también puede tener argumentos o parámetros de cero o mas caracteres.  
 
Hay un retardo mínimo entre cada byte enviado al host-MCU por parte del módulo EasyVR que  inicialmente es de 20 ms pero que después podremos modificar en los rangos siguientes: 0 - 9 ms, 10 - 90 ms y 100 ms - 1 s para adaptar la velocidad de transmisión a la velocidad de proceso del host-MCU.
 
La comunicación es controlada por el host-MCU y cada byte que envía el módulo EasyVR en respuesta a un comando enviado por el host debe de ser reconocido por este que envía el carácter espacio (0x20)
 
Cuando el host-MCU envía una combinación incorrecta de comandos y/o argumentos el easyVR responde con un byte de estado que debe ser tratado correctamente por parte del host-MCU. También se debe de tener en cuenta el programar un retardo aceptable para recuperarse de fallos inesperados.
 
Si el host-MCU no envía todos los argumentos necesarios de un determinado comando, el comando es ignorado por el módulo, en este caso el módulo no envía en respuesta ningún byte de estado y el host-MCU puede enviar otro comando.
 
El módulo pasa automáticamente al modo sleep o de bajo consumo después de una puesta en marcha, para sacarlo de ese estado e iniciar la comunicación se envía un carácter cualquiera.
 
 
Comandos: a continuación voy a mostrar los comandos más importantes utilizados en la demo, así como los argumentos requeridos por cada uno de ellos, para ver todos los comandos implementados en el protocolo ver el manual del fabricante.

 

Tablas de comandos (1)

 

*Argumentos: [1] [2] establecen el índice que ocupa el sonido a reproducir en la tabla de sonidos según la siguiente fórmula: índice = [1] * 32 + [2]  
 
*Argumento [3] configura el volumen de la reproducción: 0 = Mínimo, 15 = Medio, 31 = Máximo.
 
 
En respuesta tenemos los posibles valores devueltos por el módulo, en el archivo de cabecera (protocol.h) viene la codificación para cada una de las etiquetas.  

 

Tabla de comandos (2)

 

*Argumentos [1]. Como argumento hay que pasarle el índice del grupo donde se encuentra las voces a reconoce: (0 = trigger, 1-15 = generic, 16 = password)
 
 
Los argumentos de los comandos como hemos dicho antes son caracteres imprimibles que siguen el siguiente criterio de codificación:

 

Tabla de argumentos

 

Ejemplo simplificado implementado en C

 
 
void main(void) 
{ 
while(TRUE) 
  { 
      switch (valor1){ 
      case 'r'://Voz reconocida 
         printf(" ");//Para que el EasyVR mande el siguiente valor. 
         valor1=getc(); 
         break; 
      case 'B': //Saludar 
         putc('w');//Comando para que se reproduzca un sonido de la TB de sonidos 
         putc('A');//[1] 
         putc('E');//[2] 
                   //indice=[1]x32+[2] 
         putc('P');//[3] --> Volumen de reproducción (3) valor por defecto. 
         valor1=getc();//leer OK ('o') 
         escucha();//Activamos la escucha 
         break; 
//mas cases…… 
      default:  
        printf("wAAP");//”beep” error en el reconocimiento de voz 
        valor1=getc();//leer OK ('o') 
        escucha();//Activamos la escucha 
        }  
       } 
  } 
void escucha(){ 
 while (valor1!='r'){ 
   printf("dB"); //Activación escucha 
   valor1=getc(); 
 } 
} 
 


Comentario:
 
 
En el ejemplo se pueden distinguir los dos comandos básicos utilizados para:
 

  • Reproducción de un sonido de la tabla de sonidos  

 
putc('w');//Comando para que se reproduzca un sonido de la TB de sonidos
putc('A');//[1]
putc('E');//[2]
              //indice=[1]x32+[2]
putc('P');//[3] --> Volumen de reproducción (3) valor por defecto.
valor1=getc();//leer OK ('o')
 
 
Enviamos el comando CMD_PLAY_SX cuyo código es ‘w’ en minúscula ya que se trata de un comando. Luego le enviamos los tres parámetros, los dos primeros para determinar el índice que ocupa el sonido en la tabla de sonidos, si sustituimos el valor de los argumentos según la tabla en la fórmula tenemos que índice= 0*32+4=4, luego el sonido a reproducir será el que ocupa la posición 4 en la tabla de sonidos. El valor del tercer parámetro (‘E’) tiene un valor de 15 que corresponde a un nivel de volumen medio.  
 
Cada vez que el comando es reconocido correctamente por el módulo este mandará un OK que tendremos que leer en el programa del host-MCU  

 

  • Reconocimiento de un comando definido por el usuario

 
En este caso el comando que utilizamos es CMD_RECOG_SD cuyo código es 'd' y que tiene como argumento el grupo donde se encuentra la voz a reconocer. Si el comando es aceptado el módulo responderá con un STS_RESULT (‘r’), en ese caso tendremos que enviarle un carácter en blanco, con esto le decimos al módulo que envíe el siguiente valor que contendrá la posición del comando en el grupo. Si el comando no es reconocido mandará un STS_ERROR en cuyo caso se entrará el default-case, se enviará un beep de error y pondremos el módulo otra vez en modo escucha a la espera del siguiente comando a reconocer.

 

© 2007-2017 AquiHayapuntes.com