ESP8266:Модули/Краткое вводное руководство по WiFi-модулю ESP8266

Материал из Онлайн справочника
Версия от 15:34, 14 сентября 2023; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Краткое вводное руководство по WiFi-модулю ESP8266[1]

ESP8266 – это недорогой, но очень полезный модуль, который подключается к микроконтроллеру через интерфейс UART и добавляет ему функцию WiFi-связи.

Особенности ESP866:

Подключение

В подключении ESP8266 нет ничего сложного, но есть 2 важных момента, связанных с питанием:

  • Модулю ESP8266 требуется 3,3 вольта. Не питайте его 5 вольтами – это вызовет перенапряжение!
  • Модуль ESP8266 не имеет контактов, устойчивых к 5 вольтам, а для последовательной коммуникации использует 3,3 вольта. Поэтому для коммуникации с 5-вольтовыми микроконтроллерами вроде Arduino потребуется преобразователь вольтовой логики.

Впрочем, если вы чувствуете в себе тягу к экспериментам и не боитесь испортить ESP8266, то второе требование можете проигнорировать. Но будьте готовы к непредвиденным последствиям! :)

Распиновка ESP8266 выглядит следующим образом:

Если подключить к ESP8266 питание, у него загорится красный и замигает синий (он отвечает за последовательную коммуникацию) светодиоды.

Подключение к плате Serial-USB (безопасно)

Если у вас есть 3,3-вольтовая плата Serial-USB (от FTDI), то ею можно спокойно пользоваться вместе с ESP8266, не боясь что-то испортить или повредить. Но обратите внимание, что на многих платах FTDI припаяна перемычка, конвертирующая 3,3 вольта в 5 вольт. Поэтому убедитесь, что ваша плата настроена именно на 3,3 вольта.

Чтобы установить последовательную коммуникацию между платой FTDI и модулем ESP8266, их нужно подключить друг к другу следующим образом:

Подключение к плате Arduino Uno R3 (быстро, но не очень безопасно)

НЕ РЕКОМЕНДУЕТСЯ. Вы можете испортить либо Arduino, либо сам ESP8266.

Почему использовать Arduino с ESP8266 – плохая идея:

  • Входные контакты модуля ESP8266 не устойчивы к 5 вольтам – это может повредить модуль
  • Модуль ESP8266, возможно, будет тянуть больше тока, чем может обеспечить 3,3-вольтовый регулятор на Arduino – это может повредить Arduino
  • Если напряжение превысит 3,3 вольта, модуль ESP8266, возможно, начнет работать нестабильно и непредсказуемо – это может повредить вашему психическому здоровью :D

У этого метода есть, впрочем, и один очевидный плюс:

  • Если у вас уже есть Arduino UNO R3, то для дальнейшей работы с ESP8266 потребуется минимум дополнительных настроек. Кроме того, лично у меня в большинстве случаев все работает нормально.

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

  • Загрузить на Arduino «пустой» скетч, не использующий последовательное соединение. К примеру, скетч «BareMinimum» – чтобы открыть его, кликните в IDE Arduino на Файл > Примеры > 01.Basics > BareMinimum (File > Examples > 01.Basics > BareMinimum)
  • Снять микроконтроллер с платы Arduino (но только если он в корпусе DIP; если он прикреплен к плате поверхностным монтажом, то отпаивать его не нужно)

Чтобы установить последовательную коммуникацию между платой Arduino и модулем ESP8266, их нужно подключить друг к другу следующим образом:

Последовательная коммуникация

Теперь, когда последовательная коммуникация настроена, с WiFi-модулем можно работать через терминал (например, через монитор порта IDE Arduino).

Использование монитора порта IDE Arduino

