Relevadores controlados por internet

Para el momento en el que me enteré de la existencia del controlador de ethernet ENC28J60, no había sido la primera vez que me paso por la cabeza la idea de conectar un microcontrolador a la red y que pensé en el gran abanico de posibilidades que abre frente a uno, ya que además de conectarnos con las computadoras en la red local, también nos abre las puertas para conectarnos con nuestros circuitos desde cualquier dispositivo con acceso a Internet.

Tarjeta de desarrollo basada en el ENC28J60

Tarjeta de desarrollo basada en el ENC28J60

Lo que llama inmediatamente la atención de este chip, que viene de la misma casa que los famosos PICs,  es que uno se da cuenta de que la tecnología ethernet estará más cerca de los hobbystas que antes, por que si hay algo que me agrada de microchip es que sus chips son fáciles de conseguir y además en encapsulados adecuados para el protoboard. Este experimento pretende ser para mi una introducción con un enfoque práctico a la tecnología Ethernet y el Stack TCP/IP de microchip. El hardware esta basado en un microcontrolador PIC24FJ64GA002 junto con el ENC28J60 y una memoria serial I2C 24FC1025 , si quieres saber más de este asunto pulsa en leer más.

Un vistazo al hardware.

El componente en torno al cual se desarrolla este experimento es el ENC28J60, un controlador ethernet bastante especial, ya que se comunica con el CPU mediante un bus serial SPI, y no un bus paralelo como la mayoría de los circuitos de interfaz ethernet de otros fabricantes. El ENC28J60 implementa las funciones de las dos capas más bajas del modelo OSI (MAC & PHY). Permitiendo que el cualquier microcontrolador pueda enviar tramas a través del cableado ethernet existente en casa o en edificios, permitiendo realizar aplicaciones de monitoreo fácilmente. El PIC24FJ64GA002 con sus 8KB de SRAM y 64KB de memoria FLASH funciona como el CPU que se encarga de procesar todo el tráfico (con ayuda del software TCP/IP cargado en su memoria). En la memoria EEPROM24FC1025 se almacena una imagen binaria (MPFS, o Microchip File System) de las páginas y las imágenes e iconos de la página web, para que puedan ser accesados por el servidor HTTP. Esta imagen se genera mediante una utilidad de linea de comandos para windows que viene  con el stack TCP/IP.

Como se puede ver en la fotografía, la cantidad de componentes y las conexiones entre estos son mínimos debido al alto nivel de integración de los componentes y al uso de interfaces serie entre ellos.

Circuito utilizado para las pruebas del Stack TCP/IP

Circuito utilizado para las pruebas del Stack TCP/IP

Para la comunicación con el puerto serie de la PC, estoy usando un adaptador que construí previamente cuando realicé algunos experimentos con Arduino, es un convertidor TTL o CMOS a RS-232 construido en base al chip MAX3232 que funciona perfectamente cuando se lo alimenta con 3 volts de corriente directa. Además del hardware que aparece en el esquemático, conecté una de las tarjetas de una entrenadora que construí, la cual posee 8 salidas a relevadores controlables mediante señales TTL o CMOS, esta tarjeta esta basada en un ULN2803 que es un arreglo de transistores darlington. En las fotografías a continuación se puede ver el circuito de prueba, incluyendo los relevadores. Para mayor seguridad, los relevadores deberían de estar optoacoplados, para evitar que algún corto o error por parte nuestra pudiera llegar a dañar los componentes digitales que son más caros.

Placa de entrenamiento con relevadores y drivers darlington

Placa de entrenamiento con relevadores y drivers darlington

El stack TCP-IP

El stack software para el stack TCP/IP lo provee la empresa microchip technology. Cuando se descarga el stack TCP/IP se incluye el código fuente, esto es bueno si somos curiosos (como yo) y queremos ver como funcionan las cosas. Afortunadamente para mi, hay alguien que ya paso por el proceso de compilar y poner a funcionar el stack TCP/IP de microchip technology y lo pone a disposición de todos. En el sitio web de Jorge Amodio se encuentra una distribución de la versión 3.75.6 del stack. Aunque ya es una versión algo vieja (la actual es la 5.0) esta ya esta optimizada y configurada para usarse en un PIC24FJ64GA002 por lo que ofrece una manera rápida de empezar a trabajar, además de que las modificaciones que hizo me parecen más que oportunas, por que permiten localizar los archivos de código fuente rápidamente.

Modelo del stack TCP-IP provisto por Microchip

Modelo del stack TCP-IP provisto por Microchip

Modificaciones al software

Aunque mínimas, el software que grabé en el microcontrolador tiene algunas modificaciones.

  • Las páginas web se guardan en una memoria I2C en vez de la SPI que contempla el proyecto inicial, aunque esto afecta negativamente el rendimiento fue necesario por que eran las memorias que tenía en casa.
  • Modificado el archivo i2ceeprom.c debido a lo mencionado anteriormente, ya que el archivo que viene con el stack esta pensado para funcionar con el módulo  MSSP(Master Synchronous Serial Port) de los PIC18, hay que hacer algunos cambios para que funcione con el I2C del PIC24
  • Modificada la función HTTPGetVars() para aceptar 4 leds en vez de dos.
  • Modificados los archivos de configuración para el PIC24FJ64GA002para aceptar 4 entradas y 4 salidas digitales.

Después de estas modificaciones, viene la parte emocionante que es ver si todo el conjunto funciona como se espera :D.

Pruebas de conectividad y configuración del router ADSL o Cable para acceso remoto.

Para realizar las primeras pruebas del stack, conviene tener instalado en la PC un analizador de protocolos de red, una buena opción es Wireshark, que nos ofrece una alternativa gratuita para observar los paquetes que fluyen por la red de área local. En mi caso, las primeras pruebas las realice conectando directamente el  prototipo al puerto ethernet de mi computadora portátil mediante un cable cruzado. De ese modo se puede comprobar que el hardware y el software están funcionando correctamente. Según mi experiencia, es recomendable que al momento de realizar las pruebas solamente se tenga conectado un dispositivo a la interfaz que vamos a utilizar para escuchar los paquetes, ya que así evitamos un tráfico excesivo y esto nos beneficia al momento de analizar las tramas que envía el ENC28J60. En la imagen se observa la ventana de wireshark, con los primeros paquetes ARP transmitidos por mi prototipo, con los cuales el Stack TCP/IP esta tratando de obtener la dirección física del Gateway, cuya dirección configuré como 192.168.1.1. Con esta prueba queda claro, al menos, que la interfaz SPI entre el controlador Ethernet y el microcontrolador funciona correctamente, ya que el ENC28J60 esta generando tráfico entendible por la PC.

Primeros paquetes capturados con WireShark

Para poder tener acceso a el servidor web embebido desde Internet, primeramente se necesita haber contratado el servicio de acceso con un proveedor, si ya tenemos el servicio y tenemos instalado el Módem-Ruteador, es necesario conocer la dirección IP publica del módem, es decir aquella con la que nos pueden localizar otras computadoras desde Internet. Normalmente esta dirección se asigna de manera dinámica por el ISP, por lo que probablemente cambiará de vez en cuando: por ejemplo al apagar y volver a encender el módem o cada determinado numero de días.  Para superar este problema, algunos ruteadores domésticos soportan un protocolo conocido como DDNS (Dynamic DNS), que puede notificar a un servidor DNS  de cualquier cambio en la dirección IP. De esta manera  podemos acceder a las computadoras de nuestra red local a través de un dominio o subdominio. Para contar con este servicio en necesario obtener una cuenta gratuita (o de pago) con algún proveedor como http://www.no-ip.com o http://www.dyndns.com/. No voy a detallar como se configura el DDNS, por que hay muchas maneras de hacerlo y cada una dependerá del equipo que estemos usando (por ejemplo se puede instalar y configurar un cliente en la PC, o el propio ruteador puede incluir un cliente DDNS), lo mejor será consultar la documentación del proveedor del servicio y la del hardware en cuestión.

