A través de las dificultades a las estrellas o LILYGO TTGO T-Internet-POE ESP32 LAN8270A

imagen

Vi la placa LILYGO TTGO T-Internet-POE ESP32 LAN8270A y por supuesto no pude dejar pasar una novedad tan interesante: ESP32, LAN8270A, POE, tarjeta SD, Wi-Fi + Ethernet ... Fue interesante sentir este trabajo de un lúgubre genio chino con mis propias manos y probarlo en trabajo real, porque las placas TTX prometían perspectivas muy interesantes para su uso en IoT, bricolaje y en general en el campo de "Wi-Fi + Ethernet y lo que puedas imaginar . "



Pero, como siempre, el camino desde los folletos publicitarios en los sitios web de vendedores y fabricantes hasta el lanzamiento del tablero y la realización de pruebas resultó ser muy difícil y espinoso. A continuación, les traigo un informe sobre mi fascinante investigación sobre este tema.



Piedra en el jardín LILYGO



Según mis observaciones (muchos) fabricantes de "hardware" padecen una enfermedad genérica: una falta total de competencia en marketing y, en general, una comprensión elemental de lo que sus productos están haciendo por las personas.



Un buen ejemplo es LILYGO TTGO T-Internet-POE ESP32 LAN8270A (en adelante llamaremos a esta placa T-Internet-POE por brevedad). El fabricante hizo una tabla interesante, pero ... no hizo nada más:



  • sin configuración de pines del controlador normal
  • sin diagrama de circuito
  • No hay una descripción sana del uso de la placa y patrones típicos de su uso.
  • no hay explicaciones técnicas para el funcionamiento de los componentes individuales de la placa
  • no hay ejemplos de código (hay 1 (!) boceto para "vete a la mierda, muchacho, no te molestes en trabajar")
  • no hay sitio web con documentación
  • no hay foro con moderadores competentes y motivados
  • no existen artículos populares y motivadores para quienes estén interesados ​​en este controlador, pero no saben (no entienden) dónde podría usarlo para sus propios fines
  • y todavía hay muchas cosas que deberían haber sido


En definitiva, no hay nada de nada y todo el que se atreva a comprar T-Internet-POE debe ser un impecable guerrero DIY, de lo contrario no tiene posibilidades de sobrevivir en esta batalla con LILYGO. ¿Hay muchos de nosotros así?



¿Y cómo, con este enfoque de negocios, logran vender algo? ¿Y cuánto aumentarían sus ventas si dejaran el soldador a un lado por un momento y se acordaran de sus clientes?



Las preguntas son retóricas, pero de una forma u otra, además tendré que hacer todo el trabajo para los departamentos técnico y de marketing de LILYGO.



¿Cuál es el truco?



En términos simples, en esta placa logramos combinar con más o menos éxito ESP32 (Wi-Fi), Ethernet, POE en un solo dispositivo, y agregar una cereza a este pastel en forma de lector de tarjetas microSD. A partir de una sola combinación de estos componentes, se presentan inmediatamente muchas opciones interesantes para usar esta placa:



  • trabajar a través de Wi-Fi con una copia de seguridad en forma de un canal Ethernet
  • trabajar a través de Ethernet con una copia de seguridad en forma de conexión Wi-Fi
  • servicio de enlaces Wi-Fi y Ethernet
  • enrutador entre Wi-Fi y Ethernet en ambas direcciones
  • servidor web para dos interfaces
  • diferentes servidores web en diferentes interfaces
  • fuente de alimentación del controlador (remoto) a través de POE


Y muchas otras opciones interesantes (por cierto, no olvides que además del componente de red en sí, la placa tiene salidas GPIO y se puede utilizar para su propósito previsto, es decir, como controlador IoT).



Como puede ver, el ámbito de aplicación de esta placa en IoT y bricolaje está limitado solo por su imaginación y sus necesidades, y en general, T-Internet-POE parece muy prometedor como dispositivo.



A continuación, intentemos descubrir cómo hacer frente a todo este esplendor, que, dada la casi total falta de información en el tablero, no es una tarea tan fácil.



Especificaciones



No proporcionaremos aquí una lista completa de todas las características técnicas de la placa, eso es con qué, y no hay problemas con eso en los sitios web de vendedores y fabricantes (el problema es que no hay nada más además de estas características). Aquí hay solo una lista de elementos del teclado:



  • ESP32-WROOM (4 MB)
  • LAN8720A (Ethernet PHY)
  • POE 802.3af
  • lector de tarjetas microSD
  • 12 pines GPIO para conexiones externas


¿Qué nos dice esta configuración a primera vista? Que al usar esta placa como servidor web, los archivos se pueden almacenar tanto en una tarjeta de memoria microSD como en la memoria interna del módulo ESP32 (o ambos allí y allí a la vez).



Al mismo tiempo, 12 GPIO gratuitos producen una impresión ambigua: por un lado, esto ya es "algo" y mucho mejor que en el ESP8266, y por otro lado, después de los proyectos en el Mega 2560 con sus docenas de GPIO, 12 pines se ven muy, muy modestos y limitan severamente las posibilidades de desarrollo; aquí necesitará inventar algún tipo de extensores de puerto o hacer ensamblajes en tándem con otros controladores.



Opciones de controlador



Tras una inspección más cercana, resulta que bajo el mismo nombre hay dos controladores diferentes, uno en el ESP32-WROOM y el segundo en el ESP32-WROVER-B, que no se puede ver de inmediato: las placas se ven casi iguales y puedes jugar el juego "encuentra 10 diferencias" ...



imagen



Obtuve el controlador en el ESP32-WROOM, por lo que la narración adicional se referirá a él.



Programador



Los ingenieros de LILYGO están tan lejos de sus usuarios que sus decisiones no siempre son fáciles de entender. Estas soluciones incluyen la creación de una placa de programación separada en el chip CP2104 para el controlador T-Internet-POE.



¿Para qué? ¿Por qué necesita un programador separado cuando este nodo podría integrarse en la placa del controlador o simplemente usar adaptadores USB-TTL estándar (como hacen todos los demás fabricantes de hardware)? La respuesta, aparentemente, solo la conocen los desarrolladores de LILYGO (pero perdonémosles esta pequeña creatividad).



imagen



Pero los desarrolladores de LILYGO no solo hicieron algo incomprensible, también lograron hacerlo torcido:



  • en primer lugar, utilizaron pines amados por la gente con un paso de 2,0 mm
  • en segundo lugar, previeron la instalación del conector en el lado inverso (!) de la placa


(Para los desarrolladores de una solución de este tipo, recomendaría a veces distraerse del trabajo y tomarse un tiempo para descansar).



El resultado es una especie de monstruo extraño. Y todo estaría bien si el problema se limitara solo al componente estético, pero aquí surgen problemas más serios:



  • si la placa está instalada y sujeta en su posición normal, entonces los pines del programador están en la parte inferior de la placa y es imposible conectarlos sin desmontar el controlador;
  • si trabaja con una placa sin sujetar, entonces los conectores con un paso de 2.0 no proporcionan la rigidez adecuada y toda la estructura amenaza con desmoronarse en cualquier momento y cerrar todo a su alrededor.


Como nivelación para esta jamba de desarrolladores, podemos recomendar soldar una línea de pines en la parte superior de la placa y hacer (o comprar, si se vende) un adaptador flexible de 6 pines de 2,0 mm.



Pinout



Para empezar, daremos la versión original del pinout (cultivado tanto como sea posible). Para aquellos "que están al tanto" hay suficiente información, el resto entenderá poco de esta "alfabetización china".



imagen



Tratemos de traducir esto al ruso y, en general, averigüemos qué sucede allí con el pinout de elementos y la asignación de recursos del controlador.



En total, ESP32 tiene 40 pines (D0 - D39), de los cuales 14 pines



D6 - D11, D20, D24, D28-D31, D37, D38



excluimos de la consideración como prácticamente sin usar (por varias razones, un análisis detallado del propósito de estos pines está más allá del alcance de este artículo). Permanecer:



Pines de conexión Ethernet del 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



están instalados en la LAN y el chip D23 estándar, mientras que D20A estándar están instalados en la LAN y el chip LAN D23



Dado que el fabricante dudó en proporcionar un diagrama esquemático del controlador, solo puedo dar aquí un diagrama de conexión física de Ethernet típico similar en LAN8720A.



imagen



El LAN8720A también tiene un pin de reloj, que está conectado a D17 en la placa T-Internet-POE (también seleccionado en el boceto):



D17 - ETH_CLOCK



y restablecer el pin



D5 - NRST



lector de tarjetas microSD



El lector de tarjetas microSD se conecta a HSPI:



D2 - SD_MISO

D12 - SD_CS

D14 - SD_SCLK

D15 - SD_MOSI



y en caso de su uso "toma" los pines D2, D14, D15 libres para conexiones externas y llevados a la placa. La pregunta "cuál es más rentable: usar un lector de tarjetas y perder 3 de los 12 pines libres, o mantener 3 GPIO adicionales y abandonar el lector de tarjetas" es similar a la pregunta "qué es mejor: ¿un elefante o un caballo?" y tienes que contestarla cada vez que uses la tarjeta T-Internet-POE.



Otros pines



Todavía tenemos los pines D0 (ETH_CLOCK, no usados ​​en esta capacidad) y D1 (TX0) y D3 (RX0).



Pines gratis



Ahora pasemos a la parte más interesante: la descripción de los pines libres traídos a la placa del controlador.



El primero es el grupo D34, D35, D36, D39, que funciona solo en la entrada. Mejor, por supuesto, para la entrada que nada en absoluto, pero con tal déficit de GPIO, sería mucho mejor si estos cuatro pines fueran GPIO completos.



Y luego 8 GPIO completos que puede usar en sus proyectos. Aquí debe recordar que, aunque estos pines son GPIO completos, algunos de ellos funcionan de una manera muy peculiar (por ejemplo, cambian el potencial al inicio del controlador, etc.). Por lo tanto, antes de conectarles algo, debe averiguar y aclarar específicamente estos puntos.



D2 (SD_MISO)

D4

D12

D14 (SD_SCLK)

D15 (SD_MOSI)

D16

D32

D33



Como dicen, por ti, mi joven amigo de la programación y los microcontroladores, 8 GPIOs y no te niegues nada.



POE



Aquí tenemos que decir unas palabras más sobre el soporte de POE, ya que esta es una de las ventajas de esta placa y uno de sus "chips" y para muchos será la razón por la que querrán comprarla y usarla.



Implementa soporte completo para el estándar POE 802.3af con aislamiento y administración de energía en el chip SI3404.



No estoy muy interesado en la alimentación remota del controlador, por lo que no he probado este aspecto del rendimiento de T-Internet-POE, pero, aparentemente, no hay problemas con POE.



Soporte de software



Como usted mismo comprende, puede trabajar con T-Internet-POE utilizando cualquier entorno de software que conozca este hardware, incluido el SDK nativo (y esta es probablemente la opción más correcta), pero intentaremos averiguar qué se puede exprimir. de estas piezas de hierro usando el IDE de Arduino.



Como entorno de software para experimentos, utilizamos Arduino IDE versión 1.8.5 y ESP32-Arduino versión 1.0.5 (la última versión en el momento de escribir este artículo).



No describiré el proceso mismo de instalación del soporte ESP32 en el IDE de Arduino, porque una gran cantidad de materiales en Internet están dedicados a este tema, describiendo este proceso en todos los matices.



Solo mencionaré un punto aquí: más todo lo que este controlador no tiene, aún no tiene soporte nativo en la versión 1.0.5 de ESP32-Arduino. Por lo tanto, se seleccionó el "Módulo DEV ESP32" como controlador en el administrador de la placa con las siguientes configuraciones:



Modo de flash: DIO

Tamaño de flash: 4 MB (32 Mb)

Esquema de partición: 4 MB (1,2 MB / 1,5 MB)



Boceto estándar



A continuación se muestra un boceto que nos complació con el fabricante de la placa . No hay nada especial que comentar, solo inicializa la interfaz Ethernet y envía solicitudes al servidor en Internet.



Código de boceto completo del fabricante de la 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);
}

      
      







Cuando vi este boceto por primera vez, me pregunté: "¿Qué quería decir el fabricante con esto?" El único propósito de este boceto es mostrar que esta tecnología funciona en principio. Esto es ciertamente bueno, pero ¿qué sigue? ¿Qué hacer con todo esto sin tener documentación, ni ejemplos, ni una sana respuesta del fabricante?



