Знакомимся с модулем ESP8266 подробнее

Модуль ESP8266 (ESP-07)ESP8266 - это микроконтроллер, разработанный в 2014 году и выпускающийся компанией Espressif Systems - китайской компанией из Шанхая. Он представляет собой сетевое решение с Wi-Fi-трансивером на борту плюс возможность выполнения записываемых в его память приложений.

Существует множество модификаций плат, именуемых обычно от ESP-01 до ESP-12. Сейчас уже появились ещё другие наименования плат от сторонних разработчиков. Отличия в платах заключается в основном в портах ввода-вывода, количестве флеш-памяти, вида коннекторов и т.п. Процессор - один и тот же, так что с точки зрения программирования не имеет значения какую плату программировать.

Спецификация ESP8266:

  • Напряжение питания: 3,3 В
  • Энергопотребление:10 мка...170 мА
  • Флеш-память: до 16 мб максимум (обычно 512 кб)
  • Процессор: Tensilica L106, 32 бита
  • Скорость процессора: 80...160 МГц
  • ОЗУ: 32 кб + 80 кб
  • Порты ввода-вывода общего назначения: 17 (мультиплексируемые с другими функциями)
  • АЦП: 1 ввод с разрешением 1024
  • Поддержка 802.11: b/g/n/d/e/i/k/r
  • Максимальное число подключений TCP: 5

Из спецификации видно, что вопрос как долго будет работать ESP8266 от батареек не может быть легко определён. Потребление энергии изменяется в очень широком диапазоне - при передаче на полной мощности оно составляет 170 миллиампер, а в режиме сне - всего 10 микроампер!

ESP8266 разработан так, что он может использовать подключённый к нему модуль памяти и это обычно флеш-память. Напомним, что количество циклов перезаписи в такую память составляет 10000 раз. Это вполне достаточно для случаев когда приложение записывает в память свои настройки или ведёт какой либо лог данных, но если ваше приложение записывает свои данные слишком быстро, память в скором времени перестанет работать.


Подключение к ESP8266

ESP8266 - это Wi-Fi устройство, значит и подключиться к нему можно через Wi-Fi, однако перед этим следует его настроить - процессор не знает названием вашей локальной сети и пароля для подключения к ней, а также других возможных настроек. Это, конечно, справедливо для случая когда мы хотим чтобы модуль подключался к нашей сети. Для случая когда сам модуль работает в режиме точки доступа, всё немного сложнее.

Для упрощения работы с модулем на стадии программирования и отладки своего приложения можно использовать последовательный порт (UART). ESP8266 имеет специальный последовательный порт для этого - два порта, означенных Rx и Tx. Tx - служит для передачи данных, а Rx - для приёма. Этими портами модуль соединяется с соответствующими портами партёра. Наиболее удобно подключить этот порт к компьютеру посредством переходника USB-UART. При таком подключении мы может отправлять модулю команды из программы терминала прямо с клавиатуры и получать ответы от модуля в терминал или записывать программу в модуль.

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

У модуля ESP8266 есть также второй последовательный порт. Главное его назначение - вывод диагностической и отладочной информации. Это может быть очень полезно при проверке своей программы. Пин Tx второго последовательного порта мультиплексирован с пином GPIO2.

Второй UART ESP8266


Теория Wi-Fi

Работая с устройствами стандарта Wi-Fi, желательно иметь понимание принципе его работы в беспроводной сети. На высоком уровне, Wi-Fi - это беспроводная сеть для  соединений TCP/IP. Wi-Fi - это набор протоколов беспроводной сети, описанных в стандарте IEEE 802.11.

Устройство, называемое Wireless Access Point (AP) - беспроводной точкой доступа  (точкой доступа) работает как узел коммуникаций. Обычно оно подключено или работает в режиме роутера. Например, Wi-Fi роутер в вашем доме работает в таком режиме.

Модуль ESP8266 может работать как в режиме точки доступа (Access Point), так и в режиме клиента - рабочей станции (Station), а может и в обоих режимах одновременно. Чаще всего точка доступа имеет подключение к интернету и работает как мост между устройством и интернетом. Несколько рабочих станций в локальной сети общаются между собой также через точку доступа. Станция одновременно может быть подключена только к одной точке доступа. Каждое устройство в сети имеет собственный уникальный MAC-адрес - 48-битовое значение.

Если в пределах видимости находится несколько точек доступа, их потребуется как-то различать, поэтому у каждой точки доступа есть сетевой идентификатор, называемый SSID (Service Set Identifier, иногда также называемый BSSID) - это имя сети, имеющее длину до 32 символов.


Режим AT-команд

