Попалась мне на глаза плата LILYGO TTGO T-Internet-POE ESP32 LAN8270A и конечно я не мог пройти мимо такой интересной новинки: ESP32, LAN8270A, POE, SD карта, Wi-Fi+Ethernet… Было интересно пощупать это произведение сумрачного китайского гения своими руками и протестировать в реальной работе, ведь TTX платы сулили очень интересные перспективы для использования в IoT, DIY и вообще в области «Wi-Fi+Ethernet и на что фантазии хватит».
Но, как всегда, путь от рекламных проспектов на сайтах продавцов и производителя до запуска платы и проведения на ней тестов оказался очень непростым и тернистым. Далее предлагаю вашему вниманию отчёт о моих увлекательных изысканиях по этой теме.
Камень в огород LILYGO
По моим наблюдениям (многие) производители «железа» страдают одной родовой болезнью — полным отсутствием компетенции в маркетинге и вообще элементарного понимания того, что свои продукты они делают для людей.
Хорошим примером тут может служить LILYGO TTGO T-Internet-POE ESP32 LAN8270A (далее для краткости будем называть эту плату T-Internet-POE). Производитель сделал интересную плату, но… не сделал больше ничего:
- нет нормальной распиновки контроллера
- нет принципиальной электрической схемы
- нет вменяемого описания применения платы и типовых паттернов её использования
- нет технических пояснений по работе отдельных составляющих платы
- нет примеров кода (есть 1 (!) скетч на «отвали, мальчик, не мешай работать»)
- нет сайта с документацией
- нет форума с грамотными и мотивированными модераторами
- нет популярных и мотивирующих статей для тех, кто интересуется этим контроллером, но не знает (не понимает) где он мог бы его применить для своих целей
- и нет ещё множества вещей, которые должны были бы быть
Короче, нет вообще ничего и каждый, кто рискнёт купить T-Internet-POE, должен быть безупречным воином DIY, иначе у него нет ни одного шанса выстоять в этой битве с LILYGO. Много ли среди нас таких?
И как при таком подходе к делу они вообще умудряются что-то продавать? И насколько выросли бы их продажи, если бы они на минутку отложили в сторону паяльник и вспомнили о своих покупателях?
Вопросы риторические, но так или иначе далее мне придётся проделать всю работу за технический и маркетинговый отделы LILYGO.
В чём фишка?
Говоря простыми словами, на этой плате удалось более-менее удачно объединить в одном устройстве ESP32 (Wi-Fi), Ethernet, POE и ещё добавить к этому торту вишенку в виде microSD картридера. Из одного только сочетания этих составляющих сразу вытекает множество интересных вариантов применения этой платы:
- работа по Wi-Fi с резервом в виде Ethernet канала
- работа по Ethernet с резервом в виде Wi-Fi подключения
- обслуживание одновременно и Wi-Fi и Ethernet линков
- роутер между Wi-Fi и Ethernet в обе стороны
- веб-сервер на два интерфейса
- разные веб-сервера на разных интерфейсах
- питание (удалённого) контроллера по POE
И множество других интересных вариантов (кстати, не нужно забывать, что кроме непосредственно сетевой составляющей, плата имеет GPIO выводы и может использоваться по своему прямому назначению, то есть в качестве IoT контроллера).
Как вы видите, сфера применения этой платы в IoT и DIY ограничена только вашей фантазией и вашими потребностями и в целом T-Internet-POE как устройство смотрится очень многообещающе.
Далее давайте попытаемся разобраться как со всем эти великолепием совладать, что, учитывая практически полное отсутствие информации по плате, является не такой простой задачей.
Технические характеристики
Мы здесь не будем приводить полный список всех технических характеристик платы — вот с чем с чем, а с этим на сайтах продавцов и производителя проблем нет (проблема в том, что кроме этих характеристик там больше ничего нет). Приведём здесь только список ключевых элементов платы:
- ESP32-WROOM (4 МБ)
- LAN8720A (Ethernet PHY)
- POE 802.3af
- microSD картридер
- 12 GPIO пинов для внешних подключений
О чём навскидку нам говорит такая конфигурация? О том, что при использовании этой платы в качестве веб-сервера, файлы можно хранить как на microSD карте памяти, так и во внутренней памяти модуля ESP32 (или и там и там сразу).
При этом 12 свободных GPIO производят двойственное впечатление — с одной стороны это уже «кое-что» и значительно лучше чем на ESP8266, а с другой стороны после проектов на Mega 2560 с её десятками GPIO, 12 пинов смотрятся очень и очень скромно и сильно ограничивают возможности разработки — тут нужно будет либо изобретать какие-то расширители портов, либо делать тандемные сборки с другими контроллерами.
Варианты контроллера
При ближайшем рассмотрении оказывается, что под одним названием существуют два разных контроллера — один на ESP32-WROOM, а второй на ESP32-WROVER-B, что сходу и не разглядишь — на вид платы практически одинаковые и можно играть в игру «найди 10 отличий».
Мне достался контролер на ESP32-WROOM, поэтому дальнейшее повествование будет относится к нему.
Программатор
Инженеры LILYGO так далеко оторвались от своих пользователей, что их решения не всегда можно понять. К таким решениям относится создание ими отдельной платы программатора на чипе CP2104 для контроллера T-Internet-POE.
Зачем? Зачем нужен отдельный программатор, когда этот узел можно было интегрировать на саму плату контроллера или попросту использовать стандартные USB-TTL переходники (как делают все остальные производители железа)? Ответ, видимо, знают только разработчики LILYGO (но простим им этот маленький креатив).
Но мало того, что разработчики LILYGO сделали непонятную вещь, они ещё и умудрились сделать её криво:
- во-первых они применили горячо любимые народом пины с шагом 2,0 мм
- во-вторых они предусмотрели установку разъёма на обратную (!) сторону платы
(Разработчикам такого решения я бы порекомендовал иногда отвлекаться от работы и уделять время отдыху.)
В результате получился какой-то странный монстр. И всё бы ничего, если бы проблема ограничивалась только эстетической составляющей, но тут вылезают более серьёзные проблемы:
- если устанавливать и крепить плату в нормальном положении, то пины программатора оказываются снизу платы и к ним невозможно подключиться без демонтажа контроллера;
- если работать с платой без крепления, то разъёмы с шагом 2,0 не обеспечивают должной жёсткости и вся конструкция грозит развалиться в любой момент и всё вокруг позамыкать.
В качестве нивелирования этого косяка разработчиков, можно порекомендовать припаивать линейку пинов с верхней стороны платы и сделать (или купить, если он продаётся) 6-пиновый 2,0 мм гибкий переходник.
Распиновка
Для начала приведём оригинальный вариант распиновки (окультуренный насколько это было возможно). Для тех «кто в курсе» информации достаточно, остальные мало что поймут из этой «китайской грамоты».
Попробуем перевести это на русский язык и вообще разобраться с тем, что там происходит с распиновкой элементов и распределением ресурсов контроллера.
Всего на ESP32 имеется 40 пинов (D0–D39) из них 14 пинов
D6–D11, D20, D24, D28-D31, D37, D38
мы исключаем из рассмотрения как практически неиспользуемые (по разным причинам, подробный разбор назначения этих пинов выходит за рамки этой статьи). Остаются:
Пины подключения Ethernet чипа LAN8720A
D18 – ETH_MDIO_PIN
D19 – ETH_TX_D0
D21 – ETH_TX_EN
D22 – ETH_TX_D1
D23 – ETH_MDC_PIN
D25 – ETH_RX_D0
D26 – ETH_RX_D1
D27 – ETH_RX_CRS
причём, D18 и D23 устанавливаются в скетче, а остальные 6 пинов чипа LAN8720A являются «стандартными» и задаются в библиотеке.
Поскольку производитель постеснялся предоставить принципиальную схему контроллера, то я здесь могу только привести аналогичную типовую схему подключения физики Ethernet на LAN8720A.
К LAN8720A также относится пин тактирования, который на плате T-Internet-POE подключён к D17 (тоже выбирается в скетче):
D17 – ETH_CLOCK
и пин сброса
D5 – NRST
microSD картридер
microSD картридер подключён на HSPI:
D2 – SD_MISO
D12 – SD_CS
D14 – SD_SCLK
D15 – SD_MOSI
и в случае своего использования «забирает» свободные для внешних подключений и выведенные на плату пины D2, D14, D15. Вопрос «что выгоднее — использовать картридер и потерять 3 из 12-и свободных пинов или сохранить 3 лишних GPIO и отказаться от картридера» — сродни вопросу «что лучше: слон или конь?» и вам каждый раз придётся отвечать на него при использовании платы T-Internet-POE.
Прочие пины
У нас остаются пины D0 (ETH_CLOCK, не задействован в этом качестве) и D1 (TX0) и D3 (RX0).
Свободные пины
Теперь переходим к самому интересному — описанию свободных пинов, выведенных на плату контроллера.
Первой идёт группа D34, D35, D36, D39, работающая только на вход. Лучше конечно на вход, чем вообще ничего, но при таком дефиците GPIO было бы гораздо лучше, если бы эти четыре пина были полноценными GPIO.
И затем 8 полноценных GPIO, которые вы можете использовать в своих проектах. Тут нужно помнить, что хоть эти пины и являются полноценными GPIO, но некоторые из них работают весьма своеобразно (например меняют потенциал на старте контроллера и т. п.). Поэтому прежде, чем к ним что-то подключать, нужно специально выяснять и уточнять эти моменты.
D2 (SD_MISO)
D4
D12
D14 (SD_SCLK)
D15 (SD_MOSI)
D16
D32
D33
Как говорится, вот тебе, мой юный друг программирования и микроконтроллеров, 8 GPIO и ни в чём себе не отказывай.
POE
Тут нужно ещё сказать несколько слов о поддержке POE, поскольку это является одним из достоинств этой платы и одной из её «фишек» и для многих это будет причиной, по которой они захотят её купить и использовать.
Здесь реализована полноценная поддержка стандарта POE 802.3af с развязкой и управлением питанием на чипе SI3404.
Меня дистанционная запитка контроллера не очень интересует, поэтому этот аспект работоспособности T-Internet-POE я не тестировал, но, судя по всему, с POE здесь проблем нет.
Программная поддержка
Как вы сами понимаете, работать с T-Internet-POE можно при помощи любых программных сред, имеющих представление об этом железе, в том числе в нативном SDK (и вероятно это наиболее правильный вариант), но мы попытаемся выяснить, что можно выжать из этой железки при помощи Arduino IDE.
В качестве программной среды для экспериментов использовались Arduino IDE версии 1.8.5 и ESP32-Arduino версии 1.0.5 (последняя сборка на момент написания статьи).
Сам процесс установки поддержки ESP32 в Arduino IDE я описывать не буду потому, что этому вопросу посвящено огромное количество материалов в интернете, во всех нюансах описывающих этот процесс.
Упомяну здесь только один момент: плюс ко всему, чего не имеет этот контроллер, он ещё не имеет и нативной поддержки в ESP32-Arduino версии 1.0.5. Поэтому в качестве контроллера в менеджере плат выбирался «ESP32 DEV Module» с настройками:
Flash Mode: DIO
Flash Size: 4MB (32 Mb)
Partition Scheme: 4MB (1,2MB/1,5MB)
Стандартный скетч
Ниже приведён скетч, которым нас порадовал производитель платы. Там особенно комментировать нечего, он просто инициализирует Ethernet интерфейс и посылает запросы к серверу в интернете.
/*
This sketch shows how to configure different external or internal clock sources for the Ethernet PHY
*/
#include <ETH.h>
#include <SPI.h>
#include <SD.h>
#define SD_MISO 2
#define SD_MOSI 15
#define SD_SCLK 14
#define SD_CS 13
/*
* ETH_CLOCK_GPIO0_IN - default: external clock from crystal oscillator
* ETH_CLOCK_GPIO0_OUT - 50MHz clock from internal APLL output on GPIO0 - possibly an inverter is needed for LAN8720
* ETH_CLOCK_GPIO16_OUT - 50MHz clock from internal APLL output on GPIO16 - possibly an inverter is needed for LAN8720
* ETH_CLOCK_GPIO17_OUT - 50MHz clock from internal APLL inverted output on GPIO17 - tested with LAN8720
*/
// #define ETH_CLK_MODE ETH_CLOCK_GPIO0_OUT // Version with PSRAM
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT // Version with not PSRAM
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_POWER_PIN -1
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_TYPE ETH_PHY_LAN8720
// I?C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_ADDR 0
// Pin# of the I?C clock signal for the Ethernet PHY
#define ETH_MDC_PIN 23
// Pin# of the I?C IO signal for the Ethernet PHY
#define ETH_MDIO_PIN 18
#define NRST 5
static bool eth_connected = false;
void WiFiEvent(WiFiEvent_t event)
{
switch (event) {
case SYSTEM_EVENT_ETH_START:
Serial.println("ETH Started");
//set eth hostname here
ETH.setHostname("esp32-ethernet");
break;
case SYSTEM_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case SYSTEM_EVENT_ETH_GOT_IP:
Serial.print("ETH MAC: ");
Serial.print(ETH.macAddress());
Serial.print(", IPv4: ");
Serial.print(ETH.localIP());
if (ETH.fullDuplex()) {
Serial.print(", FULL_DUPLEX");
}
Serial.print(", ");
Serial.print(ETH.linkSpeed());
Serial.println("Mbps");
eth_connected = true;
break;
case SYSTEM_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case SYSTEM_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
void testClient(const char *host, uint16_t port)
{
Serial.print("\nconnecting to ");
Serial.println(host);
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
return;
}
client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
while (client.connected() && !client.available());
while (client.available()) {
Serial.write(client.read());
}
Serial.println("closing connection\n");
client.stop();
}
void setup()
{
Serial.begin(115200);
WiFi.onEvent(WiFiEvent);
SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
Serial.println("SDCard MOUNT FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
String str = "SDCard Size: " + String(cardSize) + "MB";
Serial.println(str);
}
pinMode(NRST, OUTPUT);
digitalWrite(NRST, 0);
delay(200);
digitalWrite(NRST, 1);
delay(200);
digitalWrite(NRST, 0);
delay(200);
digitalWrite(NRST, 1);
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE);
}
void loop()
{
if (eth_connected) {
testClient("baidu.com", 80);
}
delay(10000);
}
Когда я в первый раз увидел этот скетч, то задался вопросом: «что этим хотел сказать производитель?». Единственное назначение этого скетча — показать, что эта технология в принципе работает. Это конечно хорошо, но что дальше? Что со всем этим делать не имея ни документации, ни примеров, ни вменяемой ответной реакции от производителя?
Походу получается, что ответ от LILYGO — изучать программирование и создавать ПО самостоятельно (или искать готовые прошивки, хотя это и не спортивно).
Интерфейсы и пинг
Для сетевых профессионалов (и примкнувших к ним) скажу пару слов о скорости работы по интерфейсам Wi-Fi и Ethernet и их отзывчивости. Тестирование проводилось в ненагруженной гигабитной сети, зашумлённость Wi-Fi диапазона специально не контролировалась.
Первый скриншот — это пинг контроллера по Wi-Fi интерфейсу. Минимум 24 мс, максимум 105 мс, среднее 67 мс.
Второй — пинг контроллера по Ethernet интерфейсу. Минимум 0 мс, максимум 9 мс, среднее 2 мс.
Как вы видите, пинг по проводному Ethernet кардинально меньше, чем по Wi-Fi (что ожидаемо). Насколько хороши или плохи эти цифры предоставляю судить читателям самостоятельно, меня они вполне устраивают для моих целей.
Тестирование
Тестировать такую систему, как T-Internet-POE на скетчах, подобных предложенному производителем — это несерьёзно, поэтому для тестирования контроллера применялась специализированная версия AMS, адаптированная специально для этой платы. Учитывая, что это сервер, который использует полноценные HTML, CSS, Javascript, Ajax, графические файлы и библиотеки, то успешная работа такого сервера на T-Internet-POE будет свидетельствовать о правильно спроектированном железе и возможности его использования в реальных проектах.
Примечание: тестирование производилось на внутренней, не публичной версии AMS для T-Internet-POE. Публикация и распространение этой версии не планируется, возможно это будет сделано позже, после соответствующих доработок.
Тест 1. Запускаем AMS сервер на T-Internet-POE
Запустить AMS на новом контроллере с новым чипом и сетевым интерфейсом — это весьма нетривиальная задача, но тем не менее, при правильном подходе и понимании того, что ты делаешь, всё становится возможным.
Косяк номер 1
В процессе этой работы стали вылезать «косяки» самого контроллера T-Internet-POE и первое, что было выявлено — это то, что контроллер отказывается прошиваться при вставленной microSD карте памяти. Не помогает ничего — ни замена USB порта, ни питание от отдельного блока, ни нажимание кнопок, ни замена карты — контроллер упорно не желает прошиваться при вставленной карте памяти.
Глюк это конкретного экземпляра или родовой дефект всех контроллеров T-Internet-POE сказать трудно (имея в своём распоряжении один экземпляр), можно только констатировать 100-процентную повторяемость и воспроизводимость проблемы.
Что это значит для нас? В практическом плане это значит, что на контроллере T-Internet-POE фактически нет картридера — картридер, который блокирует прошивку контроллера — это не картридер, а баг.
Что же делать? Остаётся только использовать 1,5 МБ SPIFFS, имеющийся на модуле ESP32. Да, это не очень много, но в принципе 1,5 МБ памяти для IoT устройства — это более-менее приемлемо в большинстве случаев.
Косяк номер 2
Ок, от картридера мы отказались, теперь нам нужно подружиться с SPIFFS. Вроде бы задача несложная и даже привычная, но и тут нас ждёт засада: по какой-то причине утилита ESP32FS отказывается нормально работать на этом контроллере (в этой конфигурации). Перенос файлов в память модуля ESP32 приводит к последующей ошибке монтирования SPIFFS диска.
М-да… В случае невозможности нормально перенести файлы (сервера) на SPIFFS диск, остаётся только один способ — инициализация интерфейса через Serial соединение, и последующий перенос файлов на SPIFFS диск через веб-интерфейс. Способ конечно не очень удобный, но никак не влияющий на конечный результат — файлы сервера были успешно перенесены на SPIFFS диск.
Описание самого процесса адаптации кода под новый контроллер я опускаю, поскольку это потребовало бы составления антологии наподобие полного собрания сочинений В. И. Ленина и сразу перехожу к демонстрации факта успешной работы AMS сервера на T-Internet-POE (а значит и работоспособности самой платы T-Internet-POE).
Загрузка страницы по Wi-Fi интерфейсу.
Загрузка страницы по Ethernet интерфейсу.
Выигрыш по скорости примерно в 4 раза, естественно, в пользу Ethernet. Здесь нужно ещё иметь в виду, что речь идёт о неоптимизированном коде и после проведения соответствующих работ результаты должны значительно улучшиться.
Работа сервера по Ethernet интерфейсу на LILYGO TTGO T-Internet-POE ESP32 LAN8270A.
Тест 2. Работа на двух интерфейсах
Тут мне придётся немного поработать разрушителем легенд. В интернете ходят упорные слухи, что одновременная работа Wi-Fi и Ethernet на связке ESP32 и LAN8270A невозможна. Это не так — AMS сервер прекрасно работает на двух интерфейсах одновременно и отлично обслуживает запросы по Wi-Fi и Ethernet. Никаких проблем с зависаниями или перезагрузками ESP32 нет.
Вот это уже интересный результат, который открывает заманчивые перспективы: поскольку мы имеем собственный сервер, то можем как угодно управлять обслуживанием интерфейсов, например, по Wi-Fi отдавать одни сайты с одним контентом, а по Ethernet — другие сайты с другим контентом. Образно говоря, бабушке по Ethernet отдавать сайт с кулинарными рецептами, а внуку по Wi-Fi — сайт с избранными статьями из БСЭ.
Тест 3. Бан по одному из интерфейсов
Теперь давайте попробуем на практике реализовать идею с различным обслуживанием интерфейсов веб-сервером. В качестве примера попробуем реализовать отказ в обслуживании для подключений по одному из интерфейсов (Ethernet).
Клиент, подключённый к нашему контроллеру по Ethernet интерфейсу получил отказ в обслуживании.
Резервирование интерфейсов
Сама идея резервирования интерфейсов лежит на поверхности и так и просится для реализации. Подобных сценариев существует множество, например, у вас есть IoT контроллер, который подключён к локальной сети по Ethernet. В случае аварийной ситуации, при пропадании проводного линка, контроллер автоматически подключается к резервному беспроводному роутеру и продолжает свою работу.
Сетевой роутинг
Имея в своём распоряжении два рабочих сетевых интерфейса можно как угодно маршрутизировать пакеты в сети. Никто также не мешает в схему маршрутизации по Wi-Fi и Ethernet добавить маршрутизацию данных по nRF24 или LoRa или по любой другой беспроводной сети. Таким образом можно сделать любой роутер для вашей IoT системы.
Ну, и как было отмечено выше, существует ещё множество интересных вариантов использования контроллера с двумя сетевыми интерфейсами.
Итоги
Теперь давайте подведём итоги этого небольшого исследования: в общем, несмотря на некоторые косяки и детские болезни, контроллер LILYGO TTGO T-Internet-POE ESP32 LAN8270A мне понравился — это отличный инструмент для построения IoT систем, особенно если вы обладаете соответствующей квалификацией и не лишены фантазии и креативного подхода к своему творчеству.
Плюсы и минусы LILYGO TTGO T-Internet-POE ESP32 LAN8270A.
Плюсы:
- Это работает!
- Законченное интегрированное решение Wi-Fi + Ethernet + POE + GPIO
- Хорошая работа без зависаний и перезагрузок (проблем при тестировании выявлено не было)
- Возможность одновременной работы по двум интерфейсам
Минусы:
- Тотальное отсутствие документации, примеров и пояснений
- Относительно высокий порог входа
- Детские болезни и мелкие косяки в реализации
vindozo
только задумался в выходные о возможности построения такого устройства на ESP32 как оказывается уже готово. это всеядный интернет комбайн 3 в 1 (забыли сказать что он блютуз еще может) — дорого богато, все на максималках. он понравится с точки зрения маркетинга, но избыточен по модулям и проиграет в цене специализированным устройствам. поэтому радуемся, но не используем.
smart_alex Автор
Про bluetooth я конечно в курсе, я не стал его упоминать потому, что о нём все знают и он несколько выбивается из тематики статьи. А вообще к этому контроллеру можно подключить любой беспроводной модуль (и даже не один) и сделать любое гибридное IoT устройство.
Про цену вообще не задумывался — меня лично цена вполне устраивает (за такой функционал) и практика показывает, что на реальных проектах такая цена никого не смущает (если это только не массовый проект, но там и контроллер нужно делать собственный).
vindozo
а как вы думаете, интересно бы было подобное устройство с дополнительным встроеным питанием от сети 220в? просто контролеры POE содержат в себе все компоненты для построения импульсного блока питания с развязкой, пару джамперов, реактивное сопротивление на кондере + диодный мост — так светильники китайские запитывают. и готово, контролер работает от 220в и обычного интернета. смысл — установка в щиток, на дин-рейку без вилки
smart_alex Автор
Я думаю, что это очень гибкая платформа как в плане софта, так и в плане железа и всё зависит от ваших задач. Для себя я пока вижу такой вариант: обычная стационарная запитка через USB разъём, а в случае необходимости переноса контроллера в необслуживаемое место — запитка контроллера через POE. (Но это в моём конкретном случае.)