Artículos recientes

Promociones especiales

Novedades

Tutorial Módulo Ethernet ENC28J60 y Arduino

Tutorial Módulo Ethernet ENC28J60 y Arduino

  

En este tutorial aprenderemos a usar el Módulo Ethernet ENC28J60, con un ejemplo sencillo en donde accederemos a nuestro Arduino desde internet, encenderemos un LED y visualizaremos la lectura de un potenciómetro desde un navegador web.

Módulo Ethernet ENC28J60

El Módulo Ethernet ENC28J60 es popular  por su bajo costo, si bien esta desarrollado por Microchip, existen librerías para hacerlo trabajar con Arduino, consume mucho más memoria que el Ethernet Shield, pero para aplicaciones básicas es muy útil. 

Existe gran información y ejemplos de este módulo en la red, así como diferentes librerías, para este tutorial utilizaremos una de las librerías más usadas, la librería Ethercard.

Para realizar el Tutorial necesitamos un Arduino Uno, un módulo ENC28J60, un potenciómetro, un Led, una resistencia, un protoboard, cables DuPont y un cable Ethernet para conectarnos a nuestro Modem, router o switch


Conexiones entre el Módulo Ethernet ENC28J60 y Arduino

 

Módulo ENC28J60

Arduino Uno

VCC

Pin 3.3V

GND

Pin GND

 SS (CS)

Pin 10

 MOSI (SI)

 Pin 11

 MISO (SO)

 Pin 12

 SCK

 Pin 13

 

 

  

Conexion ENC28J60 y Arduino 

   

Hay que resaltar que las conexiones son válidas para el Arduino Uno o placas basadas en el Atmega328 (Arduino mini pro, Arduino nano, etc) pues el Módulo ENC28J60 usa la comunicación SPI, por lo que si se trabaja con el Mega, se tiene que conectarse a sus pines SPI correspondientes.

Una vez hecho toda la conexión pasamos a programar el sketch para el Arduino

  

Programa para el Módulo Ethernet ENC28J60

  

Si es la Primera vez que estamos programando este módulo es necesario descargar e importar a nuestro IDE de Arduino la librería Ethercard.

Una vez importado la librería escribimos el siguiente sketch:

#include <EtherCard.h>

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x01,0x05};
static byte myip[] = {192,168,1,177};
byte Ethernet::buffer[700];

const int ledPin = 2;

char* EstadoLed="OFF";

void setup () {
 
  Serial.begin(9600);
  Serial.println("Test del Modulo  ENC28J60");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "No se ha podido acceder a la controlador Ethernet");
 else
   Serial.println("Controlador Ethernet inicializado");
 
  if (!ether.staticSetup(myip))
    Serial.println("No se pudo establecer la dirección IP");

  Serial.println();
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}

static word homePage() {
  
 BufferFiller bfill = ether.tcpOffset();
 bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5\r\n\r\n"
      "<html><head><title>Naylamp Mechatronics</title></head>"
      "<body>"
      "<div style='text-align:center;'>"
      "<h1>Test del Módulo  ENC28J60</h1>"      
      "Tiempo transcurrido : $L segundos"
      "<br /><br />Estado del LED: $S<br />"      
      "<a href=\"/?status=ON\"><input type=\"button\" value=\"ON\"></a>"
      "<a href=\"/?status=OFF\"><input type=\"button\" value=\"OFF\"></a>"
      "<br /><br />Potenciómetro: $D (resolución de 1024)"
      "<br /><br />"
      "<a href='http://www.naylampmechatronics.com/'>www.naylampmechatronics.com</a>"
      "</body></html>"      
      ),millis()/1000,EstadoLed,analogRead(0));
     
  return bfill.position();
}
  
void loop() {
 
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if(pos) {
    
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Comando ON recivido");
      digitalWrite(ledPin, HIGH);
      EstadoLed = "ON";
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Comando OFF recivido");
      digitalWrite(ledPin, LOW);
       EstadoLed= "OFF";
    }        
    ether.httpServerReply(homePage()); // se envia página Web
  }
}




