разработка и программирование электронных устройств

Эксперименты с WiFi модулями на основе SoC ESP8266

Система на кристалле SoC (System on crystal) ESP8266 от китайского производителя Espressif предоставляет возможность простой разработки программируемых модулей с доступом к беспроводной сети WLAN. ESP8266 не имеет встроенной Flash — памяти программ, а вместо нее использует внешнюю микросхему QSPI Flash .

Основные характеристики ESP8266 :

  • RISC процессор Tensilica L106 с тактовой частотой 160 МГц
  • Максимальный объем внешней Flash — памяти программ до 16 Мбайт
  • Частота внешнего тактового резонатора от 24МГц до 52 МГц
  • Встроенный высокочастотный 2,4 ГГц приемо-передатчик с поддержкой стандартов IEEE802.11b/g/n
  • Встроенный стек протоколов TCP/IP и полная поддержка протокола 802.11b/g/n WLAN MAC
  • Доступные для программирования периферийные интерфейсы GPIO, SDIO, SPI, HSPI, I2C, I2S, UART, PWM, IRDA, ADC

На основе ESP8266 китайская промышленность выпускает большое количество недорогих WiFi модулей. Для своих экспериментов я приобрел в разное время два таких модуля: ESP-12F и ESP-14.
Оба модуля изображены на следующей картинке.

Отличия между модулями заключаются в основном в объеме Flash памяти программ и наличии в ESP-14 встроенного микроконтроллера STM8.
Дополнительный микроконтроллер добавлен для взаимодействия с модулем ESP8266 посредством передачи AT — команд.
Видимо идея оказалась не очень удачной и судя по отсутствию документации на модуль ESP-14 на сайте производителя этот модуль был снят с производства.

Оба модуля расположены на печатной плате размером 24 x 16 (мм) с антенной в виде печатного проводника. Все компоненты модулей закрыты защитным металлическим экраном.
Шаг выводов для запаивания модуля составляет 2 мм, общее количество выводов равно 22 , расположение выводов на обеих модулях отличается.

Для программирования модулей на основе ESP8266 используется UART, режим программирования активируется установкой низкого логического уровня на выводе GPIO0.
Для удобства подключения соединительных проводов я запаял оба модуля на платы-переходники.

Подключение к компьютеру осуществляется адаптером USB-UART на основе микросхемы CP2102.

Существует также большое количество модулей на основе ECP8266 с встроенным преобразователем USB-UART, которые не требуют от пользователя навыков работы с паяльником и готовы к работе сразу после включения.

Рассмотрим возможности ESP8266 на примере модуля ESP-12F. Приведенная ниже информация актуальна также для других модулей на основе ESP8266.
Для работы с модулем существует несколько способов, самый простой и не требующий изменения прошивки ESP8266 — это использовать текстовые AT — команды.
Для программирования ESP8266 доступен набор разработчика SDK от Espressif.
Также ESP8266 можно программировать в Arduino-IDE.

Программирование ESP8266 в Arduino-IDE

Загрузить Arduino-IDE можно с официального сайта Arduino.
Среда разработки Arduino-IDE очень простая и к тому же кросс-платформенная .
Исходный файл с текстом программы на языке С++ называется в Arduino-IDE скетчем.
Это основной и единственный модуль программы, из которого могут быть вызваны многочисленные библиотечные функции (или созданы объекты на основе библиотечных классов).

Строго говоря язык программирования Arduino только основан на C++ , на самом деле он имеет значительно меньше возможностей и намного проще языка С++.
Любая программа (скетч) в Arduino-IDE должна иметь две обязательные функции setup() и loop().

Как несложно догадаться из названий этих функций внутри setup() необходимо выполнить начальную инициализацию , а в loop() крутиться основной цикл программы.
По-умолчанию программа для Arduino однозадачная , код программы выполняется внутри бесконечного цикла , но возможно также использовать планировщик задач FreeRTOS.
Для этого необходимо задействовать библиотеку FreeRTOS.

