En esta tanda de dos artículos explicaré cómo olvidarse de los comandos AT del módulo ESP8266 ESP-01 (aunque lo escrito vale para toda la familia ESP) y poder programarlo como un chip independiente: conectando la wifi, manejando el puerto serie, usando los pines GPIO, etc. La gran ventaja es que tenemos un microprocesador más potente, más versátil, más rápido y además en muchos casos es más barato que si usáramos los microcontroladores PIC o AVR (como contrapartida tiene menos pines de E/S).
CONSTRUYENDO EL TOOLCHAIN
El primer paso que tenemos que hacer para programarlo es construir el toolchain para poder compilar los programas para este chip con el compilador cruzado. Para ello recomiendo tener un linux donde construirlo (ya sea físico o virtualizado), no recomiendo usar windows y cygwin. Yo estoy usando el ubuntu 14.04 LTS.
Lo primero es instalar las herramientas necesarias, para ello ejecutar:
1 |
sudo apt-get install make unrar autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python sed unzip git |
Vamos a usar el toolchain de https://github.com/pfalcon/esp-open-sdk, con el que el proceso de creación es bastante sencillo (ejecútalo en la raíz de tu directorio personal):
1 |
git clone https://github.com/pfalcon/esp-open-sdk.git |
Esto habrá creado una carpeta esp-open-sdk. Entra dentro de está y haz un make (con el parámetro STANDALONE=y) para crear todo el toolchain (puede tardar un rato dependiendo de tu ordenador):
1 2 |
cd esp-open-sdk make STANDALONE=y |
Ahora vamos a poner en la variable de entorno PATH la ruta a los binarios, ya que el esptool no funciona si no se pone (cambia oscar por tu usuario):
1 2 |
PATH=$PATH:/home/oscar/esp-open-sdk/xtensa-lx106-elf/bin export PATH |
COMPILANDO PROGRAMAS
Vamos a descargarnos unos ejemplos ya hechos:
1 |
git clone https://github.com/esp8266/source-code-examples.git |
Esto creará una carpeta llamada source-code-examples. Entra dentro de esta carpeta y edita el fichero example.Makefile.
1 2 |
cd source-code-examples nano example.Makefile |
Modifica las siguientes lineas (recuerda cambiar oscar por tu usuario):
1 |
XTENSA_TOOLS_ROOT ?= /opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin |
POR
1 |
XTENSA_TOOLS_ROOT ?= /home/oscar/esp-open-sdk/xtensa-lx106-elf/bin |
1 |
SDK_BASE ?= /opt/Espressif/ESP8266_SDK |
POR
1 |
SDK_BASE ?= /home/oscar/esp-open-sdk/sdk |
1 |
ESPTOOL ?= esptool.py |
POR
1 |
ESPTOOL ?= /home/oscar/esp-open-sdk/esptool/esptool.py |
El campo ESPPORT debes cambiarlo si no coincide con la ruta al dispositivo asociado a tu dongle usb a serie.
Ahora entra dentro del direcotrio blinky, copia el fichero anteriormente editado como Makefile y haz un make para compilar el firmware:
1 2 3 |
cd blinky cp ../example.Makefile Makefile make |
Si todo ha ido bien habremos compilado el firmware para nuestro ESP8266:
PROGRAMANDO EL ESP8266
Para poder programar nuestro módulo ESP8266 necesitamos un dongle usb a serie (USB2TTL) como este:
Después es necesario añadir al usuario que estemos utilizando (en el ejemplo, oscar) en el grupo dialout para poder acceder al dongle:
1 |
sudo adduser oscar dialout |
Ahora sólo queda subir el programa al módulo ESP8266, para ello debes cablear el módulo de la siguiente forma (estando éste sin alimentación):
Las líneas rojas van a VCC (3,3V) y las negras a GND (masa). Ahora alimenta el módulo.
Si es la primera vez que vas a programar el módulo wifi, debes borrar las configuraciones por defecto, esto se consigue ejecutando el siguiente comando:
1 |
~/esp-open-sdk/esptool/esptool.py --port /dev/ttyUSB0 write_flash 0x7C000 ~/esp-open-sdk/esp_iot_sdk_v1.0.1/bin/esp_init_data_default.bin 0x7E000 ~/esp-open-sdk/esp_iot_sdk_v1.0.1/bin/blank.bin |
Las siguientes veces ya no será necesario repetir este paso. Si has hecho este paso vuelve a apagar y encender el módulo.
Finalmente para programar el firmware creado, ejecuta el comando:
1 |
make flash |
Enhorabuena, acabas de programar por primera vez tu módulo ESP8266. Ahora desconecta el cable que va al pin de programacion (así el módulo no estará en modo de programación), conecta un led entre el GPIO 2 (el que no aparece conectado a ningún sitio en la fila de GND de la foto anterior de las conexiones) y masa. Así es como luce el «hola mundo» del chip ESP8266:
En el siguiente artículo explicaré cómo hacer tus propios programas en C para el esp8266.
una pregunta, una vez flasheado el modulo, no se requiere flashear mas, a meneos que salga una version nueva ?
Por qué lo preguntas? Es como un Arduino, mientras no necesites cambiar algo lo que hayas programado sigue funcionando.
Muy buen trabajo!! Muchas gracias, logré programar mi ESP8266 ESP-01. Sin embargo al ejecutar el penúltimo comando obtuve el siguiente error:
kmo2@kmo2-HP:~/esp-open-sdk/source-code-examples/blinky$ ~/esp-open-sdk/esptool/esptool.py –port /dev/ttyUSB0 write_flash 0x7C000 ~/esp-open-sdk/esp_iot_sdk_v1.0.1/bin/esp_init_data_default.bin 0x7E000 ~/esp-open-sdk/esp_iot_sdk_v1.0.1/bin/blank.bin
Connecting…
Traceback (most recent call last):
File «/home/kmo2/esp-open-sdk/esptool/esptool.py», line 557, in
image = file(filename, ‘rb’).read()
IOError: [Errno 2] No such file or directory: ‘/home/kmo2/esp-open-sdk/esp_iot_sdk_v1.0.1/bin/esp_init_data_default.bin’
Sin embargo pude programar el circuito y encender el LED sin problemas, supongo que no es del todo necesario ese comando.
También cabe decir que necesité ejecutar el comando «chmod +x /home/kmo2/esp-open-sdk/» para poder crear el toolchain sin errores («make STANDALONE=y»)
Una última consulta mi estimado amigo, que debo hacer diferente para programar el ESP8266 ESP-12E ?
Muchas gracias y muy buen trabajo!!
En teoría sirve pata eliminar los datos de la WiFi que tenga almacenados anteriromente, pero como bien dices no es imprescindible.
Lo del directorio, ya debería tener el permiso de poder entrar por defecto a no ser que lo descargaras con root y luego ejecutases el make con otro usuario o viceversa.
No he probado el ESP-12E pero la SDK es la misma para todos los módulos.
Ok gracias por la aclaración. Una consulta, todo esta funcionando bien hasta hace poco que se me presento el siguiente problema a la hora de compilar un programa usando «make»:
Error calling xtensa-lx106-elf-readelf, do you have Xtensa toolchain in PATH?
make: *** [firmware/0x00000.bin] Error 1
Sabes como puedo solucionar este problema?
Gracias de antemano
I got the same Error. The solution that worked for me was to add Xtensa-lx106-elf-readelf in path by command
export PATH=»/opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin/xtensa-lx106-elf-readelf:$PATH»
Note that I installed it in /opt/Espressif… . Please change the destination as per your configurations.
Me figura el siguiente error en la compilación «error: passing argument 1 of ‘ets_timer_disarm’ discards ‘volatile’ qualifier from pointer target type [-Werror]»
La salida completa de make es:
CC user/user_main.c
user/user_main.c: In function ‘user_init’:
user/user_main.c:51:5: error: passing argument 1 of ‘ets_timer_disarm’ discards ‘volatile’ qualifier from pointer target type [-Werror]
os_timer_disarm(&some_timer);
^
In file included from user/user_main.c:2:0:
/home/cdlt/SDKs/esp-open-sdk/sdk/include/osapi.h:66:6: note: expected ‘struct ETSTimer *’ but argument is of type ‘volatile struct ETSTimer *’
void ets_timer_disarm(os_timer_t *ptimer);
^
user/user_main.c:54:5: error: passing argument 1 of ‘ets_timer_setfn’ discards ‘volatile’ qualifier from pointer target type [-Werror]
os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
^
In file included from user/user_main.c:2:0:
/home/cdlt/SDKs/esp-open-sdk/sdk/include/osapi.h:67:6: note: expected ‘struct ETSTimer *’ but argument is of type ‘volatile struct ETSTimer *’
void ets_timer_setfn(os_timer_t *ptimer, os_timer_func_t *pfunction, void *parg);
^
user/user_main.c:60:5: error: passing argument 1 of ‘ets_timer_arm_new’ discards ‘volatile’ qualifier from pointer target type [-Werror]
os_timer_arm(&some_timer, 1000, 1);
^
In file included from user/user_main.c:2:0:
/home/cdlt/SDKs/esp-open-sdk/sdk/include/osapi.h:65:6: note: expected ‘struct ETSTimer *’ but argument is of type ‘volatile struct ETSTimer *’
void ets_timer_arm_new(os_timer_t *ptimer, uint32_t time, bool repeat_flag, bool ms_flag);
^
cc1: all warnings being treated as errors
Makefile:137: recipe for target ‘build/user/user_main.o’ failed
make: *** [build/user/user_main.o] Error 1
Hola cdlt
¿Alguien te ha dado respuesta? ¿Conseguiste que funcionase? Tengo exactamente el mismo error…