Иногда возникает ситуация, когда нужно переслать бинарь откомпилированный, например, под Arduino IDE кому-то для заливки на микроконтроллер. Например, чтобы не восстанавливать на удаленной стороне полную компию среды разработчика со всеми необходимыми библиотеками.
Установка ESPTOOL
- Необходимо установить Python на ПК. Для установки под Windows https://www.python.org/downloads/windows/
- PIP должен быть установлен с установкой Python. Если не установлен, то https://pip.pypa.io/en/stable/installing/. Для обновления PIP:
python -m pip install --upgrade pip
- Нужно установить espool https://pypi.org/project/esptool/ командой:
pip install esptool --upgrade или pip install esptool -U
Подготовка bin файлов проекта (Upload)
Чтобы «залить» бинарные файлы в микроконтроллер используется следующая последовательность шагов:
- Включить детализацию upload Arduino IDE: File -> Preferences -> Show verbose output during: -> Upload.
- Запустить загрузку (upload) скетча на DevKit board с помощью Arduino IDE.
- В деталях загрузки появится строчки, что-то вроде:
C:\Users\{YOUR_NAME}\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\2.6.1/esptool.exe --chip esp32 --port COM13 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:\Users\{YOUR_NAME}\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2/tools/partitions/boot_app0.bin 0x1000 C:\Users\{YOUR_NAME}\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2/tools/sdk/bin/bootloader_dio_80m.bin 0x10000 C:\Users\{YOUR_NAME}\AppData\Local\Temp\arduino_build_352344/{SKETCH_NAME}.ino.bin 0x8000 C:\Users\{YOUR_NAME}\AppData\Local\Temp\arduino_build_352344/{SKETCH_NAME}.ino.partitions.bin
- Для загрузки бинарного файла esptools необходимы несколько бинарных файлов:
- boot_app0.bin — загружается по адресу 0xe000.
- bootloader_dio_80m.bin — загружается по адресу 0x1000.
- {SKETCH_NAME}.ino.bin — загружается по адресу 0x10000.
- {SKETCH_NAME}.ino.partitions.bin — загружается по адресу 0x8000.
- По пути к бинарному файлу (в моем случае путь «C:\Users\{YOUR_NAME}\AppData\Local\Temp\arduino_build_352344/») находим два нужный бинарника проекта {SKETCH_NAME}.ino.*.bin и сохраняем их в отдельной папке для дальнейшей отправки на удаленную сторону.
- Добавляем в папку boot_app0.bin и bootloader_dio_80m.bin.
- Архивируем папку и отправляем на удаленную сторону.
Подготовка bin файлов (Compilation)
Иногда случаются ситуации, когда под рукой нет нужного DevKit для компиляции и upload проекта. Это самый правильный вариант формирования нужных bin файлов проекта.
В этом случае можно скомпилировать бинарники без upload, а затем добавить нужные bin файлы bootloader_ {flash_mode}_{flash_freq}.bin и boot_app0.bin. В идеале если ранее уже выполнялся upload и есть информация о том, какие бинарные файлы нужны для загрузки, адреса загрузки и сами bin файлы boot_app0.bin и bootloader_ bootloader_ {flash_mode}_{flash_freq}.bin уже есть в наличии. Если нужных бинарников нет после выполнения upload, то можно попробовать взять их в SDK.
Например, для примера с flash_mod=dio и flash_freq=80 файл bootloader_dio_80m.bin находится в папке:
C:\Users\[UserName]\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.1\tools\sdk\bin
Файл boot_app0.bin можно взять в папке:
C:\Users\[UserName]\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.1\tools\partitions
Для компиляции используется следующая последовательность:
- Включить детализацию upload Arduino IDE: File -> Preferences -> Show verbose output during: -> Compilation.
- Запустить компиляцию (Compilation) скетча на DevKit board с помощью Arduino IDE.
- В логах найти строчку с нужными бинарниками проекта {SKETCH_NAME}.ino.bin и {SKETCH_NAME}.ino.partitions.bin:
"C:\\Users\\{YOUR_NAME}\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.2/tools/gen_esp32part.exe" -q "C:\\Users\\{YOUR_NAME}\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.2/tools/partitions/default.csv" "C:\\Users\\{YOUR_NAME}\\AppData\\Local\\Temp\\arduino_build_898429/{SKETCH_NAME}.ino.partitions.bin" "C:\\Users\\{YOUR_NAME}\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\esptool_py\\2.6.1/esptool.exe" --chip esp32 elf2image --flash_mode dio --flash_freq 80m --flash_size 4MB -o "C:\\Users\\{YOUR_NAME}\\AppData\\Local\\Temp\\arduino_build_898429/{SKETCH_NAME}.ino.bin" "C:\\Users\\{YOUR_NAME}\\AppData\\Local\\Temp\\arduino_build_898429/{SKETCH_NAME}.ino.elf" esptool.py v2.6
- Отправить все бинарники на удаленную сторону.
Загрузка в ESP bin файлов проекта
- На удаленной стороне архив с bin файлами распаковывается в папку Temp.
- Ему также пересылается команда, которая была перехвачена ранее при отправке Arduino IDE бинарника в ESP. Пути к бинарникам ({SKETCH_NAME}) должны быть скорректированы. Команда что-то вроде:
%LOCALAPPDATA%\Arduino15\packages\esp32\tools\esptool_py\2.6.1\esptool.exe --chip esp32 --port COM13 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:/Temp/{SKETCH_NAME}/boot_app0.bin 0x1000 C:/Temp/{SKETCH_NAME}/bootloader_dio_80m.bin 0x10000 C:/Temp/{SKETCH_NAME}/{SKETCH_NAME}.ino.bin 0x8000 C:/Temp/{SKETCH_NAME}/{SKETCH_NAME}.ino.partitions.bin
- Убедится, что:
- Путь к esptool.exe корректный. Версии на стороне разработчика и удаленной могут различаться.
- Указан корректный COM порт и скорость для него.
- Внести исправления в команду, если найдены расхождения.
- Открыть командную строку (например, cmd.exe).
- Запустить вышеуказанную команду.
- Должна появится последовательность загрузки что-то вроде:
esptool.py v2.6 Serial port COM13 Connecting.... Chip is ESP32D0WDQ6 (revision 1) Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None MAC: 80:7d:3a:f4:74:e4 Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Changed. Configuring flash size... Auto-detected Flash size: 4MB Compressed 8192 bytes to 47... Writing at 0x0000e000... (100 %) Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 13107.5 kbit/s)... Hash of data verified. Compressed 15328 bytes to 9994... Writing at 0x00001000... (100 %) Wrote 15328 bytes (9994 compressed) at 0x00001000 in 0.1 seconds (effective 915.1 kbit/s)... Hash of data verified. Compressed 365136 bytes to 171906... Writing at 0x00010000... (9 %) Writing at 0x00014000... (18 %) Writing at 0x00018000... (27 %) Writing at 0x0001c000... (36 %) Writing at 0x00020000... (45 %) Writing at 0x00024000... (54 %) Writing at 0x00028000... (63 %) Writing at 0x0002c000... (72 %) Writing at 0x00030000... (81 %) Writing at 0x00034000... (90 %) Writing at 0x00038000... (100 %) Wrote 365136 bytes (171906 compressed) at 0x00010000 in 3.1 seconds (effective 947.5 kbit/s)... Hash of data verified. Compressed 3072 bytes to 143... Writing at 0x00008000... (100 %) Wrote 3072 bytes (143 compressed) at 0x00008000 in 0.0 seconds (effective 4096.0 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...
Бинарные файлы успешно «залиты» в микроконтроллер.
Инструкция для клиента
- Распаковать все bin файлы из архива в папку Temp. Т.е. должно получится C:\Temp\SensorSpider\*.bin
- Подключить по USB микроконтроллер.
- Посмотреть какой порт назначился в Windows.
- В команде ниже указать правильный COM порт и путь к файлу
esptool.exe %LOCALAPPDATA%\Arduino15\packages\esp32\tools\esptool_py\2.6.1\esptool.exe --chip esp32 --port COM13 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 C:/Temp/{SKETCH_NAME}/boot_app0.bin 0x1000 C:/Temp/{SKETCH_NAME}/bootloader_dio_80m.bin 0x10000 C:/Temp/{SKETCH_NAME}/{SKETCH_NAME}.ino.bin 0x8000 C:/Temp/{SKETCH_NAME}/{SKETCH_NAME}.ino.partitions.bin >{SKETCH_NAME}Upload.txt
- Выполнить команду.
- Посмотреть {SKETCH_NAME}Upload.txt , убедившись, что нет ошибок в путях и команда отработала успешно.
- Переслать файл {SKETCH_NAME}Upload.txt с результатами заливки разработчику.
«Заливка» bin файлов OTA (Over The Air)
- Для заливки подготовленных бинарных файлов OTA используется утилита espota.py:
- Для загрузки на ESP 8266 с IP адресом 192.168.1.10:
python espota.py -d -i 192.168.1.10 -f {SKETCH_NAME}.ino.bin
- Естественно такой вариант «заливки» обновлений не подходит для IoT устройств работающих по GSM, поскольку они находятся за NAT-ом оператора сотовой связи.