Ahora expliquemos lo principal del código:

static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x01,0x05};
static byte myip[] = {192,168,1,177}; 

Aquí configuramos nuestra  Mac y la IP , podemos poner cualquier valor, evitando duplicar con algún otro equipo conectado a nuestra red.

En void setup () inicializamos el módulo Ethernet y reportamos por el puerto serial, aquí también configuramos el pin del led como salida.

En la función static word homePage() escribimos nuestra página web, la cual debe estar en formato HTML:

static word homePage() {
  
 BufferFiller bfill = ether.tcpOffset();
 bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5\r\n\r\n"
      "<html><head><title>Naylamp Mechatronics</title></head>"
      "<body>"
      "<div style='text-align:center;'>"
      "<h1>Test del Módulo  ENC28J60</h1>"      
      "Tiempo transcurrido : $L segundos"
      "<br /><br />Estado del LED: $S<br />"      
      "<a href=\"/?status=ON\"><input type=\"button\" value=\"ON\"></a>"
      "<a href=\"/?status=OFF\"><input type=\"button\" value=\"OFF\"></a>"
      "<br /><br />Potenciómetro: $D (resolución de 1024)"
      "<br /><br />"
      "<a href='http://www.naylampmechatronics.com/'>www.naylampmechatronics.com</a>"
      "</body></html>"      
      ),millis()/1000,EstadoLed,analogRead(0));
     
  return bfill.position();
}

     

Notar que para enviar datos de variables hay que usar los marcadores $L  $S  $D para después enviar los datos de tipo Long, cadena, y decimal respectivamente.

También estamos configurando para que el navegador vuelva a cargar la página cada 5 segundos esto se hace con “Refresh: 5”, es necesario cunado estamos mostrando datos que cambian constantemente. El tiempo de actualización dependerá del tipo de dato que se está mostrando. En algunas aplicaciones esto no es necesario o se opta por poner un botón para actualizar. Si no se desea simplemente quitar “Refresh: 5” en la función de la página web.

La siguiente comparación se hace para ver si se han enviado datos desde el navegador mediante el método GET
  

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Comando ON recivido");
      digitalWrite(ledPin, HIGH);
      EstadoLed = "ON";
    }

   

En este caso estamos comparando si se ha recibido un dato con el método GET de la siguiente forma ?status=ON , esto sucede si en el navegador se presiona el botón ON (ver el código HTML  del botón en la función anterior)

Una vez escrito el sketch lo cargamos a nuestro Arduino.
Solo faltaría conectar el módulo ENC28J60 con un cable Ethernet a aun modem, router, switch o a la PC.


Ahora desde un navegador web de nuestra laptop, celular o tablet, accedemos a nuestro Arduino escribiendo la IP (para nuestro ejemplo 192.168.1.177) en el navegador.

Servidor web con ENC28J60 y Arduino

  
Modificando el código HTML se pueden lograr diseños da paginas mas complejas, se pueden agregar imágenes, cambiar la fuente y tamaño del texto, agregar tablas, pero esto dependerá de la habilidad de programación en HTML que tengamos.

 

   

Pueden adquirir los materiales usados en este tutorial en nuestra tienda

         Módulo Ethernet ENC28J60

         Arduino Uno R3

         Cable Dupont, hembra a macho 20cm x 20Und

         Protoboard 170

Tutoriales Relacionados

        Tutorial Ethernet Shield y Arduino 

Tutorial ESP8266 Parte I

Tags: Ethernet

