Un grabador sin botones, ¿por qué?
¿Te ha pasado que en pleno voiceover el "click" del botón se cuela al inicio del WAV? Es uno de los problemas más típicos de los grabadores DIY. Este proyecto lo resuelve de raíz: no hay botones, no hay pantalla táctil. La única interfaz es agitar el dispositivo. Una sacudida arranca la grabación; otra la detiene y la guarda como WAV en la microSD.
Al final vas a tener un grabador de voz portátil controlado por gestos, basado en un ESP32-S3 con micrófono I2S INMP441, un IMU (acelerómetro y giroscopio) y una pantalla TFT para feedback visual. Y vas a entender exactamente por qué los umbrales asimétricos son la clave para que el gesto no falle en el peor momento.

El tutorial original usa la placa todo en uno Makerfabs MaTouch ESP32-S3 Parallel TFT de 3.16", que ya trae micrófono digital, ESP32-S3, pantalla grande y gestión de batería integrados. Más abajo te muestro cómo replicar la misma idea en Chile con módulos sueltos, porque esa placa exacta no se consigue acá.
Por qué el gesto "agitar para grabar" es más útil de lo que parece
Las grabadoras profesionales tienen botones físicos con click mecánico que el micrófono captura. Las que tienen pantalla táctil capacitiva agregan ruido de fricción de dedos. La opción sin contacto físico elimina ambos:
- Cero ruido al inicio y al fin de la grabación
- Una sola mano libre: no tienes que mirar dónde apretar
- Ideal para campo: con guantes, en oscuridad, mientras caminas
El truco está en distinguir un "gesto intencional" de un "movimiento accidental". Para eso usamos umbrales asimétricos: es más fácil arrancar (umbral bajo) que detener (umbral alto). Si estuvieras grabando una entrevista y mueves el grabador, no querrías que se detenga sola.
Hardware: todo en un módulo
La gracia de la placa MaTouch es que expone cada bloque sin esconderlo. Puedes ver dónde está el micrófono, el sensor de movimiento, la salida de audio, la ranura microSD y el propio ESP32-S3:

Componentes mínimos del proyecto:
- ESP32-S3 (doble núcleo, soporta I2S nativo y display por SPI sin saturarse)
- Micrófono I2S INMP441
- IMU con I2C: el tutorial original usa el QMI8658, que viene integrado en la placa MaTouch. Como ese chip exacto no se vende suelto en Chile, vamos a hacerlo con un acelerómetro ADXL345 o un MPU6050 (ambos disponibles, ambos sirven igual para detectar la sacudida).
- Pantalla TFT (cualquier ST7735, ST7789 o ILI9341 sirve)
- Tarjeta microSD con módulo SPI breakout
- Batería 18650 con shield power bank
Mapeo de pines (referencia)
| Señal | GPIO ESP32-S3 |
|---|---|
| I2S BCLK (mic) | 44 |
| I2S LRC (mic) | 43 |
| I2S DIN (mic) | 2 |
| SD CS | 42 |
| SD MOSI | 40 |
| SD MISO | 38 |
| SD SCK | 39 |
| IMU SDA | 17 |
| IMU SCL | 18 |
Si usas otra placa ESP32-S3 (DevKitC, XIAO S3, etc.), los pines I2S y SPI son libres: redefine los #define y listo. Si quieres ver el circuito completo de la placa de referencia (LCD, alimentación, IMU, audio, cargador y ranura TF), este es el esquemático oficial:

El micrófono INMP441 va por I2S
El INMP441 es un micrófono digital: el audio llega al ESP32-S3 directo por I2S, sin pasar por el ADC analógico. Eso evita ruido analógico, lecturas inestables del ADC y problemas de señal. No es un micrófono de estudio (su sensibilidad es fija), pero para voz, aprendizaje y grabadores embebidos rinde muy bien. El detalle de conexión es simple: tres líneas de reloj y datos (BCLK, DIN, LRCLK) más alimentación de 1.8 a 3.3 V.

Por qué usamos umbrales asimétricos
#define SHAKE_THRESHOLD_START 1200
#define SHAKE_THRESHOLD_STOP 1800
#define SHAKE_DEBOUNCE 1000 // ms
SHAKE_THRESHOLD_START = 1200 (en mg, miligravedades) significa que para arrancar la grabación, la suma de cambios en X, Y y Z tiene que superar 1.2 G. Eso es un movimiento intencional pero suave.
SHAKE_THRESHOLD_STOP = 1800 (1.8 G) es más exigente. Para detener tienes que sacudir con fuerza. Esta asimetría es lo que evita los cortes accidentales si te mueves mientras grabas.
SHAKE_DEBOUNCE = 1000 ms te da un segundo de respiro después de cada cambio de estado: el sistema no puede arrancar y detener en menos de 1 segundo. Sin debounce, una sola sacudida fuerte podría disparar dos eventos y arrancar o detener en el mismo gesto.
El WAV se escribe con header válido al final
Esta es una sutileza importante: cuando grabas, el formato WAV pide saber el tamaño total del audio en el header (campos chunkSize y dataSize). Como no lo sabes hasta que el usuario detiene, el código hace lo siguiente:
- Al iniciar: escribe 44 bytes vacíos en el lugar del header (placeholder).
- Mientras graba: escribe los samples crudos a partir del byte 44.
- Al detener: hace
file.seek(0), escribe el header real con los tamaños correctos, y cierra.
Si el ESP32 se queda sin batería en medio de la grabación, el archivo queda con header inválido. Audacity puede recuperarlo importando "datos crudos" (16 bits, 22050 Hz, mono), pero perderás el último bloque que no alcanzó a escribirse.
Detección de gesto en el loop principal
QMI8658_Data d; // o ADXL345_Data, según el chip
if (imu.readSensorData(d)) {
float delta = abs(d.accelX - lastAccelX)
+ abs(d.accelY - lastAccelY)
+ abs(d.accelZ - lastAccelZ);
lastAccelX = d.accelX;
lastAccelY = d.accelY;
lastAccelZ = d.accelZ;
int currentThreshold = isRecording ? SHAKE_THRESHOLD_STOP
: SHAKE_THRESHOLD_START;
if (delta > currentThreshold && millis() - lastShake > SHAKE_DEBOUNCE) {
lastShake = millis();
if (!isRecording) startRecording();
else stopRecording();
}
}
El "delta" es la suma de magnitudes absolutas en los tres ejes. No es la magnitud real del vector (eso requiere sqrt(x²+y²+z²)), pero es mucho más barato computacionalmente y, para detección de sacudida, funciona igual. Si quieres más precisión, usa la magnitud vectorial; si quieres más velocidad, esta suma sirve.
Calibración inicial
Cuando arranca el sistema, lee la posición de reposo del IMU y la guarda como baseline. Por eso es crítico mantener el dispositivo quieto durante el primer segundo después de encenderlo. Si lo mueves en ese momento, el baseline queda incorrecto y la detección de sacudida se vuelve demasiado sensible (o demasiado insensible). Es una limitación que vale la pena documentar para el usuario final.

UI con tres estados
La pantalla TFT muestra tres pantallas según el estado de la máquina:
- STANDBY (azul): círculo concéntrico azul, texto "Shake to Record", nombre del próximo archivo (
rec_001.wav). - RECORDING (rojo): círculo rojo grande con "REC" centrado y la calidad de muestreo abajo.
- SAVED (verde): círculo verde con "SAVED!" y el nombre del archivo recién guardado.

En estado de grabación, el círculo cambia a rojo con "REC" y muestra la calidad de muestreo (22 kHz en esta versión):

El feedback visual es opcional pero muy útil cuando estás caminando o tienes el dispositivo lejos: con un vistazo periférico sabes si está grabando.
Variantes y mejoras
Cosas que no están en el tutorial original y que mejoran sustancialmente la experiencia:
- Streaming por WiFi a un servidor: en lugar de guardar a la SD, transmite el audio en vivo por UDP a una Raspberry Pi en tu red local. Convierte el ESP32-S3 en un micrófono inalámbrico de baja latencia (cercana a 50 ms).
- Detección de palabra clave con TinyML: agrega un modelo de TensorFlow Lite Micro entrenado para detectar una palabra ("grabar" o "stop") y úsalo como trigger alternativo a la sacudida. Es menos accidental que un acelerómetro.
- Modo de bajo consumo: pon el ESP32-S3 en light sleep entre lecturas del IMU y despiértalo por interrupción del acelerómetro. Así la batería 18650 te dura muchas más horas de espera entre grabaciones.
Personalización para Chile
Componentes en MechatronicStore con stock local:
- Seeed Studio XIAO ESP32-S3 (SKU GS1-3): $13.670 CLP. Equivalencia: el tutorial original usa la placa MaTouch de Makerfabs, que no se vende en Chile. El XIAO ESP32-S3 tiene el mismo chip y PSRAM; solo te falta la pantalla integrada y el IMU on board, que armas con módulos sueltos.
- Módulo Micrófono I2S INMP441 (SKU GL3-12): $5.890 CLP.
- Acelerómetro digital 3 ejes ADXL345 GY-291 (SKU GN3-4): $3.490 CLP. Equivalencia: el QMI8658 del tutorial original no se vende suelto. El ADXL345 cumple exactamente la misma función para detectar la sacudida; solo necesitas cambiar la librería.
- Pantalla TFT LCD de 1.8" (SKU D-316): $6.590 CLP. Opcional, para el feedback visual REC / STANDBY / SAVED.
- Módulo datalogger para microSD (SKU G-014): $2.500 CLP. Necesario si tu placa ESP32-S3 no tiene ranura microSD integrada.
- Micro SD tarjeta de memoria 8 GB (SKU B-450V1): $7.990 CLP.
- Batería 18650 3000 mAh (SKU L-040): $5.190 CLP.
- Módulo Power Bank con shield 2 pilas 18650 (SKU N-115): $8.590 CLP.
Total del proyecto completo con feedback visual: cercano a $54.000 CLP. Versión sin pantalla (headless): cercana a $47.000 CLP.
Recursos
- Tutorial original (inglés): ESP32 Voice Recorder with No Buttons or Touch, Just Shake to Record
- Datasheet INMP441: https://invensense.tdk.com/wp-content/uploads/2015/02/INMP441.pdf
- Librería ADXL345 (Adafruit): Adafruit_ADXL345
- Especificación del formato WAV: https://soundfile.sapp.org/doc/WaveFormat/
Versión chilena con componentes en stock local en MechatronicStore.











