Conexión Ethernet para Arduino con ENC28J60

En este artículo usamos una tarjeta conectada a Arduino para habilitar una puerta ethernet e implementar un pequeño servidor web.

Ethernetmodule1

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

Instalando Biblioteca

Debemos obtener la biblioteca para instalar y usar. los pasos son los siguientes

  1. Bajar la biblioteca a tu computador, se obtiene desde la siguiente dirección
  2. Se descomprime y se renombra la carpeta cómo «EtherCard»
  3. Mover esta carpeta «EtherCard» bajo la carpeta libraries, donde esta el ejecutable de Arduino.
  4. 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.

Ethercard

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

ENC28J60arduinouno_ENC28J60

 

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,

BackSoon

 

Bibliografía

ENC28J60 y Arduino Uno
Getting Arduino Online with ENC28J60

Author: Manuel Carrasco

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

26 thoughts

  1. ¡¡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.

  2. 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

    1. Qué código puedo usar para leer las entradas analógicas del Arduino con la tarjeta enc28j60?

    1. Isamar, El Arduino Mega 2560 tiene la interfaz SPI en otros pines, la interconexion entre el modulo ENC28j60 y Arduino deberian ser

      ENC28J60 	Arduino Mega 
      VCC 	        3.3v
      GND 	        GND
      SCK      	Pin 52 (SCK)
      SO 	        Pin 50 (MISO)
      SI 	        Pin 51 (MOSI)
      CS 	        Pin 48 (SS)
      

      Saludos

  3. 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))’

    1. 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

        1. 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

  4. 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 🙂

  5. 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 ???

  6. 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.

    1. 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

  7. 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

    1. 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

    1. 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

  8. 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?

    1. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *