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.