Espruino:Примеры/Запись прошивки и использование ESP8266 вместе с Espruino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Запись прошивки и использование ESP8266 вместе с Espruino[1]

Эта статья служит кратким введением в использование ESP8266 и Espruino, а также в дальнейшее использование ESP8266 без проводного последовательного соединения (через WiFi). Справочную документацию о порте Espruino для ESP8266 читайте в этой статье.

Внимание!

Всё, что здесь описано, работает, хотя и не до конца протестировано.

Для пользователей Windows: Описанные здесь инструкции по записи прошивки с помощью esptool работают. О первой записи прошивки на Windows читайте ниже.

В этом руководстве мы пройдём через следующие шаги:

  • Настроим новый модуль ESP8266 и выполним первую прошивку при помощи последовательного порта или FTDI-адаптера.
  • Настроим WiFi на ESP8266, чтобы мы могли через него взаимодействовать с Web IDE (то есть загружать и запускать скетчи).
  • Сохраним написанный нами код, чтобы он запускался при каждой загрузке ESP8266.
  • Обновим прошивку Espruino через WiFi (с помощью OTA-апдейта).

Это руководство подразумевает, что вы загрузили ESP8266-версию Espruino в виде TGZ-архива. На момент написания этой статьи самую последнюю версию ESP8266-порта можно было найти тут. У архива должно быть название вроде «espruino_1v84.tve_master_8bb4202_esp8266.tgz», где «1v84» – это базовая версия Espruino, «tve_master» – это название ответвления, а «8bb4202» – это SHA Git-коммита, использованного для этого билда.

Первая запись прошивки

Существует большое количество типов модулей и дочерних плат на базе ESP8266 в диапазоне от «голых» ESP-01 и ESP-12 до Adafruit Huzzah и Sparkfun Thing. О том, как перевести свой ESP8266 в режим прошивки, читайте в документации к нему, поскольку у одних моделей есть кнопки, у других нет, а третьи поддерживают коммуникацию по USB. Вот пара советов.

Если возможно, используйте модуль ESP-12, а не ESP-01. На модуле ESP-12 выведены все I/O-контакты ESP8266, он оснащён 4 Мб flash-памяти, а также обладает очень хорошей мощностью радиосигнала. У модуля ESP-01 имеется всего пара I/O-контактов и только 512 Кб flash-памяти, а мощность радиосигнала на 10 дБ хуже (то есть в 8 раз!). ESP-07, ESP-13 и Wroom-02 – тоже достаточно хорошие модули.

Кроме того, вам понадобится хороший блок питания – обычного питания от USB FTDI адаптера будет недостаточно. Типичный симптом – это то, что запись прошивки будет выполнена нормально, но когда вы после этого попытаетесь запустить ESP, он крашнется.

Чтобы перевести ESP в режим записи прошивки, вам нужно притянуть контакт GPIO2 к значению «1», а контакты GPIO0 и GPIO15 – к значению «0». Затем, чтобы запустить записанную прошивку, вам надо притянуть контакты GPIO0 и GPIO2 к значению «1», а GPIO15 – к значению «0» (то есть вам надо просто изменить значение GPIO0 с «0» на «1»). Чтобы выполнить сброс, вам нужно будет на короткое время притянуть контакт RESET или CH_EN (Chip Enable) к «0». Рекомендуем подключить к обоим этим контактам подтягивающий резистор (у контакта RESET есть слабый встроенный подтягивающий резистор, но он будет работать нормально лишь в том случае, если не подключать к нему никаких других проводов; у CH_EN нет встроенного подтягивающего резистора, но вы можете подключить его к 3.3-вольтовому напряжению). Мы не рекомендуем подключать какие-либо GPIO-контакты ESP8266-модуля к GND или 3.3-вольтовому напряжению, потому что если на этом контакте задано какое-то другое значение, это приведёт к возникновению сильного тока. Вы вряд ли сожжёте чип (хотя вероятность всё же присутствует), но это создаст дополнительную нагрузку на источник питания, из-за чего другие вещи начнут работать некорректно. В частности, во время записи прошивки на контакте GPIO0 генерируется частота 26 МГц, так что этот контакт, очевидно, лучше не притягивать к «0». Для подтягивания советуем использовать резисторы номиналом от 4.7 до 10 кОм, а для стягивания – от 1 до 3.3 кОм.

