Flashear Esp8266, fu-K AT-commands

Nunca me entraba en la cabeza, mantener ese acople con arduino vía USB, me impendía explorar zona remotas con sensores, también que la api JSSC de Alexey Sokolov ya no es mantenida, solo un fork que veo bastante activa a la gente y es aquí jSerialComm.

Una Elegante solución para guindow$ y linux Instalación ESP8285H05 en Ubuntu 18.04.3 LTS

Necesitamos un convertidor de puerto serie a usb, pero el arduino no los proporciona ya, así que no hace falta comprar uno.

Se flashea porque el esp8266 viene para ser usado con los aburridos comandos AT, cosa que nos ahorramos al flashear porque soportaría comandos del arduino, siendo programable con el IDE como tal, o por ejemplo PlataformIO un plugin para VSCode

Usaremos

Esp8266 pinout

esp8266pinout esp8266arduino

Conexión con arduino y fuente regulable de 3.3v a 5v

fritzingesp8266FuenteReguladaConexionTotal

NODEMCU FIRMWARE PROGRAMMER

nodemcufirmwareprogrammer

la primera vez al ejecutar la aplicación y darle flash, parece que se queda buscando el puerto com del arduino, debemos es darle flash, y reconectar el puerto usb, es decir quitar/conectar, y así empezaría el proceso de flasheo.

Log con mal flasheo

Aquí vemos que da como cierto problema al conectar con el com

Note:Begin find ESP8266.
Note:Serial port disconnected.
Warning:Serial port closed by user.
Note:Detect serial port changed.
Note:Auto MAP serial port.Port-->COM3

Note:Serial port connected.
Note:Begin find ESP8266.
Note:Detect serial port changed.
Note:Auto MAP serial port.Port-->COM4

Log correcto

flasheando con NodemcuFirmwareProgrammer

nodemcu

Note:Detect serial port changed.
Note:Auto MAP serial port.Port-->COM4

Note:Serial port connected.
Note:Begin find ESP8266.
Note:ESP8266 ACK success.
Note:ESP8266 ACK success.
Note:Set base address success.
Note:Program flash success.

Flashing completado correctamente

nodemcuflashcompleta

Configuración del arduino con respositorio esp8266

EL repositorio es el siguiente Esp8266 debemos añadir la siguiente URL en la ventana Preferencias:

  • Gestor de URLs Adicionales de Tarjetas

https://arduino.esp8266.com/stable/package_esp8266com_index.json

width=

Ahora gracias a eso podemos irnos a Herramientas/Placa/Gestor de tarjetas, buscamos ESP8266 y lo instalamos para descargar la api.

gestortarjetasarduino

Luego de instalado deberíamos de ver en Herramientas/Placa las nuevas placas Espxxx añadidas a la lista.

Seleccionamos Generic ESP8266 Module


También el led a usar por defecto, será GPIO0 el pinDigital

ledblinktoesp8266

  • 1 Colocar el pin GPIO0 a tierra sin la tensión de 3.3v que viene del arduino, o la fuente,0

  • 2 Oprimir (subir/upload)

  • 3 En el sketch cuando aparezca lo siguiente.

  • 4 Connecting…​…​. justo colocamos los 3.3v (INMEDIATAMENTE)

También se puede tener tener la tierra desconectada y luego conectar el cable USB, el modo de flasheo empezará normalmente.
 Connecting.......

 El Sketch usa 257220 bytes (26%) del espacio de almacenamiento del programa. El máximo es 958448 bytes.
 Las variables Globales usan 26816 bytes (32%) de la memoria dinámica, dejando 55104 bytes para las variables locales. El máximo es 81920 bytes.
 esptool.py v2.8
 Serial port COM4
 Connecting........____
 Chip is ESP8266EX
 Features: WiFi
 Crystal is 26MHz
 MAC: 68:c6:3a:ea:87:1c
 Uploading stub...
 Running stub...
 Stub running...
 Configuring flash size...
 Auto-detected Flash size: 1MB
 Compressed 261376 bytes to 192973...
 Writing at 0x00000000... (8 %)
 Writing at 0x00004000... (16 %)
 Writing at 0x00008000... (25 %)
 Writing at 0x0000c000... (33 %)
 Writing at 0x00010000... (41 %)
 Writing at 0x00014000... (50 %)
 Writing at 0x00018000... (58 %)
 Writing at 0x0001c000... (66 %)
 Writing at 0x00020000... (75 %)
 Writing at 0x00024000... (83 %)
 Writing at 0x00028000... (91 %)
 Writing at 0x0002c000... (100 %)
 Wrote 261376 bytes (192973 compressed) at 0x00000000 in 20.3 seconds (effective 103.2 kbit/s)...
 Hash of data verified.

 Leaving...
 Hard resetting vía RTS pin...