La campaña resulta que la respuesta de LILYGO es aprender a programar y crear software por tu cuenta (o buscar firmware ya hecho, aunque esto no es un deporte).



Interfaces y ping



Para los profesionales de la red (y aquellos que se han unido a ellos), diré algunas palabras sobre la velocidad del trabajo a través de interfaces Wi-Fi y Ethernet y su capacidad de respuesta. Las pruebas se llevaron a cabo en una red gigabit descargada, el nivel de ruido de la gama Wi-Fi no se controló específicamente.



La primera captura de pantalla es un ping del controlador a través de la interfaz Wi-Fi. Mínimo 24 ms, máximo 105 ms, promedio 67 ms.



imagen



El segundo es hacer ping al controlador a través de la interfaz Ethernet. Mínimo 0 ms, máximo 9 ms, promedio 2 ms.



imagen



Como puede ver, el ping a través de Ethernet con cable es dramáticamente más bajo que a través de Wi-Fi (lo cual es de esperar). Si estos números son buenos o malos, dejo que los lectores juzguen por sí mismos, estoy bastante satisfecho con ellos para mis propósitos.



Pruebas



No es serio probar un sistema como T-Internet-POE en bocetos similares al sugerido por el fabricante, por lo que se utilizó una versión especializada de AMS, adaptada específicamente para esta placa, para probar el controlador. Teniendo en cuenta que se trata de un servidor que utiliza HTML, CSS, Javascript, Ajax, archivos gráficos y bibliotecas completos, el funcionamiento exitoso de dicho servidor en T-Internet-POE indicará un hardware correctamente diseñado y la posibilidad de su uso en proyectos reales.



Nota: las pruebas se realizaron en una versión interna no pública de AMS para T-Internet-POE. La publicación y distribución de esta versión no está prevista, quizás se haga más adelante, luego de las mejoras oportunas.



Prueba 1. Ejecute el servidor AMS en T-Internet-POE



Lanzar AMS en un nuevo controlador con un nuevo chip y una nueva interfaz de red no es una tarea trivial, pero, sin embargo, con el enfoque correcto y la comprensión de lo que está haciendo, todo se vuelve posible.



Jamba número 1



En el proceso de este trabajo, comenzaron a surgir los "bajíos" del controlador T-Internet-POE, y lo primero que se reveló fue que el controlador se negaba a parpadear cuando se insertaba una tarjeta de memoria microSD. Nada ayuda, ni reemplazar el puerto USB, ni alimentar desde una unidad separada, ni presionar botones, ni reemplazar la tarjeta; el controlador se niega obstinadamente a parpadear con una tarjeta de memoria insertada.



Es difícil decir un glitch de una instancia específica o un defecto genérico de todos los controladores T-Internet-POE (teniendo una instancia a nuestra disposición), solo podemos afirmar que el problema es 100% repetible y reproducible.



¿Qué significa esto para nosotros? En términos prácticos, esto significa que el controlador T-Internet-POE en realidad no tiene un lector de tarjetas; un lector de tarjetas que bloquea el firmware del controlador no es un lector de tarjetas, sino un error.



¿Qué hacer? Todo lo que queda es usar el SPIFFS de 1,5 MB disponible en el módulo ESP32. Sí, esto no es mucho, pero en principio, 1,5 MB de memoria para un dispositivo IoT es más o menos aceptable en la mayoría de los casos.



Jamba número 2



Ok, abandonamos el lector de tarjetas, ahora necesitamos hacernos amigos de SPIFFS. Parece que la tarea es simple e incluso familiar, pero aquí nos espera una emboscada: por alguna razón, la utilidad ESP32FS se niega a funcionar normalmente en este controlador (en esta configuración). Mover archivos a la memoria del módulo ESP32 da como resultado un error posterior al montar el disco SPIFFS.



Hmmm ... Si es imposible transferir archivos (servidores) a un disco SPIFFS normalmente, solo hay una forma: inicializar la interfaz a través de una conexión en serie y luego transferir archivos a un disco SPIFFS a través de la interfaz web. El método, por supuesto, no es muy conveniente, pero no afecta el resultado final de ninguna manera: los archivos del servidor se transfirieron con éxito al disco SPIFFS.



