Google Translate Element

lunes, 24 de mayo de 2010

Voz con PIC

Gracias a la aplicación BTc Sound Encoder de la página Romanblack, me he decidido a realizar este código para realizar unas pruebas, la verdad es que el sonido es decente con un pequeño ruido (a 44.1K de bitrate), pero se comprende correctamente, la idea es utilizar lo aprendido más adelante para la realización de un robot controlado por wifi y que pueda decir algunas palabras, podéis descargar el fichero comprimido con el código CCS el fichero WAV utilizado y el necesario para programar en la EEPROM voz_pic_test.rar

37 comentarios:

Anónimo dijo...

hola amigo radioelf es mu y interesante tu post, pero e leido la pagina del autopr y no e logrado captarle ocmo es que graban en el pic, ya que veo que solo es un archivo btc , pero y el hex? gracias

Radioelf dijo...

Hola, el fichero *.btc es el que se tiene que grabar en una EEPROM externa, el HEX lo obtienes al compilar el pic_voz_test.C, piensa que es un ejemplo, y según la aplicación que quieras puede variar, desde gravar en el propio PIC el audio (btc) si es un sonido de poca duración a grabar en varias EEPROMs, pero siempre es: obtener el fichero *.btc con la aplicación de Romanblack, si es pequeño incluirlo en el fichero fuente *.c o *.asm, si no, en una EEPROM externa, compilar para obtener el HEX y grabar PIC y EEPROM si es necesario. Con el ejemplo solo quiero mostrar como se hace y como se lee con el PIC el fichero btc, en el ejemplo se lee de una EEPROM externa a través de I2C.Si quieres el HEX solo tienes que compilar el pic_voz.c (CCS) o me lo pides, pero solo te servirá como ejemplo.

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Hola. Aunque tu código está bien comentado, sin embargo, no comprendo bien cómo calculas exactamente el retardo necesario en microsegundos que hay que aplicar después de enviar cada bit leído, si utilizas alguna fórmula. Si es así, supongo que dependerá de la frecuencia de muestreo del sample y de la frecuencia de reloj a que trabaja el PIC. Consigo sacar algo medio inteligible con un PIC16F84A a 4 MHz con una muestra a 22050 MHz (aunque luego al amplificarlo se distorsiona, pero bueno). No se sí podrías orientarme algo... Gracias de todas formas

Radioelf dijo...

Hola Manuel, para que el sonido tenga una calidad decente es necesario utilizar el máximo bitrate posible, esa es la razón de utilizar ASM y comprobar los tiempos que tarda en ejecutarse cada instrucción, pero no aplico ningún retardo ya que si lees la EEPROM a 1Mhz y a 8Mhz el pic (0.5us) con los tiempos que tardan a ejecutarse las rutinas se obtiene como máximo un bitrate de de 44100hz (22,6us), como comenté el sonido no es perfecto pero se entiende sin dificultad, intenta aumentar el bitrate y veras que te mejora el sonido.

Anónimo dijo...

COMO SERIA EN ASSEMBLER,

Radioelf dijo...

Hola, pues si te miras el código veras que la parte principal esta en assembler, solo tienes que hacer una mínima modificación para configurar el pic realizar un bucle sustituyendo el while y poco más, eso si tendrías que utilizar una libreria para trabajar con el I2C, si quieres en este blogger tengo una, http://radioelf.blogspot.com.es/2009/11/rutina-para-la-gestion-i2c.html

Unknown dijo...

hola radioelf un favor tenes el circuito en proteus de la vox en pic que diga hola , espero respuestas gracias.

Radioelf dijo...

hola, no tengo el circuito en proteus, pero si quieres puedes descargar el hex https://dl.dropbox.com/u/3108930/CCS/main.hex

Anónimo dijo...

Buenas tardes Radioelf.

He realizado junto con el archivo ccs que adjuntas la implementación práctica para montarme mi propio robot, pero el sonido que logro sacar es con mucho ruido. He grabado un mensaje de 4 segundos a 44Khz, hago el proceso de obtención del fichero BTC y lo cargo en la eeprom con un programador. Existe un 80% de ruido y un 20 de la voz grabada. ¿Usaste algo más a la salida aparte de la resistencia y condensador?.

Radioelf dijo...

Hola, en la aplicación que hice de test, usé solo el condensador y la resistencia (6k5, 220nF), y la calidad no era una maravilla pero se entiende bien y no hay casi nada de ruido, para un robot que realicé, use un dspic, el filtro RC y un amplificador audio, y el sonido mejoró...pero no recuerdo los valores.... es importante los ajustes de algunos parámetros de la aplicación BTC, y que se esté trabajando a 44Khz, te lo comento de memoria ya que hace casi tres años...

Anónimo dijo...

Hola amigo Radioelf.
Disculpa, ¿cual es el pin de salida, es decir, en qué pin se conecta la bocina (para el caso del pic16f877a)?

Radioelf dijo...

Hola, como comento el código es solo una prueba, y se tendría que modificar para cada aplicación, según lo que se quiera realizar, el ejemplo es para un 16F876 y la salida es RA0 (pin 2), también tienes que poner una resistencia y un condensador como se indica en el código (pic_voz_test.c) y esta salida es recomendable de amplificar.

Anónimo dijo...

Muchas gracias por responder amigo.
Otra pregunta.
¿Cuál es el código con el que mandas a llamar el archivo btc de sonido?
Quiero hacer que un pic16f877a reproduzca un poco de música.

Radioelf dijo...

Hola, el código obtenido btc es el programado en la eeprom y se leer a través de I2C, en el fichero pic_voz_test.c puedes ver los detalles, la verdad es que no creo que la musica suene muy bien, para voz el sonido es decente.

Anónimo dijo...

Hola amigo, unas preguntas.
Si quiero poner diferentes audios, usando el programa que pones de ejemplo, ¡qué parte del código es la que debo modificar y qué código es el que debo escribir en su lugar?

¿El código se obtiene del BTC Sound?
¿De dónde lo obtengo?

Radioelf dijo...

Hola, los audios los tienes que poner en la EEPROM, teniendo en cuenta el tamaño que te ocupa para conocer en que posición de la EEPROM se encuentra el inicio y el final de cada audio, la parte de código que tienes que modificar es donde se indica el inicio y el fin de lectura a través de las variables "i" para el inicio y "longitud" para el fin
long i =0, longitud; //inicia en la posición 0
longitud=2559+1; //finaliza en la posición 2560

Anónimo dijo...

Gracias amigo!
Otra pregunta.
Tengo un archivo (bloc de notas) que generé con el BTC sound, que dice asi:
// File Details:
// Size 1976320 bits (247040 bytes)
// Sound encoded at 44100 bits/sec
// using BTc64 1bit Algorithm to be decoded on
// the following circuit:
//
//
// R = 6491 ohms
//
// Digital -----------R-----*----- Analogue
// | out
// |
// |
// C = 0.22 uF
// |
// |
// |
// Gnd

El Size 1976320 bits, ¿es la posición final?
¿Es decir longitud=1976319+1?

Radioelf dijo...

Hola de nuevo, el tamaño es en bytes y no en bits en tú caso serían 247040 bytes, pero yo te recomiendo que cuando programes la eeprom mires en el programa que estes usando donde finaliza cada audio y donde empieza el siguiente, si tienes varios audios puedes crear un fichero para cada uno de ellos y finalmente crear uno donde incluyes (editándolo) los distintos audios, dejando por ejemplo un par de bytes entre ellos, en tú caso por ejemplo el primer audio sería de 0 a 247040, el segundo audio iniciaria en 247042 (2 bytes de espacio entre audios) al (247042 + tamaño segundo audio)...

Anónimo dijo...

Muchas gracias amigo Radioelf!

Anónimo dijo...

Yo otra vez.
Compilé el programa de ejemplo, obtuve el .hex, pero al probarlo no se oye nada, leyendo ésta página (de nuevo) ví que el sonido se debe programar en una eeprom externa.
Cómo se hace eso?
Y si lo quiero programar directamente en el pic, cómo se hace?
Por ejemplo, tu sinodo de "hola", cómo lo puedo programar directamente en el pic?

Anónimo dijo...

Otra pregunta, con la eeprom externa, el pic y la bocina, ¿cómo es el diagrama de conexión?

Radioelf dijo...