Hay que dar de alta la regla del firewall para que permita el paso de las peticiones al webserver

Hay que dar de alta la regla del firewall para que permita el paso de las peticiones al webserver

Otra consideración importante es que el ruteador que tengamos instalado en casa, casi con seguridad bloqueará los paquetes de requests HTTP que vengan desde Internet a menos que le indiquemos explícitamente que los encamine hacia un determinado host dentro de nuestra red privada. Esto se debe a que normalmente estos equipos cuentan con mecanismos conocidos como NAT (Network Address Translation) y PAT (Port Address Translation), lo que implica que todos los dispositivos de la red local tienen direcciones IP en un rango privado (definido en el RFC1918) y se comunican con los host en Internet (a través del ruteador) usando la dirección publica que tiene asignada la interfaz WAN del módem. En el caso de que nuestro servidor no sea accesible desde Internet, habrá que configurar nuestro ruteador para reenviar los paquetes destinados al puerto 80 de la IP publica al puerto que nosotros queramos de la  IP privada asignada al webserver embebido. De nueva cuenta, el procedimiento exacto depende del ruteador que se este usando, sin embargo las imágenes reflejan el procedimiento para un ruteador 2Wire.

El 2Wire tiene de fábrica una regla de firewall para permitir el paso de paquetes a un servidor web en el puerto 80

Mi equipo 2Wire tiene de fábrica una regla de firewall para permitir el paso de paquetes a un servidor web en el puerto 80

La página web

Para personalizar un poco la presentación del contenido, desarrolle una pequeña página usando un demo de Adobe Dreamweaver. La página esta realizada según las últimas tendencias: Usando estilos CSS  y XHTML sin tablas para el diseño. Además conseguí unos iconos para representar el estado de las salidas y de las entradas digitales.  Como se ve en la imagen la página tiene un panel que permite interactuar con los dispositivos desde el navegador. Al pulsar sobre los iconos de los focos(bombillas) se pueden encender o apagar los relevadores conectados al protoboard. Los iconos de la parte inferior reflejan  el estado de las entradas digitales. También nos muestra la hora que se obtuvo mediante el protocolo NTP. En la parte izquierda hay un menú que permite navegar por algunas páginas que solamente son informativas.

Página web principal del proyecto, servida por el webserver basado en PIC

Página web principal del proyecto, servida por el webserver basado en PIC

Por último, aquí hay un video del prototipo funcionando.

Conclusión  y aplicaciones.

  • Hoy en día la tecnología nos permite “jugar” con microprocesadores y microcontroladores pequeños y relativamente simples con capacidades similares y hasta superiores a las primeras computadoras y que tienen los recursos para poder implementar un Stack TCP/IP. En la época en que empezaba el desarrollo de la tecnología en la que hoy se sustenta Internet, lograr un servidor simple, pequeño y barato como el que muestra esta página hubiera sido con seguridad imposible.
  • Con las herramientas que nos proporciona microchip de forma gratuita, es bastante sencillo desarrollar aplicaciones embebidas con servicios basados en TCP/IP. En esta ocasión tuve la oportunidad de experimentar con el servidor HTTP, el cliente NTP, el cliente DHCP y el servidor FTP, sin embargo espero pronto experimentar con versiones más nuevas del stack TCP/IP, para probar las nuevas características.
  • Haciendo pequeñas modificaciones al software del Stack TCP/IP se pueden añadir aplicaciones para monitoreo remoto, control de acceso, sistemas de seguridad, automatización y domótica que parecen bastante interesantes y novedosas.
  • Ya tiene un rato que estoy experimentando con las familias de microcontroladores de 16 bits de microchip technology y la mayor parte del tiempo ha sido bastante agradable ver la gran cantidad de funciones con las que cuentan estos chips. Son muy superiores en prestaciones a los PIC18 y PIC16F y además se mantienen en encapsulados muy manejables, como lo es el DIP28 del PIC24FJ64GA002. Todo eso sin contar el compilador C30 que es bastante bueno y esta disponible de manera gratuita en su versión para estudiantes. La única desventaja, al tratarse de dispositivos recientes, son los numerosos errores o  “Silicon Errata” que hay que tener en cuenta al diseñar el programa y el hardware.