Omito la descripción del proceso de adaptación del código para el nuevo controlador, ya que esto requeriría compilar una antología como una colección completa de obras de VILenin e inmediatamente procedo a demostrar el hecho del funcionamiento exitoso del servidor AMS en la T -Internet-POE (y por tanto la operatividad del T -Internet-POE).



Cargando la página a través de la interfaz Wi-Fi.



imagen



Carga de la página a través de la interfaz Ethernet.



imagen



La ganancia de velocidad es aproximadamente 4 veces, naturalmente, a favor de Ethernet. Aquí también hay que tener en cuenta que estamos hablando de código no optimizado y después de realizar el trabajo adecuado, los resultados deberían mejorar significativamente.



imagen



Funcionamiento del servidor a través de la interfaz Ethernet en LILYGO TTGO T-Internet-POE ESP32 LAN8270A.



Prueba 2. Trabajando en dos interfaces



Aquí es donde tengo que hacer un poco de trabajo para romper mitos. Hay rumores persistentes en Internet de que el funcionamiento simultáneo de Wi-Fi y Ethernet en un paquete de ESP32 y LAN8270A es imposible. Este no es el caso: el servidor AMS funciona muy bien en dos interfaces al mismo tiempo y atiende perfectamente las solicitudes a través de Wi-Fi y Ethernet. No hay problemas con el ESP32 se congela o se reinicia.



imagen



Este ya es un resultado interesante, que abre perspectivas tentadoras: dado que tenemos nuestro propio servidor, podemos administrar el servicio de las interfaces de cualquier manera, por ejemplo, a través de Wi-Fi para servir algunos sitios con un contenido y a través de Ethernet - otros sitios con otro contenido. En sentido figurado, dar un sitio con recetas culinarias a una abuela a través de Ethernet y un sitio con artículos seleccionados de TSB a un nieto a través de Wi-Fi.



Prueba 3. Prohibir una de las interfaces



Ahora intentemos poner en práctica la idea de servir diferentes interfaces por parte del servidor web. Como ejemplo, intentemos implementar una denegación de servicio para conexiones a través de una de las interfaces (Ethernet).



imagen



Un cliente conectado a nuestro controlador a través de una interfaz Ethernet recibió una denegación de servicio.



Redundancia de interfaz



La idea misma de la reserva de interfaz está en la superficie y requiere implementación. Hay muchos escenarios similares, por ejemplo, tiene un controlador de IoT que está conectado a una red local a través de Ethernet. En caso de emergencia, si se pierde el enlace por cable, el controlador se conecta automáticamente al enrutador inalámbrico de respaldo y continúa su trabajo.



Enrutamiento de la red



Con dos interfaces de red que funcionan a su disposición, puede enrutar paquetes en la red como desee. Nadie se molesta en agregar enrutamiento de datos a través de nRF24 o LoRa o mediante cualquier otra red inalámbrica al esquema de enrutamiento de Wi-Fi y Ethernet. Por lo tanto, puede crear cualquier enrutador para su sistema IoT.



Bueno, y como se señaló anteriormente, hay muchos más casos de uso interesantes para un controlador con dos interfaces de red.



Resultados



Ahora resumamos esta pequeña investigación: en general, a pesar de algunas jambas y enfermedades infantiles, me gustó el controlador LILYGO TTGO T-Internet-POE ESP32 LAN8270A: es una excelente herramienta para construir sistemas de IoT, especialmente si tiene las calificaciones adecuadas y no las tiene. sin imaginación y un enfoque creativo para su trabajo.



Pros y contras de LILYGO TTGO T-Internet-POE ESP32 LAN8270A.



Pros:

  • ¡Funciona!
  • Solución completa integrada Wi-Fi + Ethernet + POE + GPIO
  • Buen trabajo sin congelaciones y reinicios (no se identificaron problemas durante las pruebas)
  • Posibilidad de trabajo simultáneo en dos interfaces


Desventajas:

  • Falta total de documentación, ejemplos y explicaciones.
  • Umbral de entrada relativamente alto
  • Enfermedades infantiles y cardúmenes menores en implementación



All Articles