ESP8266:Модули/Азы программирования ESP8266
Черновик |
Азы программирования ESP8266[1]
Время выполнения: 2-10 минут. Уровень сложности: Новичок.
Это руководство рассказывает об азах программирования чипа ESP8266 на примере адаптерной платы ESP-12E со встроенным конвертером USB-Serial.
Необходимые компоненты
Что такое ESP8266?
Чип ESP8266 – это SoC, способный конвертировать последовательные данные в WiFi-данные и выпущенный в 2014 году. С тех пор он завоевал большую популярность среди людей, разрабатывающих недорогие проекты для интернета вещей. WiFi-чипы находятся в свободной продаже уже около 10 лет, поэтому у читателя может возникнуть очевидный вопрос: «Что, собственно, делает ESP8266 таким особенным?» Во-первых, то, что ESP8266 был выпущен в очень удачное время – в период повышенного спроса к теме интернета вещей среди разработчиков и предпринимателей, занимающихся техническими проектами. Но есть и другие причины:
- Очень способный микроконтроллер (32-бита, 80 МГц, встроенный WiFi, хорошие IO-шины и периферийные компоненты; полный список характеристик смотрите ниже)
- Очень низкая цена – около 1 доллара
- Открытый SDK, который работает с GCC
- Способность работать с интерпретаторами Lua (NodeMCU), JavaScript (Esprunio) и Python (MycroPython)
- Интеграция с IDE Arduino
Поскольку ESP8266 выпускался только в корпусе QFN (от англ. «quad-flat no-leads»; это можно перевести как «плоский корпус, у которого выходные контакты находятся по всем 4 сторонам, но загнуты под корпус»), который плохо поддавался пайке, поэтому рынок был открыт для недорогой адаптерной платы, способной работать с этим чипом. Самой популярной серией модулей, использующих ESP8266, стала ESP-xx, где «xx» – это 2 цифры, после которых иногда могут идти буквы (к примеру, ESP-12E).
Адаптерная плата ESP-12E (она же NodeMCU DevKit)
Среди прочих модулей серии ESP-xx наибольшей популярностью в сообществе ESP8266 пользуется FCC-сертифицированный ESP-12E, также известный как ESP-12F (у первых версий ESP-12E не было сертификации FCC).
На плате ESP-12E выведены все доступные контакты ESP8266. Кроме того, она оснащена светодиодом, сообщающем о статусе контакта TX на SoC (что очень удобно при программировании ESP8266), 4-мегабайтной flash-памятью для шины SPI (как правило, Winbond W25Q32FV) и всеми остальными компонентами, необходимыми для корректной работы ESP8266 (например, кварцевым резонатором, конденсаторами, резисторами и т.д.). Также на ESP-12E имеется встроенная антенна, работающая в диапазоне от -70 до -80 дБм на расстоянии около 15 метров.
ESP-12E – это отличный модуль для ESP8266, но у него нет сквозных отверстий, к которым можно было бы подключить штырьковые контакты (разработчикам пришлось отказаться от них в пользу компактности). Из-за этого его не слишком удобно использовать с макетной платой, поэтому ESP-12E предназначен, скорее, для встраивания в печатную плату. Более того, чтобы сделать ESP-12E более подходящим для быстрого прототипирования, ему нужен регулятор мощности и возможность коммуникации по USB. Поэтому мы создали плату, в которую встроены, помимо других пассивных компонентов и дискретных микросхем, UART-адаптер Silicon Labs CP2102 (USB-Serial), 3.3-вольтовый регулятор напряжения NCP1117 (постоянный ток), коннектор MicroUSB и гребешки штырьковых контактов.
Наш продукт очень близко следует проекту платы NodeMCU, распространяемой по принципу «open-source», и выводит все (доступные) порты ESP8266 на штырьковые контакты, благодаря чему ее удобно использовать вместе с макетной платой. Наша плата также оснащена дополнительными контактами GND, Vin и 3V3, что удобно во время работы над проектами. Кроме того, для нее практически не требуется дополнительная настройка – просто подключите ее к компьютеру, установите USB-драйверы и можете приступать к программированию.
Прошивка
Пользователи сообщества, сформировавшегося вокруг ESP8266, разработали несколько вариантов прошивок – от кастомных прошивок, загружаемых прямо на чип, до интерпретаторов (для языков Lua, JavaScript и Python), обрабатывающих команды через периферийные интерфейсы (например, SPI или UART). В этом разделе мы расскажем о самых популярных прошивках, а ниже – о том, как с ними работать.
Примечание: Одновременно на ESP8266 может быть запущена только одна прошивка. К примеру, если на ESP8266 стояла фабричная прошивка (интерпретатор AT-команд), но потом вы вдруг решили записать на него скетч «Blink» (через IDE Arduino), то затем, чтобы снова использовать AT-команды, вам нужно будет снова записать на ESP8266 интерпретатор AT-команд. Этот процесс может быть довольно муторным, поэтому настоятельно советуем присмотреться к одному из вариантов ниже.
Интерпретатор AT-команд (вариант по умолчанию)
Самый простой способ начать работать с ESP8266 – это фабричная прошивка, позволяющая обрабатывать любые AT-команды, полученные по интерфейсу UART. Самое большое преимущество этого метода в том, что он не требует от пользователя знания какого-то языка программирования. Ему нужно лишь знать определенные команды. Но отсюда и недостаток – для отправки команд нужен либо дополнительный микроконтроллер, либо адаптер USB-Serial.
Список некоторых AT-команд для ESP8266 можно найти по этой ссылке.
AT-команды – это стандарт для коммуникации с RF-чипами, который установился еще в 80-ые. Однако этому стандарту требуется дополнительное устройство, чтобы запустить код, который отправляет AT-команды. Но что выделяет ESP8266 на фоне конкурентов, так это то, что она может хранить этот код вместе с WiFI-кодом в своей памяти (или в отдельной flash-памяти для SPI). Затем в дело вступила и сама Espressif – она открыла большую часть своего SDK, что позволило разработчикам внедрить инструменты (включая GCC) для загрузки на ESP8266 другой прошивки.
NodeMCU
NodeMCU – это на данный момент самая популярная альтернативная прошивка для ESP8266. Будучи основанной на проекте eLua, она запускает на ESP8266 интерпретатор, способный выполнять команды на скриптовом языке Lua. Эти команды передаются на ESP8266 через последовательный интерфейс UART.
NodeMCU – это отличный вариант для тех, кто только начинает работать с ESP8266, т.к. обеспечивает интерактивную среду, позволяющую отправлять команды для управления не только беспроводным интерфейсом ESP8266, но также GPIO-контактами и функциями вроде ШИМ. Вдобавок вы получаете полный доступ к функциям языка Lua для написания собственной прошивки. Потому что, если говорить, к примеру, о дефолтной прошивке ESP8266 (т.е. об интерпретаторе AT-команд), то код для нее должен быть написан при помощи языка, который будет понятен микроконтроллеру/SoC (например, в случае с микроконтроллерами Atmel/ARM, стоящими на платах Arduino, этим языком является C/C++).
NodeMCU не является единственной прошивкой, выполняющей команды интерактивно, но к числу ее преимуществ можно отнести то, что она позволяет сохранять код в виде скрипта во flash-памяти ESP-12E, а также настроить этот код так, чтобы он запускался с каждым запуском чипа. И хотя это удобно, мы все же предпочитаем работать с ESP8266 (в частности, писать кастомную прошивку) при помощи IDE Arduino (подробнее – ниже).
Кастомная прошивка (при помощи IDE Arduino)
Хотя кастомную прошивку можно скомпилировать и записать на ESP8266 напрямую, проще сделать это через IDE Arduino. Впрочем, некоторые пользователи могут найти IDE Arduino неудобной для написания собственного кода, и этот метод, к тому же, стирает всю прошивку на flash-памяти ESP8266.
Другое
Продвинутые пользователи могут воспользоваться набором инструментов «esp-open-sdk», который позволяет программировать ESP8266 напрямую (более подробно читайте тут), не используя IDE Arduino.
Чип ESP8266 также привлек внимание сообществ, сформировавшихся вокруг Espruino и MicroPython. MicroPython и Espruino – это отличные интерпретаторы (за первым стоит Python, а за вторым – JavaScript), способные работать на встраиваемых платформах. Впрочем, они пока находятся на ранних стадиях разработки и поддерживают не все функции ESP8266.
Установка USB-драйверов
Независимо от прошивки, самое первое, что вам нужно сделать – это настроить USB-коммуникацию между адаптерной платой ESP-12E и компьютером. Конвертация USB-UART на нашей плате осуществляется при помощи модуля CP2012, для которого мы используем, как правило, вот эти драйверы (выберите вариант, соответствующий вашей ОС).
После установки драйверов нужно убедиться, что компьютер видит модуль CP2012. На разных ОС это делается по-разному.
OS X
Подключите один конец USB-кабеля к компьютеру, а другой – к плате. Теперь откройте терминал и введите туда следующую команду (она выводит список доступных устройств):
ls /dev/tty.*
Файл, созданный для коммуникации с CP2012, должен называться «tty.SLAB_USBtoUART».
Linux
Пользователи Linux вообще могут не делать никаких лишних телодвижений, потому что CP2012 распознается операционной системой даже без установки драйверов. Как и на OS X, откройте терминал и впишите туда следующее:
ls /dev/tty* | grep 'USB\|ACM'
На Linux платы с адаптерами USB-Serial (CH340, CP2012, FT232R и т.д.) отображаются как «/dev/tty.ACM» или «/dev/tty.USB__», где «__» – это номер. Самый быстрый способ определить, какая именно запись соответствует вашей плате – это дать команду до подключения к USB.
Windows
Установив драйвер, подключите один конец USB-кабеля к компьютеру, а другой – к плате. После этого должно появиться сообщение «Device driver software installed successfully» (это значит «драйвер устройства установлен успешно»).
Теперь проверьте, все ли работает правильно:
- Откройте «Диспетчер задач» («Панель Управления» > «Система и безопасность» > «Система» > «Диспетчер устройств»)
- Найдите пункт «Порты (COM & LPT)». В нем должен быть порт под названием «USB-SERIAL CP2102 (COM__)», где «__» – это номер, который, как правило, равен или больше «3».
Теперь вы готовы к коммуникации с ESP8266 через модуль CP2012. Значит, время поговорить о каждом виде прошивки отдельно.
Прошивка с интерпретатором AT-команд
Для загрузки прошивки (какой бы она ни была) понадобятся две вещи: утилита для загрузки прошивки и образ, который вы будете загружать.
Утилита для загрузки прошивки
Есть несколько утилит, с помощью которых можно загружать прошивку на ESP8266, но мы предпочитаем те, что могут работать на разных операционных системах (т.е. кросс-платформенные). В данном случае мы используем esptool – это утилита на базе Python, разработанная Фредриком Албергом (Fredrik Ahlberg).
Скопируйте весь репозиторий с esptool, вписав в терминал следующее:
git clone https://github.com/themadinventor/esptool
Образ с прошивкой
Теперь нужно скачать образ с прошивкой, который мы будем загружать на ESP8266. Вариантов, содержащих интерпретатор AT-команд, опять же, несколько, но мы воспользуемся прошивкой от Ai-Thinker, которую курируем в общей папке на Google Drive. Чтобы загрузить этот файл, кликните сюда, затем на «Firmware», затем на «AT-Commands (Ai-Thinker)» и, наконец, скачайте файл «v1111ATFirmware.bin».
Загрузка прошивки на ESP8266
Перед использованием esptool нам понадобится установить Python-модуль pySerial. Это можно сделать разными способами (зависит от операционной системы). Чтобы скачать исходный код модуля, впишите в терминал (или в PowerShell, если используете Windows) следующее:
git clone https://github.com/pyserial/pyserial
Чтобы установить этот модуль, впишите следующее:
sudo python setup.py install
Теперь, когда модуль установлен, мы можем приступить к загрузке прошивки. Для этого нам нужно знать путь к установочному файлу и название устройства или COM-порт, к которому оно подключено. В нашем случае это будет, соответственно, «~/Downloads/v0.9.5.2\ AT\ Firmware.bin» и «/dev/tty.SLAB_USBtoUART». Теперь можно запускать утилиту esptool:
python esptool.py --port /dev/tty.SLAB_USBtoUART write_flash 0x00000 ~/Downloads/v1111ATFirmware.bin
Готово! Теперь можно использовать AT-команды для коммуникации с ESP8266.
Использование
Для отправки сообщений через USB-порт компьютера можно использовать разные программы, но мы предпочитаем IDE Arduino. Нужно лишь выбрать правильный порт в меню Инструменты > Порт (Tools > Port), и в нашем случае это «/dev/cu.SLAB_USBtoUART», а затем открыть монитор порта, кликнув на Инструменты > Монитор порта (Tools > Serial Monitor). Нужную плату в меню Инструменты > Плата (Tools > Board) выбирать не нужно, поскольку прошивку мы загружать не собираемся; подойдет и вариант «Arduino/Genuino Uno», стоящий по умолчанию.
В мониторе порта нужно будет изменить две настройки. В меню, отвечающем за то, что будет стоять в конце строки, нужно поставить «NL & CR» («Both NL & CR»), а в меню, отвечающем за скорость передачи данных – «115200». После этого можно отправить тестовую AT-команду:
AT
В ответ должно прийти простое OK. Это быстрый способ проверить, что ESP8266 слушает AT-команды, присланные по UART-порту. Еще один быстрый способ проверки – запросить версию прошивки:
AT+GMR
Затем можно немного поиграться с WiFi-функционалом ESP8266, переключив его в режим станции:
AT+CWMODE=1
Или просканировав ближайшие сети:
AT+CWLAP
Полный список AT-команд для ESP8266 ищите выше, в разделе «Прошивка».
Прошивка NodeMCU и язык Lua
Прошивку NodeMCU тоже можно загрузить при помощи esptool. Последнюю версию NodeMCU можно скачать отсюда.
Загрузка прошивки на ESP8266
Здесь подойдет та же команда, что и для интерпретатора AT-команд, нужно лишь поменять путь к установочному файлу и название устройства:
python esptool.py --port /dev/tty.SLAB_USBtoUART write_flash 0x00000 ~/Downloads/nodemcu_float_0.9.6-dev_20150704.bin
Использование
Поскольку прошивка NodeMCU – это интерпретатор языка Lua, нам нужно будет воспользоваться программой ESPlorer IDE, написанной Виктором Бруцким. Исчерпывающее ознакомительное руководство по ESPlorer IDE смотрите здесь.
Далее убедитесь, что у вас стоят последние версии JRE (от «Java Runtime Environment») и JDK (от «Java Development Kit»), а также в том, что их версии совпадают. Теперь дважды кликните по файлу «ESPlorer.jar» из ZIP-архива, который загрузили ранее. Самое первое, что нужно сделать в ESPlorer IDE – это выставить скорость передачи данных на 9600 бод и выбрать правильное устройство в выпадающем меню, находящемся в верхней части программы (показано на картинке ниже цифрой «2»). Затем кликните на кнопку «Open», чтобы начать коммуникацию с ESP8266.
Теперь, когда коммуникация с ESP8266 установлена, мы можем запустить код, написанный на Lua. Напишите в редакторе ESPlorer IDE вот такой скрипт:
-- печатаем список точек доступа:
function listap(t)
for k,v in pairs(t) do
print(k.." : "..v)
end
end
wifi.sta.getap(listap)
Закончив, кликните на кнопку «Send to ESP», чтобы отправить этот код интерпретатору Lua, запущенному на ESP8266. Когда код будет запущен, ESP8266 отправит ответ, напечатав в мониторе порта (находится в правой части ESPlorer IDE) список близлежащих WiFi-сетей.
Кастомная прошивка и IDE Arduino
Если вы хотите использовать ESP8266 как обычный микроконтроллер вроде ATmega328 на Arduino UNO, то на него можно загрузить кастомную (например, написанную лично вами) прошивку. Впрочем, как и всегда при перепрограммировании микроконтроллеров, кастомная прошивка перезапишет (т.е. сотрет) все, что хранится на flash-памяти чипа.
Хотя для написания собственной прошивки можно использовать SDK производителя, проще делать это в IDE Arduino. Если у вас этой программы нет, то о том, как ее установить, можно почитать тут.
Откройте IDE Arduino, кликните по Файл > Настройки (File > Peferences), найдите поле Дополнительные ссылки для менеджера плат (Additional Boards Manager URL), введите в него ссылку «http://arduino.esp8266.com/stable/package_esp8266com_index.json» (без кавычек) и нажмите ОК.
Кликните в IDE Arduino на Инструменты > Плата > Менеджер плат... (Tools > Board > Board Manager...), промотайте вниз и найдите пункт «esp8266 by ESP8266 Community», который должен быть самым последним в списке. Затем кликните на кнопку «Установка» («Install»).
Теперь, перезапустив IDE Arduino, вы можете выбрать используемую плату, кликнув по Tools > Board > NodeMCU 1.0 (ESP-12E Module). Затем укажите правильную частоту процессора, кликнув на Tools > CPU Frequency > 80 MHz, и правильную скорость загрузки, кликнув на Tools > Upload Speed > 115200. Напоследок кликните на Tools > Port > /dev/cu.SLAB_USBtoUART.
С этого момента можно приступать к написанию собственной прошивки, а потом – и к ее загрузке. Для начала можно попробовать пример для поиска WiFi-сетей; чтобы открыть его, кликните в IDE Arduino на Файл > Примеры > ESP8266WiFi > WiFiScan (File > Examples > ESP8266WiFi > WiFiScan). Загрузите код и откройте монитор порта; там должен быть показан список близлежащих WiFi-сетей. Также обратите внимание, что вам нужно выставить правильную скорость передачи данных – 115200 бод – и это делается в выпадающем меню, которое находится в правом нижнем углу монитора порта.
Другие варианты прошивки
На адаптерную плату ESP8266 можно загружать и другие прошивки. Кроме того, вы можете поочередно использовать то одну, то другую, то третью, и в этом нет ничего сложного. Помните, однако, что одновременно на чип может быть загружена только одна прошивка.
Видео
Это серия видео о том, как начать работать с разными прошивками.
Программирование ESP8266 при помощи IDE Arduino:
[Видео]
JavaScript на ESP8266 при помощи Espruino:
[Видео]
Python на ESP8266 при помощи MicroPython:
[Видео]
Возможные проблемы
NodeMCU
- Ошибка «Unsupported major.minor version 51.0»
- Нужно, чтобы версии JRE (Java Runtime Environment) и JDK (Java Development Kit) соответствовали друг другу.
ESPlorer IDE
- Ошибка «Can't autodetect firmware, because proper answer not received»
- Вы получаете это сообщение, как правило, после загрузки прошивки NodeMCU, поскольку файл «init.lua» не создается автоматически. В результате генерируется сообщение lua: cannot open init.lua, а это совсем не тот ответ, которого ожидает ESPlorer IDE. После того, как вы сохраните файл на ESP8266, предупреждение исчезнет.
- Зависание на сообщении «Communication with MCU»
- Возможно, нужно нажать на плате кнопку сброса.
IDE Arduino
- При попытке загрузить прошивку на ESP8266 выдает ошибку «xtensa-lx106-elf-g++ No such file or directory».
- Обновите Arduino IDE до последней версии. Удалите аддон для ESP8266. Для этого кликните в IDE Arduino на Инструменты > Плата > Менеджер плат... (Tools > Board > Boards Manager...), в открывшемся меню найдите пункт «esp8266 by ESP8266 Community», а затем нажмите на «Удалить» («Remove»). Затем снова установите аддон для ESP8266. Перезапустите IDE Arduino. Теперь все должно быть в порядке.
Другое
- Проблема со сбросом/дампом памяти
- Если ваша программа используется функцию setTCPNoDelay(true), попробуйте закомментировать эту строчку или вместо true поставить false.
См.также
Внешние ссылки