Lo anterior no es un error, Si nos pasa entonces toca ir a:

Herramientas > Reset Method > "no dtr (aka ck)".

resetmethosnodtr

esptool.py v2.8
Serial port COM4
Connecting.....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 68:c6:3a:ea:87:1c
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 1MB
Compressed 261376 bytes to 192973...

Writing at 0x00000000... (8 %)
Writing at 0x00004000... (16 %)
Writing at 0x00008000... (25 %)
Writing at 0x0000c000... (33 %)
Writing at 0x00010000... (41 %)
Writing at 0x00014000... (50 %)
Writing at 0x00018000... (58 %)
Writing at 0x0001c000... (66 %)
Writing at 0x00020000... (75 %)
Writing at 0x00024000... (83 %)
Writing at 0x00028000... (91 %)
Writing at 0x0002c000... (100 %)
Wrote 261376 bytes (192973 compressed) at 0x00000000 in 20.3 seconds (effective 103.2 kbit/s)...
Hash of data verified.

Leaving...
Soft resetting...

ESP-01s con conversor usb/ttl

Para ahorrarnos pasos anteriores a la hora de cablear, podemos usar este conversor, aqui el LED_BUILTIN estara en el GPI02 de esta version esp-01s

En mi caso usa un convertidor de la serie cp210x

rubn ⲁƛ ▸ sudo dmesg | grep tty
[954377.573038] usb 1-4.4.4.2: cp210x converter now attached to ttyUSB0

Ejecutamos esptool.py

rubn ⲁƛ ▸ esptool.py flash_id
esptool.py v4.2.1
Found 1 serial ports
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 2c:f4:32:10:1d:bf
Uploading stub...
Running stub...
Stub running...
Manufacturer: 85
Device: 6014
Detected flash size: 1MB (1)
Hard resetting via RTS pin...
1 1MB de memoria correspondiente a la version esp-01s

Hacemos un pequeño blink delay de medio segundo

#define LED_BUILTIN 2 (1)
//const int PIN = ;// pin digital
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  Serial.begin(115200);
  //pinMode(PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}
1 pin del led del esp

Como podemos ver en aliexpress esta placa esta muy económica, y tambien el conversor, dar click en la imagen

conversorUsbTtl


Instalación ESP8285H05 en Ubuntu 18.04.3 LTS

El turno es para el NodeMCU ESP8285H08 con 2MB de flash, la mitad que la del lolin v3.

esp8285h08

Usando dmesg o lsusb con linux para escanear puertos

Es ideal tener un cable usb con datos, para que sea reconocido el microcontrolador, y tengamos una salida en consola como la siguente, con ambos comandos.
rubn ⲁƛ ▸ sudo dmesg | grep tty
[87120.442984] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
[87124.729474] usb 1-4.3: ch341-uart converter now attached to ttyUSB0 (1)
1 El micro ha sido reconocido.

Con lsusb