Подключите TX-линию FTDI-адаптера к RX-контакту ESP, а RX-линию FTDI к TX-контакту ESP. Если ваш FTDI-адаптер нельзя настроить на 3.3 вольта, вам нужно будет как-то разобраться с тем фактом, что ESP8266 не устойчив к 5-вольтовому напряжению. Это значит, что вам нужно что-то сделать с соединением между TX-линией FTDI-адаптера и RX-контактом ESP. По-быстрому эту проблему можно решить, последовательно подключив резистор номиналом от 2.2 до 4.7 кОм. Но есть и более умное решение – подключить к цепи диод, благодаря которому FTDI сможет притянуть RX-контакт ESP только к «0», а для переключения на «1» использовать подтягивающий резистор (см. схему Adafruit Huzzah). Также можно просто подключить схему для сдвига уровня.

Во время записи прошивки выполняются следующие действия:

  • Запись загрузчика (это загрузчик второго уровня, запускаемый после ROM-загрузчика).
  • Запись прошивки Espruino.
  • Удаление настроек SDK.
  • Удаление аппаратных настроек SDK.
  • Установка правильных параметров памяти SPI flash (при помощи специальных инструментов).

Если у вас Linux, настоятельно рекомендуем использовать esptool.py, потому что он корректно выполняет последний шаг из списка выше. Загрузите его с GitHub и запустите как показано в коде ниже при помощи файлов из TGZ-архива Espruino. Вам надо будет узнать размер flash-памяти вашего чипа, потому что если вы укажете неправильное значение, Espruino сообщит вам об этом в момент загрузки, и всё будет работать, но лишь до первого сохранения или апгрейда, так что лучше сразу укажите правильное значение, но если ошибётесь, то потом всё равно сможете задать новое.

Вот команды для памяти 4 Мб (например, для ESP-12):

$ /path/to/esptool/esptool.py --port /dev/ttyUSB0 --baud 115200 \
  write_flash --flash_freq 80m --flash_mode qio --flash_size 32m \
  0x0000 "boot_v1.6.bin" 0x1000 espruino_esp8266_user1.bin \
  0x3FC000 esp_init_data_default.bin 0x3FE000 blank.bin
А это команды для памяти 512 Кб (например, для ESP-01):
$ /path/to/esptool/esptool.py --port /dev/ttyUSB0 --baud 115200 \
  write_flash --flash_freq 40m --flash_mode qio --flash_size 4m \
  0x0000 "boot_v1.6.bin" 0x1000 espruino_esp8266_user1.bin \
  0x7C000 esp_init_data_default.bin 0x7E000 blank.bin

Фрагмент --flash_size 4m --flash_freq 40m означает 4 Мбит и 40 МГц, тогда как у flash-памяти 4 Мб это 32 Мбит и 80 МГц. Обратите внимание на разные адреса у esp_init_data_default.bin и blank.bin: SDK хранит свои WiFi-настройки ближе к концу памяти, так что с изменением размера flash-памяти изменятся и эти адреса.

Первая запись прошивки на Windows

Наш опыт показал, что esptool на Windows работает хорошо. Инструкции ниже подразумевают, что из вашей командной строки можно получить доступ к git и python. Проверено на Windows 7, Git версии 1.9.5.msysgit.0, Enthought Canopy Python 2.7.6 и прототипной плате Nodemcu v.0.9.

Запустите командную строку, сделайте клон esptool и в директории esptool запустите python setup.py install (этот шаг нужно проделать только один раз).

> git clone https://github.com/themadinventor/esptool.git
Cloning into 'esptool'...
remote: Counting objects: 268, done.
emote: Total 268 (delta 0), reused 0 (delta 0), pack-reused 268
Receiving objects: 100% (268/268), 99.66 KiB | 0 bytes/s, done.
Resolving deltas: 100% (142/142), done.
Checking connectivity... done.

> cd esptool

> python setup.py install
running install
...
...
...
Finished processing dependencies for esptool==0.1.0

Скачайте и распакуйте последнюю версию бинарного пакета и запустите в этой директории командную строку. Команда для запуска такая же как обычно, а следующая команда подразумевает, что в родительской поддиректории есть поддиректория с esptool. Настройте COM-порт, если ESP ещё не работает на COM12. В моём случае хорошо себя показала скорость 460800 бод, запись примерно при 260 Кбит/с вместо 80 Кбит/с.

>python "../esptool/esptool.py" --port COM12 --baud 115200 write_flash \
  --flash_freq 80m --flash_mode qio --flash_size 32m \
  0x0000 boot_v1.6.bin 0x1000 espruino_esp8266_user1.bin \
  0x3FC000 esp_init_data_default.bin 0x3FE000 blank.bin