¿Comentatios?

Para cualquier comentario o duda sobre este experimento, puedes escribirme a mi dirección de correo electrónico ruben en tech-freaks.net. El código fuente del stack TCP/IP lo puedes encontrar en el link a la página de Jorge Amodio, la versión que encontrarás ahí es para usarse con memorias SPI,  si quieres alguno de los archivos que utilize  yo o quieres saber más sobre las modificaciones que hice, contactame.

34 Comments

  1. esta con madre este proyecto, espero y pronto me pueda introducir en el mundo del ethernet, ya se algo de pic y he realizado var4ios proyectos interesantes, pero ahora quiero meterme a la comunicacion con ethernet

    se ve muy interesante

    Reply
    • Gracias Goyo.

      Te recomiendo que lo intentes, es más fácil de lo que parece con el software que te proporciona microchip. Además también es relativamente fácil encontrar el ENC28J60 ya sea suelto o en una tarjeta.

      Saludos.

      Reply
  2. me parece demasiado interesante tu aplicacion donde compraste ese modulo? y cuanto te costo te felicito por tu pasion espero contribuir con algun proyecto que tengas de que universidad eres?

    saludos y felicitaciones

    Reply
  3. Buenisimo lo que hiciste, yo estoy trabajando tambien con eso y tengo un drama barbaro con el DDNS, no logro que funcione. Me podrias decir que version des stack usas?
    Saludos

    Reply
    • Hola Francisco.

      Realmente la version del stack que use (3.75.6) no tiene el cliente DDNS. Lo comente en el blog por que el circuito lo llegue a probar con un router Linksys que incorpora un cliente DDNS. Por que no me pasas el archivo donde esta la configuración del cliente DDNS para darle un vistazo. Si estas probándolo detrás de un router que hace NAT, asegurate de que el cliente DDNS del PIC no este enviando la dirección IP PRIVADA que le asigno tu servidor DHCP, ya que las direcciones locales no son accesibles desde internet y posiblemente el servidor ignorara actualizaciones con direcciones en rango privado.

      Saludos

      Reply
  4. hola amigooo excelente trabajooo estoy desarrollando un dispositivo para reproducir streaming sobre ip…en palabra colegiales un radio por internet…te agredeceria toda la informacion que tengas hacerca del stack y consejos ya q no he podido hacer que corraa exitoss

    Reply
  5. hola:
    muy interesante tu proyecto, yo inicie un proyecto similar, hace unas semanas y me gustaria contar con el codigo fuente que utilizaste y stack 3.75.6, si pudieras compartir tu informacion ya que me seria muy util.

    saludos
    Henry Vilca V.

    Reply
    • Hola Henry

      Permiteme buscarlo y te lo mando por correo.

      Saludos

      Reply
  6. Tú proyecto me parece interesante, quisiera que me ayudes porque estoy a punto de ingresar en el muno de los pic con ethernet, y la verdad no tengo mucha experiencia.
    Ayudame con tu correo para que me des algunas indicaciones

    Reply
  7. hola nesecito aser una interface por asi llamarla que pueda manejar 8 reles o mas atraves de la red o por usb en el ultimo caso tendras algo que puedas mandarme por correo gracias

    Reply
    • Hola Leo.

      Si no vas apurado, vas por buen camino con los PIC. mi correo es ruben en tech-freaks.net

      Saludos.

      Reply
  8. Hola ruben exelente proyecto yo tengo algo armado con Avr pero no puedo lograr configurarlo para acceder a mi servidor web.
    Si me podrias pasar el codigo de este exelente proyecto y el stack estaria mas que agradecido y si keres compartimos proyectos que ya tengo armados

    saludos

    Reply
  9. Felicitaciones por el proyecto …
    Podrias subir la pagina web que realizaste …
    para aprender a ocupar eso de las ampolletas..
    Saludos

    Reply
  10. Buen dia, Muy interesante su proyecto, He buscado proyectos realizados con los pic24 y son pocas los ejemplos la verdad, Me gustaria me recomendara con cual compilar y simular he programado los pic18 con ccs y simulado en proteus pero estos pic24 son un campo nuevo para mi, Mi correo es ojpg10@hotmail.com, le agradeceria mucho si me colaborara.

    Reply
    • Hola Oscar.

      La verdad el único compilador que he utilizado con los PIC24 es C30 de Microchip, aunque también esta la opción de Hi-Tech Software (ahora pertenece a Microchip), que no he tenido oportunidad de utilizar.

      La verdad que los PIC24 Son una opción bastante mejor que los PIC16 y PIC18, tienen muchas funciones que las otras familias de los PIC no tienen, personalmente la característica que más me agrada es el PPS o Peripheral Pin Select, con esta función puedes seleccionar los pines a utilizar para la comunicación serie UART, SPI, Interrupciones, etc.

      Personalmente creo que vale la pena invertir tiempo en aprender a utilizarlos.

      Saludos

      Reply
  11. Amigo puedes subir la página web porfa …
    Saludos

    Reply
  12. Hola.

    Creo que ya perdí los archivos originales que cargué en la EEPROM. De cualquier forma lo busco y si lo tengo lo subo.

    Gracias.

    Reply
  13. Hola,

    En primer lugar felicitarte por tu proyecto, es un gran aporte. Queria saber si me podrias dar algunas indicaciones sobre el stack TCP-IP y el ENC28J60, ya que quiero realizar un proyecto para poder administrar un dispositivo atravez de la red. Si pudieras mandarme la información con la que cuentes te estaria muy agradecido.

    Saludos
    Alfonso Bermúdez

    Reply
  14. Hola Rubén.
    El proyecto que tienes es una joyita, bueno la verdad quisiera que me des las pautas para empezar un proyecto similar, tengo un montón de proyectos realizados con PIC y me gustaría poder monitorearlos y tener control sobre ellos remotamente. Ya cuento con el ENC-28j60, solo el dispositivo.
    Te agradecería si es que nos podemos contactar via correo electrónico.
    Un abrazo.

    Atte:
    Daniel

    Reply
  15. HOLA RUBÉN, DISCULPA EN EL ENC28J60 YA VIENE INTEGRADO EL CSMA/CD PARA EL CONTROL DE FLUJO O HAY QUE IMPLEMENTARLO.

    Reply
    • Hola Oscar.

      El ENC28J60 tiene la funcionalidad de retransmisión programable en caso de colisión. Sin embargo, en redes modernas basadas en Switches que funcionan en modo full-duplex no hay colisiones y CSMA/CD no se utiliza. CSMA/CD esta disponible por compatibilidad y para cuando se selecciona half-duplex como modo de operación.

      En resumen, el procedimiento de deteccion de colision y retransmisión puede ser manejado por el controlador, pero pudes evitar colisiones si usas el ENC28J60 conectado a un puerto configurado en full duplex de un Switch, aunque no todos los switches soportan configurar el modo duplex de puerto. Para hubs y switches no administrables, lo recomendable es colocar el enc28J60 en modo half-duplex y el stack tcp manejará las retransmisiones en caso de ser necesario.

      Reply
  16. Muchas gracias por la respuesta Rubén.
    Saludos.

    Reply
  17. Hola Rubén, disculpa una duda al momento de liberar espacio en el buffer de recepción, cuando quiero evitar que el enc28j60 sobrescriba sobre los datos que no he procesado los protejo con el limitador ERXRDPT(L,H), pero como se necesitan 2 punteros de 8bytes para poder abarcar toda la memoria , ¿la zona protegida la abarcaría desde ERXRDPT(L,H) hasta ERXND (L,H )?
    Gracias de antemano.
    Saludos.

    Reply
  18. De verdad mis respetos con este proyecto y con el blog en general…
    Te comento que tengo la intención de realizar un medidor de consumo eléctrico que pueda monitorear a través de una red ip, pero este tema del Ethernet me tiene trancado. Cuál sería la manera más fácil (en caso de que logre hacer que el 28J60 funcione correctamente) de hacer que los datos expresados por el pic se grafiquen en la computadora?? Es posible conectar el controlador Ethernet con un pic 16f873A

    Otra pregunta, en que pais recides?

    Muchas gracias por tu tiempo y dedicación.
    Saludos.

    Reply
  19. An

    Yo programo en C#, he usado en una ocasión una librería que se llama zedgraph para graficar en tiempo real los datos de un medidor de potencia AC. No se si sea la manera más fácil pero asi lo he hecho yo, tendrías que abrir un socket TCP para recibir datos desde el PIC.

    El PIC16F873A esta muy pequeño para correr el stack TCP/IP de microchip, dudo mucho que puedas hacerlo con ese PIC. Te recomiendo el PIC24FJ64GA002. Este tiene 64 KB de flash y no le cabe el stack TCP/IP ultima versión con todos los módulos habilitados (pero es DIP 28).

    Si quieres algo más sencillo que lidiar con todo TCP/IP en el micro puedes probar una solución ethernet a serial como los módulos de tibbo y lantronix (checa el xport de lantronix). En este caso con el PIC16F873 te sería suficiente, aunque estos módulos tienden a ser muy caros y dificiles de conseguir.

    Yo vivo en México, por cierto.

    Reply
  20. Oscar, no había visto el comentario, ni se si vayas a leerlo pero te comento: ERXRDPT(L,H) es el apuntador de lectura del buffer de recepción. El ENC28J60 maneja el buffer de manera circular, de modo que si se intenta escribir en la dirección apuntada por ERXRDPT(L,H) se genera una interrupción y se aborta la recepción del nuevo paquete.

    La zona que no tocará comienza entonces desde ERXRDPT(L,H) y termina hasta donde tengas paquetes sin procesar. para saber con exactitud en donde empieza y donde termina checa la hoja de datos del ENC28J60.
    Espero que sirva de algo.

    Reply
  21. Hola Rubén la verdad muy buen proyecto, yo estoy tratando de hacer algo similar, en este momento estoy investigando de como realizarlo… te agradecería si me podes mandar una ayuda o archivos que tengas, así puedo seguir con mi investigación

    Muchas gracias
    Saludos

    Reply
  22. Hola amigo ruben que buen trabajo yo estoy iniciando un proyecto como este donde quiero hacer control a través de Internet con pic pero trabajo con el compilador ccs y no he trabajado aun con SPI y no se donde se guarda la pagina con la que se trabaja.
    gracias por cualquier colaboración estaré atento a una respuesta.

    Reply
  23. Hola Ruben, dejame decirte que es un excelente trabajo, el cual comparto por que estoy trabajando con la tarjeta PICDEM.net 2 de Micochip, solo que no he logrado configurar mi router para abrir el puerto 80 y poder accesar desde internet. Ya lo hice en la local y ahi todo funciona muy bien. Ojala pudieras brindarme un poco de informacion, y de nuevo felicidades.

    Reply
    • Hola Cesar.

      Este asunto varía mucho dependiendo de la compañía (ISP) y el modem que estes utilizando. En ciertas compañías como las cableras (TV + Internet) Es bastante dificil, ya que muchas veces la solución es contratar una Ip estática con la compañia. Esto se debe a que ellos (cableras) utilizan un pool de direcciones IP para sacar a internet a varios suscriptores a través de un router y NAT. Desgraciadamente uno no tiene control de estas direcciones, ya que son propiedad de las cableras. Con DSL al menos donde yo vivo nos asignan una dirección pública de internet por suscriptor para la interfaz WAN del módem, por lo que podemos usar DNS dinámico sin problemas.

      Por la dirección Ip de donde envías el comentario podría asegurar que esto es lo que te esta pasando. Si gustas deja otro comentario a ver si puedo encontrar una solución o preguntar a alguien entendido en el tema de redes de este tipo.

      Saludos coordiales.

      Reply

Submit a Comment

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

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

$0.000 items

Carrito