Programar el chip wifi ESP8266 como si fuera un microcontrolador (1/2)

IMG_20150504_230102

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:

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):

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):

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):

COMPILANDO PROGRAMAS

Vamos a descargarnos unos ejemplos ya hechos:

Esto creará una carpeta llamada source-code-examples. Entra dentro de esta carpeta y edita el fichero example.Makefile.

Modifica las siguientes lineas (recuerda cambiar oscar por tu usuario):

POR

POR

POR

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:

Si todo ha ido bien habremos compilado el firmware para nuestro ESP8266:
shell1

PROGRAMANDO EL ESP8266

Para poder programar nuestro módulo ESP8266 necesitamos un dongle usb a serie (USB2TTL) como este:
IMG_20150501_165235
Después es necesario añadir al usuario que estemos utilizando (en el ejemplo, oscar) en el grupo dialout para poder acceder al dongle:

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):
conexiones
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:

shell2
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:

shell3
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.

9 comentarios en “Programar el chip wifi ESP8266 como si fuera un microcontrolador (1/2)

  1. Bruno Garcia Tejada

    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!!

    Responder
    1. admin Autor

      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.

      Responder
      1. Bruno Garcia Tejada

        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

        Responder
        1. Alok Dixit

          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.

          Responder
  2. cdlt

    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]»

    Responder
  3. cdlt

    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

    Responder

Responder a Alok Dixit Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *