Avistei a bordo LILYGO TTGO T-Internet-POE ESP32 LAN8270A e é claro que eu não poderia passar por uma novidade tão interessante: ESP32, LAN8270A, POE, cartão SD, Wi-Fi + Ethernet ... Foi interessante sensação este trabalho de um gênio chinês sombrio com minhas próprias mãos e testá-lo em trabalho real, porque as placas TTX prometiam perspectivas muito interessantes para uso em IoT, DIY e em geral no campo de "Wi-Fi + Ethernet e o que você pode imaginar . "
Mas, como sempre, o caminho dos folhetos publicitários nos sites de vendedores e fabricantes até o lançamento da placa e a realização de testes acabou sendo muito difícil e espinhoso. A seguir, trago a sua atenção um relatório sobre minha fascinante pesquisa sobre este tópico.
Pedra no jardim LILYGO
De acordo com minhas observações, muitos fabricantes de "hardware" sofrem de uma doença genérica - uma total falta de competência em marketing e, em geral, uma compreensão elementar do que seus produtos fazem pelas pessoas.
Um bom exemplo é LILYGO TTGO T-Internet-POE ESP32 LAN8270A (doravante chamaremos esta placa de T-Internet-POE para abreviar). O fabricante fez uma placa interessante, mas ... não fez mais nada:
- sem pinagem de controlador normal
- nenhum diagrama de circuito
- não há uma descrição sã do uso da placa e padrões típicos de seu uso
- não há explicações técnicas para o funcionamento de componentes individuais da placa
- sem exemplos de código (há 1 esboço (!) para "foda-se, garoto, não se preocupe em trabalhar")
- nenhum site com documentação
- não há fórum com moderadores competentes e motivados
- não há artigos populares e motivadores para aqueles que estão interessados neste controlador, mas não sabem (não entendo) onde ele poderia usá-lo para seus próprios fins
- e ainda há muitas coisas que deveriam ter sido
Resumindo, não há absolutamente nada e todos os que se atrevem a comprar o T-Internet-POE devem ser um guerreiro DIY impecável, caso contrário não têm hipóteses de sobreviver nesta batalha com o LILYGO. Existem muitos de nós assim?
E como, com essa abordagem de negócios, eles conseguem vender alguma coisa? E quanto suas vendas aumentariam se eles colocassem o ferro de soldar de lado por um momento e se lembrassem de seus clientes?
As perguntas são retóricas, mas de uma forma ou de outra, além disso terei que fazer todo o trabalho para os departamentos técnico e de marketing da LILYGO.
Qual é o truque?
Em termos simples, nesta placa conseguimos combinar mais ou menos com sucesso ESP32 (Wi-Fi), Ethernet, POE em um dispositivo e adicionar uma cereja no topo deste bolo na forma de um leitor de cartão microSD. De apenas uma combinação desses componentes, muitas opções interessantes para usar esta placa seguem imediatamente:
- trabalhar via Wi-Fi com um backup na forma de um canal Ethernet
- trabalhar por Ethernet com um backup na forma de uma conexão Wi-Fi
- serviço de links Wi-Fi e Ethernet
- roteador entre Wi-Fi e Ethernet em ambas as direções
- servidor web para duas interfaces
- diferentes servidores da web em diferentes interfaces
- fonte de alimentação do controlador (remoto) via POE
E muitas outras opções interessantes (aliás, não se esqueça que além do próprio componente de rede, a placa possui saídas GPIO e pode ser usada para o fim a que se destina, ou seja, como controlador de IoT).
Como você pode ver, o escopo de aplicação desta placa em IoT e DIY é limitado apenas por sua imaginação e suas necessidades e, em geral, o T-Internet-POE parece muito promissor como um dispositivo.
A seguir, vamos tentar descobrir como lidar com todo esse esplendor, que, dada a quase total falta de informações no quadro, não é uma tarefa tão fácil.
Especificações
Não forneceremos aqui uma lista completa de todas as características técnicas da placa - é com o quê, e não há problemas com isso nos sites de vendedores e fabricantes (o problema é que não há nada além dessas características). Aqui está apenas uma lista dos principais elementos do quadro:
- ESP32-WROOM (4 MB)
- LAN8720A (Ethernet PHY)
- POE 802.3af
- leitor de cartão microSD
- 12 pinos GPIO para conexões externas
O que essa configuração nos diz imediatamente? Que ao usar esta placa como um servidor web, os arquivos podem ser armazenados em um cartão de memória microSD e na memória interna do módulo ESP32 (ou ambos lá e ali ao mesmo tempo).
Ao mesmo tempo, 12 GPIOs gratuitos produzem uma impressão ambígua - por um lado, isso já é "algo" e muito melhor do que no ESP8266 e, por outro lado, após projetos no Mega 2560 com suas dezenas de GPIOs, 12 pinos parecem muito, muito modestos e limitam severamente as possibilidades de desenvolvimento - aqui você precisará inventar algum tipo de extensor de porta ou fazer montagens em tandem com outros controladores.
Opções de controlador
Após uma inspeção mais detalhada, verifica-se que sob o mesmo nome existem dois controladores diferentes - um no ESP32-WROOM e o segundo no ESP32-WROVER-B, que você não pode ver imediatamente - as placas parecem quase iguais e você pode jogar o jogo "encontre 10 diferenças" ...
Eu tenho o controlador no ESP32-WROOM, então a próxima narração irá se referir a ele.
Programador
Os engenheiros do LILYGO estão tão distantes de seus usuários que suas decisões nem sempre são fáceis de entender. Essas soluções incluem a criação de uma placa de programador separada no chip CP2104 para o controlador T-Internet-POE.
Pelo que? Por que você precisa de um programador separado quando este nó pode ser integrado na própria placa do controlador ou simplesmente usar adaptadores USB-TTL padrão (como todos os outros fabricantes de hardware fazem)? A resposta, aparentemente, apenas os desenvolvedores do LILYGO sabem (mas vamos perdoá-los por esse pequeno criativo).
Mas não apenas os desenvolvedores do LILYGO fizeram algo incompreensível, eles também conseguiram torná-lo torto:
- em primeiro lugar, usaram alfinetes amados pelo povo com pitch de 2,0 mm
- em segundo lugar, eles previam a instalação do conector no lado reverso (!) da placa
(Para desenvolvedores de tal solução, eu recomendaria às vezes se distrair do trabalho e descansar.)
O resultado é algum tipo de monstro estranho. E tudo ficaria bem se o problema se limitasse apenas ao componente estético, mas aqui surgem problemas mais sérios:
- se a placa for instalada e fixada em sua posição normal, os pinos do programador estão na parte inferior da placa e é impossível conectar a eles sem desmontar o controlador;
- se você trabalha com uma placa sem fixação, então os conectores com pitch de 2,0 não oferecem a rigidez adequada e toda a estrutura corre o risco de se desfazer a qualquer momento e fechar tudo ao seu redor.
Como um nivelamento para este batente de desenvolvedores, podemos recomendar soldar uma linha de pinos na parte superior da placa e fazer (ou comprar, se vendido) um adaptador flexível de 6 pinos de 2,0 mm.
Pinagem
Para começar, daremos a versão original da pinagem (cultivada tanto quanto possível). Para quem "sabe" existe informação suficiente, o restante pouco entenderá dessa "alfabetização chinesa".
Vamos tentar traduzir isso para o russo e geralmente descobrir o que acontece lá com a pinagem dos elementos e a alocação dos recursos do controlador.
No total, ESP32 tem 40 pinos (D0 - D39), dos quais 14 pinos
D6 - D11, D20, D24, D28-D31, D37, D38
excluímos da consideração como praticamente não utilizados (por várias razões, uma análise detalhada do propósito desses pinos está além do escopo deste artigo). Permanecer:
Pinos de conexão Ethernet do chip 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
são instalados no chip LAN, D20A e padrão são instalados no chip LAN, enquanto D20A padrão são instalados no D20A e LAN
Como o fabricante hesitou em fornecer um diagrama esquemático do controlador, só posso dar aqui um diagrama de conexão física Ethernet típico semelhante no LAN8720A.
O LAN8720A também tem um pino de relógio, que é conectado ao D17 na placa T-Internet-POE (também selecionado no desenho):
D17 - ETH_CLOCK
e redefinir o pino
D5 - NRST
leitor de cartão microSD
O leitor de cartão microSD é conectado ao HSPI:
D2 - SD_MISO
D12 - SD_CS
D14 - SD_SCLK
D15 - SD_MOSI
e no caso de seu uso "tira" os pinos D2, D14, D15 livres para conexões externas e trazidos para a placa. A pergunta "o que é mais lucrativo - usar um leitor de cartão e perder 3 dos 12 pinos livres, ou manter 3 GPIOs extras e abandonar o leitor de cartão" é semelhante à pergunta "o que é melhor: um elefante ou um cavalo?" e você tem que responder sempre que usar o cartão T-Internet-POE.
Outros pins
Ainda temos os pinos D0 (ETH_CLOCK, não usado nesta capacidade) e D1 (TX0) e D3 (RX0).
Alfinetes grátis
Agora vamos para a parte mais interessante - a descrição dos pinos livres trazidos para a placa controladora.
O primeiro é o grupo D34, D35, D36, D39, que funciona apenas na entrada. Melhor, é claro, para a entrada do que nada, mas com esse déficit de GPIO, seria muito melhor se esses quatro pinos fossem GPIOs completos.
E então 8 GPIOs completos que você pode usar em seus projetos. Aqui você precisa se lembrar que embora esses pinos sejam GPIOs completos, alguns deles funcionam de uma maneira muito peculiar (por exemplo, eles mudam o potencial no início do controlador, etc.). Portanto, antes de conectar algo a eles, você precisa descobrir e esclarecer especificamente esses pontos.
D2 (SD_MISO)
D4
D12
D14 (SD_SCLK)
D15 (SD_MOSI)
D16
D32
D33
Como se costuma dizer, um brinde a você, meu jovem amigo da programação e dos microcontroladores, 8 GPIOs e não se negue nada.
POE
Aqui precisamos dizer mais algumas palavras sobre o suporte a POE, já que esta é uma das vantagens desta placa e um de seus "chips" e para muitos será o motivo pelo qual irão querer comprá-la e usá-la.
Ele implementa suporte total para o padrão POE 802.3af com isolamento e gerenciamento de energia no chip SI3404.
Não estou muito interessado em ligar o controlador remotamente, então não testei esse aspecto do desempenho do T-Internet-POE, mas, aparentemente, não há problemas com o POE.
Suporte de software
Como você mesmo entende, você pode trabalhar com T-Internet-POE usando qualquer ambiente de software que conheça esse hardware, incluindo o SDK nativo (e esta é provavelmente a opção mais correta), mas vamos tentar descobrir o que pode ser espremido fora desses pedaços de ferro usando o IDE do Arduino.
Como um ambiente de software para experimentos, usamos o IDE do Arduino versão 1.8.5 e o ESP32-Arduino versão 1.0.5 (a versão mais recente no momento da redação deste artigo).
Não vou descrever o próprio processo de instalação do suporte ESP32 no IDE do Arduino, porque uma grande quantidade de materiais na Internet são dedicados a esse problema, descrevendo esse processo em todas as nuances.
Mencionarei apenas um ponto aqui: além de tudo que este controlador não possui, ainda não possui suporte nativo no ESP32-Arduino versão 1.0.5. Portanto, “Módulo ESP32 DEV” foi selecionado como um controlador no gerenciador de placa com as seguintes configurações:
Modo Flash: DIO
Tamanho do Flash: 4 MB (32 Mb)
Esquema de partição: 4 MB (1,2 MB / 1,5 MB)
Desenho padrão
Abaixo está um esboço que nos agradou o fabricante da placa . Não há nada de especial a comentar, ele apenas inicializa a interface Ethernet e envia solicitações ao servidor na Internet.
Código de esboço completo do fabricante da placa
/*
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);
}
Quando vi esse esboço pela primeira vez, me perguntei: "O que o fabricante queria dizer com isso?" O único objetivo deste esboço é mostrar que essa tecnologia funciona em princípio. Isso certamente é bom, mas e depois? O que fazer com tudo isso sem ter qualquer documentação, ou exemplos, ou uma resposta sensata do fabricante?
A campanha acabou descobrindo que a resposta do LILYGO é aprender a programar e criar software por conta própria (ou procurar firmware pronto, embora isso não seja esporte).
Interfaces e ping
Para os profissionais de rede (e aqueles que se juntaram a eles), direi algumas palavras sobre a velocidade do trabalho em interfaces Wi-Fi e Ethernet e sua capacidade de resposta. Os testes foram realizados em uma rede gigabit descarregada, o nível de ruído do alcance do Wi-Fi não foi especificamente controlado.
A primeira captura de tela é um ping do controlador por meio da interface Wi-Fi. Mínimo 24 ms, máximo 105 ms, média 67 ms.
A segunda é fazer o ping do controlador por meio da interface Ethernet. Mínimo 0 ms, máximo 9 ms, média 2 ms.
Como você pode ver, o ping em Ethernet com fio é drasticamente menor do que em Wi-Fi (o que é esperado). Se esses números são bons ou ruins, deixo para os leitores julgar por si mesmos, estou bastante satisfeito com eles para meus propósitos.
Testando
Não é sério testar um sistema como o T-Internet-POE em esboços semelhantes ao sugerido pelo fabricante, então uma versão especializada do AMS, adaptada especificamente para esta placa, foi usada para testar o controlador. Por se tratar de um servidor que utiliza HTML, CSS, Javascript, Ajax, arquivos gráficos e bibliotecas de pleno direito, a operação bem-sucedida de tal servidor no T-Internet-POE indicará um hardware devidamente projetado e a possibilidade de seu uso em projetos reais.
Observação: o teste foi realizado em uma versão interna não pública do AMS para T-Internet-POE. A publicação e distribuição desta versão não está planejada, talvez seja feita posteriormente, após as devidas melhorias.
Teste 1. Execute o servidor AMS no T-Internet-POE
Lançar o AMS em um novo controlador com um novo chip e uma nova interface de rede não é uma tarefa trivial, mas, mesmo assim, com a abordagem correta e a compreensão do que você está fazendo, tudo se torna possível.
Jamb número 1
No processo deste trabalho, os "cardumes" do controlador T-Internet-POE começaram a surgir, e a primeira coisa que foi revelada foi que o controlador recusava-se a piscar quando um cartão de memória microSD era inserido. Nada ajuda - nem substituindo a porta USB, nem ligando de uma unidade separada, nem pressionando botões, nem substituindo o cartão - o controlador teimosamente se recusa a piscar com um cartão de memória inserido.
É difícil dizer uma falha de uma instância específica ou um defeito genérico de todos os controladores T-Internet-POE (tendo uma instância à nossa disposição), só podemos afirmar que o problema é 100% repetível e reproduzível.
O que isso significa para nós? Em termos práticos, isso significa que o controlador T-Internet-POE na verdade não possui um leitor de cartão - um leitor de cartão que bloqueia o firmware do controlador não é um leitor de cartão, mas um bug.
O que fazer? Resta usar o SPIFFS de 1,5 MB disponível no módulo ESP32. Sim, não é muito, mas, em princípio, 1,5 MB de memória para um dispositivo IoT é mais ou menos aceitável na maioria dos casos.
Jamb número 2
Ok, abandonamos o leitor de cartão, agora precisamos fazer amizade com SPIFFS. Parece que a tarefa é simples e até familiar, mas aqui estamos em uma emboscada: por algum motivo, o utilitário ESP32FS se recusa a funcionar normalmente neste controlador (nesta configuração). Mover arquivos para a memória do módulo ESP32 resulta em um erro subsequente ao montar o disco SPIFFS.
Hmmm ... Se for impossível transferir arquivos (servidores) para um disco SPIFFS normalmente, só há uma maneira - inicialização da interface por meio de uma conexão serial e, em seguida, transferir arquivos para um disco SPIFFS por meio da interface da web. O método, é claro, não é muito conveniente, mas não afeta o resultado final de forma alguma - os arquivos do servidor foram transferidos com sucesso para o disco SPIFFS.
Omiti a descrição do processo de adaptação do código para o novo controlador, pois isso exigiria a compilação de uma antologia como uma coleção completa de obras de VILenin e imediatamente procuro demonstrar o fato da operação bem-sucedida do servidor AMS no T -Internet-POE (e, portanto, a operabilidade do T -Internet-POE).
Carregando a página via interface Wi-Fi.
Carregando a página via interface Ethernet.
O ganho de velocidade é cerca de 4 vezes, naturalmente, a favor da Ethernet. Aqui você também precisa ter em mente que estamos falando de código não otimizado e depois de realizar o trabalho adequado, os resultados devem melhorar significativamente.
Operação do servidor via interface Ethernet no LILYGO TTGO T-Internet-POE ESP32 LAN8270A.
Teste 2. Trabalhando em duas interfaces
É aqui que eu tenho que fazer um pouco de trabalho destruidor de mitos. Existem rumores persistentes na Internet de que a operação simultânea de Wi-Fi e Ethernet em um pacote de ESP32 e LAN8270A é impossível. Este não é o caso - o servidor AMS funciona muito bem em duas interfaces ao mesmo tempo e atende perfeitamente às solicitações por Wi-Fi e Ethernet. Não há problemas com o ESP32 congela ou reinicializa.
Este já é um resultado interessante, que abre perspectivas tentadoras: como temos o nosso próprio servidor, podemos gerir o serviço das interfaces de qualquer forma, por exemplo, via Wi-Fi para servir alguns sites com um conteúdo, e via Ethernet - outros sites com outro conteúdo. Falando figurativamente, para dar um site de receitas culinárias para uma avó via Ethernet, e um site com artigos selecionados do TSB para um neto via wi-fi.
Teste 3. Ban em uma das interfaces
Agora vamos tentar colocar em prática a ideia de servir diferentes interfaces pelo servidor web. Como exemplo, vamos tentar implementar uma negação de serviço para conexões em uma das interfaces (Ethernet).
Um cliente conectado ao nosso controlador por meio de uma interface Ethernet recebeu uma negação de serviço.
Redundância de interface
A própria ideia de reserva de interface está na superfície e exige implementação. Existem muitos cenários semelhantes, por exemplo, você tem um controlador IoT conectado a uma rede local via Ethernet. No caso de uma emergência, se o link com fio for perdido, o controlador se conecta automaticamente ao roteador sem fio de backup e continua seu trabalho.
Roteamento de rede
Com duas interfaces de rede funcionais à sua disposição, você pode rotear pacotes na rede como desejar. Ninguém se preocupa em adicionar roteamento de dados via nRF24 ou LoRa ou via qualquer outra rede sem fio ao esquema de roteamento Wi-Fi e Ethernet. Assim, você pode fazer qualquer roteador para o seu sistema IoT.
Bem, e conforme observado acima, existem muitos casos de uso mais interessantes para um controlador com duas interfaces de rede.
Resultados
Agora vamos resumir esta pequena pesquisa: em geral, apesar de algumas ombreiras e doenças infantis, gostei do controlador LILYGO TTGO T-Internet-POE ESP32 LAN8270A - é uma excelente ferramenta para construir sistemas IoT, especialmente se você tiver as qualificações adequadas e não sem imaginação e uma abordagem criativa para o seu trabalho.
Prós e contras do LILYGO TTGO T-Internet-POE ESP32 LAN8270A.
Prós:
- Funciona!
- Solução integrada completa de Wi-Fi + Ethernet + POE + GPIO
- Bom trabalho sem congelamentos e reinicializações (nenhum problema foi identificado durante o teste)
- Possibilidade de trabalho simultâneo em duas interfaces
Desvantagens:
- Total falta de documentação, exemplos e explicações
- Limite de entrada relativamente alto
- Doenças infantis e cardumes menores em implementação