Está en la página 1de 12

Práctica 7:

Servidor Ethernet con Arduino


Prof. Victor Manuel Fuentes Olivares

victor_fuenteso@my.unitec.edu.mx

Nombre del estudiante:

1. __Miguel Valdez Vázquez__

Contenido

• Introducción

• Objetivos

• Actividades

• Evaluaciones

• Conclusiones
Introducción

¿QUÉ ES EL W5100?
El W5100 es un controlador de Ethernet fabricado por Wiznet especialmente diseñado para
aplicaciones embebidas. Podemos emplear este controlador con un procesador como Arduino para
implementar comunicación por internet.

El W5100 está diseñado para facilitar la implementación de conectividad a internet sin necesidad de
un SO, lo que lo hace interesante para MCU y aplicaciones de IoT.

Incluye una pila de TCP/IP por hardware y buffer interno de 16Kbytes para Tx/Rx. Esto permite liberar
de estas tareas al procesador, siendo una de sus principales ventajas frente a otros controladores
de Ethernet como el ENC28J60.

El W5100 puede conectarse mediante SPI, por lo que es muy sencilla la conexión con la mayoría de
procesadores. Algunos módulos incorporan un lector de tarjeta SD, donde podemos guardar ficheros
(html, txt, jpg, png) con los que trabajar cuando actuemos como servidor.

Admite velocidades de 10/100 Mbits/s, soportando modos Full-Duplex y Half-Duplex con detección
y corrección automática de la polaridad. Cumple con las especificaciones IEEE 802.3 10BASE-T y
802.3u 100BASE-TX. La pila TCP/IP soporta conexiones TCP, UDP, IPv4, ICMP, ARP, IGMP and
PPPoE, y hasta 4 conexiones simultáneas.

El W5100 es un chip ampliamente empleado en dispositivos conectados en aplicaciones industriales,


domésticas de domótica e IoT. Por ejemplo, entre otros muchos, pantallas y televisores inteligentes,
relés activados por internet, impresoras, cámaras IP o dispositivos de almacenamiento en red.

Nosotros podemos emplear un módulo de Ethernet con W5100 en nuestros proyectos para enviar o
recibir información desde internet o una red Interna, por ejemplo, para realizar la lectura de un sensor,
o para activar, controlar o desactivar cualquier dispositivo.

No obstante hay que tener en cuenta que Arduino, debido a sus reducidas capacidades de memoria
y procesador, no es la mejor máquina para realizar operaciones complejas como servir páginas web.
Para ello es mejor plantear el uso de procesadores más potentes como el STM32 o el ESP8266 o
incluso un micro ordenador tipo Orange Pi, Raspberry Pi.

Para controlar los módulos de Ethernet con W5100 usaremos la librería Ethernet.h, que está
integrada en el propio IDE de Arduino.

CLIENTE ETHERNET – LEER PÁGINAS WEB

Arduino actúa como cliente, es decir, se conecta a una página web para leerla. Leer una página
completa y volcarla por el puerto serie es muy lento, y es una de las muestras de las limitaciones de
Arduino frente a un ordenador.
SERVIDOR ETHERNET – VISUALIZAR ENTRADAS

Arduino actúa como servidor, es decir, devuelve una página web cuando un cliente (un PC, un móvil,
otro Arduino…) se conecta a él.

SERVIDOR ETHERNET – CONTROLAR SALIDAS

Arduino actúa también como servidor, pero esta vez queremos que el usuario pueda realizar
acciones sobre Arduino a través de la página web que servimos.

Objetivos

• Utilizar dispositivos los puertos de entrada y salida de Arduino como interfaz


de datos para controlar dispositivos finales periféricos.

• Crear un código que incluya la información de configuración WEB para iniciar


comunicación por internet.

• Armar y probar los circuitos demostrativos de ON y OFF.

Lista de Materiales
• Interfaz IDE Arduino 1.8 o compatible
• Arduino UNO R3 con cable USB
• Tarjeta Ethernet Shield para Arduino R1
• Cable Ethernet RJ45 configuración UNO-UNO
• Modem Router
• Protoboard
• 5 LED de cualquier color
• Cables jumper
1.- Armar el circuito
2.- Abrir IDE Arduino y crear un sketch para Servidor Ethernet

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


IPAddress ip(192, 168, 50, 153); // La IP debe ser similar a la que tiene
su computador o móvil, solo cambia el cuarto octeto.
EthernetServer server(80);

const int pinLed1 = 2;


const int pinLed2 = 3;
const int pinLed3 = 4;
const int pinLed4 = 5;

void setup()
{
Serial.begin(9600);

Ethernet.begin(mac, ip);
server.begin();

Serial.print("server is at ");
Serial.println(Ethernet.localIP());

pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
pinMode(pinLed4, OUTPUT);
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, LOW);
digitalWrite(pinLed3, LOW);
digitalWrite(pinLed4, LOW);
}

void loop()
{
EthernetClient client = server.available();
if (client)
{
Serial.println("new client");
bool currentLineIsBlank = true;
String cadena = "";
while (client.connected())
{
if (client.available())
{
char c = client.read();
Serial.write(c);

if (cadena.length()<50)
{
cadena.concat(c);

// Buscar campo data


int posicion = cadena.indexOf("data");
String command = cadena.substring(posicion);

if (command == "data1=0")
{
digitalWrite(pinLed1, HIGH);
}
else if (command == "data1=1")
{
digitalWrite(pinLed1, LOW);
}

else if (command == "data2=0")


{
digitalWrite(pinLed2, HIGH);
}
else if (command == "data2=1")
{
digitalWrite(pinLed2, LOW);
}

else if (command == "data3=0")


{
digitalWrite(pinLed3, HIGH);
}
else if (command == "data3=1")
{
digitalWrite(pinLed3, LOW);
}

else if (command == "data4=0")


{
digitalWrite(pinLed4, HIGH);
}
else if (command == "data4=1")
{
digitalWrite(pinLed4, LOW);
}
}

// Al recibir linea en blanco, servir página a cliente


if (c == '\n' && currentLineIsBlank)
{
client.println(F("HTTP/1.1 200 OK\nContent-Type: text/html"));
client.println();

client.println("<html>");
client.println("<head>");
client.println("</head>");
client.println("<body style='background-color: #40E0D0;'>");
client.println(F("<head>\n<title>Miguel Valdez V&#225;zquez</title
>\n</head>\n<body>"));
client.println(F("<div style='text-align:center; max-width= min-
content; width=85%;'>"));
client.println(F("<br/>"));
client.println(F("<h1>-----U N I T E C-----</h1>"));
client.println(F("<br/>"));
client.println(F("<h2>SISTEMAS EMBEBIDOS>"));
client.println(F("<h2>-----D O M O T I C A-----</h2>"));
client.println(F("<h2>Practica 6: Servidor Ethernet</h2>"));
client.println(F("<br/>"));
client.println(F("<h3>Miguel Valdez V&#225;zquez</h3>"));
client.println(F("<br/>"));
client.println(F("<h3>Controlar dispositivos</h3>"));

client.print(F("Estado LED 1 = "));


client.println(digitalRead(pinLed1) == LOW ? "OFF" : "ON");
client.println(F("<br/><br/>"));
client.println(F("<button onClick=location.href='./?data1=0' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>ON</button>"));
client.println(F("<button onClick=location.href='./?data1=1' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>OFF</button>"));
client.println(F("<br/><br/>"));

client.print(F("Estado LED 2 = "));


client.println(digitalRead(pinLed2) == LOW ? "OFF" : "ON");
client.println(F("<br/><br/>"));
client.println(F("<button onClick=location.href='./?data2=0' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>ON</button>"));
client.println(F("<button onClick=location.href='./?data2=1' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>OFF</button>"));
client.println(F("<br/><br/>"));

client.print(F("Estado LED 3 = "));


client.println(digitalRead(pinLed3) == LOW ? "OFF" : "ON");
client.println(F("<br/><br/>"));
client.println(F("<button onClick=location.href='./?data3=0' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>ON</button>"));
client.println(F("<button onClick=location.href='./?data3=1' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>OFF</button>"));
client.println(F("<br/><br/>"));

client.print(F("Estado LED 4 = "));


client.println(digitalRead(pinLed4) == LOW ? "OFF" : "ON");
client.println(F("<br/><br/>"));
client.println(F("<button onClick=location.href='./?data4=0' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>ON</button>"));
client.println(F("<button onClick=location.href='./?data4=1' style
='margin:auto;background-
color: #000000;color: snow;padding: 10px;border: 2px solid #3F7CFF;width:85p
x;'>OFF</button>"));
client.println(F("<br/><br/><br/>"));

client.println(F("<a href='http://192.168.50.153'>Refrescar</a>"))
;
client.println(F("</div>\n</body></html>"));
break;
}
if (c == '\n')
{
currentLineIsBlank = true;
}
else if (c != '\r')
{
currentLineIsBlank = false;
}
}
}

delay(1);
client.stop();
}
}

3.- Guardar el archivo


4.- Compilar

5.- Cargar el SKETCH a la tarjeta Arduino

6.- Conectarse vía explorador de internet a la dirección asignada en el código


7.- Probar que funcionen los botones virtuales y que se enciendan o apaguen los LED de
acuerdo con cada salida.
Preguntas de evaluación:

1.- ¿Cuál es la diferencia entre un Servidor Ethernet y un Cliente Ethernet?

En el modelo cliente y servidor existen grandes diferencias entre el papel que cada uno juega
en el sitio web. Para explicarlo de forma sencilla podemos decir que el "cliente" es un
ordenador común y corriente, con un software básico como el que tienen los ordenadores
residenciales y este establece conexión con el servidor.

El servidor entonces es el hardware o sitio web que ofrece sus servicios al cliente, el software
con el que opera es mucho más potente y rápido. Además, ejecutan acciones inteligentes
que se proporcionan con base en las elecciones del cliente.

2.- ¿Qué es el BUS SPI en arduino y cuál es su función?

El Bus SPI (del inglés Serial Peripheral Interface) es un estándar de comunicaciones, usado
principalmente para la transferencia de información entre circuitos integrados en equipos
electrónicos. El bus de interfaz de periféricos serie o bus SPI es un estándar para controlar
casi cualquier dispositivo electrónico digital que acepte un flujo de bits serie regulado por un
reloj (comunicación sincrónica).

El bus SPI incluye una línea de reloj, dato entrante, dato saliente y un pin de chip select, que
conecta o desconecta la operación del dispositivo con el que uno desea comunicarse. De
esta forma, este estándar permite multiplexar las líneas de reloj.

3.- En el código, ¿Qué significa y cuál es la función del puerto 80?

Este puerto es el que se usa para la navegación web de forma no segura HTTP, es decir, es
el medio por el cual un servidor HTTP “escucha” la petición hecha por un cliente, en este
caso, lee las interacciones realizadas en el portal web

4.- ¿Cuál es el máximo de salidas que puede controlar en Arduino como Servidor Ethernet?

8 ya que la placa Arduino se comunica con la tarjeta W5100 mediante el bus SPI. Utiliza los
pines digitales 10, 11, 12, y 13.

Conclusiones:

Se realizó con éxito la práctica, teniendo un poco de dificultad a la hora de conectar los
componentes ya que en el esquema presentado no conectaban GND a tierra en el protoboard,
después de pruebas y análisis deduje que eso era lo que faltaba, adicional se configuró un poco
el código html para modificar el diseño y hacerlo más atractivo a la vista.

Referencias
Arduino. (s.f.). Arduino Ethernet Shield V1. Obtenido de Arduino:
https://www.arduino.cc/en/Main/ArduinoEthernetShieldV1

También podría gustarte