jueves, 5 de julio de 2012

Uso del módulo ethernet ENC28J60 con Arduino : Parte 1

Hola, en esta ocación quiero compartir un tutorial para utilizar un módulo ENC28J60 que proporciona conectividad ethernet a cualquier microcontrolador, en este caso lo usaremos mediante un Arduino o sea un Atmega328

En el mercado encontraremos diferentes presentaciones de este módulo, algunas vienen en formato de Shield, yo consegui una tarjeta mas pequeña pero que se cablea facilmente al Arduino

El módulo que se uso para este tutorial es el siguiente:

Tambíen existe la version "shield":

En las bibliotecas de Arduino ya encontramos una librería ethernet, el problema es que esta librería esta diseñada para operar con un módulo diferente, el WIZnet W5100, por lo que no es compatible, despues de probar varias opciones al fin encontre una que funcionó sin problemas y que se puede descargar desde la sig. liga:

* Actualización al 26/11/2016

La versión actualizada de la librería la encuentran en la siguiente liga:

https://github.com/jcw/ethercard/archive/master.zip


Bueno empezaremos cableando el módulo ethernet al Arduino, para esto usamos el siguiente diagrama:


Cabe mencionar que la comunicacion entre el módulo ethernet y el arduino se lleva acabo utilizando un protocolo que se llama SPI o Serial Peripheral Interface


SPI es un protocolo serial sincrono que se utiliza para comunicar un microcontrolador con otro y con periféricos a distancias cortas.

Para hacer una conexion SPI siempre habrá un dispositivo maestro (usualmente un microcontrolador) que controlará uno o varios periféricos (esclavos), se utilizan por lo generar 3 lineas de conexión  y una de selección que son:

* SO o MISO (Master In Slave Out). La linea que utiliza el esclavo para enviar datos al maestro
* SI o MOSI (Master Out Slave In). Datos del maestro al esclavo.
* SCK (Serial clock). Pulsos de reloj para sincronizar la comunicación
* CS o Select. Se usa por el master para habilitar o deshabilitar un determinado periférico

Los microcontroladores atmel incluyen las 4 lineas para usar protocolo SPI las cuales obviamente están presentes en los pines del arduino, para el arduino uno se deben usar: Pin digital 10 para CS, Pin digital 11 para SI, Pin digital 12 para SO y Pin digital 13 para SCK, en el caso del arduino mega se usaría los sig. pines: 50 (MISO), 51 (MOSI), 52 (SCK), and 53 (CS).

La alimentación del módulo puede ser a 3.3 o 5V, yo usé ambos para las pruebas y no encontré ninguna diferencia así que lo deje puesto a 3.3V.


Así queda nuestro módulo cableado:



Después de cablear el módulo lo que sigue es instalar la librería, como estoy usando la versión de Windows, las rutas serán en ese formato, primero busco el archivo que descargué, el mio quedó guardado con el mismo nombre EtherCard.zip


A continuación descomprimo el archivo y envío la carpeta descomprimida al directorio de Arduino/libraries (o la ruta donde esté instalado el ide de arduino)




Después de este paso abrimos el IDE de arduino y en el menu de Ejemplos ya deben aparecer los ejemplos de la libreria EtherCard



Seleccionamos el ejemplo pingsStaticIP


En las variables myip y gwip colocamos primero la ip que querramos asignar al arduino (en mi caso 192.168.1.188) y después la ip de nuestra puerta de enlace o gateway, en méxico para las redes de infinitum y una gran mayoría de las redes domésticas este valor es el que se muestra (192.168.1.254), una vez hecho este pequeño cambio descargamos el script al arduino y abrimos el monitor serial donde vemos el arranque del script:


Si analizamos el script vemos que hay una rutina que obtiene via dns la direccion ip del dominio www.google.com y se queda enviándole pings, en el monitor vemos los tiempos de respuesta del servidor de google (Esta parte solo funcionará si estamos conectados a internet).

Si nosotros abrimos una ventana de comandos y hacemos ping a la dirección ip del arduino debemos ver una respuesta como la de abajo, en la pantalla del monitor serial tambíen podemos ver las solicitudes de ping enviadas por la pc y recibidas por el arduino