Самый быстрый способ пообщаться с модулем ESP8266 - это передать ему AT-команду и получить ответ. Набор AT-команд - это специальный набор инструкций, которые "знает" наш модуль и может  выполнять определённые действия при их получении и выдавать в терминал результат их выполнения. Программа, называемая процессор AT-команд, уже установлена в модуле ESP8266 и готова к их приёму по последовательному порту. Эти команды начинаются с символов "AT".


AT-команды

Когда модуль подключён к терминалу компьютера, мы можем отправить самую простую команду - "AT". В ответ на неё модуль должен отправить ответ "OK".

Синтаксис AT-команд:

Тип  Формат Описание
 Тест  AT+<x>=?  Запрос параметров и диапазона возможных значений
 Запрос  AT+<x>?  Запрос текущих значений параметров
 Установка  AT+<x>=<...>  Установка значений параметров
 Выполнение  AT+<x>  Выполнение команд

Все команды заканчиваются символами "\r\n".

Основные  AT-команды:

Команда  Описание
AT Пишет в ответ "OK"
AT+RST Перезапускает модуль ESP8266
AT+GMR Возвращает версию SDK модуля и процессора AT команд.
Пример:
AT version:0.21.0.0
SDK version:0.9.5
AT+GLSP=<время> Включение режима сна на указанное число миллисекунд. Модуль проснётся через указанное время.
ATE[0|1] Отправка полученных AT команд обратно в терминал.
ATE0  - эхо выключено
ATE1 - эхо включено
AT+RESTORE Восстановление значение по умолчанию из флеш-памяти
AT+UART_CUR=<baudrate>,<databits>,<stopbits>,<parity>,<flow control> Настройка режима работы UART
AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control> То же, что и AT+UART_CUR=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
AT+SLEEP?  Получить текущий режим сна
AT+SLEEP=<sleep mode>  Режим сна:

  • 0 — режим сна выключен
  • 1 — режим неглубокого сна
  • 2 — режим модемного сна
WiFi
 AT+CWMODE_CUR=<режим> Установка режима работы.
Возможные режимы:
1 - режим станции
2 - режим точки доступа
3 - режим станции + точки доступа
AT+CWMODE_CUR? Получить текущий режим работы
AT+CWMODE_CUR=? Получить список доступных режимов работы
AT+CWMODE_DEF=<режим> То же, что и AT+CWMODE_CUR=<режим>
AT+CWMODE_DEF? То же, что и AT+CWMODE_CUR?
AT+CWMODE_DEF=? То же, что и AT+CWMODE_CUR=?
AT+CWJAP_CUR=<ssid>,<password>[,<bssid>] Подключиться к точке доступа (Join Access Point)
AT+CWJAP_CUR? Получить информацию о текущем подключении
AT+CWJAP_DEF=<ssid>,<password>[,<bssid>] То же, что и AT+CWJAP_CUR=<ssid>,<password>[,<bssid>]
AT+CWJAP_DEF? То же, что и  AT+CWJAP_CUR?
AT+CWLAP  Получить список видимых точек доступа. Ответ в формате + CWLAP: <ecn>, <ssid>, <rssi>, <mac>, <ch>, где:

  • ecn - защита
    • 0 - OPEN
    • 1 -  WEP
    • 2 - WPA_PSK
    • 3 - WPA2_PSK
    • 4 - WPA_WPA2_PSK
  • ssid - SSID точки доступа
  • rssi - уровень сигнала
  • mac - MAC адрес
  • ch - канал
AT+CWLAP=<ssid>,<mac>,<ch> Получить отфильтрованный список точек доступа
AT+CWQAP Отключиться от точки доступа
AT+CWSAP_CUR? Конфигурация режима Soft AP
AT+CWSAP_CUR=<ssid>,
<pwd>, <ch>, <ecn>
Создать точку доступа. Пример: AT+CWSAP_CUR="ESP8266","password",5,3
AT+CWSAP_DEF? То же, что и AT+CWSAP_CUR?
AT+CWSAP_DEF=<ssid>,
<pwd>, <ch>, <ecn>
То же, что и AT+CWSAP_CUR=<ssid>,
<pwd>, <ch>, <ecn>
AT+CWLIF Получить список подключённых IP в режиме Soft AP
AT+CWDHCP_CUR? Получить текущий режим DHCP
AT+CWDHCP_CUR= <mode>, <en> Включить или выключить DHCP:

  • mode
    • 0 - Soft AP
    • 1 - Station
    • 2 - Soft AP + Station
  • en
    • 0 - DHCP включен
    • 1 - DHCP выключен

 