rubn ⲁƛ ▸ lsusb
Bus 002 Device 009: ID 0480:0900 Toshiba America Inc MQ04UBF100
Bus 002 Device 008: ID 2109:0817 VIA Labs, Inc. USB3.0 Hub
Bus 002 Device 007: ID 2109:0817 VIA Labs, Inc. USB3.0 Hub
Bus 002 Device 006: ID 2109:0817 VIA Labs, Inc. USB3.0 Hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 012: ID 2109:2817 VIA Labs, Inc. USB2.0 Hub
Bus 001 Device 016: ID 10c4:ea60 Silicon Labs CP210x UART Bridge (1)
Bus 001 Device 011: ID 2109:2817 VIA Labs, Inc. USB2.0 Hub
Bus 001 Device 010: ID 2109:2817 VIA Labs, Inc. USB2.0 Hub
Bus 001 Device 009: ID 1ea7:0064 SHARKOON Technologies GmbH 2.4G Mouse
Bus 001 Device 007: ID 8087:0aaa Intel Corp.
Bus 001 Device 005: ID 5986:211b Acer, Inc HD Webcam
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
1 Este es el micro que nos interesa en este momento.

Este es el error de permisos actual con la versión del Arduino IDE 1.8.15

arduino ide PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

En caso de no tener permisos en ese puerto, ya nos había pasado hace años aquí Arduino-IDE-Error.

  • Cambiar de ttyACM0 a ttyUSB0

sudo chmod a+rw /dev/ttyUSB0

¿Bien que haremos con él?

Flashear nuestro nodeMCU de dos maneras por consola o GUI, pero este es menos tedioso que el ESP8266 ya que es un KIT mas completo, tenemos dos pasos:

Todo lo anterior sirve para Guindow$ en caso de linux son otros pasos, en la siguiente URL tenemos la explicación más detallada.

Según la web de arriba ya existe una nube donde podemos construir las ultimas versiones del firmware, yo en este caso use la configuración por defecto y en unos minutos me envían un email con las url de descarga del firmware.

correoNodemcuBuild

Flasheo con nodemcu-pyflasher

El mismo team que creo dicha aplicación también tienen una GUI para realizar el flashing llamado nodemcu-pyflasher en el README.md indican ciertos pasos para una correcta ejecución.

Aquí un flasheo correcto, con solo conectar el usb y dar permisos en consola

Esta libreria wx no deja abrir la interface del NODEMCUPY flasher, el error se esta presentando en ubuntu 20.04 y algo de GTK3 como en el log siguiente
*** Could not run GTK+ test program, checking why...
    *** The test program failed to compile or link. See the file config.log for the
    *** exact error that occurred. This usually means GTK+ is incorrectly installed.
    configure: error:
    The development files for GTK+ were not found. For GTK+ 2, please
    ensure that pkg-config is in the path and that gtk+-2.0.pc is
    installed. For GTK+ 1.2 please check that gtk-config is in the path,
    and that the version is 1.2.3 or above. Also check that the
    libraries returned by 'pkg-config gtk+-2.0 --libs' or 'gtk-config
    --libs' are in the LD_LIBRARY_PATH or equivalent.

Con esto logramos hacer una instalacion del WX

pip install https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-20.04/wxPython-4.1.1-cp38-cp38-linux_x86_64.whl
rubn ⲁƛ ▸ python
Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>> wx.__version__
'4.1.1' (1)
>>>
1 version actual del wx
sudo python nodemcu-pyflasher.py

nodemMCU pyflasher


Flasheo por consola con esptool.py

Con esta app por consola programada en python y de la gente de Espressif hacemos lo mismo que el nodemcu-pyflasher pero sin GUI.

El esptool.py podemos instalarle con pip de python para usar la última versión

Directorios de instalación del esptool.py
  1. En Linux

    • /home/rubn/.local/lib/python2.7/site-packages

  2. En FreeBSD y con permisos en dicha ruta, muy importante.

    • /usr/home/rubn/.local/bin/esptool.py

  3. En Guindow$

    • C:\Users\usuario\AppData\Local\Programs\Python\Python310\Scripts

Sirve también en caso de brikear el ESP8285 como en Unbrick-Esp8266-Blinking-led-blue

sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m 0x00000 dev8firmware.bin (1)
1 32m esta deprecado ya, usar 4MB, ni hace falta establecer el --b (baud rate), ya que usa el que tiene por defecto de 115200

Salida en consola

