Consejos prácticos para trabajar con el ESP32-C3 Super Mini
Estos son los cinco problemas más comunes que me he encontrado trabajando con el ESP32-C3 Super Mini —Arduino IDE, USB, UART, Wi-Fi y GPIO— y cómo los resolví con hardware real.
En resumen
Te comparto cinco consejos prácticos para trabajar con el ESP32-C3 Super Mini, centrados principalmente en problemas que te pueden aparecer al utilizar Arduino IDE, USB, UART, Wi-Fi y los GPIO disponibles. Todo lo que te cuento lo he probado sobre hardware real.
El primer problema es aparentemente sencillo: el programa se carga correctamente en el ESP32-C3, pero el monitor serie permanece vacío.
Yo uso un programa básico que inicializa el puerto serie y transmite un mensaje. También verifico que la velocidad —baud rate— configurada en el programa coincida con la seleccionada en el monitor serie.
En la configuración de la placa aparece una opción relacionada con la comunicación serie mediante USB, que está deshabilitada inicialmente. La habilito, pero el monitor continúa sin mostrar información.
La solución finalmente resulta ser muy sencilla: dar tiempo al puerto serie USB para inicializarse antes de enviar información.
En lugar de ejecutar inmediatamente:
Serial.begin(...);
Serial.println(...);
introduzco una espera de aproximadamente 1 segundo después de inicializar el puerto serie. Después de volver a cargar el programa, el mensaje aparece correctamente.
El segundo problema aparece al conectar una pantalla OLED I²C.
Yo utilizo:
- alimentación de 3,3 V;
- GND;
- GPIO 8 como SDA;
- GPIO 9 como SCL.
Estos son los GPIO que utilizo inicialmente como líneas I²C.
La pantalla funciona correctamente después de que modifico su dirección I²C de 0x3D a 0x3C, pero me encuentro con otro fenómeno: el LED integrado del ESP32-C3 comienza a parpadear continuamente.
La explicación es que el LED está conectado a GPIO 8, que simultáneamente estoy utilizando como línea SDA del bus I²C. Cada actividad sobre I²C provoca cambios eléctricos en GPIO 8 y, por tanto, el LED responde a esa actividad.
Mi solución consiste en reasignar I²C a otros GPIO:
Y modificar el programa para inicializar Wire utilizando esos nuevos pines.
El resultado es que:
- la pantalla continúa funcionando;
- el LED deja de parpadear;
- además, evito ese consumo innecesario de corriente, algo particularmente relevante si tu proyecto está alimentado por batería.
El problema más importante
Para mí, este es el problema más importante de los cinco.
El ESP32-C3 que utilizo en mi proyecto no conseguía conectarse a la red Wi-Fi, a pesar de que el programa estaba configurado correctamente con las credenciales de la red. El microcontrolador simplemente permanecía intentando establecer la conexión.
Yo considero tres posibles causas principales:
- Problemas con la antena
- diseño deficiente;
- interferencias;
- problemas físicos.
- Alimentación inestable.
- Configuración del software, particularmente una potencia de transmisión Wi-Fi demasiado elevada.
Después de descartar problemas de alimentación y de antena, pruebo modificando la potencia de transmisión Wi-Fi.
El resultado es inmediato: el ESP32-C3 consigue conectarse a la red y obtiene correctamente una dirección IP.
¿Qué consigo con esto?
Según mi propia demostración:
Ventajas
- mayor estabilidad de la conexión en ese caso concreto;
- menor consumo de corriente.
Desventaja
- menor alcance de la señal Wi-Fi.
Si tu dispositivo trabaja dentro de una red local y no necesita gran alcance, yo considero aceptable reducir la potencia, y te recomiendo probarlo si te encuentras en esa misma situación.
WiFi.setTxPower(WIFI_POWER_8_5dBm);
Debes colocarlo después de:
WiFi.begin(ssid, password);
El cuarto consejo trata una situación diferente.
Te cuento que existen versiones del ESP32-C3 Mini en las que no se puede utilizar directamente el USB para programar el microcontrolador, por lo que es necesario utilizar un adaptador USB-UART.
Para la demostración utilizo un adaptador UART y conecto:
| Adaptador UART | ESP32-C3 |
|---|---|
| GND | GND |
| 3,3 V | 3,3 V |
| TX | RX |
| RX | TX |
Inicialmente mi proceso de programación falla.
Después pruebo poner GPIO9 a GND para colocar el microcontrolador en modo de programación, pero tampoco funciona.
Finalmente descubro que el problema estaba en la velocidad de carga configurada en Arduino IDE.
La velocidad máxima era demasiado elevada para esa comunicación UART, así que la reduzco. En ese momento la carga del programa funciona.
Sin embargo, me encuentro con otro detalle: aunque el programa se había cargado, el LED no parpadeaba.
La razón es que el ESP32-C3 continuaba en modo de programación, porque GPIO9 seguía conectado a GND.
Al desconectar GPIO9 de GND y reiniciar la placa, el programa comienza a ejecutarse normalmente.
Una alternativa todavía mejor
Te propongo utilizar el UART solamente para la primera programación y configurar posteriormente OTA (Over-The-Air).
De esa manera, después de la configuración inicial, los siguientes programas puedes enviarlos mediante Wi-Fi y ya no necesitarías utilizar físicamente el adaptador UART.
Mi consejo favorito
Este es el consejo que más me gusta de los cinco.
El problema del ESP32-C3 Super Mini es su escasez de GPIO disponibles. Además, algunos pines están destinados a funciones especiales.
Descubro que:
son utilizados por la interfaz USB nativa del ESP32-C3.
Esto coincide con la documentación del propio ESP32-C3: GPIO18 corresponde a USB D− y GPIO19 a USB D+. (Espressif Systems)
Por tanto, si tu proyecto no necesita USB para programar ni para comunicación serie, teóricamente esos dos GPIO los puedes reutilizar para otras funciones.
Yo decido comprobarlo experimentalmente.
Como no dispongo de un adaptador USB-C breakout, improviso utilizando un conector USB-A hembra y conecto sus líneas de datos a las correspondientes líneas USB del ESP32-C3. De esta forma consigo sacar físicamente las señales correspondientes a GPIO18 y GPIO19.
Luego modifico un sencillo programa de parpadeo para utilizar:
GPIO18 en lugar de GPIO5.
Cargo primero el programa mediante USB y posteriormente construyo el circuito de prueba.
Y llega la prueba decisiva:
Posteriormente compruebo también GPIO19, obteniendo el mismo resultado.
La consecuencia importante
Existe, sin embargo, una consecuencia fundamental que quiero que tengas muy clara.
Al utilizar GPIO18 y GPIO19 para tu proyecto, pierdes temporalmente la interfaz USB nativa, porque esos dos GPIO son precisamente las líneas USB.
Te muestro además cómo recuperar posteriormente el USB:
- Desconecta la placa.
- Mantén presionado el botón BOOT.
- Vuelve a conectar el USB.
- Espera unos segundos.
- Suelta BOOT.
El puerto USB vuelve a aparecer en Arduino IDE y puedes continuar programando mediante USB.
Resumen de los cinco consejos
| Nº | Problema | Solución que te muestro |
|---|---|---|
| 1 | Monitor serie vacío | Dar tiempo a que USB/Serial se inicialice antes de transmitir |
| 2 | LED parpadeando con OLED | Mover I²C de GPIO8/9 a GPIO5/6 |
| 3 | Wi-Fi no conecta | Reducir potencia TX de 20,5 dBm a 8,5 dBm |
| 4 | No se puede programar mediante USB | Utilizar UART, GPIO20/21, modo de programación y menor velocidad de carga |
| 5 | Faltan GPIO | Reutilizar GPIO18/19 cuando no necesites USB |
La idea central que quiero que te lleves
El ESP32-C3 tiene mucha más flexibilidad de la que aparenta su reducido número de pines. Las funciones periféricas las puedes reasignar y, en determinadas circunstancias, incluso los GPIO18 y 19 utilizados por el USB nativo los puedes recuperar. Pero esto implica sacrificar temporalmente la interfaz USB y exige que tengas un método alternativo de programación o recuperación.
Además, quiero que recuerdes que GPIO18 y GPIO19 son realmente las líneas USB nativas del ESP32-C3, no simples pines "reservados" arbitrariamente por la placa. (Espressif Systems)