Во-первых, для «общения» с ESP8266 можно использовать монитор порта, встроенный в IDE Arduino.

  1. Подключите WiFi-модуль к компьютеру
  2. Кликните в IDE Arduino на Инструменты > Порт (Tools > Port), чтобы выбрать порт, к которому подключен WiFi-модуль
  3. Откройте монитор порта. Это можно сделать 3 способами. 1-ый – кликнуть в IDE Arduino на Инструменты > Монитор порта (Tools > Serial Monitor); 2-ой – нажать горячие клавиши  Ctrl + ⇧ Shift + M ; 3-ий – нажать на кнопку с изображением увеличительного стекла, находящуюся в правом верхнем углу IDE Arduino
  4. Если у вас ESP8266, на который установлена дефолтная прошивка (001609901), то в выпадающем меню, находящемся в правом нижнем углу монитора порта, выберите пункт «Возврат каретки» («Carriage Return»). Если у вас последняя версия прошивки, выберите в этом меню пункт «NL & CR» («Both NL & CR»)
  5. В правом нижнем углу монитора порта есть еще одно меню, в котором выставляется скорость передачи данных. Если используете дефолтную прошивку, выставьте там значение «115200», а если последнюю версию прошивки или модифицированную прошивку, то «9600»

Вот и все, монитор порта готов к отправке команд!

Использование утилиты GNU Screen

Если на ESP8266 установлена дефолтная версия прошивки (00160901), которая ждет, что строка будет заканчиваться только символом возвратом каретки («\r»), то GNU Screen можно использовать безо всяких дополнительных настроек. То есть, к примеру, на OS X, можно сразу ввести вот такую команду:

screen /dev/tty.usbserial-AB12345 115200

К сожалению, в последних версиях прошивка ESP8266 требует, чтобы строка заканчивалась не только символом возврата каретки («\r»), но и символом новой строки («\n»). Но настроить команду screen таким образом, чтобы она отправляла оба символа одним нажатием кнопки, по всей видимости, нельзя. Приходится нажимать  ↵ Enter  или  Ctrl + M , а затем  Ctrl + J .

Поэтому, возможно, для работы с поздними версиями прошивки лучше подойдут утилиты вроде minicom или picocom.

Вот и все, можете отправлять свои первые команды!

Первые команды

  • Проверьте, что команды AT отправляются как нужно (сами команды AT, по всей видимости, не чувствительны к регистру, но остальная их часть – да). Для этого впишите в терминале:
AT

Ответ должен быть:

OK

Если вы этого ответа не получили, проверьте следующее:

  1. Правильно ли все подключено (на плате должен мигать синий светодиод). Попробуйте поменять местами линии RX и TX.
  2. Правильная ли скорость передачи данных. Для дефолтной прошивки ESP8266 (00160901) она должна быть 115200 бод.
  3. Правильные символы стоят в конце строки. Для дефолтной прошивки ESP8266 нужен только символ возврата каретки («\r»)


  • Проверьте, находится ли ESP8266 в штатном состоянии, вписав команду сброса:
AT+RST

Ответ должен быть таким:

ets Jan 8 2013,rst cause:4, boot mode:(3,6) 

wdt reset
load 0x40100000, len 24444, room 16 
tail 12 
chksum 0xe0 
ho 0 tail 12 room 4 
load 0x3ffe8000, len 3168, room 12 
tail 4 
chksum 0x93 
load 0x3ffe8c60, len 4956, room 4 
tail 8 
chksum 0xbd 
csum 0xbd 

ready

Или примерно таким. Самая главная часть – слово ready, находящееся на последней строчке.

  • Проверьте версию прошивки, вписав следующее:
AT+GMR

Если на ESP8266 установлена дефолтная прошивка, ответ будет таким:

00160901
  • Настройте ESP8266 таким образом, чтобы он работал одновременно и в режиме станции, и в режиме точки доступа:
AT+CWMODE=3

Ответ должен быть таким:

OK

После изменения этой настройки вам может понадобиться еще раз выполнить сброс платы.

  • Найдите WiFi-сети, находящиеся рядом с ESP8266.

Во-первых, если на вашем ESP8266 стоит прошивка 00160901 (или более старая версия), вам нужно будет справиться с зависанием, которое возникает, если WiFi-сеть, к которой вы подключались в последний раз, больше недоступна.

Для этого нужно просто сохранить данные об этой WiFi-сети (в ответ должно прийти сообщение OK). Для этого впишите следующее (здесь SSID – это название WiFi-сети, а pssw – это пароль к ней):

AT+CWJAP=SSID,pssw

Чтобы узнать, какие данные о сети в данный момент хранятся на ESP8266, впишите следующее:

AT+CWJAP?

Если никаких данных о WiFi-сети не сохранено, ответ должен быть таким:

+CWJAP:""

Если на ESP8266 стоит прошивка одной из последних версий или если сеть по-прежнему где-то рядом, этот предварительный шаг делать не нужно.

Теперь, собственно, можно отправлять команду для получения списка сетей, находящихся поблизости:

AT+CWLAP

Ответ должен быть примерно таким:

+CWLAP:(0,"",0) 
+CWLAP:(3,"WiFiArtThouRomeo",-80) 
+CWLAP:(3,"Free Public WiFi",-51) 
+CWLAP:(3,"Guest",-91)

OK

Иногда в ответ будет выдавать ошибку или никакого ответа не будет вовсе. В этом случае просто включите/отключите USB-кабель и попробуйте снова. Или проделайте то же самое с заземляющим проводом.

  • Подключитесь к точке доступа WiFi. Для этого впишите следующее (здесь SSID – это название WiFi-сети, а pssw – это пароль к ней):
AT+CWJAP="SSID","pssw"

В ответ должно быть написано OK.

К примеру, среди WiFi-сетей в списке, найденном выше, может быть вот такая сеть:

AT+CWJAP="Guest","MyVoiceIsMyPassword"

Чтобы проверить, был ли модулю ESP8266 присвоен IP-адрес, впишите следующее:

AT+CIFSR

В ответ терминал должен показать присвоенный IP-адрес:

192.168.1.2

Как настроить ESP8266 в режим TCP-клиента

Модуль ESP8266 можно подключить к веб-серверу. Для этого проделайте следующее:

  • Настройте ESP8266 на несколько соединений (в ответ должно прийти OK):
AT+CIPMUX=1
  • При помощи команды AT+COPSTART укажите, к какому каналу вы хотите подключиться (0-4), тип протокола (TCP/IP), IP-адрес (или домен, если у вас есть доступ к DNS) и номер порта:
AT+CIPSTART=4,"TCP","google.com",80

В ответ должно пройти сообщение OK и, если соединение открыто, Linked:

OK
Linked
  • Далее нужно указать, сколько данных вы хотите отправить (после указания канала). В данном случае мы отправляем «GET / HTTP/1.0\r\n\r\n» из 18 байтов:
AT+CIPSEND=4,18

Но на этот раз вместо OK должно прийти следующее:

>

Это значит, что модуль ждет, пока вы отправите 18 байт.

Если вы используете монитор порта IDE Arduino, то дальше будет чуть сложнее, т.к. вам нужно будет переключиться между тем, что нужно модулю ESP8266 (только символ возврата каретки), и тем, что ждет HTTP-сервер (символ возврата каретки с символом новой строки). Поэтому откройте меню, расположенное в правом нижнем углу монитора порта IDE Arduino, и выберите там пункт «NL & CR» («Both NL & CR»). Затем отправьте следующее (вам нужно будет второй раз нажать на кнопку «Отправить» («Send»), чтобы отправить пустую строку, которую ждет HTTP-сервер):

GET / HTTP/1.0

Модуль должен ответить так:

SEND OK

Теперь вместо «NL & CR» («Both NL & CR») нужно снова поставить «Возврат каретки» («Carriage Return»). Только так вы сможете отправлять дополнительные команды.

Когда веб-сервер ответит, ESP8266 должен написать еще кое-что:

+IPD,4,530:

Цифра «4» означает, что данные идут через 4-ый канал, а «530» – это размер данных в байтах. Затем вы должны увидеть вот такие данные:

HTTP/1.0 302 Found 
Cache-Control: private 
Content-Type: ...

Это значит, что запрос прошел успешно, и мы только что «пообщались» с интернетом!

Затем от модуля должны последовать 1-2 ответа OK и подтверждение того, что сервер закрыл соединение:

Unlink

Как настроить ESP8266 в режим TCP-сервера

Модуль ESP8266 можно настроить таким образом, чтобы он принимал TCP-запросы. Делается это следующим образом:

  • Подключитесь к точке доступа WiFi
  • Настройте ESP8266 на несколько соединений:
AT+CIPMUX=1
AT+CIFSR

Запишите ответ. Он должен быть примерно таким:

192.168.1.2

Настройте модуль, чтобы он прослушивал (первый параметр mode нужно выставить на «1») соединение, и укажите порт, на котором нужно вести прослушку (в данном случае это «1336»):

AT+CIPSERVER=1,1336

Теперь подключитесь к прослушиваемому порту с другого устройства, подсоединенного к той же сети. Например, при помощи команды telnet:

telnet 192.168.1.2 1336

Модуль должен ответить следующим образом:

Link

Впишите какой-нибудь текст во время этой telnet-сессии:

KiwiconAte!

Модуль должен ответить следующим образом (цифра «0» означает канал, а «13» – объем полученных данных):

+IPD,0,13:KiwiconAte! 
OK

Затем можно отправить какие-нибудь данные – например, при помощи команды CIPSEND, которой пользовались выше. Цифра «0» означает номер канала, а «8» – объем данных:

AT+CIPSEND=0,8

ESP8266 должен ответить вот так:

>

Теперь можно писать данные:

WhatEvs

После этого модуль должен ответить следующим образом:

SEND OK

В telnet-сессии должно отобразиться:

WhatEvs

Теперь telnet-сессию можно закрыть, нажав на горячие клавиши  Ctrl + ] , а затем на  ↵ Enter . Модуль должен ответить вот так:

Unlink

Как настроить ESP8266 в режим точки доступа

