ESP — различия между версиями
Avp (обсуждение | вклад) (Создал страницу) |
Avp (обсуждение | вклад) |
||
(не показано 19 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
+ | = Общая информация = | ||
+ | * [http://www.esploradores.com/wp-content/uploads/2018/04/A-Beginners-Guide-to-the-ESP8266-1.pdf A Beginner's Guide to the ESP8266] | ||
+ | |||
+ | = ESP8266 = | ||
+ | Инструкция подготовлена Владимиром Слугиным на базе описания следующего видео: https://www.youtube.com/watch?v=64_9O9sKuqM | ||
+ | |||
+ | == Настройка IDE == | ||
+ | # Установить IDE (http://www.arduino.cc/en/Main/Software) | ||
+ | # Запустить [[может использовать::Arduino IDE]], далее Файл – Настройки – в поле Additional Boards Manager URLs вставить ссылку http://arduino.esp8266.com/package_es... | ||
+ | # Инструменты – Плата – Boards Manager | ||
+ | # В Boards Manager найти и установить (около 130 мб) [[маркировка::ESP8266]] by ESP8266 Community Forum | ||
+ | # В меню Инструменты выбрать Плата – Generic ESP8266. При необходимости установить: частота - 80MHz, скорость записи - 9600, Flash Size - 512K. | ||
+ | |||
+ | == Схема подключения к компьютеру == | ||
+ | использован USB-UART (UART - ESP8266): | ||
+ | * GND - GND | ||
+ | * RxD - TxD | ||
+ | * TxD - RxD | ||
+ | * 3.3v (!!) - Vcc + (через резистор 10-20К) CH_PD | ||
+ | |||
+ | == Скетч для записи в esp8266 == | ||
+ | # В Arduino IDE Файл – Образцы – ESP8266WebServer – HelloServer | ||
+ | # В файле указать ssid (название) точки доступа WiFi (const char* ssid = "....";) и пароль (const char* password = "....";) | ||
+ | |||
+ | == Запись в esp8266 == | ||
+ | # Соединить GND (UART) с gpio0 (esp) | ||
+ | # Подключить UART к компьютеру | ||
+ | # Разомкнуть GND и gpio0 | ||
+ | # Нажать кнопку Вгрузить в Arduino IDE | ||
+ | # После завершения загрузки переподключить UART (вместе с esp) | ||
+ | |||
+ | == Подключение к веб серверу esp8266 == | ||
+ | # Подключится к точке доступа esp (у меня называется ESPap) | ||
+ | # Ввести ip адрес (192.168.4.1) в поисковой строке браузера | ||
+ | |||
= ESP-32S = | = ESP-32S = | ||
+ | |||
== Описание == | == Описание == | ||
+ | * Pinout: https://www.14core.com/wp-content/uploads/2017/04/ESP32-Pinout-DIagram.jpg | ||
+ | * Описание CPU: http://ip.cadence.com/uploads/533/Cadence_Tensillica_Xtensa_LX6_ds-pdf | ||
+ | |||
== Получение toolchain'а == | == Получение toolchain'а == | ||
+ | <pre> | ||
+ | $ cd /path/to/arduino/ | ||
+ | $ mkdir -p hardware/espressif | ||
+ | $ cd hardware/espressif | ||
+ | $ git clone https://github.com/espressif/arduino-esp32.git esp32 | ||
+ | $ cd esp32/tools/ | ||
+ | $ python get.py | ||
+ | </pre> | ||
+ | |||
== Сборка проекта == | == Сборка проекта == | ||
+ | Для сборки необходимо выполнить следующую команду: | ||
+ | <pre> | ||
+ | ./build.py /path/to/sketch/ | ||
+ | </pre> | ||
+ | |||
+ | Собранный проект будет в подкаталоге в <code>/tmp</code>. | ||
+ | |||
+ | |||
+ | === Troubleshooting === | ||
+ | ==== TypeError: unorderable types: PartitionDefinition PartitionDefinition ==== | ||
+ | На данный момент (2017-06-28) для работы утилит из toolchain'а необходим Python 2: | ||
+ | https://github.com/espressif/esp-idf-template/issues/3 | ||
+ | |||
+ | На Gentoo GNU/Linux проблема решается на переключение на нужную версию Python: | ||
+ | |||
+ | <pre> | ||
+ | $ eselect python list | ||
+ | Available Python interpreters: | ||
+ | [1] python2.7 | ||
+ | [2] python3.3 | ||
+ | [3] python3.4 * | ||
+ | $ eselect python set 1 | ||
+ | </pre> | ||
+ | ==== warning: no return statement in function returning non-void ==== | ||
+ | Проблема возникает при использовании библиотеки [https://github.com/squix78/esp8266-oled-ssd1306 esp8266-oled-ssd1306]. | ||
+ | |||
+ | ===== Симптомы ===== | ||
+ | |||
+ | <pre> | ||
+ | In file included from /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/SSD1306Wire.h:31:0, | ||
+ | from /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/SSD1306.h:30, | ||
+ | from /tmp/arduino_8d8be8ad7edc7c39c779408e245d8629/SSD1306ClockDemo.ino:32: | ||
+ | /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/OLEDDisplay.h: In member function 'virtual bool OLEDDisplay::connect()': | ||
+ | /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/OLEDDisplay.h:253:29: warning: no return statement in function returning non-void [-Wreturn-type] | ||
+ | virtual bool connect() {}; | ||
+ | </pre> | ||
+ | |||
+ | ===== Решение ===== | ||
+ | Поменять файл <code>platform.txt</code> в каталоге с проектом, выключив сигнализацию ошибок для некоторых предупреждений: | ||
+ | |||
+ | <pre> | ||
+ | diff --git a/platform.txt b/platform.txt | ||
+ | index 3a8b30b..370b1df 100644 | ||
+ | --- a/platform.txt | ||
+ | +++ b/platform.txt | ||
+ | @@ -27,7 +27,7 @@ compiler.c.cmd=xtensa-esp32-elf-gcc | ||
+ | compiler.c.flags=-std=gnu99 -Os -g3 -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib -Wpointer-arith {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -Wno-old-style-declaration -MMD -c | ||
+ | |||
+ | compiler.cpp.cmd=xtensa-esp32-elf-g++ | ||
+ | -compiler.cpp.flags=-std=gnu++11 -fno-exceptions -fno-rtti -Os -g3 -Wpointer-arith -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -fno-rtti -MMD -c | ||
+ | +compiler.cpp.flags=-std=gnu++11 -fno-exceptions -fno-rtti -Os -g3 -Wpointer-arith -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -fno-rtti -MMD -Wno-error=return-type -Wno-error=switch -Wno-error=maybe-uninitialized -c | ||
+ | |||
+ | compiler.S.cmd=xtensa-esp32-elf-gcc | ||
+ | compiler.S.flags=-c -g3 -x assembler-with-cpp -MMD -mlongcalls | ||
+ | </pre> | ||
+ | |||
== Загрузка прошивки == | == Загрузка прошивки == | ||
+ | Из Arduino IDE загрузку следует выполнять на скорости 115200. | ||
+ | |||
+ | После загрузки нужно перезагрузить МК -- можно через кнопку, если таковая есть на плате. | ||
+ | |||
+ | == Bluetooth == | ||
+ | * [https://github.com/espressif/esp-idf/tree/master/examples/bluetooth Примеры программ] | ||
+ | * https://hackaday.io/project/28904-read-phone-notifications-using-esp | ||
+ | |||
+ | == Troubleshooting == | ||
+ | === Прошивка загрузилась, но не работает === | ||
+ | В этом случае следует перезагрузить МК. | ||
+ | |||
+ | === Brownout detector was triggered === | ||
+ | ==== Симптомы ==== | ||
+ | При работе с Bluetooth система выдаёт в последовательный порт следующее сообщение: | ||
+ | <code><pre> | ||
+ | ets Jun 8 2016 00:22:57 | ||
+ | |||
+ | rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) | ||
+ | configsip: 0, SPIWP:0xee | ||
+ | clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 | ||
+ | mode:DIO, clock div:1 | ||
+ | load:0x3fff0018,len:4 | ||
+ | load:0x3fff001c,len:956 | ||
+ | load:0x40078000,len:0 | ||
+ | load:0x40078000,len:13076 | ||
+ | entry 0x40078ad0 | ||
+ | Starting BLE wor0k! | ||
+ | |||
+ | Brownout detector was triggered | ||
+ | </pre></code> | ||
+ | |||
+ | ==== Причина ==== | ||
+ | Использование BLE приводит к повышению энергопотребления. Если источник питания не может обеспечить необходимое напряжение, то при падении напряжения до заданного минимума срабатывает "brownout detector" и микроконтроллер автоматически перезагружается. Это сделано для того, чтобы МК не находился в промежуточном состоянии "вроде работает, а вроде и нет", так как в этом случае возможны случайные сбои в его работе, которые могут привести к выходу МК из строя.<ref name="brownout-detector">https://electronics.stackexchange.com/questions/37561/what-is-a-brownout-condition</ref> | ||
+ | |||
+ | ==== Решение ==== | ||
+ | Заменить USB-провод подключения на более качественный, или использовать более мощный БП для запитки МК. | ||
+ | |||
+ | === Watchdog reset === | ||
+ | ==== Симптомы ==== | ||
+ | На монитор приходят сообщения, похожие на | ||
+ | <code><pre> | ||
+ | Exception (0): | ||
+ | epc1=0x4021372a epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000 | ||
+ | |||
+ | >>>stack>>> | ||
+ | |||
+ | ctx: sys | ||
+ | sp: 3fffed10 end: 3fffffb0 offset: 01a0 | ||
+ | 3fffeeb0: 00000000 402132ac 0000004c 40100808 | ||
+ | 3fffeec0: 9b0110ac e50110ac 3fffef30 402132ac | ||
+ | 3fffeed0: 3ffef15a 3ffef134 00000002 3ffed5b0 | ||
+ | 3fffeee0: 3ffee434 000000f8 000000f8 401005b8 | ||
+ | 3fffeef0: 3fffdc80 3ffeee5c 3ffef11c 3ffeeea4 | ||
+ | 3fffef00: 00000608 3ffee84c 3ffef134 4020aa8c | ||
+ | 3fffef10: 3fffdc80 3ffeee5c 3ffef11c 4020a8a7 | ||
+ | 3fffef20: 402298f6 3ffeee5c 3ffef11c 40229907 | ||
+ | 3fffef30: 3ffef144 3ffef134 00000000 3fffdcb0 | ||
+ | 3fffef40: 3ffedca8 00000000 3ffef11c 4022b573 | ||
+ | 3fffef50: 40000f49 3fffdab0 3fffdab0 40000f49 | ||
+ | 3fffef60: 40000e19 40001878 00000004 00000000 | ||
+ | 3fffef70: 3fffff10 aa55aa55 00000000 401047dc | ||
+ | 3fffef80: 401047e2 00000004 00000000 00000000 | ||
+ | 3fffef90: 4010000d 40102f8e 00040000 b302b935 | ||
+ | 3fffefa0: 40100a94 3fffef3c 40100a41 3fffff68 | ||
+ | 3fffefb0: 3fffffc0 00000000 00000000 feefeffe | ||
+ | 3fffefc0: feefeffe feefeffe feefeffe feefeffe | ||
+ | ... | ||
+ | |||
+ | |||
+ | <<<stack<<< | ||
+ | |||
+ | ets Jan 8 2013,rst cause:4, boot mode:(3,6) | ||
+ | |||
+ | wdt reset | ||
+ | load 0x4010f000, len 1384, room 16 | ||
+ | tail 8 | ||
+ | chksum 0x2d | ||
+ | csum 0x2d | ||
+ | v951aeffa | ||
+ | ~ld | ||
+ | </pre></code> | ||
+ | |||
+ | |||
+ | ==== Причина ==== | ||
+ | Сторожевой таймер может срабатывать из-за недостаточного уровня питания, либо реже - утечки памяти. | ||
+ | Команды в духе ESP.wdtDisable(); ESP.wdtFeed(); не помогут. Вочдог находится на какой-то внещней схеме.<ref name="wstresetreasons">https://github.com/esp8266/Arduino/issues/3535</ref> yield(); автору тоже не помог. | ||
+ | |||
+ | |||
+ | ==== Решение ==== | ||
+ | |||
+ | Можно попрыгать вокруг вашего устройства с бубном. По крайней мере, этот метод не применялся. А можете разобраться, как работает Arduino ESP8266/ESP32 Exception Stack Trace Decoder. | ||
+ | |||
+ | = Общая информация = | ||
+ | == Подключение оборудования == | ||
+ | * http://www.esp8266learning.com/wemos-oled-shield-example.php | ||
+ | * http://arduino-project.net/oled-l2c-arduino-uno/ | ||
+ | |||
+ | = [[маркировка::ESP8285]] + WiFi Repeater = | ||
+ | <code><pre> | ||
+ | $ apt install esptool | ||
+ | $ cd $ESP_REPEATER_SOURCE_PATH/firmware | ||
+ | $ esptool --port /dev/ttyUSB0 write_flash -fs 1MB -fm dout 0x00000 0x00000.bin 0x02000 0x02000.bin | ||
+ | </pre></code> | ||
+ | |||
+ | https://gustavovelascoh.wordpress.com/2017/11/07/how-to-set-a-wifi-repeater-using-an-esp8285/ | ||
+ | |||
+ | = Ссылки = | ||
+ | <references/> | ||
+ | |||
+ | [[Категория:База знаний]] |
Текущая версия на 22:00, 28 августа 2021
Содержание
Общая информация
ESP8266
Инструкция подготовлена Владимиром Слугиным на базе описания следующего видео: https://www.youtube.com/watch?v=64_9O9sKuqM
Настройка IDE
- Установить IDE (http://www.arduino.cc/en/Main/Software)
- Запустить Arduino IDE, далее Файл – Настройки – в поле Additional Boards Manager URLs вставить ссылку http://arduino.esp8266.com/package_es...
- Инструменты – Плата – Boards Manager
- В Boards Manager найти и установить (около 130 мб) ESP8266 by ESP8266 Community Forum
- В меню Инструменты выбрать Плата – Generic ESP8266. При необходимости установить: частота - 80MHz, скорость записи - 9600, Flash Size - 512K.
Схема подключения к компьютеру
использован USB-UART (UART - ESP8266):
- GND - GND
- RxD - TxD
- TxD - RxD
- 3.3v (!!) - Vcc + (через резистор 10-20К) CH_PD
Скетч для записи в esp8266
- В Arduino IDE Файл – Образцы – ESP8266WebServer – HelloServer
- В файле указать ssid (название) точки доступа WiFi (const char* ssid = "....";) и пароль (const char* password = "....";)
Запись в esp8266
- Соединить GND (UART) с gpio0 (esp)
- Подключить UART к компьютеру
- Разомкнуть GND и gpio0
- Нажать кнопку Вгрузить в Arduino IDE
- После завершения загрузки переподключить UART (вместе с esp)
Подключение к веб серверу esp8266
- Подключится к точке доступа esp (у меня называется ESPap)
- Ввести ip адрес (192.168.4.1) в поисковой строке браузера
ESP-32S
Описание
- Pinout: https://www.14core.com/wp-content/uploads/2017/04/ESP32-Pinout-DIagram.jpg
- Описание CPU: http://ip.cadence.com/uploads/533/Cadence_Tensillica_Xtensa_LX6_ds-pdf
Получение toolchain'а
$ cd /path/to/arduino/ $ mkdir -p hardware/espressif $ cd hardware/espressif $ git clone https://github.com/espressif/arduino-esp32.git esp32 $ cd esp32/tools/ $ python get.py
Сборка проекта
Для сборки необходимо выполнить следующую команду:
./build.py /path/to/sketch/
Собранный проект будет в подкаталоге в /tmp
.
Troubleshooting
TypeError: unorderable types: PartitionDefinition PartitionDefinition
На данный момент (2017-06-28) для работы утилит из toolchain'а необходим Python 2:
https://github.com/espressif/esp-idf-template/issues/3
На Gentoo GNU/Linux проблема решается на переключение на нужную версию Python:
$ eselect python list Available Python interpreters: [1] python2.7 [2] python3.3 [3] python3.4 * $ eselect python set 1
warning: no return statement in function returning non-void
Проблема возникает при использовании библиотеки esp8266-oled-ssd1306.
Симптомы
In file included from /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/SSD1306Wire.h:31:0, from /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/SSD1306.h:30, from /tmp/arduino_8d8be8ad7edc7c39c779408e245d8629/SSD1306ClockDemo.ino:32: /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/OLEDDisplay.h: In member function 'virtual bool OLEDDisplay::connect()': /home/avp/sketchbook/libraries/ESP8266_Oled_Driver_for_SSD1306_display/OLEDDisplay.h:253:29: warning: no return statement in function returning non-void [-Wreturn-type] virtual bool connect() {};
Решение
Поменять файл platform.txt
в каталоге с проектом, выключив сигнализацию ошибок для некоторых предупреждений:
diff --git a/platform.txt b/platform.txt index 3a8b30b..370b1df 100644 --- a/platform.txt +++ b/platform.txt @@ -27,7 +27,7 @@ compiler.c.cmd=xtensa-esp32-elf-gcc compiler.c.flags=-std=gnu99 -Os -g3 -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib -Wpointer-arith {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -Wno-old-style-declaration -MMD -c compiler.cpp.cmd=xtensa-esp32-elf-g++ -compiler.cpp.flags=-std=gnu++11 -fno-exceptions -fno-rtti -Os -g3 -Wpointer-arith -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -fno-rtti -MMD -c +compiler.cpp.flags=-std=gnu++11 -fno-exceptions -fno-rtti -Os -g3 -Wpointer-arith -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib {compiler.warning_flags} -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -fno-rtti -MMD -Wno-error=return-type -Wno-error=switch -Wno-error=maybe-uninitialized -c compiler.S.cmd=xtensa-esp32-elf-gcc compiler.S.flags=-c -g3 -x assembler-with-cpp -MMD -mlongcalls
Загрузка прошивки
Из Arduino IDE загрузку следует выполнять на скорости 115200.
После загрузки нужно перезагрузить МК -- можно через кнопку, если таковая есть на плате.
Bluetooth
Troubleshooting
Прошивка загрузилась, но не работает
В этом случае следует перезагрузить МК.
Brownout detector was triggered
Симптомы
При работе с Bluetooth система выдаёт в последовательный порт следующее сообщение:
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:956
load:0x40078000,len:0
load:0x40078000,len:13076
entry 0x40078ad0
Starting BLE wor0k!
Brownout detector was triggered
Причина
Использование BLE приводит к повышению энергопотребления. Если источник питания не может обеспечить необходимое напряжение, то при падении напряжения до заданного минимума срабатывает "brownout detector" и микроконтроллер автоматически перезагружается. Это сделано для того, чтобы МК не находился в промежуточном состоянии "вроде работает, а вроде и нет", так как в этом случае возможны случайные сбои в его работе, которые могут привести к выходу МК из строя.[1]
Решение
Заменить USB-провод подключения на более качественный, или использовать более мощный БП для запитки МК.
Watchdog reset
Симптомы
На монитор приходят сообщения, похожие на
Exception (0):
epc1=0x4021372a epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
>>>stack>>>
ctx: sys
sp: 3fffed10 end: 3fffffb0 offset: 01a0
3fffeeb0: 00000000 402132ac 0000004c 40100808
3fffeec0: 9b0110ac e50110ac 3fffef30 402132ac
3fffeed0: 3ffef15a 3ffef134 00000002 3ffed5b0
3fffeee0: 3ffee434 000000f8 000000f8 401005b8
3fffeef0: 3fffdc80 3ffeee5c 3ffef11c 3ffeeea4
3fffef00: 00000608 3ffee84c 3ffef134 4020aa8c
3fffef10: 3fffdc80 3ffeee5c 3ffef11c 4020a8a7
3fffef20: 402298f6 3ffeee5c 3ffef11c 40229907
3fffef30: 3ffef144 3ffef134 00000000 3fffdcb0
3fffef40: 3ffedca8 00000000 3ffef11c 4022b573
3fffef50: 40000f49 3fffdab0 3fffdab0 40000f49
3fffef60: 40000e19 40001878 00000004 00000000
3fffef70: 3fffff10 aa55aa55 00000000 401047dc
3fffef80: 401047e2 00000004 00000000 00000000
3fffef90: 4010000d 40102f8e 00040000 b302b935
3fffefa0: 40100a94 3fffef3c 40100a41 3fffff68
3fffefb0: 3fffffc0 00000000 00000000 feefeffe
3fffefc0: feefeffe feefeffe feefeffe feefeffe
...
<<<stack<<<
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v951aeffa
~ld
Причина
Сторожевой таймер может срабатывать из-за недостаточного уровня питания, либо реже - утечки памяти. Команды в духе ESP.wdtDisable(); ESP.wdtFeed(); не помогут. Вочдог находится на какой-то внещней схеме.[2] yield(); автору тоже не помог.
Решение
Можно попрыгать вокруг вашего устройства с бубном. По крайней мере, этот метод не применялся. А можете разобраться, как работает Arduino ESP8266/ESP32 Exception Stack Trace Decoder.
Общая информация
Подключение оборудования
- http://www.esp8266learning.com/wemos-oled-shield-example.php
- http://arduino-project.net/oled-l2c-arduino-uno/
ESP8285 + WiFi Repeater
$ apt install esptool
$ cd $ESP_REPEATER_SOURCE_PATH/firmware
$ esptool --port /dev/ttyUSB0 write_flash -fs 1MB -fm dout 0x00000 0x00000.bin 0x02000 0x02000.bin
https://gustavovelascoh.wordpress.com/2017/11/07/how-to-set-a-wifi-repeater-using-an-esp8285/