Desde su salida al mercado, el fabricante del SoC wifi ESP8266, Espressif, ya ofrecía un SDK para programarlo, pero había que tener razones muy poderosas para atreverse a usarlo, primero por no ser «muy libre» y segundo porque su documentación digamos que no era especialmente accesible.
Inicialmente, la forma común de explotar el ESP8266 era controlarlo enviando órdenes AT (incluidas en el firmware oficial) desde otro
Gracias a la popularización del ESP8266 (seguramente desde que AI-Thinker empezó a distribuir módulos muy baratos basados en este SoC) pero sobre todo gracias a unos auténticos héroes del ESP8266 que además de desarrollar para él, han documentado al detalle su funcionamiento, la primera alternativa consiste precisamente en poder programarlo. Incluso Espressif, el fabricante, se animó posteriormente a liberar el SDK con algo parecido a una licencia MIT y (más o menos) soporta a la gran comunidad que se ha creado entorno a este SoC wifi.
Superado el reto inicial, y sobre todo por la difusión de la documentación, el crecimiento actual de entornos de desarrollo, lenguajes, mejoras al firmware para añadir nuevas funcionalidades, en definitiva, la sinergia entre fabricantes, desarrolladores y en general usuarios de todo nivel, ha hecho que el SoC ESP8266 sea la opción más popular para añadir capacidad wifi al diseño de un dispositivo, muy posiblemente para conectarlo a la Internet de las cosas.
En definitiva, ahora sí es accesible desarrollar aplicaciones para el ESP8266, tanto por la evolución del SDK oficial, como por la documentación y soporte existente por parte de la comunidad del mismo y de las diferentes opciones creadas usándolo; pero su gran difusión invita a suponer que las alternativas seguirán creciendo en el futuro.
Conexión del ESP8266 para grabar un programa en la memoria flash
En las versiones iniciales de los diferentes tipos de módulos wifi ESP8266 la forma de explotarlos estaba fijada en inicio: utilizando las órdenes AT del ESP8266 de su firmware. La reprogramación de su memoria flash era algo excepcional, así que grabar un nuevo programa no era algo que estos módulos tuvieran previsto hacer de manera cómoda.
Las nuevas placas de desarrollo basadas en el ESP8266 de Espressif, la NodeMCU es un buen ejemplo, tienen resuelto este inconveniente ya sea añadiendo hardware (que puede ser, simplemente, un pulsador o un conmutador) o con un entorno de desarrollo a medida que, por ejemplo, explota el sistema de archivos para memoria flash SPI (SPIFFS) en el que grabar un script.
Para utilizar un módulo wifi ESP8266 genérico habrá que gestionar «a mano» la conexión, incluyendo alguna fórmula con la que reutilizar en la fase de producción los GPIO involucrados en la programación.
Aunque este es el esquema genérico (y el de funcionamiento más seguro) la conexión dependerá de varios factores, por ejemplo, que el pin GPIO15 esté expuesto (en algunos tipos de módulos wifi ESP8266 no lo está). Aunque esta es la conexión recomendable, debo decir que no he encontrado ningún caso en que fuera imprescindible para grabar la memoria flash del ESP8266 conectar a nivel alto el pin GPIO2.
El pin de reset tampoco suele ser imprescindible que esté a nivel alto al programar el ESP8266 (ya que normalmente funciona también «al aire») como sí lo es en el modo de producción. Como ocurre con GPIO2 es recomendable seguir la conexión «oficial», además, como muy probablemente será necesario resetear el tipos de módulos wifi ESP8266 antes de grabar la memoria flash, lo más práctico, cuando se planea programar el SoC muchas veces, es disponer una conexión estable que incluya un pulsador de reset para llevarlo a nivel bajo (resetearlo) y que esté normalmente a nivel alto por medio de una resistencia para cuando no se pulse el botón. Desafortunadamente, es más incómodo implementar de forma «artesanal» la conmutación de GPIO0, GPIO2 y GPIO15 entre el modo de programación y el modo de explotación. La forma más simple consiste en utilizar puentes o conmutadores.
Diferentes placas ESP8266 pueden tener diferente cantidad de memoria
Como se ha dicho, la explotación de los primeros modelos de módulos wifi con el SoC ESP8266 se realizaba por medio de las órdenes AT del ESP8266 implementadas en su firmware. Como las primeras versiones del firmware ocupaban poca memoria, la mayoría de los módulos wifi ESP8266 (como los primeros ESP-01) disponían solamente de 512 KiB (4 Mbit). Actualmente, tanto por dar más alternativas a la programación del ESP8266 como porque las nuevas versiones del firmware necesitan más memoria, los normal es encontrar, al menos, el doble de memoria flash, 1 MiB (8 Mbit).
Comprando pocas unidades, la diferencia de precio entre una memoria flash quad SPI de 4 Mbit y de 8 Mbit es insignificante, pero a la hora de valorar grandes producciones (y su repercusión en el precio final) es lógico utilizar solamente la cantidad necesaria. El bajo precio de la memoria flash y su (relativamente) fácil proceso de sustitución (solo tiene 8 patillas) hace que merezca la pena plantearse alargar la vida de un viejo módulo wifi ESP8266 añadiendo más memoria, imprescindible tanto para las últimas versiones del firmware como para programarlo usando los lenguajes de más alto nivel.
GPIO disponibles en el ESP8266
El SoC ESP8266 está integrado en un encapsulado SMD QFN de 32 patillas más la conexión GND que se encuentra en la parte posterior, que queda en contacto con la PCB. Al no disponer de muchas conexiones, la mayoría de las patillas tiene asociadas varias funciones intercambiables. En las siguientes imágenes se muestra la nomenclatura que el fabricante da al pinout y las patillas que se usan de forma genérica.
Los esquemas de abajo muestran el pinout de los GPIO, incluyendo el pin ADC, y el patillaje del ESP8266 asociado a las comunicaciones. Solamente la entrada analógica, y los GPIO 0, 15 y 16 quedan libres si se utilizan las comunicaciones UART TTL, I2C y SPI.
Hay un par de datos en las imágenes anteriores en los que merece la pena fijarse, en primer lugar, del GPIO6 al GPIO11 no pueden utilizarse porque se han reservado para acceder a la memoria flash y en segundo lugar, solamente hay un puerto UART completo (numerado como cero), el segundo puerto (numerado como uno) solo puede utilizarse para enviar datos utilizando el pin TX1.
Se utilizan más patillas de las que podría esperarse para acceder a la memoria flash porque utiliza comunicaciones «Quad SPI» que permite velocidades cuatro veces superiores al bus SPI convencional. Como la memoria flash usada en los módulos wifi ESP8266 también es compatible con «Dual SPI» y con el protocolo básico SPI, se puede degradar su funcionamiento a una velocidad inferior para poder utilizar más GPIO. No es normal utilizar esta configuración, menos en un diseño propio, ya que suele ser preferible disponer de más velocidad de acceso a memoria frente a más GPIO que, por otra parte, pueden conseguirse utilizando un expansor (multiplexor) de GPIO que se comunique con el ESP8266 por I2C o por SPI.
Alejandro Nara
Victor, colega, gracias por tu nota, esstoy comenzando con arduino y puntualmente con una esp8266.
Es un mundo mas que fascinante asì que las recomendaciones que puedas darme seràn muy valiosas.
Víctor Ventura
Hola, Alejandro.
Pues encantado de ser de ayuda aunque creo que lo mejor es que plantees cuestiones concretas que seguro que por aquí podremos echarte una mano.
Mientras, nos vemos por polaridad.es seguro que encuentras artículos que te inspiren 🙂
Daniel Sánchez
Hola! Víctor, gracias por la información, estoy realizando un proyecto para medir frecuencia cardíaca y poder mandar los datos vía Wi-Fi a una app. Estoy programando en el mismo módulo ESP8266 para ahorrarme el espacio de la placa de arduino y como sensor de frecuencia cardíaca el MAX30100. Es buena idea querer omitir el arduino? o tendré futuras fallas o restricciones al omitirlo?. Gracias!
Víctor Ventura
Hola, Daniel.
Es una excelente idea omitir el Arduino. Con el ESP8266 tienes suficiente (y ahorras espacio y consumo)
Saludos.