Tel.: +34 91 706 56 69
Poema Sinfónico, 27. Esc B. Planta 1 Pta 5
28054 (Madrid - SPAIN)
e-mail: gm2@gm2publicacionestecnicas.com ó consultas@convertronic.net
Desde hace varios años, la creación de extensas redes informáticas ha dejado de servir únicamente para conectar ordenadores. La caída de los precios y el aumento de la potencia informática de los pequeños microcontroladores inició el rápido proceso de conexión a las redes locales Ethenet o incluso a la red global de Internet, dispositivos de bajo consumo, que realizan principalmente funciones de control, control y medición.
Además, estas soluciones comenzaron a aparecer también en redes industriales profesionales, reemplazando gradualmente los sistemas más antiguos basados en RS232 y derivados. Así, a principios del siglo XXI, la era del llamado Internet de las Cosas (del inglés: Internet of Things – IoT). Aunque el mercado actual de IoT está dominado por dispositivos que se comunican principalmente a través de redes inalámbricas y estándares WiFi, ZigBee, BLE o Z-Wave, todavía en muchas soluciones de hardware (principalmente del llamado IIoT - Industrial Internet de las cosas), que requiere una transmisión confiable y seguridad de datos, una de las soluciones más populares sigue siendo la red Ethernet. Los creadores de la plataforma Arduino no dejaron sin respuesta la demanda de los diseñadores de dispositivos IIoT y ampliaron la oferta estándar de módulos Arduino con superposiciones tipo Ethernet Shield 2, dirigidos a usuarios individuales, o Arduino MKR ETH SHIELD para soluciones profesionales, basado en controladores WIZnet W5100/W5200/W5500 e integrando circuitos MAC y PHY en un circuito integrado. Esta oferta fue rápidamente ampliada por productores independientes con módulos nuevos y mucho más económicos basados en sistemas populares ENC28J60. Este artículo describe brevemente ambas soluciones: la oficial, basada en la serie W5x00, y las soluciones basadas principalmente en Open Source/Open Hardware en módulos ENC28J60.
Comunicación con el uso de módulos WIZnet W5x00 y la biblioteca Arduino Ethernet
La indudable ventaja de los módulos oficiales basados en circuitos de la serie W5x00 (incluidos sus equivalentes de hardware, por ejemplo, superposiciones OKYSTAR OKY2102 o DFROBOT DFR0125) es proporcionar soporte de software completo en forma de una biblioteca Ethernet incorporada en la pila Arduino. Por lo tanto, el usuario puede comenzar a crear el programa justo después de ejecutar el Arduino IDE, sin la necesidad de instalar paquetes de software adicionales.
Figura 1. MódulosOKY2102 (izquierda) y DFR0125 (derecha), equipados con controlador WIZnet W5100
Dependiendo de la variante del sistema WIZnet y la cantidad de RAM disponible, la biblioteca Ethernet admite un máximo de cuatro (para el chip W5100 y RAM <= 2 kB) u ocho (sistemas W5200 y W5500) conexiones entrantes / salientes paralelas. La interfaz de software de la biblioteca se ha dividido en cinco clases, agrupando funcionalidades individuales. La clase Ethernet es responsable de la inicialización de la biblioteca y la configuración de la red (incluida la dirección IP, la dirección de subred o la configuración de la puerta de enlace de acceso). Se ha creado una clase IPAddress para el direccionamiento IP. Para ejecutar una aplicación de servidor simple en el lado de Arduino, será necesario usar la clase EthernetServer, que permite escribir y leer datos de todos los dispositivos conectados. Una clase complementaria es la clase EthernetClient, que permite, en unas pocas llamadas simples, preparar un cliente de red funcional que realiza operaciones de escritura y lectura de datos desde el servidor. Para la comunicación UDP, la biblioteca Ethernet proporciona la clase EthernetUDP. Una descripción completa de las clases con métodos está disponible en:
De una manera característica de la plataforma Arduino, todas las operaciones complejas del programa se han implementado directamente en la biblioteca suministrada: el programador tiene un conjunto limitado pero muy funcional de API a su disposición, gracias a lo cual el proceso de desarrollo de la aplicación es rápido y no requiere un conocimiento detallado de las pilas de redes. Por lo tanto, analicemos la construcción de la aplicación de servidor más simple, entregada con la biblioteca Ethernet, cuya tarea es escuchar las conexiones entrantes del cliente del protocolo Telnet.
El código de la aplicación del servidor comienza a agregar los archivos de encabezado necesarios para establecer la comunicación SPI (los módulos WIZnet intercambian datos con el microcontrolador usando este protocolo) y los archivos de encabezado de la biblioteca Ethernet:
#include <SPI.h>
#include <Ethernet.h>
El siguiente paso es configurar los parámetros de red (dirección MAC del controlador, dirección IP de la puerta de enlace de acceso y máscara de subred) y crear un servidor de escucha en el puerto número 23 (el puerto predeterminado para el protocolo Telnet):
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);
EthernetServer server(23);
En el cuerpo de la función setup(), es necesario inicializar la biblioteca Ethernet e iniciar el proceso de escucha. Adicionalmente, también se colocó la configuración del puerto serie, en el cual se mostrarán los mensajes sobre la dirección del servidor, la conexión del nuevo cliente y los datos recibidos durante la sesión establecida:
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Chat server address:");
Serial.println(Ethernet.localIP());
}
El bucle principal del programa loop() espera una conexión del cliente y comprueba los datos legibles. Al recibir datos, los envía de vuelta al cliente sin cambios, realizando así una función de eco simple:
void loop() {
EthernetClient client = server.available();
if (client) {
if (!alreadyConnected) {
client.flush();
Serial.println("We have a new client");
client.println("Hello, client!");
alreadyConnected = true;
}
if (client.available() > 0) {
char thisChar = client.read();
server.write(thisChar);
Serial.write(thisChar);
}
}
}
El funcionamiento correcto de la aplicación anterior se puede probar usando cualquier cliente de protocolo Telnet (por ejemplo, Putty en Windows o comando telnet en Linux) o con el uso de otro conjunto Arduino y clase EthernetClient.
Comunicación con el uso de módulos ENC28J60 y bibliotecas externas
Una solución alternativa para los conjuntos de circuitos WIZnet W5x00 oficialmente admitidos son módulos basados en controladores ENC28J60 (p.ej. OKYSTAR OKY3486 lub ETH CLICK). Debido al precio más bajo y más fácil de instalar a mano (a diferencia de los sistemas W5x00 contenidos en carcasas de 80-pines LQFP, el controlador ENC28J60 está disponible en carcasas SSOP, SOIC, QFN de 28-pines y un carcasa de orificio SPDIP), este circuito es muy popular entre la electrónica de aficionados.
Figura 2. Módulos OKY3486 (izquierda) y ETH CLICK (derecha) equipados con controlador ENC28J60
A pesar de la falta de soporte oficial de Arduino, muchas bibliotecas de código abierto se han puesto a disposición de los programadores, lo que garantiza una rápida integración de los chips ENC28J60 con el software. Se debe prestar especial atención a la biblioteca UIPEthernet y disponible bajo la licencia GPLv2, la biblioteca EtherCard. La ventaja indudable del primero de estos proyectos es la compatibilidad de la interfaz API con la biblioteca Ethernet oficial de Arduino, lo que permite que el proceso de desarrollo de la aplicación sea independiente de las elecciones realizadas entre los sistemas W5x00 y el sistema ENC28J60 en la capa de hardware. El segundo proyecto - EtherCard - implementa una interfaz de programación independiente que, dependiendo de las preferencias del programador, puede resultar una alternativa interesante.
Como en el caso de la biblioteca Arduino Ethernet, la implementación de una funcionalidad bastante compleja (por ejemplo, implementación del cliente DHCP) se puede realizar en varias líneas de código:
#include <EtherCard.h>
static byte mymac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte Ethernet::buffer[700];
void setup () {
Serial.begin(57600);
Serial.println(F("\n[testDHCP]"));
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println(F("Failed to access Ethernet controller"));
Serial.println(F("Setting up DHCP"));
if (!ether.dhcpSetup())
Serial.println(F("DHCP failed"));
ether.printIp("My IP: ", ether.myip);
ether.printIp("Netmask: ", ether.netmask);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {
ether.packetLoop(ether.packetReceive());
}
Contenido elaborado por Transfer Multisort Elektronik Sp. z o.o.
Suscripción papel: 180,00.- € (IVA inc.)
Suscripción PDF: 60,00.- € (IVA inc)
Suscríbete a nuestro boletín de noticias