Si lograron llevar acabo con éxito todos los pasos felicidades! oficialmente acaban de darle conectividad de red a su arduino.

En la segunda parte del tutorial aprenderemos como convertir nuestro arduino en un servidor web para poder monitorear y controlar las salidas y entradas de la placa, hasta la próxima!

Con información tomada de:




46 comentarios:

  1. Gracias por tu aporte fue de gran ayuda para mi. Espero me puedas pasar como controlar la placa arduino con esta libreria, gracias mi correo es alltrips.stafe@gmail.com

    ResponderEliminar
  2. Muy agradecido. Añadir como incentivo q por 11-12€ lo compramos en tiendas ebay de españa.Busquen por ENC28J60.

    ResponderEliminar
  3. soy de argentino muchas gracias me diste una mano barbara!!!!!
    excelente tutorial!!!!!!
    un abrazo y felices fiestas!

    pd: donde esta la segunda parte del tutorial.

    ResponderEliminar
    Respuestas
    1. Gracias e igualmente saludos al cono sur!!, la segunda parte del tutorial esta aca http://tecnotinker.blogspot.mx/2012_12_01_archive.html

      Eliminar
  4. buenas, yo tengo el arduino mega 2560 donde cambio la asignación de los pines??

    ResponderEliminar
  5. No es necesario hacer cambios en el codigo ya que la biblioteca se ajusta automaticamente dependiendo de la configuracion del ide, si usas un mega solo asegurate de usar los pines adecuados, en el articulo indico cuales son (50, 51, 52 y 53)

    ResponderEliminar
  6. Hola, excelente aporte! Tengo problemas al correr el programa, en el monitor serial se queda en [pings] sin hacer más nada, tampcoresponde ping, ya revise las conexiones y están OK. Usaba antes este módulo ethernet con PIC sin problemas, me llama la atencion que los pines reset y WOL queden desconectados.
    Alguna sugerencia?

    Saludos.-

    ResponderEliminar
    Respuestas
    1. Hmm no me das mucha informacion, cual es la ip de la computadora donde estas haciendo las pruebas?, si la configuracion de red es correcta otra opcion posible es que la libreria no sea 100% compatible con el módulo que estás usando, a mi me paso eso al principio y tuve que probar 2 o 3 librerias diferentes hasta que encontre esta que viene en el tutorial

      Eliminar
    2. El GW de la red en la que estoy trabajando es 192.168.0.1/24 y conecto el módulo a un switch común y corriente. El tema es que en el serial monitor se queda [pings] y no pasa nada de nada.
      El módulo es igual al de la foto tuya (en mi caso marca LC Studio)y ya lo utilicé antes sin ningún problema. ¿Tendrás los links de las otras librerías para probar?

      Saludos.-

      Eliminar
    3. Bueno encontré algunas cosas que están mal en la librería para esta configuración: el archivo enc28j60.cpp tiene los pines asignados para el caso de arduino uno y mega, pero en el caso del mega para el pin SS indica 2, lo corregí a 53, y además configuré el pin como salida y lo puse en alto.
      Ahora los led's del módulo en el conector ethernet están uno encendido y el otro parpadea, pero en el monitor serial sigue apareciendo solamente [pings] y no responde.

      Eliminar
    4. a mi me pasa exactamente lo mismo que a luciano B, aunque sin querer invertí la polaridad en el modulo ethernet (cosa de hacer las cosas con prisa) y no se si me cargué el módulo, porque cuando lo enchufo en el router, la luz del puerto en este, aparece naranja en vez de amarilla.

      gracias por el tutorial

      Eliminar
    5. Hola luciano, tambien estoy teniendo problemas con las librerias, en que parte modificaste el Pin SS en el archivo enc28j60?

      Eliminar
  7. ya he conseguido que me funcione con otras librerías que me he descargado EtherShield_Arduino_v1.zip.

    gracias de nuevo

    ResponderEliminar
  8. Gracias a ti David, puedes compartir la liga de la libreria para futuras referencias?

    ResponderEliminar
  9. Hola que tal.

    Interesante post, pero no me funciona en mi Arduino DUE, genera errores cuando compilo. Alguna idea o sugerencia.

    ResponderEliminar
    Respuestas
    1. Hola hasta hoy no he tenido oportunidad de probarlo en el DUE pero alguien comento que la libreria tiene un error de asignacion de pines en el mega, se me ocurre que tal vez esto pudiera originar el problema, tampoco estoy muy enterado si las librerias de los avr (mega y uno) se pueden utilizar directamente en los DUE, quiza quieras mirar alguna otra libreria

      Eliminar
  10. Tengo un problema con esta librería. Tengo una placa arduino mega, los pines se que son los 50, 51,52,53.
    Mi problema es al compilar el código, me da un error:
    Ethernet no fue declarado y me señala en rojo, la línea de
    byte Ethernet::buffer[700];
    Alguien tiene idea de como solucionar este problema....

    ResponderEliminar
    Respuestas
    1. Probá con un ide de Arduino anterior, esa librería, leí por ahí, que no funciona con los ides nuevos, a menos que se le hagan modificaciones.
      Sds.

      Eliminar
  11. Saludos;

    Los pines para leonardo cambian?, es que tego una placa leonardo y ya conecte todo como lo indicas, pero no consigo que me funcione.

    ResponderEliminar
  12. Excelente la explicación, ojala vengan muchos tutoriales como este, saludos

    ResponderEliminar
  13. Excelente el Articulo!, debo aclarar que en mi caso, con arduino uno, tuve que cambiar el parámetro del serial a 9600 (estando desde el ejemplo en 57600.. o algo asi), y que solo funciona conectandolo directamente al router. No pude arreglarmelas solo para establecer una comunicacion directa con la pc sin router de por medio. Si alguien tuvo el ingenio, estaria agradecido por la respuesta. Saludos!!!

    ResponderEliminar
    Respuestas
    1. Probá con un cable cruzado, norma A de una lado, norma B del otro, suerte!.

      Eliminar
  14. Mi problema es que solo se queda en [getStaticIP] y no hace nada, lo conecto directamente al router y se queda igual, mi router utiliza la ip 192.168.1.1 por lo mismo esa direccion pongo como gateway y no hace nada, luego de un rato y en ciertas ocasiones me dice Failed to access Ethernet controller
    Server: 74.125.79.99

    ResponderEliminar
  15. se puede modificar el el pin del SS, no lo veo en el codigo. Arme una placa que esta cableado diferente y no funciona

    ResponderEliminar
  16. No se si a estas alturas, alguien me va responder sobre las dudas, pero allá va.
    No lo consigo, me pasa como a Joao, se queda con getstaticip. Utilizo la página de google.es que me responde al ping con el md me da 216,58,210,131, conexión directa al router y pongo correctamente una dirección vacía de mi red y el Gateway. Lo que no veo es donde poner la clave web del router ??? No hace falta ???

    Que puedo estar haciendo mal ???

    gracias y un saludo

    ResponderEliminar
    Respuestas
    1. Exactamente a que te refieres con clave web, si es conexion mediante cable ethernet no requieres clave

      Eliminar
  17. Hola, Estoy trabajando con la shiled 28j60 v1.1 y arduino uno, y envío datos a una base de datos, pero al enviarlos se envían desfasados, es decir envío dos datos, dato1 primero y luego dato2 y entonces luego de enviar dato2 ahi solamente se envía dato1. Creo que puede ser el Buffer, por si alguien quiere realizar el proyecto y hacer comentarios esta en: http://www.tweaking4all.nl/hardware/arduino/arduino-ethernet-data-push/

    ResponderEliminar
  18. Hola, espero alguien pueda ayudarme, tengo el problema de que modulo no logra hacer ping a ninguna dirección IP, Privada o Local, sin embargo al hacer el ping desde CMD hacia el modulo, si obtengo respuesta, considere de incio alguna restriccion de Firewall en el modem pero se encuentra deshabilitado, alguna sugerencia para este probema?

    ResponderEliminar
    Respuestas
    1. Podrías probar conectarlo directamente a la PC, también asegúrate que estén en el mismo segmento de la red, ej : Arduino 192.168.0.2 y pc 192.168.0.3.
      En Windows 7 tenés que habilitar el icmp en el Firewall o deshabilitarlo para hacer la prueba, en mi caso funcionó con cable directo no cruzado, pero probá ambos, suerte!.

      Eliminar
  19. Hola, yo lo tengo funcionando un rato largo , más de una hora y de repente ya no responde a los ping el ENC28J60, teniendo alimentado el Arduino 1 por usb, será que la librería falla?.

    ResponderEliminar
  20. tengo una duda, no conosco la mac, como podria obtenerla?

    ResponderEliminar
    Respuestas
    1. Toma una MAC DE cualquier dispositivo, solo asegurate de que sea valida, saludos, por ejemplo una tarjeta de red que tengas o un celular que ya no ocupes, otra cosa, asegurate que esa misma mac no se repita en en tu red local, tiene que ser unica, es decir vas a clonar la mac, saludos.

      Eliminar
  21. Toma una MAC de una tarjeta de red Zarco66 o bien busca en google direcciones mac, ya que este módulo al parecer no cuenta con una mac propia, yo tome una de un celular viejito.

    ResponderEliminar
  22. Hola, buenísimo el tutorial. Quisiera saber si se puede acceder y manejar la placa arduino UNO con el módulo ethernet ENC28J60 desde JAVA. Estoy diseñando un sistema web pero no quiero conectar el servidor por COM3 al arduino. Quiero manejarlo por red. Saludos y gracias.

    ResponderEliminar
  23. Buenas,

    Me gustaría saber que diferencias hay entre la ethernet shield de Arduino con el W5100 y está que usas para este proyecto. Que beneficios tiene esta sobre la de W5100?

    Un saludo.

    ResponderEliminar
  24. En su momento el modulo enc28j60 era mas economico, actualmente ya no hay tanta diferencia en costos y el w5100 tiene la ventaja de estar soportado por la libreria ethernet que viene con arduino

    ResponderEliminar
  25. buenos dias ingeniero y muy buen tutorial te cuento que tenia uno y lo arrumbe pensando que no me serviria y pues ya lo tengo trabajando lo probe con mi ip local y bien;lo probe con la ip publica y abri el puerto de mi router y ok;mi duda comienza cuando cambia mi ip publica ya no puedo conectarme a mi arduino por que logico ya cambio mi ip publica por ser dinamica ahora pues me cree una cuenta en no-ip pero ahora no logro conectarme mi pregunta es si tengo que tener encendida una computadora con el ejecutable DUC que me bajo de la misma pagina para que me este redireccionando mi ip o hay alguna forma de que se redireccione tan solo con tener mi arduino conectado.
    Gracias Ing.

    ResponderEliminar
    Respuestas
    1. Normalmente los modems tienen la opcion de configurar el servicio de dns dinamico, revisa las opciones de configuracion del tuyo

      Eliminar
  26. Saludos, La IDE de Arduino no me permite subir el codigo al micro, me arroja el sig error:

    C:\Users\Jesús Eduardo\Documents\Arduino\libraries\EtherCard/EtherCard.h:167:15: note: no known conversion for argument 1 from 'const char*' to 'int*'

    Se encontraron múltiples librerías para "EtherCard.h"
    Usado: C:\Users\Jesús Eduardo\Documents\Arduino\libraries\EtherCard
    No usado: C:\Users\Jesús Eduardo\Documents\Arduino\libraries\ethercard-master
    exit status 1
    no matching function for call to 'EtherCard::dnsLookup(const char*)'

    Que estoy haciendo mal?

    ResponderEliminar
  27. Holaa buenas trades a todos estoy con un proyectito que me estas dando dolores de cabezaaa. Necesito interconectar un arduino UNO, un Molulo Lan, Un modulo RFID, Un modulo RELE y un modulo Sensor de paso de corriente y mediante un modulo LAN enviar y recibir los datos de estos modulos. ALGUIEN QUE PUEDA TIRARME UNA SOGAAAAAAAAAA UN SALVAVIDAAAAASS

    ResponderEliminar
  28. Buenas,
    Mi proyecto es algo un poco raro, creo yo, ¿se podría conectar este módulo a un esp8266, de manera que se conecte a ethernet si esta cableado o a wifi si no lo está?, por cuestiones de tamaño, no me puedo permitir usar otras shields más grandes en el proyecto.
    Muchas gracias

    ResponderEliminar
  29. Hola al descargar la libreria no me sale el ejemplo que planteaste me podes dar una mano?

    ResponderEliminar