AT+CWDHCP_DEF? То же, что и AT+CWDHCP_CUR?
AT+CWDHCP_DEF=<mode>, <en> То же, что и AT+CWDHCP_CUR= <mode>, <en>
AP+CWAUTOCONN=<enable> Подключаться к точке доступа после старта модуля:

  • 0 - не подключаться
  • 1 - подключаться
AT+CIPSTAMAC_CUR? Получить текущий MAC адрес в режиме Station. Пример:  AT+CIPSTAMAC_CUR="29:0f:46:09:e4:8c"
AT+CIPSTAMAC_CUR= Установить MAC адрес в режиме Station
AT+CIPSTAMAC_DEF? То же, что и AT+CIPSTAMAC_CUR? в режиме Station
AT+CIPSTAMAC_DEF= То же, что и AT+CIPSTAMAC_CUR= в режиме Station
AT+CIPAPMAC_CUR? Получить текущий MAC адрес в режиме Access Point. Пример:  AT+CIPSTAMAC_CUR="29:0f:46:09:e4:8c"
AT+CIPAPMAC_CUR= Установить MAC адрес в режиме Access Point
AT+CIPAPMAC_DEF? То же, что и AT+CIPSTAMAC_CUR? в режиме Access Point
AT+CIPAPMAC_DEF= То же, что и AT+CIPSTAMAC_CUR= в режиме Access Point
AT+CIPSTA_CUR=<ip> Установить IP-адрес в режиме Station
AT+CIPSTA_CUR? Получить IP-адрес в режиме Station. Пример: +CIPSTA:"0.0.0.0"
AT+CIPSTA_DEF=<ip> То же, что и AT+CIPSTA_CUR=<ip> в режиме Station
AT+CIPSTA_DEF? То же, что и AT+CIPSTA_CUR? в режиме Station
AT+CIPAP_CUR? Установить IP-адрес в режиме Access Point
AT+CIPAP_CUR=<ip> Получить IP-адрес в режиме Access Point. Пример: +CIPSTA:"0.0.0.0"
AT+CIPAP_DEF? То же, что и AT+CIPSTA_CUR=<ip> в режиме Access Point
AT+CIPAP_DEF=<ip> То же, что и AT+CIPSTA_CUR? в режиме Access Point
AT+CIFSR Получить IP адрес и IP адрес шлюза
TCP/IP
AT+CIPSTATUS Получить информацию о соединении. Формат ответа:
STATUS: <stat>
+CIPSTATUS:<id>,<type>,<addr>,<port>,<tetype>

  • stat
    • 2 - получен IP
    • 3 - подключен
    • 4 - отключен
  • id - id подключения
  • type - TCP или UDP
  • addr - IP адрес
  • port - номер порта
  • tetype
    • 0 - ESP8266 работает как клиент
    • 1 - ESP8266 работает как сервер

 

AT+CIPSTART=<type>,<addr>,<port>[,<local port>,<mode>] Запустить подключение когда CIPMUX=0:

  • type - тип, TCP или UDP
  • addr - удалённый IP адрес
  • port - удалённый порт
  • local port - локальный порт
  • mode - только для UDP

Пример: AT+CIPSTART="TCP","192.168.1.1",1000

AT+CIPSTART=? Тест подключения
AT+CIPSEND=<length> Отправить данные, где length - длина отправляемых данных
AT+CIPCLOSE Закрыть подключение
AT+CIFSR Получить локальный IP адрес
AT+CIPMUX=<mode> Разрешить множественные подключения:

  • 0 - режим одиночного подключения
  • 1 - режим множественных подключений
AT+CIPMUX? Получить текущее значение CIPMUX
AT+CIPSERVER=<mode>,<port> Запустить TCP сервер. Если порт не указан, то используется порт по умолчанию - 333. Сервер может быть создать только если режим CIPMUX=1:

  • mode
    • 0 - удалить сервер (требует перезапуска)
    • 1 - создать сервер
AT+CIPMODE=<mode> Режим сквозной передачи (данные будут передаваться прямо в UART):

  • 0 - нормальный режим
  • 1 - сквозной режим

В сквозном режиме перед данными будет добавлена строка "+IPD,c,n,", где c - номер канала, а n - число полученных байтов.

AT+CIPSTO=<time> Установить время ожидания сервера. Значение может быть в диапазоне от 0 до 7200 секунд.
AT+CIUPDATE Обновление ПО модуля

Программирование ESP8266

Модуль ESP8266 позволяет записывать собственные приложения для их запуска. Вы может скомпилировать код с языка C и загрузить в модуль. Такая процедура называется "прошивкой" (flashing). Для того, чтобы ваше приложение выполняло полезные функции, у него должна быть возможность отправлять и принимать данные по сети и/или работать с внешними датчиками, входами и выходами. ESP8266 оснащён базовыми функциями для этого, набор которых представляет собой примитивную "операционную систему". Службы этой ОС могут быть вызваны вашим приложением. Они полностью документированы и для вас будет очень полезно уметь пользоваться ими.