На момент написания данной статьи поддержки FreeRTOS для ESP8266 в библиотеках Arduino не оказалось.
Хотя производитель Espressif уже портировал FreeRTOS на ESP8266 в своем RTOS-SDK.

Добавить поддержку ESP8266 в Arduino-IDE можно добавлением в меня File->Preferences ссылки http://arduino.esp8266.com/stable/package_esp8266com_index.json для стабильных версий или http://arduino.esp8266.com/staging/package_esp8266com_index.json для тестируемых версий в поле Additional Boards Managet URLs.




Признаюсь откровенно для стабильных версий такой способ добавления ESP8266 в Arduino-IDE не работает.
Другой способ добавления поддержки ESP8266 в Arduino-IDE заключается в клонировании git — репозитория.

Я рекомендую воспользоваться именно этим способом :


cd <каталог установки Arduino>/hardware
mkdir esp8266com
cd esp8266com
git clone https://github.com/esp8266/Arduino.git esp8266

Также можно установить бинарный инструментарий для программирования ESP8266, для этого необходимо наличие установленного Python 2.7 .


cd esp8266/tools
python get.py

Далее необходимо выбрать Generic ESP8266 Module в меню Tools->Board.

Настройки модуля ESP-12F у меня выглядят следующим образом :

В разделе Examples for Generic ESP8266 Module меню File->Examples можно выбрать интересующий пример для программирования ESP8266.

Компиляция и загрузка прошивки в плату осуществляется нажатием на кнопку Upload в верхнем меню Arduino. Плата должна быть подключена к USB-UART адаптеру, GPIO0 = 0. Также должен быть выбран правильный номер COM — порта в меню Tools->Port.
Если вы работаете в операционной системе Linux, то необходимо разрешить доступ к устройству COM-порта, например добавить себя в группу dialout владельцев файла /dev/ttyUSB0 :


$sudo usermod -a -G dialout
$sudo systemctl reboot

Из Arduino-IDE можно вызывать функции ESP API . Для проверки такой возможности откройте пример File->Examples->ESP8266->TestEspApi.
В этом примере я изменил скорость работы UART c 74880 на 9600, иначе на экран выводился мусор.

Описание функций ESP API находиться в документации ESP8266 Non-OS SDK API Reference.
Документация для программирования ESP8266 из Arduino-IDE находиться по этой ссылке Welcome to ESP8266 Arduino Core’s documentation!

В примерах также есть обновление прошивки модуля по воздуху OTA (Over the air).
Для проверки данной возможности откройте пример File->Examples->ArduinoOTA->BasicOTA.
В примере необходимо подставить название своей беспроводной сети и код доступа к ней :

Загрузите этот пример обычным способом (через COM — порт), далее откройте терминал Tools->Serial Monitor , отсоедините питание, GPIO0=1 , снова подайте питание.
В терминале появиться IP адрес модуля для программирования с помощью OTA.
Перепрошить модуль по воздуху можно различными способами, в том числе из Arduino-IDE, для этого необходимо перезапустить среду разработки и выбрать в меню Tools->Port беспроводное устройство (у меня оно называется esp8266-ab3eff at 192.168.0.107) в разделе Network ports.

Далее нажимаем на кнопку Upload, закорачивать GPIO0 на землю при этом нет необходимости. Модуль будет перепрошит по воздуху. Но необходимо помнить, что если прошитый в модуль скетч не поддерживает OTA, то в следующий раз придется заново прошивать модуль через UART.
Хочу заметить, что программирование ESP6266 в Arduino-IDE — наиболее простой способ работы с модулем.
Если возможности Arduino-IDE вас не устраивают, то можно воспользоваться фреймворком PlatformIO и программировать модуль на основе ESP8266 в своем любимом редакторе кода или IDE (например Eclipse).

