ESPica32 es una radio que sintoniza cualquier KiwiSDR del mundo, sin PC ni móvil, construida con un ESP32-WROOM-32, una pantalla OLED, un solo encoder y un módulo de audio.
Qué es ESPica32 y por qué
Un KiwiSDR es un receptor de radio por software que cualquiera puede escuchar por internet. Yo quería algo físico: girar una perilla, oír la banda y ver la frecuencia, como en una radio de verdad. Lo que tenía en casa era poco: un ESP32-WROOM-32, una pantalla OLED, un encoder y un amplificador MAX98357A. Con eso salió un diseño minimalista:
- Servidor web en el ESP32: desde el móvil o el PC se escribe o se elige el Kiwi (puedes guardar varios) y se configura el WiFi.
- Un único encoder para frecuencia, volumen y modo, más cambio de paso y de banda con clics.
- Pantalla OLED con frecuencia, modo y RST (medidor S).
- Panel web de control como respaldo del encoder: sintonía, modo, volumen y bandas.
El resultado, ESPica32, es un sketch de Arduino IDE de unos 1,2 MB que funciona con cualquier Kiwi, incluso uno en Argentina escuchado desde Alemania.
El nombre, ESPica32, es un homenaje a la famosa radio Spica.
Materiales
Cinco componentes y unos cables bastan.
| Componente | Detalle |
|---|---|
| ESP32-WROOM-32 | Placa de desarrollo con USB (DevKit) |
| Pantalla OLED I2C | SH1106 1,3″ o SSD1306 0,96″, dirección 0x3C |
| Encoder rotativo con pulsador | EC11 o módulo KY-040 |
| Amplificador I2S MAX98357A | Salida de 3 W para altavoz de 4 a 8 Ω |
| Altavoz pequeño | 4 a 8 Ω |
| Cables y protoboard | Dupont |
Sin amplificador I2S también funciona con el DAC interno del ESP32 (GPIO25) y un LM386, con peor calidad. En el código se elige con AUDIO_INTERNAL_DAC.
Video Explicativo
Esquema de conexiones
Son ocho GPIO en total. Estos son los pines que usa el sketch, definidos en config.h.

- Alimentación: la pantalla va a 3V3 y el amplificador a VIN, que da los 5 V del USB. Todos los GND se unen.
- Encoder: el común (C) y el segundo pin del pulsador van a GND. El código activa las resistencias pull-up internas, así que no hacen falta externas.
- Dirección I2C: la pantalla responde en 0x3C. Si la imagen sale en blanco, prueba
OLED_SH1106 1enconfig.h. - Un clic salta de 2 en 2: cambia
ENC_STEPS_PER_DETENTde 4 a 2.
Cómo se usa
La primera vez, el ESP32 crea la red WiFi KiwiRadio-Setup (clave kiwiradio); en 192.168.4.1 se elige tu WiFi y se añaden los Kiwis. Después entra solo a tu red y se abre en kiwiradio.local.
| Gesto en el encoder | Acción |
|---|---|
| Girar | Cambia lo que tiene el foco: frecuencia, volumen o modo |
| Clic corto | Pasa el foco de frecuencia a volumen y a modo |
| Doble clic | Siguiente banda (160 m, 80 m, 40 m, WWV, 30 m … 10 m) |
| Clic largo (0,6 s) | Cambia el paso de sintonía: 10 Hz, 100 Hz, 1 kHz, 5 kHz, 10 kHz |
| Clic muy largo (2 s) | Muestra la IP de la web en la pantalla |
La web muestra los mismos controles más un campo para escribir la frecuencia, el selector de buffer de audio y un panel de diagnóstico de cortes. Frecuencia, modo, volumen y ajustes se guardan en la flash y vuelven al encender.
Los desafíos
El hardware fue fácil; lo difícil fue que el audio de un Kiwi lejano llegara sin cortes.
- Pantalla en blanco. La OLED de 1,3″ usa el controlador SH1106, no el SSD1306. Con
OLED_SH1106 1enconfig.hapareció la imagen. - Placa y particiones. El sketch ocupaba el 94 % con el esquema por defecto. Con Partition Scheme No OTA (2MB APP/2MB SPIFFS) bajó al 59 %.
- El Kiwi no conectaba. La biblioteca WebSockets cerraba la conexión al instante (
badp=5en el log del Kiwi). La sustituí por un cliente WebSocket propio, más pequeño, que además informa del motivo del cierre. Con él conectó a la primera. - Cortes de audio en Kiwis lejanos. Mi Kiwi está en Argentina y yo en Alemania, con un ping TCP de unos 260 ms. Fui por pasos:
- Un buffer de audio grande (hasta 2 s) con subida automática tras cada corte.
- Un mínimo manual (100 a 2000 ms) para que el buffer nunca baje de ese valor, y una compensación de deriva del reloj.
- Un panel de diagnóstico que clasifica cada corte como red, ESP32 o buffer. Mostró que llegaban solo unos 13,5 paquetes por segundo de los 23,4 necesarios: el ESP32 no alcanzaba el caudal de audio sin comprimir con esa latencia.
- Compresión ADPCM: el Kiwi envía el audio comprimido y el ESP32 lo descomprime. Hacen falta unos 6 kB/s en lugar de 24 kB/s y el audio quedó limpio.
- Cambio de banda sin perder el paso. Mi primera idea fue un foco extra en el encoder para la banda, pero ya no se podía ajustar el paso. La solución fue el doble clic.
Descarga de Archivos
Instalación en Arduino IDE
- Instala el paquete de placas esp32 de Espressif y la biblioteca U8g2.
- Descomprime el proyecto y abre
kiwi-radio-mini/kiwi-radio-mini.ino. - Elige la placa ESP32 Dev Module y el Partition Scheme No OTA (2MB APP/2MB SPIFFS).
- En
config.hponOLED_SH1106 1si tu pantalla es de 1,3″ y revisa los pines. - Sube el sketch. La primera vez conecta al WiFi KiwiRadio-Setup y abre
192.168.4.1. - Añade tu WiFi y un Kiwi (por ejemplo
servidor:8073) y empieza a escuchar.
Próximos pasos
ESPica32 funciona bien con Kiwis cercanos y lejanos. Lo siguiente que me gustaría añadir:
- Waterfall en una pantalla a color.
- Una caja impresa en 3D.
- Lista de favoritos de frecuencias.

Deja una respuesta