Connecting...
Erasing flash...
Wrote 3072 bytes at 0x00000000 in 0.3 seconds (79.8 kbit/s)...
Erasing flash...
Wrote 438272 bytes at 0x00001000 in 43.4 seconds (80.7 kbit/s)...
Erasing flash...
Wrote 1024 bytes at 0x003fc000 in 0.1 seconds (83.6 kbit/s)...
Erasing flash...
Wrote 4096 bytes at 0x003fe000 in 0.4 seconds (83.4 kbit/s)...

Leaving...

После записи прошивки у вас должна появиться возможность подключиться к последовательному порту на скорости 115200 бод и доступ к терминалу Espruino. Это можно проверить при помощи простой программы

screen /dev/ttyUSB0 115200. Например:
$ screen /dev/ttyUSB0 115200
>process.memory()
process.memory()
={ "free": 1279, "usage": 121, "total": 1400, "history": 37 }
>reset()
reset()
=undefined

 _____                 _
 |   __|___ ___ ___ _ _|_|___ ___
 |   __|_ -| . |  _| | | |   | . |
 |_____|___|  _|_| |___|_|_|_|___|
           |_| http://espruino.com
 1v84.tve_master_b603c8a Copyright 2015 G.Williams
WARNING: the esp8266 port is in beta!
Flash map 4MB:512/512, manuf 0xe0 chip 0x4016

>

Последняя строчка Flash map... сообщает, что мой модуль настроен на 4 Мб flash-памяти, а также то, что сам чип flash-памяти был сделан производителем 0xe0 и имеет код 0x4016. Большинство кодов можно найти по этой ссылке, а если ваши настройки не будут соответствовать какому-либо из часто используемых чипов, Espruino вам об этом сообщит.

Удаление прошивки

Перед обновлением до новой версии необходимо стереть старую прошивку – во избежание всяких непонятных ситуаций вроде невозможности загрузить сохранённый код или бесконечных циклов перезагрузки...

$ /path/to/esptool/esptool.py --port /dev/ttyUSB0 --baud 115200 erase_flash

Настройка WiFi

Чтобы настроить WiFi, вам, во-первых, нужна точка доступа, к которой можно подключиться, а также нужно выполнить следующее:

  • Дать вашей Espruino команду подключиться к этой точке доступа.
  • Дать своему модулю имя хоста.
  • Сохранить WiFi-настройки, чтобы автоматически подключаться к этой точке доступа после отключения или сброса.

Настройка WiFi осуществляется при помощи библиотеки WiFi (документацию о ней можно найти тут). Воспользуйтесь кодом ниже, но не забудьте задать там свои настройки:

>var wifi = require("Wifi");
=function () { [native code] }
>wifi.connect("my-ssid", {password: "my-password"},
   function(err){if(err)console.log(err);else console.log("connected!");})
=undefined

И где-то через 1-15 секунд вы должны увидеть следующее:

connected!
>

А вот так можно узнать более подробную информацию о статусе соединения:

>wifi.getStatus()
={
  "mode": "sta",
  "station": "connected",
  "ap": "disabled",
  "phy": "11n",
  "powersave": "ps-poll",
  "savedMode": "off"
 }
> wifi.getIP()
={
  "ip": "192.168.0.106",
  "netmask": "255.255.255.0",
  "gw": "192.168.0.1",
  "mac": "5c:cf:ff:06:c0:db"
 }

Запишите где-нибудь IP-адрес своего Espruino-модуля, позднее он нам ещё понадобится.

Теперь задайте имя хоста для своего модуля (ВНИМАНИЕ: сейчас можно задать только имя DHCP-хоста, поэтому то, применимо ли оно также к DNS или нет, зависит от вашей точки доступа и DNS-настроек; скоро это будет исправлено при помощи mDNS).

>wifi.setDHCPHostname("espruino");

Итак, если вас устраивают введённые WiFi-настройки, вы можете их сохранить, чтобы они использовались автоматически при каждом включении модуля:

>wifi.save()

К слову, ESP8266 может служить упрощённой версией точки доступа. У неё есть свои ограничения (вроде возможности подключаться не более чем 4 клиентам или отсутствия маршрутизации между клиентами), но в случае необходимости он свою работу выполнит. Чтобы активировать у ESP8266 режим точки доступа, просто воспользуйтесь вот этим кодом:

> wifi.startAP("my-ssid")
=undefined
> wifi.getAPIP()
={
  "ip": "192.168.4.1",
  "netmask": "255.255.255.0",
  "gw": "192.168.4.1",
  "mac": "5e:cf:ff:06:c0:db"
 }

Запомните IP-адрес Espruino (192.168.4.1) – ниже он нам пригодится.

Использование Web IDE через WiFi

Теперь вы можете подключиться напрямую к Espruino из Web IDE через WiFi. Но сначала давайте проверим, есть ли вообще связь. Для этого можно воспользоваться командой ping espruino, ping espruino.local или ping 192.168.0.106 (но задайте здесь корректный IP-адрес).

Кроме того, вы также можете воспользоваться терминалом (xterm, iterm, putty и пр.), чтобы подключиться к 23 порту Espruino и проверить, есть ли у вас доступ к командной строке Espruino. Ниже я использую для этого инструмент командной строки netcat:

$ nc espruino 23
>process.memory()
process.memory()
={ "free": 1279, "usage": 121, "total": 1400, "history": 37 }
>

Теперь откройте IDE, зайдите в настройки (для этого кликните на кнопку с шестерёнкой справа вверху), кликните на пункт Communications, найдите пункт Connect over TCP Address (этого пункта нет в версии Web IDE на espruino.com, но есть в версии из онлайн-магазина Chrome) и задайте там имя хоста и порт, которые успешно использовали в терминале или nc (например, espruino.local:23). Закройте настройки и подключитесь – в результате у вас должен появиться доступ к командной строке Espruino!

Если вашем Web IDE выставлены настройки по умолчанию, то при подключении будет вызвана функция reset(), поэтому у вас может возникнуть резонный вопрос, почему вы по-прежнему подключены после сброса. Дело в том, что сброс, вызываемый функцией reset() – это программный сброс, который не затрагивает WiFi. Он закроет все сокеты, созданные вашим скетчем, сбросит все режимы контактов и очистит память, но не тронет сокет, используемый TCP-соединением Web IDE (или терминалом).

Теперь при помощи IDE или терминала вы можете загружать на Espruino код и запускать его. Когда ваш код будет вас полностью устраивать, вы можете сделать так, чтобы он запускался на Espruino автоматически в момент загрузки. Для этого воспользуйтесь функцией save() – она сохранит ваш код в долговременную память Espruino. Не путайте её с функцией WiFi.save(), которая сохраняет WiFi-настройки в отдельную область flash-памяти. Более подробно о сохранении своего JavaScript-кода для его автоматического запуска читайте в этом треде.

Обновление прошивки Espruino по WiFi

После выхода новой версии Espruino вы можете обновить прошивку через WiFi, но с условием, что у вашего ESP8266-модуля есть как минимум 1 Мб flash-памяти (то есть с ESP-01 этого сделать не получится). При обновлении используется маленький скрипт оболочки (из ZIP-архива, который можно скачать тут), который при помощи curl выполняет несколько HTTP-запросов, чтобы загрузить новую прошивку и перезагрузить ESP8266. Хотя этот скрипт создан для запуска из командной строки Linux, пользователи Windows могут установить Git и во время установки выбрать Use Git and optional Unix tools from the windows command prompt, что позволит запускать этот скрипт так же, как и на Linux.

Выполнение этого скрипта выглядит следующим образом (все необходимые файлы есть в скачиваемом ZIP-архиве):

$ sh wiflash.sh espruino.local:88 espruino_esp8266_user1.bin espruino_esp8266_user2.bin
Flashing user2.bin
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  435k    0     0  100  435k      0  42456  0:00:10  0:00:10 --:--:-- 53886
Rebooting into new firmware
Waiting for ESP8266 to come back
Success, took 16 seconds

Обратите внимание на порт 88 в espruino.local:88, и также не забывайте использовать те же имя хоста и IP-адрес, которые использовали в IDE или терминале. Запись прошивки не стирает WiFi-настройки, так что вы можете сразу же переподключиться к Web IDE. Как правило, Web IDE не замечает, что отключилась, так что вам, скорее всего, нужно будет отключиться и снова подключиться.

Решение проблем

Конечно, ничто не может просто взять и нормально работать... Обратную связь по этому руководству и возникших проблемах можно озвучить на форуме Espruino или на Gitter – расскажите нам, что нужно исправить!

См.также

Внешние ссылки