Программирование ESP8266 в Eclipse с помощью PlatformIO

Фреймворк PlatformIO для разработки приложений IoT (Internet of things) написан на языке программирования Python и позволяет работать с фреймворками Arduino, ARM mbed , средствами разработки для STM32, ESP8266, ESP32 и многими другими с использованием различных редакторов кода и IDE. На данный момент PlatformIO поддерживает 566 различных отладочных плат.
PlatfornIO можно установить сразу с IDE на основе редактора кода Atom или Visual Studio Code, а можно воспользоваться интерфейсом командной строки CLI(command line interface).
CLI позволяет создавать новые проекты и экспортировать их в различные IDE.

Для работы PlatformIO необходимо установить Python версии 2.7 или выше.
После установки пакета Python загрузить PlatformIO возможно при помощи менеджера пакетов pip.
Для этого откройте окно терминала (в Windows или Linux) и введите в командной строке :


pip install -U platformio

Далее необходимо создать каталог проекта и произвести его начальную инициализацию :


mkdir project_example
cd project_example
platformio init --ide eclipse --board esp12e

Список всех поддерживаемых PlatformIO отладочных плат можно просмотреть с помощью команды :



platformio boards

После генерации нового проекта его можно открыть в Eclipse CDT.

В файле platformio.ini находятся настройки проекта :



