пятница, 20 ноября 2015 г.

ESP8266 быстрый старт

Есть у меня два модуля ESP-01, купил давно уже, на всякий случай, а тут и задача подвернулась, думаю надо их попробовать в деле. Поначалу я даже не представлял, как будет устроена работа, на каком уровне абстракции придется работать, реализовывать ли TCP/IP стек в МК, формировать ли сетевые пакеты руками, какой вообще функционал мне предоставит модуль, ну и тому подобные переживания :).
Оказалось все очень просто, модуль представляет из себя полностью законченное сетевое устройство, он поддерживает необходимые методы шифрования и вообще реализует всю работу с TCP/IP на стороне WiFi, а с МК общается через UART посредством набора AT-команд. Т.е. на стороне МК все предельно просто, там доступны такие удобные команды, как посмотреть список WiFi-сетей, подключиться к выбранной, открыть коннект до хоста IP на порту PORT, записать и прочитать данные из сокета, сделать пинг до хоста и т.д.

Распиновка модуля такая:

также у меня есть китайска-USB-TTL адаптер, выдающий кроме 5В еще и 3.3В.
Подключение модуля обещает быть проще некуда, 4 проводка и можно общаться с ним через программу-терминал. Следовательно, VCC подключаем к питанию 3.3В, GND к земле, RXD чипа к TXD адаптера, TXD чипа к RXD адаптера, CH_PD к питанию.

Sex begins here

Втыкаю USB-адаптер в комп - модуль ожил: моргнул синим диодом и далее постоянно горит красный.
Расчехляю Terminal v.1.9, ставлю 9600 бод, коннект.. ээ, дарагой.. коннект!
Падлюка китайская, адаптер не пашет, COM-порта нет, дрова не ставятся, система Windows 8.1 x64.
15 минут на поиск нужных, попадается мне целая детективная история о том, как злые китайцы скопировали микросхему PL2303 и штампуют ее, не отчисляя лицензионных денег исходному производителю Prolific, зато ссылаясь на его дрова. Компания выпустила под Win8 драйвер, умеющий отличать подделку. Короче в любом случае, чипы версий HXA/XA больше не поддерживаются, а у меня оказался именно такой. Скачал я в итоге файл pl2303_hxa_xa_win8x64_181.zip, принудительная установка из архива и адаптер завелся.

Продолжаем.
Питание на ESP есть, однако новой WiFi сети не вижу (фича?), при включении ESP UART моргает 1 раз, но в терминале пусто. На команду AT молчит, LED TX на адаптере моргает, значит данные уходят на модуль.
Покурил статейку http://esp8266.ru/esp8266-podkluchenie-obnovlenie-proshivki/#esp8266-connect
Попробовал передергивать не питание ESP, а CH_PD - получил ожидаемый мусор при старте модуля. Что ж, похоже пациент жив! Теперь надо пообщаться

Мусор, однако, раз от раза может сильно отличаться по длине. То 1 символ, то 3, то целая гора. Получить его в нормальном виде (отладочный текст) так и не вышло, ни на какой скорости. И на команду AT так и не отвечает, ни с CR+LF, ни как-то иначе..
Ресет у меня все время висел в воздухе, пробовал я его к питанию подтягивать, не помогло, так и оставил его висеть.

Один модуль я, кажется, почикал, подав ему 5В на GPIO0.
Со вторым был аккуратнее, но так нифига и не получилось его завести.
Ни одна из 3 программ-прошивальщиков не смогла ничего сделать с модулем.

Нихрена не быстрый получился старт, как всегда собрал все возможные проблемы.
Китайский адаптер USB-TTL не внушает доверия, вероятно работает криво.
Попробую другой адаптер, программатор для AVR на FTDI.

На другой день

После новой серии неудачных попыток, укорачивания проводов от программатора до чипа и подключения питания от 2xAA (мой программатор выдает только 5В) - стабильно заработал вывод отладочной инфы на скорости 74 880 бод. И новая сеть WiFi появилась, ESP_9E606F. Линию TX на программаторе (от программатора к модулю) я подключил через резистор 1k2.
Пример вывода отладки:
 ets Jan  8 2013,rst cause:1, boot mode:(3,7)
load 0x40100000, len 816, room 16
tail 0
chksum 0x8d
load 0x3ffe8000, len 788, room 8
tail 12
chksum 0xcf
ho 0 tail 12 room 4
load 0x3ffe8314, len 288, room 12
tail 4
chksum 0xcf
csum 0xcf
2nd boot version : 1.2
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4Mbit
jump to run user1
Первый вчерашний модуль я пометил MD (maybe dead), но он таки оказался тоже жив, на AT ответил на скорости 9600.

Понеслась!

Узнать текущий режим командой "AT+CWMODE?", получаю "+CWMODE:2", режим клиента и AP.
Переводим в режим клиента "AT+CWMODE=1" - OK.
Посмотрим список сетей "AT+CWLAP", список выведен с задержкой около секунды.
Подключаемся к сети AT+CWJAP ="your SSID here","wifikey" - хер. ERROR
Пробуем настроить шифрование "AT+CWSAP=3" - ERROR.
Пробовал подключиться к случайно выбранной сети без пароля - думало секунд 15 и выдало FAIL.
Вероятно модулю не нравится имя моей сети, оно содержит пробелы и восклицательный знак:). ХЗ чо я покрутил в итоге, но с Nй попытки приконнектился.
Даже с компа пингуется :)
C:\Users\mex>ping 172.30.0.198
Обмен пакетами с 172.30.0.198 по с 32 байтами данных:
Ответ от 172.30.0.198: число байт=32 время=100мс TTL=255
Ответ от 172.30.0.198: число байт=32 время=20мс TTL=255
Ответ от 172.30.0.198: число байт=32 время=1мс TTL=255
Ответ от 172.30.0.198: число байт=32 время=2мс TTL=255
Статистика Ping для 172.30.0.198:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 1мсек, Максимальное = 100 мсек, Среднее = 30 мсек

Ползем дальше.
Какой адрес получен от DHCP? "AT+CIFSR" - 172.30.0.198
У меня в сетке есть nginx сервер, попробую получить его приветственную страницу:
надо открыть коннект до порта 80, запросить GET / HTTP/1.0 и прочитать все, что отдадут.
Установим режим множественных подключений
AT+CIPMUX=1
Открываю коннект 
AT+CIPSTART=TCP,"172.30.0.1",80
Получаю некое Link typ ERROR
... В инете вычитал 'Link typ ERROR' - can occur when MUX=0 ...
AT+RST, снова установка AT+CIPMUX=1, коннект, раздумье и .. ресет модуля, в смысле он внезапно ребутнулся.
Проба повтора - снова ресет..

Обновлю ка прошивку, сейчас версия 0018 стоит, может даже из облака попробую, понтов ради )
AT+CIUPDATE
посыпались символы, как в матрице прям.. сижу довольный, жду, думаю что это код прошивки сливается :)

На аккумуляторах 2.5В в этот момент. пока работает.
Долго.. минут 5 наверное уже прошло, на счетчике Rx уже 220к.
Еще минут 5. Rx=410к.. Надо было UART с 9600 на 115200 наверное перевести :)
Флеша в модуле 512к, осталось недолго. Rx=500к, да что ж он там, под завязку что ли.
И тут, глядя на эти волны символов, и думая, откуда это у них такая закономерность, решил я терминал на 74880 бод переключить.. а там все это время оказывается фаталы сыпались.

Передернул питание и получил такой косяк


эх, надо шить вручную. понты не прошли.. запустил FLASH_DOWNLOAD_TOOLS и перешил на версию AT 0.21, SDK 0.9.5

Пробуем снова
Список сетей, коннект, MUX=1, открываем соединение 
AT+CIPSTART=TCP,"172.30.0.1",80
теперь сразу ERROR пишет

А документация-то у меня от старой версии открыта, ну ка от 0.21 посмотрю.
Ба, тут добавилась команда PING! Попробуем
AT+PING="ya.ru"
В ответ
+3
OK

Супер. Но что насчет коннекта по HTTP?
Открыл pdf от китайцев, оказалось, что для CIPMUX=1 первым параметром идет ID соединения.
Короче я переключился в MUX=0, и сработало
AT+CIPSTART="TCP","10.0.0.101",80
CONNECT
OK

AT+CIPSEND=18 18 это длина отправляемого заголовка + переносы строки \r\n\r\n
OK
> GET / HTTP/1.0
2 перевода строки, не забываем
SEND OK

и вуаля, наши данные!
+IPD,837:HTTP/1.1 200 OK
Server: nginx/1.2.5
Date: Thu, 19 Nov 2015 18:15:19 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 612
Last-Modified: Thu, 22 Oct 2015 03:24:12 GMT
Connection: close
Accept-Ranges: bytes
<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>    body {        width: 35em;        margin: 0 auto;        font-family: Tahoma, Verdana, Arial, sans-serif;    }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>CLOSED

Если на сервер запрос не посылать, то коннект он разорвет сам через какое то время, а модуль сообщит, что соединение закрыто, прислав строку
CLOSED

К концу экспериментов на аккумах было 2.27В
Я запросил вебсервер еще один раз - все работает.

Материалы и ресурсы

полезно почитать вики http://www.esp8266.com/wiki/doku.php
сайты http://esp8266.ru и http://esp8266.com
upd: хак модуля - вывод дополнительно 4шт GPIO http://esp8266.ru/esp8266-esp-01-hacked/


Комментариев нет:

Отправить комментарий