Hola, lo primero que se tiene que tener en cuenta es que el código es solo para hacer una prueba, para usar en una aplicación concreta se tiene que modificar el código según el caso, la EEPROM interna del pic no tiene capacidad para almacenar el fichero (dependerá del modelo del PIC y del tamaño del fichero de audio), el diagrama al ser una prueba de ejemplo no lo tengo echo, solo se tiene que conectar a la eeprom por I2C y yo en ese caso conecte la salida (pwm-resistencia-condensador) a un amplificado para hacer la prueba, tengo un robot que está monitorizado por wifi que reproduce varios sonidos y en ese caso si que tengo el diagrama, pero tanto el programa como la aplicación son mucho más complejos.

Anónimo dijo...

Hola, estoy realizando una aplicacion muy similar al ejemplo propuesto, pero no tengo mucha experiencia en trabajo con memorias por lo que mi pregunta es el archivo btc en que direccion de memoria lo guardas?

Radioelf dijo...

Hola, el archivo btc lo tienes que programar en una EEPRON externa, el inicio en la posición 0. no tienes que hacer nada, programar tal cual, en el ejemplo se usa una 24FC512, el código pic_voz_test.c es una ejemplo y tendrías que modificar y compilar según el caso

Anónimo dijo...

Hola radioelf una consulta, que pines de la memoria van a Tx y Rx del micro que en tu programa los defines como los pines A0 y A1?

Radioelf dijo...

Hola de nuevo, la memoria EEPROM está conectada a través de I2C y los pines son RC3-SDL y RC4-SDA, para un 16f876 con encapsulados dip los pines físicos son el 14 para SDL y el 15 para SDA, 0xA1 y 0xA0 son las direcciones I2C para leer o escribir en la EEPRON desde I2C

Anónimo dijo...

Hola radioelf! quise realizar tu proyecto como prueba para una aplicacion muy similar que voy a desarrollar pero no pude grabar el archivo .btc en la memoria ya que solo soportaba .hex o .bin, me puedes ayudar con esa duda?

Radioelf dijo...

Hola, si renombras el fichero de .btc a .bin, no tendrías que tener problemas en grabar en una EEPROM externa.

Anónimo dijo...

Nada mas lo renombro en mi computador? o necesito algun software?

Radioelf dijo...

Hola, si tienes el .btc, solo tienes que renombrar, el software necesario es el que utilices para programar EEPROMs

FriensWorld dijo...

Buenos dias mi nombre es Hernan y por casualidad encontre su blog ya que buscaba algo de sitetizacion de voz con pic, me parecio interesante y decidi emular el circuito en proteus pero tengo el inconveniente que cuando lo simulo parece salir un sonido como si fuera una ametralladora (taca taca taca....) lo que hice fue compilar el archivo pic_voz_test en CCS y para la memoria renombre el archibo hola_44K_btc64.btc a hola_44K_btc64.bin no se que estoy haciendo mal gracias

ATT Hernan G

Radioelf dijo...

Hola Hernan, la verdad es que no lo he emular con proteus, pero creo que al no ser una emulación en tiempo real, no te funcionara correctamente, piensa que lo tiempos son MUY críticos sobre todo al leer la EEPROM y gestionar los datos leídos, lo de renombrar el archivo es correcto, siento no poderte ayudar más.

Daniel dijo...

Hola. Estoy experimentando con este proyecto, intenté bajar el archivo voz_pic_test.rar y no existe. Hay alguna forma que puedas subirlo nuevamente?
Gracias y Saludos
Daniel

Radioelf dijo...

Hola. He reparado el enlace de descarga, hora tendría que funcionar.

Eduardo Morales dijo...

Hola Radioelf, ¿cómo guardas el audio en la memoria EEPROM?, cómo generas los valores en hexadecimal para meterlos a la memoria?, estoy trabajando con una memoria EEPROM y debo guardarle un audio pero no sé cómo. Gracias =)

Radioelf dijo...

Hola, para generar los valores en hexadecimal se utiliza la aplicación BTc Sound Encoder que puedes encontrar en la página de Romanblack, en dicha pagina también puedes encontrarás información útil; para guardar el fichero obtenido en la eeprom puedes utilizar un programador de eeproms valido para tú eeprom, ten en cuenta que este proyecto tiene más de 8 años y a día de hoy puedes encontrar con información obsoleta....