12/10/2012
Biblioman
AQUIHAYAPUNTES.COM COMANDAR UN PIC A TRAVÉS DE LA
VOZ
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 2
Introducción
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.
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 3
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
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 4
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.
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 5
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:
o Velocidad: 9600 (defecto), 19200, 38700, 57600, 115200
o 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:
R = 5
3∗ 1000 -1000 ≈ 680 Ω
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 6
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:
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 7
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.
Nombre del comando
Código Descripción Argumentos Respuesta
CMD_PLAY_SX 'w' (77h) Reproducción de sonidos en la T.
Sonidos [1] [2] [3]
STS_SUCCESS, STS_ERROR
*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.
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 8
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.
Nombre del comando
Código Descripción Argumentos Respuesta
CMD_RECOG_SD 'd' (64h) Activa
reconocimiento de voz SD/SV
[1]
STS_RESULT, STS_SIMILAR, STS_TIMEOUT,
STS_ERROR
*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.
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 9
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
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 10
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:
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 11
La forma de utilizar ambos programas se muestra en el siguiente vídeo:
http://www.youtube.com/watch?v=E1siC-wlNKc
Nota: el vídeo le falta resolución (lo siento falta de presupuesto), se ve un poco
mejor si se ve a pantalla completa
Comandar un PIC a través de la voz
Biblioman www.AquiHayApuntes.com Página 12
Un vídeo con la demo funcionando la tenéis aquí:
http://www.youtube.com/watch?v=2kSQM2rmjcY
Puedes seguir el desarrollo de esta demo en el siguiente hilo del foro.
Fuentes de información
http://www.veear.eu
http://www.ccsinfo.com/
Audacity
Marcas registradas
Las marcas citadas en este artículo así como algunas de las imágenes procedentes de
capturas de pantallas pertenecen a sus respectivos propietarios, su utilización en este
artículo es con fines educativos y sin ánimo de lucro.
Copyrigh © 2012 AquiHayApuntes.com
Autor de este artículo: Biblioman
Versión: 1.01
Página Web: http:\\www.aquihayapuntes.com
Email: [email protected]
Puedes copiar y distribuir libremente este artículo haciendo referencia al contenido de
este párrafo.