Comandar un PIC a través de la voz

Tutorial de como comandar un PIC a través de la voz con el módulo EasyVR

Biblioman

9/18/20129 min read

En este tutorial voy a describir cuales han sido mis experiencias con el módulo EasyVR y su conexión a un PIC. El objetivo era poder interactuar con el Microcontrolador a través de la voz y establecer una comunicación bidireccional con él, de tal manera que las ordenes se las mandáramos al PIC a través de un micrófono y el nos contestará por medio de un altavoz, un objetivo nada novedoso a estas alturas ya que hay bastantes ejemplos en la red que tratan sobre el uso de este módulo pero la mayoría de ellos están basados en la plataforma Arduino, aquí se tratará de hacer un ejemplo en C utilizando el compilador de CCS y basándonos en la documentación del fabricante.

Características principales del módulo EasyVR

  • 26 Voces y comandos pre-grabados de fábrica SI (Speaker Independent) en seis idiomas diferentes: inglés, italiano, alemán, francés, español y japonés.

  • Soporta hasta 32 comandos con su voz asociada creados por el usuario y definidos en cualquier idioma SD (Speaker Dependent).

  • Incluye una aplicación de escritorio para Windows, desde donde se le puede programar fácilmente los diferentes comandos y voces al módulo.

  • El módulo se puede conectar a cualquier host que disponga de una UART para la comunicación serie.

  • La alimentación del módulo es de 3.5 a 5V.

  • Dispone de un conjunto de comandos para interactuar fácilmente con el módulo a través del puerto serie, bien por medio de la aplicación de escritorio o bien a través de cualquier Microcontrolador que disponga de UART.

  • Tres pines de E/S digitales a niveles TTL de 3V DC (IO1, IO2, IO3).

  • Una salida de audio (PWM) para la conexión con un altavoz de 8 Ohmios.

  • Capacidad de reproducir hasta 9 minutos de sonidos y/o voces.

Dimensiones y asignación de pines

Esquema y conexión del circuito

Comentario del esquema: esta demo conecta el módulo EasyVR a un PIC16f877, el circuito recibe las instrucciones a través de la voz por medio de un micrófono conectado al EasyVR y el módulo responde a los comandos a través de un altavoz de 8 Ohmios conectado al módulo por medio del conector J2. El módulo se comunica con el PIC a través de una comunicación serie por medio de la UART. Pasemos a describir de forma más detallada los elementos del circuito.

  • El micrófono es del tipo omnidireccional es decir capta sonidos en un ángulo de 360º y en un margen de frecuencias que va desde los 100 Hz a los 20 KHz. Viene incluido con el módulo por lo que solo nos tenemos que preocupar de conectarlo al conector J3 del EasyVR.

  • El altavoz (no incluido) vale cualquiera que tenga una impedancia de 8 Ohmios, se conecta al conector J2 que es la salida de audio del módulo. Hay que tener cuidado con la impedancia del altavoz, el conectar un altavoz con menor impedancia puede dañar la salida de audio o el módulo entero.

  • El módulo dispone de un módulo de comunicación serie asíncrona (UART) para comunicarse con otros dispositivos como un Microcontrolador o con un PC a través de un puerto COM y un adaptador de niveles MAX 232 o MAX 2323 ya que el rango de tensión del módulo va desde 3.3V a 5V DC. La conexión es cruzada, es decir el pin ETX del módulo EasyVr va conectado al pin RX del PIC y el pin ERX del módulo al pin TX del PIC. La configuración de la UART del módulo es la siguiente:

- Velocidad: 9600 (defecto), 19200, 38700, 57600, 115200

- Trama: 8 bits de datos, 1 bit de parada, sin paridad y sin control de flujo.

  • La demo dispone de un conmutador para cambiar la conexión serie del PIC al PC y viceversa, muy útil para no tener que estar cambiando las conexiones.

  • Las salidas digitales que encenderán o apagaran las bombillas se hace a través de los pines RB1 y RB2 del PIC. Los transistores y los relés hacen de adaptadores de tensión ya que las bombillas trabajan a 220 V AC.

  • Del conector J4 del EasyVR solo se utiliza el pin /XM para poder actualizar la tabla de sonidos que reside en la memoria Flash del módulo. El EasyVR dispone de un bootloader gestionado por hardware, cuando la patilla /XM se encuentre a nivel alto el dispositivo entra en modo programación y permite actualizar la tabla de sonidos a través de la aplicación de escritorio. La patilla /XM se conecta a través de un jumper y una resistencia pull-up, el valor de esta resistencia depende de la tensión de alimentación aplicada al módulo que como hemos comentado puede variar entre 3.5 y 5V, internamente el módulo tiene conectada a la patilla /XM otra resistencia (pull-down) según se muestra en la figura de abajo:

Por tanto si en /XM tenemos que tener una tensión de 3V y aplicamos una tensión de alimentación de 5V, a partir de la fórmula del divisor de tensión calculamos el valor de R:

Nota: En la práctica a mi me ha ido bien con una resistencia de 1K.

Una foto de la demo montada

¿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:

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.

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.

*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:

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.

Podríamos comunicarnos con el módulo EasyVR únicamente a través del programa del Microcontrolador pero es más fácil configurar muchas de sus opciones a través de la aplicación de escritorio EasyVR Commander que el fabricante ofrece gratuitamente.

Junto a este programa también se instala la aplicación QuickSynthesis 5 (QS5) necesaria para codificar en el formato necesario (wap con 16 bits sin compresión y mono de 22050 Hz) los archivos de sonidos que se cargarán en la tabla de sonidos del módulo EasyVR:

La forma de utilizar ambos programas se muestra en el siguiente vídeo:

Nota: al vídeo le falta resolución (lo siento falta de presupuesto), se ve un poco mejor si se ve a pantalla completa.

Un vídeo con la demo funcionando la tenéis aquí:

Fuentes de información

https://www.fortebit.tech/easyvr-3-plus/
http://www.ccsinfo.com/
Audacity


Espero que el artículo os sea de utilidad, podéis descargar la versión en .pdf desde aquí

Un saludo