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.
Теория 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> | Режим сна:
|
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>, где:
|
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:
|
AT+CWDHCP_DEF? | То же, что и AT+CWDHCP_CUR? |
AT+CWDHCP_DEF=<mode>, <en> | То же, что и AT+CWDHCP_CUR= <mode>, <en> |
AP+CWAUTOCONN=<enable> | Подключаться к точке доступа после старта модуля:
|
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>
|
AT+CIPSTART=<type>,<addr>,<port>[,<local port>,<mode>] | Запустить подключение когда CIPMUX=0:
Пример: AT+CIPSTART="TCP","192.168.1.1",1000 |
AT+CIPSTART=? | Тест подключения |
AT+CIPSEND=<length> | Отправить данные, где length - длина отправляемых данных |
AT+CIPCLOSE | Закрыть подключение |
AT+CIFSR | Получить локальный IP адрес |
AT+CIPMUX=<mode> | Разрешить множественные подключения:
|
AT+CIPMUX? | Получить текущее значение CIPMUX |
AT+CIPSERVER=<mode>,<port> | Запустить TCP сервер. Если порт не указан, то используется порт по умолчанию - 333. Сервер может быть создать только если режим CIPMUX=1:
|
AT+CIPMODE=<mode> | Режим сквозной передачи (данные будут передаваться прямо в UART):
В сквозном режиме перед данными будет добавлена строка "+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: