wi-fi модуль esp8266
Думаю, что для многих не новость, что недавно появились на рынке сверх дешевые чипы esp8266 и модули на их основе. Ещё одним большим плюсом этих чипов, по мимо цены, является большая интеграция чипа, следствие чего самодостаточность, а точнее очень малое количество компонентов обвязки.
Чип esp8266 и модули на его основе
Единственным большим минусом этих модулей является секретность их ней документации. Конечно что-то уже давно просочилось в сеть, но основные документы и SDK находятся под NDA грифом. Почему так, не мне судить, но неприятно. Но в некотором скором времени производитель собирается перевести документы на свободно распространяемую лицензию.
Начнём с самого вкусного — цены модуля и чипа. Цена модуля в интернет магазинах составляет порядка 200-300р, на taobao 160р. Цена чипа в интернет магазинах и на taobao 90р, у производителя 1,5$. Цены на конец сентября 2014 года, зеленый стоит 40р.
Хоть основная документация по модулю и закрыта, но из имеющихся источников можно получить дефолтные схемы разводки модуля, краткую спецификацию и список AT команд для работе с модулем по UART (когда чип настроен на этот режим работы, родной у него, кажется, SPI). Данной документации уже будет достаточно для поверхностного ознакомления с данным модулем и построения любительских конструкций на его базе.
Краткая спецификация модуля
Частота | Wi-Fi 2412-2484МГц |
Стандарт | 802.11 b / g / n |
Мощность | + 20dBm |
Максимальное расстояние | 100м (при идеальных условиях) |
Безопасность | WPA / WPA2 |
Встроенный TCP/IP стек | |
Интерфейс | UART 115200 |
Напряжение питания | 3.3В |
Потребление тока | 70мА (240мА пик) |
Температурный режим | -40 +70С |
Подключение модуля ESP-01
GND | GPIO2 | GPIO0 | Rx |
Tx | CH_PD (enable) | RST | Vdd (3,3В) |
Если обратить внимание на количество компонентов, то их всего 6 — пассивных, SPI память и PCB антенна (два светодиода с обвязкой и разъём не посчитал), что очень приятно в плане занимаемым местом, количеством паяемой обвязки и следствием трудозатрат и стоимости применения данного модуля.
В своих экспериментах подключал модуль к cp2102 через небольшую платку со стабилизатором на 3.3В и 2-мя гасящими резисторами.
Испытательный стенд для модуля esp8266
Для работы подаём на модуль питание 3,3В, подключаем UART и подтягиваем к плюсу питания Enable (CH_PD). Напомню: скорость UART 115200, стандартные настройки 8N1.
Список AT команд
Синтаксис:
<command> — выполнит команду
<command>? — запросить статус какого-либо параметра
<command>=<parametr> — задать параметры
AT | AT OK |
Тест |
AT+RST | AT+RST | Перезагрузит модуль |
AT+GMR | AT+GMR 00160901 OK |
Версия прошивки |
AT+CWMODE=<mode> | AT+CWMODE=1
OK |
Режим работы модуля <mode>: 1-клиент 2-точка доступа 3-совмещенный |
AT+CWJAP = <SSID>,<PWD> | AT+CWJAP="HOME","password" OK |
Присоединиться к точке доступа <SSID> — имя точки доступа <PWD> — ключ |
AT+CWLAP | AT+CWLAP +CWLAP:(0,"",0) +CWLAP:(4,"Sosed",-77) +CWLAP:(1,"HOME",-54) OK |
Получить список видимых точек доступа Первый параметр — шифрование: 0 — open 1 — WEP 2 — WPA_PSK 3 — WPA2_PSK 4 — WPA_WPA2_PSK Второй параметр — SSID Третий параметр — чувствительность |
AT+CWQAP | AT+CWQAP OK |
Отключиться от точки доступа |
AT+CWSAP=<ssid>,<pwd>,<chl>, <ecn> | AT+CWSAP="TEST","12345678",5,0 OK |
Установить точку доступа <ssid> — имя точки доступа <psd> — ключ <chl> — канал <ecn> — шифрование, см AT+CWLAP |
AT+CWLIF | AT+CWLIF | Список присоединённых устройств |
AT+CIPSTATUS | AT+CIPSTATUS STATUS:3 +CIPSTATUS:0,"TCP","46.38.56.236",80,0 OK |
Статус TCP соединения Возвращаемый параметр — статус соединения 3 — соединение установлено 4 — нет соединения Первый параметер — сессия Второй параметр — соединение: TCP или UDP Третий параметр — IP Четвёртый параметр — порт Пятый параметр — неизвестен |
AT+CIPMUX=<mode> | AT+CIPMUX=0 OK |
Количество соединений 0 — одно соединение 1 — мультисоединение (до 4-х) |
AT+CIPMODE=<mode> | AT+CIPMODE? +CIPMODE:0 |
Режим передачи данных <mode> — неизвестно |
Для одного соединения (+CIPMUX=0): AT+CIPSTART=<type>,<adr>,<port> Для мульти соединения (+CIPMUX=1): AT+CIPSTART=<id>,<type>,<adr>,<port> |
AT+CIPSTART="TCP","alex-exe.ru",80
OK … Unlink |
Соединение TCP/UDP <id> — идентификатор соединения <type> — тип соединения: TCP или UDP <adr> — адрес IP или URL <port> — порт |
Для одного соединения (+CIPMUX=0): AT+CIPSEND=<length> Для мульти соединения (+CIPMUX=1): AT+CIPSTART=<id>,<length> |
AT+CIPSEND=53 > GET /links/links.html HTTP/1.0 Host: alex-exe.ru busy SEND OK +IPD,233:HTTP/1.1 200 OK |
Отправить данные <id> — идентификатор соединения <length> — количество отправляемых данных Передаваемые данные отправляются после приглашения > , после ввода команды.е |
+IPD,1024:<html> <head> <title>Alex_EXE — Сайты</title> … обрезано … OK |
Приём данных Первый параметр <id> — идентификатор соединения (для +CIPMUX=1). Возвращает количество прочитанных байт, после двоеточия возвращает принятые данные. Принимает по 1024 байта, разделяя. |
|
Для +CIPMUX=0: AT+CIPCLOSE Для +CIPMUX=1: AT+CIPCLOSE=<id> |
AT+CIPCLOSE OK Unlink |
Закрыть соединение Единственный параметр <id> для мультипоточного режима — идентификатор соединения |
AT+CIFSR | AT+CIFSR 192.168.1.208 |
Получить IP адрес модуля |
AT+CIPSERVER=<mode>,<port> | AT+CIPSERVER=1,8888 OK |
Поднять сервер <mode> — режим скрытности 0 — скрыт 1 — открытый <port> — порт |
AT+CIPSTO=<time> | AT+CIPSTO=180 OK |
Установить время одной сессии на сервере <time> — время сессии в секундах, от 0 до 28800. |
Такой перечень команд на данный момент удалось найти. Скудновато, но для минимального функционала хватит.
Пример установки точки доступа и поднятие TCP сервер на 8888 порту:
AT+CWMODE=2 OK AT+RST OK ... перезагрузка ... AT+CWSAP="TEST","12345678",5,0 OK AT+CIPMUX=1 OK AT+CIPSERVER=1, 8888 OK AT+CIFSR 192.168.4.1 Link +IPD,0,17:Test alex-exe.ru OK Unlink
После поднятия сервера зашёл на него через терминал (Link — момент подсоединения) и отправил короткое тестовое сообщение, после чего отсоединился (Unlink — момент отключения).
Пример установки клиента с выполнением «ручного» GET HTTP запроса:
AT+CWMODE=1 OK AT+RST OK ... перезагрузка ... AT+CWLAP +CWLAP:(0,"",0) +CWLAP:(4,"Sosed",-77) +CWLAP:(1,"HOME",-54) OK AT+CWJAP="HOME","password" OK AT+CIPMUX=0 OK AT+CIPSTART="TCP","alex-exe.ru",80 OK Linked AT+CIPSEND=53 > GET /links/links.html HTTP/1.0 Host: alex-exe.ru busy SEND OK +IPD,233:HTTP/1.1 200 OK Server: nginx/1.6.0 Date: Tue, 14 Oct 2014 21:41:06 GMT Content-Type: text/html Content-Length: 1647 ... обрезано ... OK +IPD,1024:<html> <head> <title>Alex_EXE - Сайты</title> ... обрезано ... OK +IPD,623: <tr> <td valign=top colspan=2> <b><p align=center><a HREF = "computer.html">Компьютер</a></p></b> ... обрезано ... </td></tr></head></html> OK OK Unlink
Если в будущем смогу раздобыть больше информации и описания по модулю и чипу, причём не из засекреченных источников, — то будет продолжение.
Источники, с которых собирал информацию:
ESP8266: Революция в мире интернета вещей
nurdspace.nl/ESP8266
www.electrodragon.com/w/Wi07c
даташит Espressif AT Instruction (на Китайском)
Alex_EXE | 15.10.2014 | Связь |
Nobody пишет 16.10.2014 в 11:08 #
Благодарю за информацию по модулям.
Заказал уже несколько для тестирования. До нового года надеюсь приедут.
> Если в будущем смогу раздобыть больше информации и описания по модулю и чипу, причём не из засекреченных источников
А у Вас есть информация из источников NDA? Насколько мне известно там специфичный RISC процессор.
Ой. Оказывается есть сайт http://www.esp8266.com. Там в том числе есть информация по GCC для этого процессора: https://github.com/jcmvbkbc/gcc-xtensa
Скорей бы рабочий день закончился… Покопаться на том сайте надо по подробнее.
Alex_EXE пишет 16.10.2014 в 12:37 #
По доступу к NDA — пока ещё нет, но в скором времени думаю получить. Но NDA есть NDA.
На счёт встроенного 32-битного процессора — правда, упоминания в интернете есть.
По данным модулям в интернете информация есть, но есть подозрения (не мои, а кто имеет доступ к свежей документации), что она устаревшая. Те ресурсы видел — но ещё не смотрел.
Александр пишет 02.12.2014 в 19:36 #
Хорошо все описано. Спасибо.
Вот наткнулся на сайт http://geektimes.ru/post/241054/
где описана уже прошивка чипа.
Сергей пишет 01.01.2015 в 17:12 #
Недостаток ESP8266 — неиндустриальный диапазон температур (нижняя температура -20).
Alex_EXE пишет 28.04.2015 в 00:59 #
У модуля (прошивка 00160901 или v0.9.2) обнаружился ещё один очередной глюк:
Если у модуля была установлена точка доступа с ключом, то он к ней после включения будет автоматически подключатся. Но вот если точка доступа недоступна и к ней не получается подключится то команда AT+CWLAP (поиск доступных/видимых Wi-Fi сетей) приводит к зависанию модуля. Команда — AT+CWQAP (отключиться от точки доступа), не помогает, модуль всё равно виснет.
Может помочь только если установить «пустую» точку доступа, т.е. AT+CWJAP=»»,»» и перезагрузить модуль.
radiomanoff пишет 04.01.2016 в 22:28 #
Ув. Alex_EXE, может Вы подскажите…
Проблема в следующем ,не получается запустить Ваш — Пример установки клиента с выполнением «ручного» GET HTTP запроса для ESP8266.
Через командную строку и telnet — удается получить утвердительный ответ от alex-exe.ru
-на GET-запрос:
GET /links/links.html HTTP/1.0
Host: alex-exe.ru
Ответ:
HTTP/1.1 200 OK
Server: nginx/1.7.9
Date: Mon, 04 Jan 2016 15:59:31 GMT
Content-Type: text/html
Content-Length: 1647
Connection: close
Last-Modified: Mon, 12 Jan 2015 09:41:42 GMT
ETag: "54b396d6-66f"
Accept-Ranges: bytes
и тд…..
Eсли тоже самое проделать с моей ESP8266 в программе ESPlorer , то получаю ответ — HTTP/1.1 400 Bad Request.
Что судя по всему означает — «запрос не может быть исполнен ввиду синтаксической ошибки»
Лог с прграммы ESPlorer:
AT+CIPMUX=0
OK
AT+CIPSTART="TCP","alex-exe.ru",80
CONNECT
OK
AT+CIPSEND=48
OK
> Здесь отсылаю GET-запрос - GET /links/links.html HTTP/1.1 Host: alex-exe.ru
busy s...
Recv 48 bytes
SEND OK
+IPD,323:HTTP/1.1 400 Bad Request
Server: nginx/1.7.9
Date: Mon, 04 Jan 2016 16:17:16 GMT
и тд...........
Пробовал отcылать — GET /links/links.html\r\n\r\n HTTP/1.1 Host: alex-exe.ru\r\n\r\n
Результат тот-же HTTP/1.1 400 Bad Request.
В чем-же проблема? Где ошибка?
Alex_EXE пишет 08.01.2016 в 23:42 #
Проверьте сколько точно байтов Вы посылаете, может указано меньшее число, чем в посылке, из-за этого она бьётся. Можете добавить дополнительных пару байт: если модуль повиснет — т.е. он будет ждать недостающих байт, так же их можно попробовать скомпенсировать символами переноса строки.
radiomanoff пишет 09.01.2016 в 21:41 #
Спасибо за ответ. Но я забросил это дело с telnet, потому что этот вопрос интересовал только в плане правильной отсылки GET-запросов. Больше интересует связка ESP8266 и STM32, и я «рулю» в этом направлении.
На github.com есть интересный проект — https://github.com/materone/WIFI-ESP8266-STM32F103R8T6 . Я взял его за основу и переделываю под STM32F103C8T6 в Keil 5. Модуль ESP8266 c AT-прошивкой.
Сейчас проблема только в правильной обработкой запросов и ответа сервера.
Alex_EXE пишет 10.01.2016 в 03:42 #
Текущий проект, над которым работаю, обладает подобным функционалом. Одна из задач контроллера синхронизироваться с сервером и обмениваться с ним данными. В качестве прошивки выбрал ESP_8266_BIN0.92.bin , т.к. она оказалось, по моему мнению и под мои задачи, наиболее стабильной.
На первом этапе отработал все необходимые команды через telnet с сервером, потом с терминальной программе в ручном, а затем в скриптовом режиме через esp модуль. Далее алгоритм написал под stm32.
В стабильной работы от модуля добился, но широкого тестирования пока что не проводил.
Все таки эти модули esp8266 мне не очень понравились, т.к. они в какой-то степени корявые, под что приходится подстраиваться. Другие модули с которыми работал, мне понравились больше, но esp лидирует по цене и для простых массовых задач это большой плюс.
Проект является закрытым, поэтому исходниками поделится не смогу. В будущем, думаю алгоритм перенести на другую платформу и потом его описать.
radiomanoff пишет 10.01.2016 в 19:41 #
А Вы не подскажите, имеется ли ограничение на команду AT+CIPSEND = x,y по количеству отправленых символов?
Alex_EXE пишет 11.01.2016 в 10:21 #
С ним не сталкивался. Использую фиксированные посылки около 300-350 байт.
Так же использую всего одну короткую сессию.
radiomanoff пишет 11.01.2016 в 22:03 #
Вы знаете , я попробовал разные варианты с этим модулем: сама АТ-прошивка, скрипты LUA и «прошивка» через Arduino ID. У каждого варианта свои достоинства и недостатки.
NodeMCU например — стабильно и просто, но непонятки с оперативкой просто задалбывают, да и «раскуривать» LUA надо.Выгодно отличается ArduinoIDE , как никак Си ,куча примеров и все видно, что с оперативкой , что с flash…По крайней мере достаточно просто , у меня запустился «прозрачный мост».
Но пройдя это путь, я все же вернулся к АТ-прошивке в связке с STM32. Даже наоборот, мне нужна связь с внешним миром для моей STM32. Включится сервером на 80-ом порту, и отдавать небольшую html-страницу у меня выходит, но все-же со стабильностью проблемы безусловно есть.
Есть мысль плюнуть на все эти GET-запросы, включить модуль «прозрачным мостом» и замутить на каком-нибудь VisualStudio C# — прогу для обработки данных с МК. По крайней мере для USB-интерфейса, у меня получилось сделать нечто подобное…
Alex_EXE пишет 12.01.2016 в 19:53 #
Можно попробовать более стабильные модули, например USR-WiFi232, WizFi210. Они намного приятнее чем esp, правда и дороже. WizFi210, по моему, даже http обвертку имеет.
radiomanoff пишет 12.01.2016 в 23:50 #
WizFi210 наверно слишком дорог для любительского проекта, а вот USR-WiFi232 заинтересовал, пожалуй закажу попробовать, спасибо за наводочку…
M9cO пишет 09.02.2016 в 03:33 #
я столкнулся с тем что запрос от браузера на ESP-01 приходит в разном виде если ставить скорость передачи меньше 56000 и больше 56000. Если она выше то он в правильном виде.
Никак не могу понять каким образом появляется это «ОК» после +IPD,… если обращаться браузером???
Alex_EXE , а каким образом у Вас устроено общение с сервером? Я соединяю Atmega8 с wifi и сталкиваюсь с проблемой «неправильного приема инфы», когда мы ожидаем определенный ответ, а он приходит с ошибкой и все программа останавливается.
UART_send_str(«AT+RST\r\n»);
uart_wait(«ready»); это просто пример того что я имею ввиду.
Alex_EXE пишет 09.02.2016 в 23:10 #
Данный модуль пока применил только в одном проекте, где он по HTTP (точнее данные передаются в голом виде, для формальности использовал HTTP обёртку) обращается к специальному серверу по форматированному протоколу.
Данные модули отличаются не очень стабильной работой, можете попробовать использовать другие прошивки.
С тем, что если модуль словив хоть одну ошибку — повиснет — такое есть у них, причём помогает только аппаратный ресет или сброс питания.
Может быть ваш модуль на малой скорости не успевает передать все данные и приходит ответ, из-за чего он виснет. Попробуйте, ради проверки, обмениваться меньшими объёмами данных или увеличить интервалы между ответами на запросы.
M9cO пишет 10.02.2016 в 00:32 #
Спасибо за совет, попробую поставить какую-нибудь третью прошивку(может и поставленная вторая глючная) . Именно запрос приходит в кривом виде, я даже на официальном форуме тему создал — безрезультатно. Ради интереса можете посмотреть на скрины с экрана, где вводятся одинаковые команды, а затем обращается браузер к этому созданному серверу. http://esp8266.ru/forum/threads/poluchenie-raznoj-infy-na-raznyx-skorostjax-pri-obraschenii-brauzerom.992/
Я тут подумал, а что если сделать ожидание определенного ответа лишь некоторое время, а затем просто идти дальше по коду. Не пропускать лишь +IPD.
Alex_EXE пишет 10.02.2016 в 03:21 #
А как в такой ерунде можно будет найти заветные данные? точнее с какой вероятностью они дойдут.
Модуль при этом виснет?
Всё таки мне кажется, что модуль не успевает принимать данные и выплёвывать их в UART на малой скорости.
Для справки, у моего модуля скорость 115200, прошивка ESP_8266_BIN0.92.bin .
M9cO пишет 10.02.2016 в 03:50 #
Нет, модуль не виснет. Я и говорю что это происходит если общаться на любой скорости от 9600 до 38400. А если делать все тоже самое на более высокой , то более менее стабильно приходит get-запрос. Я проверил Вашу теорию у одного из знакомых, он при мне перевел модуль на 9600 и сделал тож самое, все пришло отлично.
1) Разве после get-запроса от браузера приходит «ОК» ? У меня ни с одного не получилось его дождаться. Т.е. как понять когда браузер все выплюнул и можно отправлять данные? (сейчас стоит простая задержка)
2) Можете выложить прошивку куда либо? я её тестану.
Alex_EXE пишет 10.02.2016 в 05:24 #
1. для этих целей IDP как раз таки используется, но Вам, как то с нею не свезло. Попробуйте ещё какую-нибудь другую прошивку.
Вам ведь при этом, скорее всего, нужен будет не только факт обращения к серверу, но ещё и данные с него получить (возвращение данных со страницы или переход, да и имя самой страницы то же имеет значение), так что такие полумеры — не очень хороший вариант, получать — так всё получать, а потом (или по ходу) разбираться.
2. Нет, тот код в том виде, в котором он сейчас, выложить не могу. Т.к. он подпадает под NDA, специфичен и пока не прибран. Когда-нибудь в будущем есть планы реализации некоторых конструкций с wi-fi, их скорее всего выложу. Сейчас же мне поделиться нечем.
M9cO пишет 10.02.2016 в 17:20 #
начал получать ответ «ОК» после обращения браузера. Пришлось прошить старую «Прошивка AT v0.20 SDK v0.9.3 28.11.2014» но тут нельзя менять скорость соединения, команды нет такой. Видимо в новых прошивках, просто убрали этот ответ =\
M9cO пишет 10.02.2016 в 19:17 #
пардон, можно менять, только в официальном руководстве AT v.20 об этом ни слова. Меняется командой «AT+IPR=»