rubn ⲁƛ ▸ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m 0x00000 dev8firmware.bin (1)
[sudo] contraseña para rubn:
WARNING: Flash size arguments in megabits like '32m' are deprecated.
Please use the equivalent size '4MB'. (2)
Megabit arguments may be removed in a future release.
esptool.py v3.1
Serial port /dev/ttyUSB0 (3)
Connecting....
Detecting chip type... ESP8266
Chip is ESP8285H08
Features: WiFi, Embedded Flash
Crystal is 26MHz
MAC: f4:cf:a2:0f:45:cd (4)
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00094fff...
Flash params set to 0x0240
Compressed 610304 bytes to 402075...
Wrote 610304 bytes (402075 compressed) at 0x00000000 in 35.8 seconds (effective 136.5 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
1 Se uso 32m valor deprecado
2 Usar como indica el log, 4MB
3 Puerto /dev/ttyUSB0
4 Dirección mac

Los otros pasos son iguales a los de más arriba, donde flasheamos con el ejemplo del Blink led pero con el pin 16 tal que nuestro código en Arduino seria:

const int LED = 16;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.

  pinMode(LED, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Connecting…​

El nodeMCU con el arduino IDE le seteamos varios parámetros como

  • configuracionArduino

⚙️ Subiendo el source al nodeMCU

Executable segment sizes:
ICACHE : 32768           - flash instruction cache
IROM   : 269228          - code in flash         (default or ICACHE_FLASH_ATTR)
IRAM   : 27473   / 32768 - code in IRAM          (IRAM_ATTR, ISRs...)
DATA   : 1540  )         - initialized variables (global, static) in RAM/HEAP
RODATA : 2980  ) / 81920 - constants             (global, static) in RAM/HEAP
BSS    : 25912 )         - zeroed variables      (global, static) in RAM/HEAP
El Sketch usa 301221 bytes (60%) del espacio de almacenamiento de programa. El máximo es 499696 bytes.
Las variables Globales usan 30432 bytes (37%) de la memoria dinámica, dejando 51488 bytes para las variables locales. El máximo es 81920 bytes.
esptool.py v3.0
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP8285
Features: WiFi, Embedded Flash
Crystal is 26MHz
MAC: f4:cf:a2:0f:45:cd
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 1MB
Erasing flash (this may take a while)...
Chip erase completed successfully in 1.5s
Compressed 305376 bytes to 221397...
Writing at 0x00000000... (7 %)
Writing at 0x00004000... (14 %)
Writing at 0x00008000... (21 %)
Writing at 0x0000c000... (28 %)
Writing at 0x00010000... (35 %)
Writing at 0x00014000... (42 %)
Writing at 0x00018000... (50 %)
Writing at 0x0001c000... (57 %)
Writing at 0x00020000... (64 %)
Writing at 0x00024000... (71 %)
Writing at 0x00028000... (78 %)
Writing at 0x0002c000... (85 %)
Writing at 0x00030000... (92 %)
Writing at 0x00034000... (100 %)
Wrote 305376 bytes (221397 compressed) at 0x00000000 in 19.7 seconds (effective 124.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Ya deberíamos tener nuestro micro activo 🔥

blinkFlashing


Esp8266 lolin V3

nodemcu v3 wifi esp8266 ch340

Una hermosura tambíen en buen precio en amazon, barato gracias al conversor uart CH340, esta versión de 4 megas podemos flashearle rapidamente el firmware blink_led.bin que lo extraje con el Arduino IDE.

#define LED_BUILTIN 2 (1)

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.

  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}
1 LED_BUILTIN del lolin v3

Flasheamos por consola con este comando

esptool.py --port /dev/ttyUSB0 -b 460800 write_flash 0x00000 blink_led.bin
rubn ⲁƛ ▸ esptool.py --port /dev/ttyUSB0 -b 460800 write_flash 0x00000 blink_led.bin
esptool.py v4.2.1
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: c8:c9:a3:52:ee:c7
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00041fff...
Compressed 266928 bytes to 196322...
Wrote 266928 bytes (196322 compressed) at 0x00000000 in 4.6 seconds (effective 467.1 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Estos son los firmware que utilicé