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 sintetizador de voz SP03 con PIC

El sintetizador de voz SP03 “text to speech” reproduce oralmente cualquier cadena de caracteres ASCII. Para ello dispone de 3 posibilidades de comunicación; mediante comunicación RS232, mediante puerto paralelo y por bus I2C. En este proyecto emplearemos la comunicación I2C para el envío de mensajes con el PIC y la RS232 conectado al PC para la configuración y grabación de los mensajes predefinidos.
El modulo SP03 reproduce en el momento de su conexión siempre el mensaje que tenga alojado en la primera posición de los mensajes predefinidos. Sino se quiere que esto ocurra hay que dejar vacía esta posición.
Por tanto, lo primero que haremos es conectarnos vía RS232 desde el PC para dejar todas las posiciones vacias excepto la nº10 en la que alojaremos el mensaje “Me llamo robotypic” configurado en velocidad, tono y volumen y que mas tarde será uno de los mensajes que reproduciremos con el PIC.

Pulsa en la imagen para ampliarla.

El software de configuración se puede descargar aquí.


Descargado, ejecutamos el archivo sp03.exe y nos abrirá la siguiente ventana:


Se elije el puerto de comunicación al que estamos conectados al PC. Se deja en blanco la primera de las posiciones y escribimos en el resto de posiciones deseadas los mensajes que queramos. En nuestro caso solo emplearemos la posición 10. Se ajustan los valores de volumen, tono y velocidad para el texto y se prueba en el correspondiente botón “Test”.


Con todos los ajustes y textos deseados se pulsa “Program”. Ahora el sp03 ya se queda cargado y configurado para los textos predefinidos.

Toca controlar el sp03 mediante el PIC. En este proyecto se va a mostrar 3 formas de reproducir los mensajes:

-         Mediante la carga en el buffer del sp03 de todos los caracteres del mensaje a reproducir uno a uno. Sera el primer mensaje que reproduciremos; “Hola”.

-         Mediante la carga en el buffer del sp03 de la cadena de texto contenida en una variable. Serán los dos siguientes mensajes; “como estas?” y “soy tu amigo”

-         Y mediante la reproducción de los mensajes predefinidos accediendo a la posición en el sp03 donde se encuentran. El último de los mensajes; “me llamo robotypic”.

De los tres procedimientos, el primero es el menos adecuado, sobre todo cuando se quieren reproducir muchos mensajes diferentes, dado que nos dimensiona el codigo del programa del pic en exceso y nos obliga a conocer los valores ASCII de todos los caracteres empleados, pero como muestra didáctica del principio de funcionamiento del sp03 es bastante válido.

Pulsa en la imagen para ampliarla

Por tanto, lo primero que se debe hacer es cargar en el buffer del  SP03 el mensaje a reproducir:

i2c_start();            //Comienzo de la comunicación I2C ...
i2c_write(SP03_ID);     //...con la dirección del LCD03...
i2c_write(0x00);  //...apuntando a la posición 0 del registro del SP03
i2c_write(0x00);        //Comando nulo
i2c_write(0x00);        //Volumen máximo
i2c_write(0x05);        //velocidad 
i2c_write(0x03);        //Tono
i2c_write(0x48);        //texto "h"
i2c_write(0x6F);        //texto "o"
i2c_write(0x6C);        //texto "l"
i2c_write(0x61);        //texto "a"
i2c_write(0x00);        //Comando nulo
i2c_stop ();            //Finalización de la transmisión

Y una vez cargado reproducirlo con el comando 0x40:

i2c_start();            // Comienzo de la comunicación I2C...
i2c_write(SP03_ID);     // ...con la dirección I2c del Sp03 ...
i2c_write(0x00);   //...apuntando a la posición 0 del registro del sp03
i2c_write(0x40);   //reproduce el último mensaje cargado en el sp03
i2c_stop();             // Finalización de la transmisión

A continuación, para  cargar el mensaje en el buffer mediante el segundo procedimiento, primero le asignaremos a la variable “texto” la cadena de caracteres a reproducir:

strcpy (texto, "como estas?");   //En "texto" texto a reproducir

Luego identificamos el número de caracteres que posee la cadena de texto:

n=strlen(texto); //Obtiene número de caracteres del texto a reproducir

Y lo cargamos en el buffer del SP03:
  
i2c_start();            //Comienzo de la comunicación I2C ...
i2c_write(SP03_ID);     //...con la dirección del LCD03...
i2c_write(0x00);  //...apuntando a la posición 0 del registro del SP03
i2c_write(0x00);        //Comando nulo
i2c_write(0x00);        //Volumen máximo
i2c_write(0x05);        //velocidad 
i2c_write(0x03);        //Tono
for ( i=0; i<n; i++) {
   i2c_write(texto[i]); //caracter posición i de la cedena de texto
}
i2c_write(0x00);        //Comando nulo
i2c_stop ();            //Finalización de la transmisión

De esta forma, con una única subrutina, cargamos el buffer con cualquier mensaje deseado.

Y para reproducirlo, igualmente con el comando 0x40.

Finalmente el último mensaje mediante el acceso a la posición en la que se encuentra guardado. En este caso no hay que cargar el buffer del SP03 sino reproducirlo directamente:

posicion=10;

i2c_start();            // Comienzo de la comunicación I2C...
i2c_write(SP03_ID);     // ...con la dirección I2c del Sp03 ...
i2c_write(0x00);     //...apuntando a la posición 0 del registro del sp03
i2c_write(posicion);   //Reproduce el mensaje de la posición x del sp0
i2c_stop();             // Finalización de la transmisión

En éste último procedimiento, la limitación viene dada por el número de mensajes máximo que se pueden alojar en el SP03, en concreto 30.

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



En el programa completo, se puede ver que entre sucesivas reproducciones de mensaje, se han colocado unos retardos. Con ellos,  además del espaciado en el tiempo entre mensajes, se evita que se cargue en el buffer del SP03 un nuevo mensaje antes de reproducir completamente el anterior. Con este último objetivo se puede utilizar el siguiente bucle de instrucciones:

 int registro;

 do{                     //Bucle de ejecución mientras habla    
   i2c_start();          //Comienzo de la comunicación I2C ...    
   i2c_write(SP03_ID);   // ...con la dirección I2c del Sp03 ...    
   i2c_write(0x00);   //...apuntando posición 0 del registro del sp03
   i2c_start();          //Reinicio de la comunicación I2C ...    
   i2c_write(SP03_ID+1); //... como lectura    
   registro=I2c_read();  //Guarda el data leido    
   i2c_stop();           // Finalización de la transmisión 
 }while(registro != 0);

La ejecución del programa se detendrá en dicho bucle hasta que termine de reproducir el texto por completo mediante la consulta del valor del registro del comando que ha originado la orden de reproducción.

En el siguiente enlace, la descarga de todos los archivos del proyecto:


Descargar archivos Control sintetizador voz SP03



En la siguiente reproducción se puede escuchar el resultado de lo explicado. Hay que decir que este tipo de sintetizadores de voz están diseñados para el idima inglés por lo que se le nota un marcado acento en ese idioma.


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


2 comentarios:

Oskar Gelves spigca dijo...

muy excelente tu articulo. por favor necesito saber ¿Donde puedo comprar el SP03?. estoy haciendo mi tesis y necesito el modulo sintetizador. Gracias de antemano

Robotypic dijo...

Oskar. Tienes sitios en internet. Por ejemplo:
https://www.todoelectronica.com/es/robotica-modulo-sintetizador-p-14293.html

Related Posts Plugin for WordPress, Blogger...

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