Например, если вам надо подключиться к точке доступа WiFi, в API есть команда для этого. Для получения IP адреса также есть API, для получения времени с запуска модуля также есть API. Таких функций очень много и они позволяют делать с модулем очень много полезных вещей. Запомнить все функции, конечно, невозможно, но стоит знать об их существовании. В интернете можно получить последнюю информацию на сайте производителя: http://espressif.com/en/products/esp8266/ или http://bbs.espressif.com/.


Режим загрузки

Когда модуль ESP8266 загружается, он проверяет значения уровней на пинах MTDO (GPIO15), GPIO0 и GPIO2. Комбинация высоких и низких уровней на этих пинах позволяет получить 3-битовое число с восемью возможными значениями от 000 до 111. Каждое значение интерпретируется модулем:

Значение Десятичное значение Пояснение
000 0 нет данных
001 1 Загрузка с данных по UART. Также данные для прошивки модуля.
010 2 Быстрый старт
011 3 Загрузка с флеш-памяти
100 4 SDIO low speed V2
101 5 SDIO high speed V1
110 6 SDIO low speed V1
111 7 SDIO high speed V2

С практической точки зрения это значит, что если нам требуется нормальный запуск модуля, нам требуется загрузить его с флеш-памяти (значение на пинах 011), а если нам требуется перепрошить модуль, то на пинах должно быть значение 001.


SDK ESP8266

SDK (Software Development Kit - набор средств разработчика) для модуля ESP8266 для языка C представляет собой набор файлов, называемых заголовочными с расширениями .h. Простым языком это файлы определений типов данных и функций, которые могут потребоваться при компиляции программы. SDK ESP8266 содержит папку includes с файлами от компании Espressif для нашего модуля:

Файл Пояснение
at_custom.h определения собственных расширений AT команд
c_types.h определения для языка C
eagle_soc.h Низкоуровневые определения и макросы
espconn.h Определения для TCP и UDP
espnow.h Функции поддержки esp now
ets_sys.h нет данных
gpio.h Порты ввода-вывода
ip_addr.h Определения для IP адреса и макросы
mem.h Определения для работы с памятью
os_type.h Тип ОС
osapi.h Пользовательские заголовки с названием "user_config.h"
ping.h Определения для ping
pwm.h Определения для ШИМ
queue.h Определения списков и очередей
smartconfig.h Определения конфигурации
sntp.h Определения SNTP
spi_flash.h Определения для флеш-памяти
upgrade.h Определения для обновлений
user_interface.h Определения для ОС и WiFi.

Компиляция

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

Редактировать текст программы удобнее всего в каком-нибудь редакторе, который имеет подсветку синтаксиса, встроенную справку и другие полезные функции, и ещё лучше - в интегрированной среде разработки (Iintegrated Development Enviroment). Работая в такой среде вы можете написать текст программы, скомпилировать её и сразу же загрузить в модуль.

Широко известны такие среды разработки как Eclipse и Arduino IDE.

Eclipse - очень мощная среда, разработанная компанией IBM и получившая статус открытой много лет назад. Она написана на Java, что означает возможность работы в разных ОС: Windows, Linux, OS X. К этой среде разработки можно подключать множество дополнений, а набор таких дополнений для языка C называется "C Developers Tools" (CDT). CDT не включает компилятор языка C. Его следует выбрать самому. Подробнее о компиляции приложения для ESP8266 в Eclipse будет написано в отдельной статье.

Arduino IDE - гораздо более простая среда разработки, которая, тем не менее, позволяет писать и загружать в модуль свои приложения. Как это делать описано в нашей статье "Arduino IDE + ESP8266".


Отладка

При написании программы очень часто они работают не так как ожидалось. Для модуля ESP8266 отладка (получение служебной информации и состояния системы) облегчается наличием последовательного порта специально для вывода отладочной информации. Вы можете напечатать в UART1 (GPIO2) что хотите при помощи функции os_printf(). Если подключить на пину GPIO2 модуля преобразователь UART-USB, то вы сможете видеть эту информацию на экране компьютера в реальном времени. Таким образом, имея один порт UART для прошивки модуля, а второй для отладки, вам не придётся ничего переключать при создании своей программы. Включение или выключение вывода информации управляется функцией system_set_os_print().


В следующей статье мы напишем тестовую программу - мигание светодиодом, скомпилируем её и запишем в модуль.


Ещё наши статьи  о WiFI модуле ESP8266:

Залишити відповідь