Модуль ESP8266 может не только подключаться к точкам доступа, но и сам быть точкой доступа. Это значит, что вы можете подключать устройства к ESP8266 безо всяких проводов. Это отлично подходит, к примеру, для создания локального приватного «drop box»...

  • Модуль уже идет с заранее заданной точкой доступа (название сети будет «ESP_...», но вы можете указать и собственные данные:
AT+CWSAP="NoWorriESSID","password",3,0

Первый параметр – это SSID, второй – это пароль к SSID, третий – номер канала, а четвертый – тип шифрования. Цифра «0» в данном случае означает, что шифрование выключено, а пароль будет игнорироваться, но по-прежнему не должен быть пустым значением. У меня, правда, никогда не получалось настроить шифрование (я всегда создаю незашифрованную сеть), но вы, возможно, будете удачливей меня...

  • Чтобы создать сеть, вам нужно выставить WiFi-режим модуля либо в «AP» («2»; это значит «точка доступа»), либо в «Both» («3»; это значит «точка доступа + клиент»).
AT+CWMODE=3

Готово! Модуль ESP8266 стал точкой доступа. Теперь вы можете подключиться к нему с другого устройства (например, с ноутбука или телефона).

  • Кроме того, вы можете получить IP-адреса всех устройств, подключенных к ESP8266. Для этого впишите следующее:
AT+CWLIF

В ответ должно выдать примерно следующее:

192.168.4.100, [...]
  • Теперь ESP8266 можно настроить на режим сервера (см. раздел выше). Имейте в виду, что в режиме точки доступа у ESP8266 всегда будет IP-адрес «192.168.4.1».

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

Новые версии официальной прошивки найти не так-то просто. Обычно ссылки на них можно встретить на всевозможных форумах, вики-сайтах и аккаунтах Google Drive, которые выглядят сомнительно.

Поэтому, на мой взгляд, лучше искать официальную прошивку по этой ссылке. Это закрытый аккаунт на Google Drive, поэтому у его владельца придется запросить доступ и немного подождать. Здесь, по всей видимости, находится список всех апдейтов официальной прошивки.

Рекомендую загрузить какую-нибудь из этих версий:

  • ESP8266_flasher_V00170901_00_Cloud Update Ready.zip
  • ESP8266_AT_V00180902_02_baudrate watchdog added.zip

Обратите внимание на цифры в версиях. Номер версии 00160901 состоит из двух частей: «0016» – это версия SDK, а «0901» – версия набора AT-команд.

Когда вы обновите прошивку у вас также появится опция «Cloud Updates» (т.е. «обновление из облака»), но мне обновиться через облако пока так и не удалось. Подробнее об этом можно почитать тут.

Инструменты для обновления прошивки

Обновить прошивку можно при помощи разных инструментов, но в этой статье я воспользуюсь esptool – это кроссплатформенная утилита с лицензией GPL.

Чтобы загрузить ее в виде Python-скрипта, кликните тут.

Подключение и обновление прошивки

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

  • Отключите ESP8266 от компьютера
  • Подключите 0-ой GPIO-контакт к «земле» (0 вольт), чтобы включить режим загрузки прошивки
  • Снова подключите модуль к компьютеру

Теперь ESP8266 должен находиться в режиме загрузки прошивки.

Примечание: В документации к esptool написано, что «2-ой GPIO-контакт должен иметь значение HIGH», но мой опыт показывает, что это необязательно.

Чтобы выполнить обновление прошивки, впишите в терминал вот эту команду (файл формата «*.bin» – это файл из архива «ESP8266_AT_V00180902_02_baudrate watchdog added.zip»):

python esptool.py --port /dev/tty.usbserial-ABC12345 write_flash 0x000000 " v0.9.2.2 AT Firmware.bin"

Во время обновления прошивки в терминале должны появляться сообщения, информирующие о том, как проходит процесс обновления:

Connecting... 
Erasing flash... 
Writing at 0x0007ec00... (100 %) 

Leaving...

Если вы используете монитор порта IDE Arduino, и у вас проблемы с подключением, не пытайтесь выполнять обновление при открытом мониторе порта (даже не спрашивайте меня, как я об этом узнал...).

Когда обновление завершится, проделайте следующее:

  1. Отключите ESP8266 от компьютера
  2. Отключите друг от друга 0-ой GPIO-контакт и заземляющий контакт
  3. Снова подключите ESP8266 к компьютеру

Готово! Теперь, если все сделано правильно, прошивка должна быть установлена и готова к работе.

Примечания:

  • Теперь при запуске компоненты вывода данных у модуля будут вести себя по-другому
  • Теперь скорость передачи данных у модуля по умолчанию будет 9600 бод
  • Теперь модуль ждет, что каждая строчка будет заканчиваться символами возврата каретки и новой строки
  • Будут исправлены некоторые баги и добавлены новые AT-команды

Arduino и ESP8266

До сих пор вы управляли модулем ESP8266 вручную, при помощи консоли, но им можно управлять и программно, при помощи скетча Arduino. Базовые скетчи, использующие функционал ESP8266, можно свободно найти в сети. Хотя стоит отметить, что на данный момент сообщество ESP8266 пока не определилось с тем, какую библиотеку Arduino лучше использовать для функционала ESP8266.

SDK для ESP8266 и кастомные прошивки

Для SoC-контроллера (от «system on chip»; это значит «система на кристалле») WiFi-модуля ESP8266 есть официальный SDK (от «software development kit»; это значит «комплект для разработки программного обеспечения»). Благодаря этому SDK вы можете добавить в прошивку, управляемую AT-командами, новые функции или даже создать собственную прошивку.

Вот несколько примеров кастомных прошивок...

NodeMCU

Это прошивка на базе языка LUA для WiFi-модуля ESP8266. Ее GitHub-репозиторий находится здесь. Отличный выбор для тех, кто только начинает работать с ESP8266.

Чтобы загрузить установочный пакет NodeMCU, впишите следующее:

wget https://github.com/nodemcu/nodemcu-firmware/raw/master/0.9.2/512k-flas h/nodemcu_512k.bin

Чтобы записать NodeMCU на ESP8266, впишите следующее:

python esptool.py --port /dev/tty.usbserial-ABC123456 write_flash 0x000000 nodemcu_512k.bin

Чтобы подключиться к модулю...

screen /dev/tty.usbserial-ABC123456 9600

Чтобы написать «Hello!»...

print("hello")

Более подробно о NodeMCU читайте тут и тут.

Кастомная прошивка для управления GPIO-контактами

Это кастомная прошивка с дополнительными AT-командами для считывания и записи данных на GPIO-контакты ESP8266. Эти AT-команды позволяют управлять светодиодами и считывать данные с кнопок.

Более подробно о ней читайте тут.

Дополнительные материалы

Дополнения к этому руководству можно найти тут.

См.также

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