En este artículo usamos una tarjeta conectada a Arduino para habilitar una puerta ethernet e implementar un pequeño servidor web.
La primera opción que tenemos es la Ethernet Shield oficial, pero si tenemos una limitación en el costo o en el espacio a ocupar, tenemos que buscar alternativas.
Una alternativa para implementar una conexión Ethernet es la tarjeta ENC28J60 que posee interfaz SPI y se aprecia en la figura.
Mas información tras el salto
Materiales
- Tarjeta Ethernet ENC28J60 (que puedes adquirir en nuestra tienda)
- Arduino Uno
- IDE Arduino instalado
- Notebook con Windows 7
- Acceso a Internet
- Cable de Red
- Cables con conectores macho hembra
Instalando Biblioteca
Debemos obtener la biblioteca para instalar y usar. los pasos son los siguientes
- Bajar la biblioteca a tu computador, se obtiene desde la siguiente dirección
- Se descomprime y se renombra la carpeta cómo «EtherCard»
- Mover esta carpeta «EtherCard» bajo la carpeta libraries, donde esta el ejecutable de Arduino.
- Si estaba abierta, reiniciar la aplicación de Arduino, para asegurarnos que se apliquen los cambios realizados.
Cuando abrimos el arduino IDE podemos ver la librería instalada y sus ejemplos, eso se muestra en la siguiente figura.
Conexión Física
La conexión física se basa en el uso de los pines para interfaz SPI. Se necesitan seis pines.
La siguiente tabla muestra los pines necesarios,
ENC Arduino
VCC 3.3v
GND GND
SCK Pin 13
SO Pin 12
SI Pin 11
CS Pin 8
La conexión física de los pines se ve en las siguientes figuras
Pruebas
Como prueba usamos la página «Back Soon»
// Present a "Will be back soon web page", as stand-in webserver. // 2011-01-30 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php #include <EtherCard.h> #define STATIC 0 // set to 1 to disable DHCP (adjust myip/gwip values below) #if STATIC // ethernet interface ip address static byte myip[] = { 192,168,1,200 }; // gateway ip address static byte gwip[] = { 192,168,1,1 }; #endif // ethernet mac address - must be unique on your network static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; byte Ethernet::buffer[500]; // tcp/ip send and receive buffer char page[] PROGMEM = "HTTP/1.0 503 Service Unavailable\r\n" "Content-Type: text/html\r\n" "Retry-After: 600\r\n" "\r\n" "<html>" "<head><title>" "Service Temporarily Unavailable" "</title></head>" "<body>" "<h3>This service is currently unavailable</h3>" "<p><em>" "The main server is currently off-line.<br />" "Please try again later." "</em></p>" "</body>" "</html>" ; void setup(){ Serial.begin(57600); Serial.println("\n[backSoon]"); if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println( "Failed to access Ethernet controller"); #if STATIC ether.staticSetup(myip, gwip); #else if (!ether.dhcpSetup()) Serial.println("DHCP failed"); #endif ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); } void loop(){ // wait for an incoming TCP packet, but ignore its contents if (ether.packetLoop(ether.packetReceive())) { memcpy_P(ether.tcpOffset(), page, sizeof page); ether.httpServerReply(sizeof page - 1); } }
El resultado de este sketch se aprecia tanto en la página web donde aparece el mensaje esperado, como via serial donde aparecen los parámetros de red. Esto se aprecia en la siguiente figura,
¡¡Muy buen tutorial!! estoy ansioso de que me llegue mi ENC28J60, además tengo una pregunta: ¿Es posible poner la «Subnet Mask» o máscara de red manualmente? Es que no tengo una máscara de red estilo «255.255.255.0»
Gracias.
Aunque no lo hemos intentado con una mascara distinta de la classful ( o basada en la clase) revisando la documentación nos encontramos con la variable mymask que puedes definir cuando no tienes DHCP habilitado (si tienes DHCP, no necesitas especificar la máscara, el se encarga de esta tarea)
Entonces, prueba con el siguiente encabezado
===========
#include
#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)
#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,1,126 };
// gateway ip address
static byte gwip[] = { 192,168,1,1 };
// define mask
static byte mymask[] = { 255,255,255,128 };
#endif
===================
el resto del codigo es identico
Saludos
Manuel Carrasco R.
Co-founder
http://www.iot.cl
Qué código puedo usar para leer las entradas analógicas del Arduino con la tarjeta enc28j60?
Danay
El modulo ENC28J60 es para conectar el Arduino a la red, para leer la puerta analogica 1 de Arduino simplemente haces
valor = analogRead(1);
Esn este ejemplo mostramos como leer una puerta analogica y transmitirla a un servidor remoto que tuitea de acuerdo a esa variable.
http://www.internetdelascosas.cl/2013/08/25/red-de-sensores-construye-un-sensor-de-sismos-con-arduino-un-modulo-ethernet-y-un-quakealarm/
Saludos
Hola, excelente tutorial, es posible realizar una llamada a una web desde el modulo eternet?
Francisco
En este articulo puedes ver como se usa el mismo modulo ethernet para hacer una llamada GET a una pagina web
http://www.internetdelascosas.cl/2013/08/25/red-de-sensores-construye-un-sensor-de-sismos-con-arduino-un-modulo-ethernet-y-un-quakealarm/
Saludos
Quisiera saber como lo haria la conecccion con arduino mega 2560
Isamar, El Arduino Mega 2560 tiene la interfaz SPI en otros pines, la interconexion entre el modulo ENC28j60 y Arduino deberian ser
Saludos
Hola, cuando compilo me da este error en el programa
variable ‘page’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
Hola Bastian, prueba cambiando la variable char page[] PROGMEM … (y todo lo que contiene) dentro se la seccion void setup() y cuentanos si compila.
Saludos
Buenas, tengo el mismo problema de Bastian, hice lo que le recomendaste y el programa no compila aun
Hola, mismo problema, no reconoce la variable «page» si la defino dentro de void setup(). Si la dejo afuera da error en la definición de la variable. Estoy intentando compilar con un arduino uno r3
Hola Lucas
Este codigo tiene mas de 7 años, ¿que version tienes del IDE de Arduino?
Saludos
JZ
me muestra los mensajes vía serial pero al poner la IP en el navegador no me funciona, dice que tarda mucho en responder ¿cuál es el problema?
saludos 🙂
Pablo, probablemente estas colocando una direccio IP incorrecta, cual usas?
Saludos
JZ
una pregunta estoy usando el arduino nano y la shield ethenet para este pero tengo una duda el arduino se conecta a un router al igual q el computador ?
y como haria si quisiera q el arduino me enviara un dato a una base datos o tener un web services escuchando lo q envia el arduino ???
Diego, revisa éste otro tutorial, en el enseñamos como registrar los datos en una base de datos MySQL
http://www.internetdelascosas.cl/2012/05/22/capturando-datos-en-mysql-usando-apache-php-arduino-ethernet-shield/
Saludos
JZ
Hola:
Antes que todo, gracias por el tutorial. Segundo, te pido ayuda porque estoy tratando de conectar un arduino pro mini con el módulo que usas en el tutorial, ENC28J60. Revisé el pinout del mini pro y es el mismo del uno. Estoy usando un cable cruzado y tengo una conexión de área local, usando una ip en mi pc en el mismo rango. Al usar la consola de Arduino, me aparece el mensaje backsoon, pero no logra recibir las otras variables (IP, GW, DNS).
¿Alguna idea de donde puede estar la falla? Al hacer ping desde el pc, tampoco tengo respuesta.
Gracias por tu tiempo.
Estimado Pablo.
Al usar un cable cruzado realizas una conexion punto a punto entre dos equipos, el IP se debe configurar en forma estatica dentro del script y no tienes un DNS (solo son dos equipos y no se necesita resolver nombres) ni tampoco un gateway (GW) ya que no hay ruteo de mensajes al solo existir dos equipos conectados. En resumen, es normal que no te de las variables IP, GW ni DNS porque estas son asignadas por el servicio DHCP que normalmente las entrega el router de la red donde estas trabajando, en tu caso al haber una conexion con cable cruzado no hay router, no hay servidor DHCP.
Saludos
JZ
Hola, como puedo agregarle al scketch que tome los datos de un DTH11 y los muestre por pagina web al igual que en el puerto serial
Reinaldo,
Al decir que sea igual que el puerto serial, te refieres a que se vean los valores en tiempo real sobre la pagina web?
Si es asi, basicamente deberias programar algo con Ajax o Javascript para que refresque una zona de la pantalla con los valores que entrega el Arduino, revisa las librerias de D3J https://d3js.org/
Saludos
JZ
mi arduino nano no tiene pin 13, donde puedo conectar el SCK, o hay que modificar la libreria?
Hola Nelson, el Arduino Nano (original) si tiene Pin 13, esta ubicado eso si, en el otro costado.
Si el tuyo es un clon que no tiene el pin 13, efectivamente deberias modificar la libreria.
Saludos
JZ
Buenas tardes, estoy intentando enviar datos que recibo por el puerto serie a través del modulo ethernet 28j60, pero no lo estoy logrando, me pueden ayudar?
Hola
La unica forma de poder ayudar remotamente es que subas tu codigo a un repositorio de codigo como GitHUb, de esta manera podemos descargar el codigo para probar y sugerirte modificaciones.
Saludos.
JZ