Una de las alternativas al SDK oficial de Espressif para programar directamente el SoC wifi ESP8266 es utilizar el IDE de Arduino. Esta alternativa es una de las más sencillas de usar a la vez que cuenta con un grado de madurez suficiente para producción.
Hay varias formas de utilizar la plataforma de desarrollo de Arduino con el ESP8266. La forma más básica es con el MakeFile makeEspArduino, indicada para compilar el programa y grabar la memoria flash desde la consola o desde un IDE genérico.
La segunda forma de programar el ESP8266 utilizando la infraestructura de Arduino es por medio de PlatformIO, un sistema de desarrollo pensado para la IoT con el que se pueden utilizar diferentes tipos de hardware y marcos de trabajo, ya sea desde un IDE genérico o desde la consola o desde el propio IDE de PlatformIO basado en Atom.
Instalar los componentes de desarrollo del ESP8266 en el IDE de Arduino
La tercera forma, que es la que se explica en este artículo, es desde el propio IDE de Arduino. Para instalarlo «a mano», se puede clonar el repositorio git de ESP8266 para Arduino en GitHub dentro de la carpeta «hardware» de la carpeta de Arduino.
Suponiendo que la carpeta en la que se encuentra instalado el IDE de Arduino fuera /arduino/hardware
, los pasos que habría que seguir para añadir las placas ESP8266 serían:
1 2 3 4 |
cd /arduino/hardware mkdir esp8266com cd esp8266com git clone https://github.com/esp8266/Arduino.git esp8266 |
En lugar de instalarlo clonando el repositorio git de ESP8266 para Arduino en GitHub, se puede hacer de forma automática por medio del gestor de placas del IDE de Arduino al que se accede desde el menú de preferencias.
Para añadir el ESP8266 al IDE de Arduino se escribe el URL de la descripción de este SoC (un documento JSON) en la casilla de texto del cuadro de diálogo de preferencias denominada «Gestor de URLs Adicionales de Tarjetas» http://arduino.esp8266.com/staging/package_esp8266com_index.json
Una vez que se ha añadido el repositorio con las placas de desarrollo basadas en el ESP8266 a los URL adicionales, se pueden instalar nuevas versiones, desinstalar las existentes… desde el gestor de tarjetas al que se accede desde el menú de placas que se encuentra en el de herramientas.
En el gestor de tarjetas se pueden filtrar las que se muestran para que aparezcan, por ejemplo, solamente las que disponen de una actualización, las placas de desarrollo oficiales de Arduino… Para mostrar las placas de desarrollo aportadas por terceros se selecciona la entrada contribución del menú desplegable etiquetado como tipo.
Una vez que se ha elegido mostrar solamente las tarjetas de desarrollo aportadas por terceros aparecerán las placas basadas en el ESP8266 junto con otras incluidas por defecto o que se hayan instalado anteriormente.
Al seleccionar la entrada ESP8266 by ESP8266 Community, placas de desarrollo ESP8266 soportadas por la comunidad (no por el fabricante, Espressif) se puede acceder a la ayuda en-línea, al repositorio git de ESP8266 para Arduino en GitHub y a las diferentes versiones para instalarlas o eliminar (desinstalar) este tipo de placas de desarrollo (tarjetas, en la nomenclatura del IDE de Arduino.
Elegir el tipo de placa de desarrollo con el SoC ESP8266
Una vez añadidas las placas basadas en el SoC wifi ESP8266 se pueden elegir de la misma forma que se selecciona cualquier otra placa Arduino: en la entrada etiquetada placa del menú de herramientas del IDE.
En el submenú que se despliega al elegir la entrada placas se muestran todas las tarjetas soportadas por la comunidad de desarrolladores del ESP8266. Lógicamente no estarán todas las placas que existen en el mercado y menos los circuitos propios que se hayan diseñado utilizando este SoC, en tal caso, debe seleccionarse la entrada Generic ESP8266 Module.
Puede que en el submenú aparezcan dos entradas como esta (dependerá del documento boards.txt de la carpeta en la que se instaló el soporte para las placas de desarrollo ESP8266 en Arduino), la primera suele ser más genérica y soporta las placas con 4 Mbit y la segunda es más específica para las placas que disponen de una memoria flash 8 Mbit.
Una vez que se ha elegido el tipo de placa el menú herramientas cambia para mostrar las opciones de configuración que corresponden a la que se ha seleccionado. Las opciones de configuración aparecen bajo la entrada en la que se seleccionan los dispositivos, que ahora mostrará el nombre del tipo de placa, y sobre el puerto que utilizará Arduino para grabar la memoria flash
Dado que la mayoría de placas de este tipo (especialmente las genéricas) se programan utilizando un adaptador UART TTL a USB, en el nombre del puerto aparecerá algo como /dev/ttyUSB4 o COM4 sin el nombre de la placa puesto que lo que el IDE detecta es el adaptador y no la propia placa.
Al elegir el tipo de placa de desarrollo, el IDE de Arduino también cambia el desplegable en el que se incluyen las librerías (desde el menú etiquetado programa). En la captura de pantalla de abajo se muestra las librerías que aparecen instaladas por defecto y en la siguiente las que aparecen cuando se elige una placa con el SoC ESP8266 de Espressif.
En la lista de librerías se muestran diferenciadas en dos grupos las que aporta Arduino y las que se han incluido como aportaciones de terceros. Al elegir una placa de desarrollo basada en el SoC wifi ESP8266, además de añadirse nuevas librerías diseñadas para sus características específicas, se sustituirán por las de terceros las que aporta el IDE y no son compatibles, como es el caso de la librería Wire.
La librería sustituta será equiparable con la original y funcionará de manera similar aunque puede que con alguna peculiaridad, por ejemplo, en el caso de la librería Wire no está implementado (por el momento) el modo esclavo, así que el ESP8266 actuará necesariamente como dispositivo principal del bus I2C
Configurar la placa de desarrollo con el SoC ESP8266
Configurar la velocidad a la que envían los datos para grabar la memoria flash
Dependiendo tanto de la propia placa como de otros factores externos (como el adaptador UART TTL a USB o hasta el propio PC). La velocidad más alta a la que más habitualmente funciona sin problemas la grabación de la memoria flash es 115200 baudios. En una placa o configuración especialmente problemática puede ser necesario ir probando velocidades más bajas hasta encontrar una estable o, al contrario, se pueden probar velocidades más altas y establecer (de forma subjetiva) la más rápida que funciona sin problemas. Algunos usuarios optan por velocidades altas por defecto y si la grabación del programa no se realiza de forma satisfactoria repiten el proceso; esta alternativa, bien ponderada, suele ser resultar en un proceso más rápido que la elección de una velocidad menor aunque más segura.
Configurar la conexión SPI de la memoria flash
Los tipos de memoria flash que se incorporan a los circuitos basados en el SoC wifi ESP8266 permiten acceder utilizando un bus QuadSPI que cuadruplica la velocidad del SPI convencional pero que requiere seis conexiones con el MCU además de dos para la alimentación. Por esta razón los GPIO del 6 al 11 están en uso, cosa que deja pocos GPIO libres para usos genéricos.
Una forma de conseguir un par de GPIO es degradando la velocidad de acceso a la memoria flash, ya que se pueden desconectar de la memoria GPIO9 y GPIO10 (conectando a nivel alto WP y HOLD) de manera relativamente fácil. Este modo de conexión, de acceso más lento a la memoria flash, es también a la que recurren algunas placas de desarrollo.
Siempre que el hardware de la placa de desarrollo no haya fijado el modo de acceso se podrá elegir entre los modos ⓪ QIO, cuádruple velocidad de acceso de lectura y escritura, ① QOUT cuádruple velocidad de acceso de lectura a la memoria flash, ② DIO, velocidad de acceso dual de lectura y escritura y ③ DOUT, doble velocidad de acceso de lectura a la memoria flash.
Además de la velocidad de acceso a la memoria flash, su frecuencia de funcionamiento determina la velocidad a la que el ESP8266 accederá a los datos que haya almacenados en ella. La frecuencia habitual de la memoria flash de este SoC es de 40 MHz pero es relativamente sencillo hacerle overclocking para que funcione a 80 MHz (aunque sin garantías de éxito ni de estabilidad de funcionamiento). En la entrada flash frequency del menú de herramientas se podrá elegir la frecuencia utilizada en la placa de desarrollo que se está programando.
Configurar la frecuencia de funcionamiento del ESP8266
Igual que ocurre con la memoria flash, es relativamente sencillo hacer overclocking al MCU y duplicar la frecuencia a la que funciona en la aplicación convencional, 80 MHz, para hacerlo funcionar a 160 MHz. Lógicamente los cálculos en los que esté involucrada la duración del ciclo de reloj (cálculos de tiempo) tendrán que adaptarse a esta frecuencia seleccionándola en el IDE por medio de la entrada CPU frequency del menú de herramientas.
Seleccionar el modo de reinicio (reset)
Para grabar el programa en la memoria flash de la placa de desarrollo basada en el SoC wifi ESP8266 el IDE de Arduino utiliza la aplicación esptool-ck. Esta aplicación puede resetear SoC al terminar la grabación utilizando varios métodos dependiendo del las conexiones en la placa de desarrollo y las del adaptador UART TTL a USB.
-
En las placas NodeMCU, entre otras, hay una conexión entre DTR y RESET y RTS y GPIO0 por medio de unos transistores (como puede verse en el esquema del kit de desarrollo de NodeMCU) que la utilidad esptool-ck puede activar si se le indica la opción
-cd nodemcu
. -
La conexión RTS de la UART se puede conectar a la patilla RESET o a la patilla ENABLE del ESP8266 y resetear el MCU (en el primer caso desconectándolo y volviendo a conectarlo y en el segundo por su propia función) con la opción
-cd ck
de esptool-ck. Para utilizar esta segunda fórmula también debe estar conectado DTR de la UART a GPIO0 del ESP8266 -
También se puede reiniciar el ESP8266 al terminar la grabación si se conecta DTR de la UART a RESET del MCU y la patilla de transmisión a GPIO0 utilizando un transistor. En tal caso, el parámetro que se pasa a esptool-ck resulta
-cd wifio
Dependiendo del tipo de placa de desarrollo se podrá elegir alguno de los métodos anteriores en la entrada denominada reset method del menú de herramientas. En algunos módulos wifi ESP8266 (o diseños propios) no está disponible ninguno de los métodos anteriores, en tal caso será necesario reiniciar manualmente el dispositivo para ejecutar el programa que se ha grabado en la memoria flash.
Elegir la cantidad y distribución de la memoria flash
El SoC wifi ESP8266 dispone de una ROM de 64 KBytes que se utiliza como cargador al arranque (gestor de arranque o bootloader) y una RAM de 64 KBytes para almacenar el programa que se ejecuta en el MCU. El código se carga desde la memoria flash al inicio.
512 KBytes de memoria flash en el contexto de un microcontrolador convencional parece una cantidad de memoria enorme, no extraña que se dedique a varios usos. Al principio de la memoria se almacena el código del programa, en el siguiente bloque se suele dejar espacio para poder actualizarlo OTA. Al final se reserva un espacio para simular el funcionamiento de la EEPROM de Arduino y otro espacio para almacenar la configuración del dispositivo (especialmente para los parámetros relacionados con la conexión wifi). Entre estas zonas al principio y al final puede quedar una buena cantidad de memoria en la que se pueden almacenar contenidos con una estructura equiparable a un sistema de archivos utilizando el SPIFFS.
En la entrada etiquetada como flash size (del menú de herramientas) se puede elegir la cantidad de memoria disponible en la placa de desarrollo y la parte de la misma que se desea dedicar al sistema de archivos para memoria flash SPI (SPIFFS) que en tiempo de ejecución se gestionará desde el programa que el ESP8266 esté ejecutando.
Cuando se seleccionan algunos tipos de placas de desarrollo basadas en el SoC wifi ESP8266 (por ejemplo el módulo wifi ESP8266 ESP-07) aparece una configuración de memoria predeterminada más o menos fija dependiendo del modelo seleccionado.
Configurar la depuración del código que se ejecuta en el ESP8266
El sistema de desarrollo del IDE de Arduino para el ESP8266 incluye soporte para enviar mensajes de depuración automáticos o generados desde el programa con DEBUG_MSG
a uno de los puertos serie. En la entrada etiquetada debug port del menú de herramientas se puede activar, para hacerlo, se elige uno de los puertos serie del SoC wifi ESP8266. El puerto cero (llamado Serial), el utilizado para la grabación del programa en la memoria flash puede enviar y recibir datos mientras que el puerto uno (llamado Serial1) solamente puede enviar datos, lo que lo hace un buen candidato para esta tarea.
Además de activar los mensajes de depuración se pueden configurar las situaciones de las que se desea recibir estos mensajes seleccionándolas en la entrada llamada debug level del menú de herramientas. Si se elige no enviar ningún mensaje automático (la entrada etiquetada como ninguno en el desplegable debug level del menú de herramientas) aún seguirán funcionando los mensajes enviados expresamente desde el programa. Utilizar un puerto serie para la depuración no lo inhabilita para el resto de su uso normal siempre que se ponga atención a la presencia de la información de depuración.
Seleccionar el compilador para la librería lwIP del ESP8266
Además de usar el código precompilado de la librería lwIP, las versiones más recientes del sistema de desarrollo para el ESP8266 sobre el IDE de Arduino recogen, eligiendo como placa el modo denominado Core Development Module, la posibilidad de recompilar la librería lwIP tanto con el compilador libre GCC como el de los procesadores Xtensa (XCC) originalmente de Tensilica y actualmente parte de Cadence Design Systems.
Jorge Vallejos
Hola Víctor, un cordial saludo. Tengo una consulta. Tengo un sensor de temperatura, humedad relativa y radiación UV, las mediciones de los mismos junto con la hora y la fecha las quiero enviar a una página web, desde la cual puedan ver y descargar alguna imagen o archivo pdf con el contenido actual de las mediciones. La cuestión es que tiene que ser un servidor local, donde haya una red wi-fi a la que me pueda conectar desde algún celular o alguna PC por ejemplo, entrar a la página y ver o guardar la información, todo esto local, es decir, sin conexión a internet. El mismo dispositivo debe de ser capaz de crear la red wi-fi para que yo me conecte a él desde algún dispositivo. Tengo conocimiento nulo sobre esto del IoT, no se si podría usar una raspberry pi para montar el servidor, o un arduino yun que ya trae un modulo wi-fi, o así? Que me podrías recomendar? Tiene que ser lo más barato posible jejeje…
Víctor Ventura
Hola, Jorge. Me alegra leerte otra vez por aquí.
Creo que la manera más sencilla y barata de hacer lo que planteas es generando una imagen en formato SVG en el servidor, que podría ser alguna placa con el ESP8266 con un mínimo de patillas disponibles (ESP-03, ESP-04, ESP-06, ESP-07, ESP-12…) y la disponibilidad de antena, tamaño y formato de montaje… que tu proyecto requiera.
Lo que dices sería realizable con la única reserva del número de clientes que se conectan; si son pocos valdría el ESP8266, si necesitas que muchos clientes se conecten a la vez tendrás que usar una Raspberry Pi (o algo parecido, hay algunas muy baratas con wifi, como la Orange Pi Zero) a la que le instales un servidor web de cierta capacidad (yo he montado un Apache en una ODROID-C1 con un viejo router wifi y aguanta bastante bien).
Por supuesto, con una placa Arduino Yún también puedes hacerlo. Salvo porque me parece un poco más caro, creo que sería un punto intermedio entre resolverlo todo con el ESP8266 como MCU (sin una placa Arduino) y usar una pequeña CPU como la Raspberry Pi (con acceso wifi o añadiéndolo aparte) con un servidor web.
En polaridad.es hay una serie de artículos sobre la creación de gráficas de estado de sensores conectados a la Internet de las cosas IoT que te pueden orientar sobre cómo generar los informes y otra serie sobre el almacenamiento de datos en un servidor web para IoT que te puede servir si optas por algo como una Raspberry Pi y un servidor web.
Suerte con tu proyecto.
Jorge Vallejos
Hola Víctor, agradezco mucho que hayas respondido a mi consulta, todo lo que has escrito me sirve para darme una idea general de como abordar el proyecto, porque a como te decía, mi experiencia con IoT es nula prácticamente, pero por motivos de la tesis monográfica tengo que usar esta tecnología. Voy a discutir junto con mis compañeros y el tutor de la monografía lo que has expuesto y en base a ello tomar una decisión, tanto el tutor como el resto de mis compañeros nos identificamos más con la Automatización y Control y con la Electrónica Industrial, sin embargo, es interesante investigar este «nuevo mundo». Un cordial saludo para ti y felicitaciones por tu página.
Víctor Ventura
🙂
JuanArelkys
Hola victor, muy buena tu pagina, en estos momentos necesito una ayuda, tenemos un modulo esp8266-01 y lo estamois flasheando con ai thinker 0.9.5.2 una vez que esta listo intentamos usar los comandos AT con termite3.2 e incluso el serial monitor de arduino IDE por supuesto este ultimo teniendo instalado todas las librerias correspondientes a la placa, el problema es que no recibe los comandos AT, no nos muestra el msj de ready sino que sale basurilla y nos muestra los datos de la placa tamaño de flash entre otros datos automaticamente apenas encendemos a una velocidad de 74880 baudios y continua desplazandose a la derecha el scroll automaticamente sin parar, con otra velocidad solo muestra basura, no sabemos que hacer agradeceria cualquier ayuda que podrias prestarnos.
Víctor Ventura
¡Hola!
Parece que los problemas están relacionados con las comunicaciones serie. Como supongo que has podido grabar sin problemas el firmware (no hablas de ningún error en el proceso), debe ser que, o cambias el hardware ¿nuevas conexiones? o el problema es de software.
Cuando se interpreta como basura la información que llega al ESP8266 suele ser por culpa de la velocidad: o no es la adecuada o el MCU no la soporta. También podría ser por problemas de interferencias o de alimentación pero, si los tuvieras, no habrías podido grabar el firmware correctamente.
Desde el lado del hardware, también es típico olvidar conectar RESET, que puede dar errores aleatorios (aunque no parecen los tuyos) pero supongo que, si has grabado sin problemas el firmware, no será tu caso.
No soy usuario del mismo software que tú (ni de Termite ni del firmware 0.9.5.2 para los ESP-01 de AiThinker) pero, hasta donde sé, me parece que hay dos versiones, una que funciona a 9600 baudios y otra que funciona a 115200 baudios así que supongo que, si estás trabajando a 74880 baudios es porque la has cambiado o porque no se trata del firmware que creo ¿Cómo la has cambiado? ¿Se produjo algún error al hacerlo?
Por otra parte, es normal que al conectar el módulo aparezca basura y luego muestre los datos correctos, aunque no lo es que luego vuelva a enviar basura. Si el problema fuera la velocidad de conexión, sería bastante raro que se pudiera leer una parte correctamente.
En resumen, es un caso muy confuso, hay datos que indican que funciona junto a otros que hacen pensar que no. Si yo estuviera en tu caso, ① volvería a grabar el firmware atendiendo a cualquier error, ② sin tocar las conexiones, usaría alguna aplicación para acceder al ESP-01 y verificar que funciona (ya habrás visto que mi favorita es esptool, con la que, por ejemplo, puedes leer la dirección MAC con
esptool.py read_mac
) y ③ realizando la conexión de funcionamiento normal (no la de grabar el firmware) usaría un programa de comunicaciones serie a la velocidad nominal que el firmware indique antes de cambiarla (puedes hacerlo una vez que te asegures de que todo va bien)Suerte con tu ESP8266 y no te olvides de contarnos cómo te funcionó o si tuviste nuevos problemas, así podemos aprender todos más cosas 🙂
José Ventura Zarza
Hola Victor. Enhorabunea por tu página. Los contenidos son excepcionales.
A mí me pasaba algo similar a lo que comenta JuanArelkys y el problema era la alimentación a 3,3 V que no era muy estable.
Este post es algo antiguo e imagino que ya lo habrá resuelto.
Saludos,
Víctor Ventura
¡Gracias! 🙂
Tavo
Hola Victor buenas noches, tengo un problema con mi modulo wifi 8266-01, quiisera que me ayudadras si se puede si no no hay problema de todos modos se te agradece, bueno este es mi problema
Arduino: 1.8.1 (Windows 10), Board: «Generic ESP8266 Module, 160 MHz, 80MHz, DIO, 9600, 4M (3M SPIFFS), ck, Disabled, None»
Build options changed, rebuilding all
Sketch uses 222249 bytes (21%) of program storage space. Maximum is 1044464 bytes.
Global variables use 31576 bytes (38%) of dynamic memory, leaving 50344 bytes for local variables. Maximum is 81920 bytes.
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed
This report would have more information with
«Show verbose output during compilation»
option enabled in File -> Preferences.
Cabe mencionar que apenas compre este modulo le quise meter lo que es un ejemplo de los que te viene por default cuando instalas las librerias y ese fue mi error, estoy usando un arduino mega2560 esta es mi configuracion de como estoy conectando el modulo a mi arduino
mega wifi
GND GND
3.3 VCC, RST, CH_PD
TX(18) RX
RX(19) TX
Víctor Ventura
Hola, Tavo.
No comprendo muy bien tu problema 🙁
Por una parte supongo que lo has conectado a una placa Arduino Mega usando el puerto serie ¿Para controlarlo con las órdenes AT del ESP8266? Pero por otro lado me parece que estás usando el IDE de Arduino para programar el ESP8266.
A lo mejor has configurado el IDE de Arduino para el ESP8266 pero tienes conectado un Arduino Mega ¿Puede ser que el problema esté relacionado con eso?
Suerte con tu proyecto y gracias por participar en polaridad.es
regi
buenos días,
he seguido los pasos, pero en gestor de tarjetas me sigue sin aparecer la ESP8266.
Gracias
Manuel
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed
Este error me aparecía a mí, hasta que en la pestaña herramientas, sustituí el valor ck por el de nodemcu. Utilizo una placa nodemcu v2.
Alan
Buenos Dias no se si podría ayudarme no podido configurar mi esp12f para arduino ide me sale este erro al momento de compilar
error: failed sending 1050 bytes
…
error: failed sending 1048 bytes
warning: espcomm_send_command: didn’t receive command response
warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed
warning: espcomm_send_command: wrong direction/command: 0x01 0x03, expected 0x01 0x04
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed
Este reporte podría tener más información con
«Mostrar salida detallada durante la compilación»
opción habilitada en Archivo -> Preferencias.