38 Comments

    • Avatar
      Luciano
      sep 7, 2016

      Hola, muy bueno el tutorial.Lo unico con lo que me volvi loco es que tuve que sacarle el encabezado html para que funcione en chrome e IE("HTTP/1.0 200 OKrn" "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5rnrn")Y aparte no estan casteadas las comillas en las lineas: "" ""En /?status=ON y /?status=OFF presenta errores que se solucionan al usar comillas simples.Por lo menos asi me funciono a mi.Te lo comento por si estoy haciendo algo mal por favor decimelo, y si te ayuda a corregir algún error en el código que no hayas visto genial!Saludos!

      • Avatar
        Naylamp
        sep 14, 2016

        Hola Luciano, efectivamente, las comillas podrían confundir al compilador, pues estas las interpreta como inicio y fin de una cadena. todas las comillas internas deben ir con\" , tenemos un error al digitar el codigo en nuestro blog que borra el \ , estaremos solucionandolo pronto. La comilla simple también funciona en este caso, y es el navegador quien se encarga de corregir esto, pero si es para mostrar comillas en un texto html se pueden remplazar por &quot; que en html se usa para texto con comillas.

      • Avatar
        Leonid
        sep 28, 2016

        Luciano! hola, disculpa veo que ya pudiste resolver los errores que manda al verificar, podrias pasarme tu codigo final? mi correo es ing.Leonid_Ramos@hotmail.com, de antemano muchas gracias, saludos

      • Avatar
        Nel
        oct 29, 2016

        Hola, Luciano! Estuve leyendo tu comentario sobre el error y la corrección que le diste, por favor podrías explicarlo un poco mejor, y si podrías enviarme alguna info te lo agradeceré. Mi correo es panf9188@gmail.com

      • Avatar
        josue fernando
        ene 29, 2017

        Hola al compilar el código me aparecen errores de comillas en la seccion de codigo HTML podrias ayudarme con esto o si lo tienes corregido. Te agradezco las atenciones, saludos.

    • Avatar
      Eder
      oct 19, 2016

      Hola!, no consigo hacerlo funcionar, me vuelvo loco con las comillas!, podrías pasarme el código final por correo? edertg27@gmail.com , gracias . Saludos

      • Avatar
        Leandro
        may 15, 2017

        Buenas tardes. Me pasa lo mismo y ya estoy loco con las " si dispones del código final y puedes pasarlo pues también lo agradecería. Hablamos.

    • Avatar
      jesus
      dic 6, 2016

      me gustaria saber como imprimo los valores de un sensor de esa forma.

      • Avatar
        Naylamp
        dic 14, 2016

        Hola Jesus, Para enviar, variables hazlo de la misma forma como enviamos el valor de la lectura analógica en el ejemplo

    • Avatar
      Pablo
      dic 27, 2016

      Hola! muy buen tutorial, me funciono bien, solo queria hacer una pregunta. Puedo accesar desde cualquier computadora al modulo ethernet, me refiero a que si puedo accesar desde otro LAN. digamos yo estar lejos de mi casa y por medio de internet accesar al modulo ethernet, o solo funciona para dispositivos de la misma LAN?

      • Avatar
        Naylamp
        feb 18, 2017

        Hola Pablo, para acceder remotamente a tu arduino, tienes que abrir un puerto de tu Router y asignar dicho puerto a la IP del Arduino. Posterior a esto para acceder remotamente en lugar de ingresar usando la IP de tu arduino ahora tienes que usar la IP publica de tu LAN, que generalmente es dinámica. El puerto por defecto para los navegadores es el 80, si configuraste otro tienes que digitarlo junto a la IP cuando accedas remotamente.

    • Avatar
      JUAN
      feb 14, 2017

      word len = ether.packetReceive(); word pos = ether.packetLoop(len); ESOS COMANDOS SON LOS DEL POTENCIOMETRTO?

      • Avatar
        Naylamp
        feb 18, 2017

        Hola Juan, esas líneas son la longitud y posición de la petición http del cliente, el valor del potenciómetro lo obtenemos en la función static word homePage() en el interior del texto html enviamos marcadores $L $S $D para después enviar variables de tipo Long, cadena, y decimal respectivamente.

    • Avatar
      Fernando Baltazar
      mar 24, 2017

      y como envio un dato como $volts=read.analog()+calculos... si obtengo en salida 4.3 ó 99 ó 255; algunas secuencias no me funcionan con ethernet.h ni con Ethercard, solo con Ether_28J60 pero aún no puedo enviar datos. las cadenas string en Ether_28J60 parece que las desconoce o quizás mi librería es algo obsoleta; por ejemplo bajé tu version Ethercard y no obtuve errores, pero una que bajé ayer que es igual me puso varios errores. Saludos

      • Avatar
        Naylamp
        mar 25, 2017

        Hola Fernando, En nuestro ejemplo solo enviamos datos enteros, para esto usamos $D y $L para enviar una variable tipo flotante como 4.3, tienes que usar $T, si $T no funciona agrega después de #include la línea: #define FLOATEMIT7

    • Avatar
      Fernando Baltazar
      mar 24, 2017

      Tengo e.print(pos1); o ethernet.print(pos1); estos si los veo en mi IP 192.168.1.100 y puedo prender y apagar el led y veo mis valores en pantalla pero, como obtengo un valor tipo $_post o $_get? :D Otra vez Saludos!

      • Avatar
        Naylamp
        mar 25, 2017

        Cuando se reciben datos por POST o GET estos se reciben en la petición http, y se guardan en la variable buffer, cuando presionamos los botones se envían valores con el método GET, por eso realizamos la búsqueda con if(strstr(...., "GET /?status=ON") != 0), la función strstr() devuelve la posición a partir de donde encuentra la cadena que se está buscando. Si lo que deseas es leer una variable, tendrías que leer el número a partir de la posición obtenida en strstr().

    • Avatar
      Ariel
      abr 28, 2017

      Hola Hice todo exactamente igual. y el monitor serial me dice
      Test del Modulo ENC28J60
      No se ha podido acceder a la controlador Ethernet

      No hay link con el router al cual lo conecte. la ip esta bien configurada. El modulo solo prende una luz roja D1 y ninguna mas. el router es un linksys. Lo tengo conectado por USB a una Netbook conectada con el cargador a la red electrica. El arduino es un arduino nano. Espero tu pronta respuesta. Saludos

      • Avatar
        Naylamp
        abr 30, 2017

        Hola Ariel, revisa nuevamente tus conexiones, parece que no hay comunicación entre el arduino y el ENC28J60. En ether.begin() asegúrate de especificar el número 10, que corresponde al pin SS de la comunicación SPI. Si no se especifica por defecto es el pin 8.

    • Avatar
      FERCITO
      jun 13, 2017

      Muchas gracias por el aporte señores de NayLamp; porfa pueden facilitarme sobre como se crea los botones como en el ejemplo. "ON" "OFF", le agradezco de ante mano. saludos desde Huancavelica. E-mail:kofigo3397@gamil.com

    • Avatar
      Gabriel
      ago 22, 2017

      Ola gostei muito desse lugar, vcs podem por mais para eu copiar e colar para apreender sou aluno senai????e coloca um videos de tutorial no youtube???.-_- e nos seus doido.

    • Avatar
      gabriel almeida pinto
      ago 22, 2017

      vcs podem me responder no meu email por gentileza se vao fazer videos ????

    • Avatar
      Ausberto Ibañez
      nov 3, 2017

      HOla me interesa programar el arduino con modulo de audio y red para hacer streaming o llevar audio desde un punto a otro por media de la red IP (enlace dedicado de IP - punto a punto) Què modelo me recomiendas usar y como hacer la configuración para codificar el audio y enviarlo gracias por tu ayuda

    • Avatar
      ivan
      dic 3, 2017

      disculpen, tengo que ocupar afuerza el arduino uno, es que ocupo el arduino mega y no me hace nada solo me manda el mensaje de test del modulo

    • Avatar
      Alexander Roman
      dic 24, 2017

      Buenos dias una pregunta el modulo solo se puede configurar como server o tambien hay posibilidad de hacer la configuracion para cliente?

    • Avatar
      Felipe
      mar 26, 2018

      Compañero, me compila y me sube a la arduino, pero al intentar abrir la página con la ubicacion IP que le di no carga.

      • Avatar
        JhonBP
        mar 27, 2018

        Checa en el monitor serial de arduino si hay comunicación puede que entre arduino y el modulo no haya conexion o que entre el modulo y tu router abre la ip desde un ordenador o laptop, por ejemplo en mi caso desde el celular me aparece que no puedo tener acceso y en la laptop sin problemas

    • Avatar
      fitorec
      may 7, 2018

      Hay un pequeño error en el post:En la linea donde mandas las cebeceras HTTP parece."Content-Type: text/htmlrnPragma: no-cachernRefresh: 5rnrn"Creo que el editor te quito las diagonales del retorno de carro y del salto de linea, por lo cual al cargar el código y al realizar el request el navegador al no saber cual es el content-type acaba mostrando el contenido como crea conveniente(depende del navegador) yo lo probe en Crhome y me mostraba el contenido como si fuera texto plano.Para que sea mas claro creo que debería quedar en 3 lineas(ya que eso son) algo como:"Content-Type: text/htmlrn", "Pragma: no-cachern", "Refresh: 5rnrn",Mayor info sobre las cabeceras y contenidos posibles:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers

    • Avatar
      lucho
      may 24, 2018

      Amigo, me sale texto plano pero no me muestra como pagina web. Alguna sugerencia por favor.

    • Avatar
      Sinuhe
      jun 22, 2018

      Prueba este codigo#include static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x01,0x05}; static byte myip[] = {192,168,1,177}; byte Ethernet::buffer[700];const int ledPin = 2;char* EstadoLed="OFF";void setup () { Serial.begin(9600); Serial.println("Test del Modulo ENC28J60"); if (!ether.begin(sizeof Ethernet::buffer, mymac, 10)) Serial.println( "No se ha podido acceder a la controlador Ethernet"); else Serial.println("Controlador Ethernet inicializado"); if (!ether.staticSetup(myip)) Serial.println("No se pudo establecer la dirección IP");Serial.println(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); }static word homePage() { BufferFiller bfill = ether.tcpOffset(); bfill.emit_p(PSTR("HTTP/1.0 200 OKrn" "Content-Type: text/htmlrnPragma: no-cachernRefresh: 5rnrn" "Naylamp Mechatronics" "" "

      " "

      Test del Módulo ENC28J60

      " "Tiempo transcurrido : $L segundos" "

      Estado del LED: $S
      " "" "" "

      Potenciómetro: $D (resolución de 1024)" "

      " "www.naylampmechatronics.com" "" ),millis()/1000,EstadoLed,analogRead(0)); return bfill.position(); } void loop() { word len = ether.packetReceive(); word pos = ether.packetLoop(len); if(pos) { if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) { Serial.println("Comando ON recivido"); digitalWrite(ledPin, HIGH); EstadoLed = "ON"; }if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) { Serial.println("Comando OFF recivido"); digitalWrite(ledPin, LOW); EstadoLed= "OFF"; } ether.httpServerReply(homePage()); // se envia página Web } }

    • Avatar
      luis peña
      jul 2, 2018

      Pongo la ip en la PC, celular, Laptop y nada. No conecta. La tarjeta si tiene comunicacion con el arduino

    • Avatar
      samuel
      jul 24, 2018

      duda, ¿podría conectar este proyecto con una aplicación en android en lugar de la pagina web?

    • Avatar
      Milton Betancourth
      oct 31, 2018

      Saludos. Entonces si es compatible con el arduino nano?

    • Avatar
      ALDO
      nov 15, 2018

      hola el programa me compila y carga bien, abro el serial me aparece test del modulo ENC28J60 controlador ethernet inicializado pero al poner la ip en cualquier dispositivo no carga solo me aparece no se puede acceder

    • Avatar
      Gustavo
      abr 11, 2019

      ¿Y por que no se puede recibir nada por medio de wifi? intente recibir datos conectado via wifi pero no me dejaba mas que cable ethernet

      • Avatar
        Lorenzo
        jun 1, 2019

        ¿Será porque se trata solo de un módulo con conector y especificaciones Ethernet? :-) Ya nos explicarás como lo has intentado conectarlo por Wifi...

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment: