Comandar Un Pic Atravez de La Voz

12
12/10/2012 Biblioman AQUIHAYAPUNTES.COM COMANDAR UN PIC A TRAVÉS DE LA VOZ

Transcript of Comandar Un Pic Atravez de La Voz

Page 1: Comandar Un Pic Atravez de La Voz

12/10/2012

Biblioman

AQUIHAYAPUNTES.COM COMANDAR UN PIC A TRAVÉS DE LA

VOZ

Page 2: Comandar Un Pic Atravez 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.

Page 3: Comandar Un Pic Atravez de La Voz

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

Page 4: Comandar Un Pic Atravez de La Voz

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.

Page 5: Comandar Un Pic Atravez de La Voz

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 Ω

Page 6: Comandar Un Pic Atravez de La Voz

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:

Page 7: Comandar Un Pic Atravez de La Voz

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.

Page 8: Comandar Un Pic Atravez de La Voz

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.

Page 9: Comandar Un Pic Atravez de La Voz

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

Page 10: Comandar Un Pic Atravez de La Voz

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:

Page 11: Comandar Un Pic Atravez de La Voz

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

Page 12: Comandar Un Pic Atravez de La Voz

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.