[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino

Для сборки проекта используется фреймворк Arduino. Теперь необходимо создать внутри каталога src/ файл main.cpp и наполнить его следующим содержимым :

Далее запускаем цель “PlatformIO:Build” и наблюдаем за сборкой проекта:

Теперь необходимо закоротить контакт GPIO0 на землю, подать питание на нашу плату ESP12F и запустить цель PlatformIO: Upload, после чего начнется загрузка созданной прошивки в модуль :

Последовательный порт для обновления прошивки модуля должен быть определен автоматически, но если он определиться неправильно, то можно назначить правильный номер порта в файле platformio.ini :



[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
upload_port = /dev/ttyUSB0

PlatformIO также предоставляет возможность использовать при сборке проекта фирменный SDK от производителя Espressif (правда его версия далеко не последняя).
Для этого необходимо в файле platformio.ini изменить поле framework на следующее :



framework = esp8266-rtos-sdk

В составе фреймворка есть примеры, которые расположены в каталоге $(HOME)/.platformio/packages/framework-esp8266-rtos-sdk/examples.

Наконец то мы вплотную подобрались к программированию на языке С модулей на основе ESP8266 без использования высокоуровневых фреймворков.

Для этой цели существует открытое неофициальное SDK и SDK от производителя Espressif, которое до недавнего времени было закрытым.
В обеих случаях для использования SDK необходимо наличие операционной системы Linux.
Для пользователей Windows есть возможность установить Linux как гостевую ОС в виртуальной машине.

Установка гостевой ОС Linux в VirtualBox.

Для начала необходимо загрузить и установить последнюю версию Oracle VM VirtualBox.
Этот процесс достаточно тривиален, чтобы детально на нем останавливаться.
Установка должна производиться с правами администратора.

После установки запускаем VirtualBox и жмем на зеленую кнопку «New» , потом выбираем тип операционной системы и нажимаем «Create».

Теперь необходимо выбрать ISO – образ для установки гостевой операционной системы, но сначала нужно этот образ загрузить .
В своем примере я использую образ Fedora 29 LXDE Desktop.

После загрузки Live – дистрибутива его необходимо установить на жесткий диск, для этого запускаем на рабочем столе Linux иконку «Install to Hard Drive».

Во время установки вам будет предложено выбрать жесткий диск, его можно создать в виртуальной машине с помощью опции Settings->Storage->Controller:SATA->Adds hard disk->Create new disk->VHD(Virtual Hard Disk)->Dynamicall allocated->Create.

После установки операционной системы на виртуальный жесткий диск необходимо создать новую виртуальную машину, назовем ее LXDE_Fedora_HDD.
Во время создания виртуальной машины необходимо в опциях Hard disk установить Use an existing virtual hard disk file и выбрать в выпадающем списке название виртуального диска, на который была произведена установка ОС.

Все последующие манипуляции выполняются абсолютно одинаково что в виртуальной, что в реальной машине c Fedora Linux.

Программирование ESP8266 в ESP-Open-SDK

ESP-Open-SDK предоставляет инструментальные средства для разработки программного обеспечения для чипов ESP8266 и ESP8266EX.
Для установки ESP-Open-SDK необходимо сначала установить дополнительные пакеты, для этого открываем терминал Fedora Linux(или LXDE_Fedora_HDD) и вводим команды :



$sudo dnf install -y make unar autoconf automake libtool gcc gcc-g++ gperf flex\
>bison texinfo gawk ncurses-devel expat-devel python-devel python pyserial\
>sed git unzip bash help2man wget bzip2 patch

Разрешить команду sudo можно так :



$su
{Password}
#visudo
i
{Username}ALL=(ALL) ALL
:w
:q
#exit

Проверяем работу sudo :



$sudo dnf install -y vim mc

Установку пакета esp-open-sdk будем производить в каталог /opt.



$cd /opt
$sudo git clone --recursive https://github.com/pfalcon/esp-open-sdk.git

Далее необходимо поменять владельца каталога esp-open-sdk c root на вашего пользователя :



$sudo chown -R {username}:{username} /opt/esp-open-sdk
$ls -l

Входим в каталог esp-open-sdk и запускаем процесс сборки :



$cd esp-open-sdk
$make toolchain esptool libhal STANDALONE=n

Процесс сборки достаточно длительный как в родной, так и в гостевой ОС Linux.

После сборки esp-open-sdk необходимо прописать путь к инструментарию xtensa-lx106-elf в системной переменной PATH:


$cd
$sudo vim .bashrc
export PATH=/opt/esp-open-sdk/xtensa-lx106-elf/bin:$PATH

Проверим в окне терминала версию установленного компилятора :


$xtensa-lx106-elf-gcc --version

Установим утилиту esptool для программирования Flash — памяти модуля ESP8266 :


$sudo pip install esptool

Теперь настало время добавить поддержку FreeRTOS в нашу инструментальную среду, для этого выполняем команды :


$cd /opt
$sudo git clone --recursive https://github.com/Superhouse/esp-open-rtos.git
$sudo chown -R {username}:{username} /opt/esp-open-rtos

Для доступа модуля ESP8266 к сети WIFI необходимо указать ее название (SSID) и пароль доступа к беспроводной сети , для этого создадим заголовочный файл private_ssid_config.h и пропишем в нем указанные параметры:


$cd /opt/esp-open-rtos/include
$vim private_ssid_config.h

Если вы используете гостевую ОС, то необходимо активировать свой USB-UART преобразователь в VirtualBox. Для этого нужно просто выбрать свой преобразователь в меню Devices->USB->Your USB to UART Bridge Controller, а также разрешить доступ к этому порту, добавив пользователя {Username} в группу dialout :


$sudo usermod -a -G dialout {Username}
$sudo systemctl reboot

Компилируем пример HTTP – сервера и загружаем прошивку в модуль ESP-12F , не забывая установить GPIO0=0 :


make flash -j4 -C examples/http_server ESPPORT=/dev/ttyUSB0

После успешной прошивки модуля выключаем питание, устанавливаем GPIO1=1 и вновь подаем питание на модуль ESP-12F.
В окне веб-браузера можно будет наблюдать работу встроенного в ESP8266 HTTP – сервера :

Программирование ESP8266 в SDK от Espressif

Espressif предоставляет для программирования модулей на основе ESP8266 свой фирменный SDK, который состоит фактически из двух независимых частей : non-OS SDK и RTOS SDK.
Каждый из предоставляемых SDK содержит примеры программ.

В примерах non-OS SDK есть программа , демонстрирующая расширение количества поддерживаемых AT — команд за счет добавления пользовательских.
RTOS SDK основан на операционной системе реального времени FreeRTOS и содержит гораздо большее количество примеров, нежели в non-OS SDK .

Для компиляции примеров из SDK производитель предлагает установить в виртуальной машине ОС Lubuntu Linux. Кроме того Espressif предоставляет образ OC Lubuntu Linux с предустановленным инструментарием.
При сборке используется кросс-компилятор gcc.

Документацию для быстрого начала работы с SDK можно скачать с сайта производителя ESP8266 SDK Getting Started Guide.

Установим RTOS SDK и non-OS SDK от Espressif в свою ОС Linux (или LXDE_Fedora_HDD):


$cd /opt
$sudo git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
$sudo git clone https://github.com/espressif/ESP8266_NONOS_SDK.git
$sudo chown -R {username}:{username} /opt/ESP8266_RTOS_SDK
$sudo chown -R {username}:{username} /opt/ESP8266_NONOS_SDK

Начнем с самого интересного, а именно с примеров программ для RTOS SDK.
Для их сборки необходимо добавить путь к SDK в переменную IDF_PATH :


$cd
$vim .bashrc
export IDF_PATH=/opt/ESP8266_RTOS_SDK
$sudo reboot

Соберем пример https- клиента, построенного на основе библиотеки mbed TLS для ESP8266 :


$cd /opt/ESP8266_RTOS_SDK/examples/protocols/https_mbedtls
$make

Должно запуститься конфигурационное меню , выполните настройку основных параметров, как показано на следующих картинках :

Загружаем прошивку примера в модуль ESP-12F (не забываем про GPIO0=0) с помощью команды:


$make flash

Проверим выводимую модулем информацию , запустив утилиту putty.
Несмотря на выбранную при конфигурации примера скорость 115200 бод, для того чтобы увидеть сообщение, необходимо выставить скорость обмена 74880 бод.

Для повторной настройки примера необходимо ввести в командной строке :


$make menuconfig

Настало время испытать пример для non-OS SDK. Работа с non-OS SDK имеет свои особенности. Для того, чтобы собрать какой-либо пример из каталога /opt/ESP8266_NONOS_SDK/examples необходимо скопировать интересующий пример в каталог на уровень выше (в /opt/ESP8266_NONOS_SDK).

Сборка может производиться двумя способами : вызовом скрипта gen_mics.sh с последующим вводом необходимых параметров в интерактивном режиме или передачей параметров в командной строке вместе с make (на самом деле gen_misc.sh делает тоже-самое).

Попробуем запустить пример MQTT – клиента на модуле ESP-12F.
MQTT (Message Queue Telemetry Transport) – сетевой протокол , работающий поверх TCP/IP, который имеет архитектуру издатель-подписчик. Для работы протокола необходим постоянно работающий сервер , так называемый MQTT брокер. MQTT клиенты обмениваются друг с другом сообщениями через MQTT брокера. Для этого одни клиенты (подписчики) подписываются на прием сообщений от других клиентов (издателей), когда кто-либо из издателей отправляет сообщение, то все подписанные на него клиенты немедленно получают отправленное сообщение.

Для того, чтобы испытать пример из ESP8266_NONOS_SDK/examples/esp_mqtt_proj необходимо установить MQTT брокер. Самый распространенный MQTT брокер под ОС Linux называется Eclipse Mosquitto.


Установка MQTT брокера Mosquitto на Raspberry Pi 3.

Перед установкой Mosquitto необходимо сделать обновления :


$sudo apt-get update
$sudo apt-get upgrade

Добавляем репозиторий для загрузки Mosquitto :


$sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$sudo apt-key add mosquitto-repo.gpg.key
$rm -f mosquitto-repo.gpg.key
$cd /etc/apt/sources.list.d/
$sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
$sudo apt-get update

Выполняем установку :


$sudo apt-get install -y mosquitto mosquitto-clients

Запускаем Mosquitto :


$sudo service mosquitto restart

Теперь нужно протестировать работу подписчиков и издателей.
Для этого сначала делаем подписку, открываем новое окно терминала и вводим :


$mosquitto_sub -d -t /mqtt/topic/0

Открываем еще одно окно терминала и публикуем сообщение с помощью команды :

$mosquitto_pub -d -t /mqtt/topic/0 -m “Hello world!”

В окне подписчика должно появиться сообщение “Hello world!”.
В предыдущей публикации я описывал как установить для сервера на Rpi3 статический IP адрес. IP адрес платы можно определить с помощью команды :

$hostname -I
Пример MQTT клиента из ESP8266 non-OS SDK

Сначала копируем пример esp_mqtt_proj в корневой каталог ESP8266_NONOS_SDK :


$cp -R /opt/ESP8266_NONOS_SDK/examples/esp_mqtt_proj /opt/ESP8266_NONOS_SDK
$cd /opt/ESP8266_NONOS_SDK/esp_mqtt_proj

IP адрес запущенного на Raspberry Pi 3 MQTT брокера и еще несколько параметров необходимо добавить в заголовочный файл mqtt_config.h:


$vim include/mqtt_config.h

Запускаем скрипт gen_mics.sh для сборки проекта , в процессе работы скрипта необходимо ввести несколько параметров, как показано на следующей картинке :

Второй способ сборки :


$make COMPILE=gcc BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=4

Тут я описал сборку прошивки с поддержкой обновления по воздуху OTA (over the air).
После сборки полученный бинарный файл будет автоматически скопирован в каталог ESP8266_NONOS_SDK/bin/upgrade , о чем предупреждает следующее сообщение :

Для прошивки модуля ESP-12F как обычно закорачиваем GPIO0 на землю и вводим следующие команды :


$cd ../bin
$esptool.py erase_flash
$esptool.py - -port /dev/ttyUSB0 write_flash - -flash_mode qio - -flash_size 32m - -flash_freq 40m 0x0000 boot_v1.7.bin 0x1000 upgrade/user1.4096.new.4.bin 0x3FB000 blank.bin 0x3FC000 esp_init_data_default_v08.bin 0x3FE000 blank.bin

Карта памяти для размещения кода и настроек в SPI Flash описана в документации ESP8266 SDK Getting Started Guide.

Проверим работу примера, для этого открываем на Rpi3 три терминала и подписываемся в каждом из них на прием сообщений от MQTT клиента на ESP8266 :


$mosquitto_sub -d -t /mqtt/topic/0
$mosquitto_sub -d -t /mqtt/topic/1
$mosquitto_sub -d -t /mqtt/topic/2

Возможно также проверить обратное действие, — опубликовать сообщения в топики 0 – 2 .
Для этого в одном терминальном окне можно поочередно ввести команды :


$mosquitto_pub -d -t /mqtt/topic/0 -m “Hello ESP8266 /0”
$mosquitto_pub -d -t /mqtt/topic/1 -m “Hello ESP8266 /1”
$mosquitto_pub -d -t /mqtt/topic/2 -m “Hello ESP8266 /2”

Итак, мы рассмотрели основные способы программирования модулей на основе ESP8266.
Несмотря на то, что статья вышла очень растянутой , некоторый вопросы, которые я хотел осветить, в нее не вошли.

Поэтому в следующих своих публикациях я планирую описать программирование ESP8266 в Eclipse под Windows
и Linux с использованием SDK от Espressif, а также описать установку последней версии инструментария xtensa-lx106-elf.

Viewed 8097 times by 679 viewers

Leave a Reply

You must be logged in to post a comment.