ESP32
Reproductor de WAV
Reproductor de WAV
En el anterior proyecto ../vozmemo.html
había realizado un reproductor de WAV desde una memoria
Flash, utilizando el arduino.
Ahora me dispongo a realizar el mismo proyecto pero con el ESP32, y utilizando la memoria Flash que incorpora la placa, en este caso para la placa LOLIN 32 la memoria es T25S32.
He utilizado la placa LOLIN 32 debido a que es más pequeña y la tenía cerca, pero el montaje funciona con cualquier placa ESP32.
En el caso del montaje con arduino, grabar la memoria Flash con un programador, en este montaje los datos de sonido WAV se incorporan en el propio código.
Empezamos con el sonido grabado en formato de 11KHz y 8bits.
Una vez que tenemos el archivo WAV, debemos transformarlo a código C.
Utilizamos el programa HxD , es un editor hexadecimal que tiene la opción de exportarlo a código C.
Obtenemos un fichero con extensión .c , aunque lo he renombrado con extensión .h , es un gusto mio.
Ahora debemos editar el fichero para cambiar el tipo de dato.
Debemos cambiar de:
unsigned char rawData[301892] = {
a
const char rawData[] = {
Con este cambio los datos se almacenan en la memoria Flash.
El fichero lo copiamos al mismo directorio del proyecto arduino y lo agregamos con:
#include "metro1.h"
long tamano=sizeof(rawData);
En el código de programa del ESP32, creamos una interrupción cada 11KHz, que lo que hace es leer los datos WAV almacenados en la memoria Flash y mandarlos al convertidor D/A.
hw_timer_t *timer = NULL;
void IRAM_ATTR timerInterrupcion()
{
if(dire>tama) { fin=1; dacWrite(25, 128); } //
if(fin==0) { dacWrite(25, rawData[dire++]); }
}
void setup()
{
....
timer = timerBegin(1000000); // Timer 0, clock divider 80
timerAttachInterrupt(timer, &timerInterrupcion); // Attach the interrupt handling function
timerAlarm(timer, 90, true, 0); // ((1/11000)*1000000)
...
}
He creado dos programas, uno que utiliza el terminal para mandar el numero de trozo WAV a reproducir.
En el segundo he añadido un display OLED y un mando rotatorio para elegir el sonido a reproducir, también se puede mandar los códigos desde consola.
Para leer el mando rotatorio utilizo las entradas en modo INPUT_PULLUP, debería funcionar tal como está en el código.
El problema es que algunos pin del ESP32 no se pueden poner en modo INPUT_PULLUP, si no os funciona con está configuración, deberéis colocar una resistencia de 10K desde las entradas hasta Vcc.
He tenido un problema con las librerías del ESP32.
Como yo utilizo Linux para programar, y tiene su propio Arduino en los repositorios, si mezcláis las librerías con la versión que viene de serie en Linux, saldrán errores.
Solución, desinstalar el Arduino que viene en Linux, y bajar de la página de arduino la versión arduino-1.8.19 y utilizar esta última.
Como en la versión de arduino, el leer byte a byte desde la memoria Flash no es del todo rápido, próximamente intentaré crear un buffer de 100 bytes para que sea más rápido.
Ahora me dispongo a realizar el mismo proyecto pero con el ESP32, y utilizando la memoria Flash que incorpora la placa, en este caso para la placa LOLIN 32 la memoria es T25S32.
He utilizado la placa LOLIN 32 debido a que es más pequeña y la tenía cerca, pero el montaje funciona con cualquier placa ESP32.
En el caso del montaje con arduino, grabar la memoria Flash con un programador, en este montaje los datos de sonido WAV se incorporan en el propio código.
Empezamos con el sonido grabado en formato de 11KHz y 8bits.
Una vez que tenemos el archivo WAV, debemos transformarlo a código C.
Utilizamos el programa HxD , es un editor hexadecimal que tiene la opción de exportarlo a código C.
Obtenemos un fichero con extensión .c , aunque lo he renombrado con extensión .h , es un gusto mio.
Ahora debemos editar el fichero para cambiar el tipo de dato.
Debemos cambiar de:
unsigned char rawData[301892] = {
a
const char rawData[] = {
Con este cambio los datos se almacenan en la memoria Flash.
El fichero lo copiamos al mismo directorio del proyecto arduino y lo agregamos con:
#include "metro1.h"
long tamano=sizeof(rawData);
En el código de programa del ESP32, creamos una interrupción cada 11KHz, que lo que hace es leer los datos WAV almacenados en la memoria Flash y mandarlos al convertidor D/A.
hw_timer_t *timer = NULL;
void IRAM_ATTR timerInterrupcion()
{
if(dire>tama) { fin=1; dacWrite(25, 128); } //
if(fin==0) { dacWrite(25, rawData[dire++]); }
}
void setup()
{
....
timer = timerBegin(1000000); // Timer 0, clock divider 80
timerAttachInterrupt(timer, &timerInterrupcion); // Attach the interrupt handling function
timerAlarm(timer, 90, true, 0); // ((1/11000)*1000000)
...
}
He creado dos programas, uno que utiliza el terminal para mandar el numero de trozo WAV a reproducir.
En el segundo he añadido un display OLED y un mando rotatorio para elegir el sonido a reproducir, también se puede mandar los códigos desde consola.
Para leer el mando rotatorio utilizo las entradas en modo INPUT_PULLUP, debería funcionar tal como está en el código.
El problema es que algunos pin del ESP32 no se pueden poner en modo INPUT_PULLUP, si no os funciona con está configuración, deberéis colocar una resistencia de 10K desde las entradas hasta Vcc.
He tenido un problema con las librerías del ESP32.
Como yo utilizo Linux para programar, y tiene su propio Arduino en los repositorios, si mezcláis las librerías con la versión que viene de serie en Linux, saldrán errores.
Solución, desinstalar el Arduino que viene en Linux, y bajar de la página de arduino la versión arduino-1.8.19 y utilizar esta última.
Como en la versión de arduino, el leer byte a byte desde la memoria Flash no es del todo rápido, próximamente intentaré crear un buffer de 100 bytes para que sea más rápido.
09/07/02024
Como había prometido, he realizado una segunda
versión, en esta la lectura de los datos desde la memoria Flash la
hago de 100 datos cada vez.
En el arduino se notaba que aumentaba el rendimiento del programa,
pero en este caso al ser un procesador 10 veces más rápido, no se
nota mucho.
De todas formas he programado el cambio.
PROGRAMA2
VIDEO DEMOSTRATIVO
Saludos.
Juan Galaz
Bibliografía:
../vozmemo.html
voz2.html
arduvoz.html
arvoc.html .
No hay comentarios:
Publicar un comentario