Tema 6 – Comunicaciones con Arduino (2)

Librería Ethernet. Shield Ethernet y W5100.

 Ethernet Shield permite a una placa Arduino conectarse a internet. Está basada en el chip ethernet Wiznet W5100. El Wiznet W5100 provee de una pila de red IP capaz de soportar TCP y UDP. Soporta hasta cuatro conexiones de sockets simultáneas. Usa la librería Ethernet para escribir programas que se conecten a internet usando la shield.

 

Datasheet de W5100: https://www.sparkfun.com/datasheets/DevTools/Arduino/W5100_Datasheet_v1_1_6.pdf

Librería ethernet: http://arduino.cc/en/Reference/Ethernet

El shield provee un conector ethernet estándar RJ45. La ethernet shield dispone de unos conectores que permiten conectar a su vez otras placas encima y apilarlas sobre la placa Arduino.

 Arduino usa los pines digitales 10, 11, 12, y 13 (SPI) para comunicarse con el W5100 en la ethernet shield. Estos pines no pueden ser usados para e/s genéricas.

 El botón de reset en la shield resetea ambos, el W5100 y la placa Arduino.

La shield contiene un número de LEDs para información:

  • ON: indica que la placa y la shield están alimentadas
  • LINK: indica la presencia de un enlace de red y parpadea cuando la shield envía o recibe datos
  • 100M: indica la presencia de una conexión de red de 100 Mb/s (de forma opuesta a una de 10Mb/s)
  • RX: parpadea cuando el shield recibe datos
  • TX: parpadea cuando el shield envía datos

El jumper soldado marcado como “INT” puede ser conectado para permitir a la placa Arduino recibir notificaciones de eventos por interrupción desde el W5100, pero esto no está soportado por la librería Ethernet. El jumper conecta el pin INT del W5100 al pin digital 2 de Arduino.

El slot SD en la shield usa la librería http://arduino.cc/en/Reference/SD para manejarlo.

Para usar la Ethernet Shield solo hay que montarla sobre la placa Arduino. Para cargar los sketches a la placa conectarla al ordenador mediante el cable USB como se hace normalmente. Luego conectar la Ethernet a un ordenador, a un switch o a un router utilizando un cable ethernet standard (CAT5 o CAT6 con conectores RJ45). La conexión al ordenador puede requerir el uso de un cable cruzado (aunque muchos ordenadores actuales, pueden hacer el cruce de forma interna).

Un tutorial sencillo para comenzar con el shield ethernet en: http://www.artinteractivo.com/arduino-ethernet

 Para cualquier duda sobre el ethernet Shield consultar: http://arduino.cc/en/Main/ArduinoEthernetShield

 Puntos a recordar del Ethernet Shield:

  • Opera a 5V suministrados desde la placa de Arduino
  • El controlador ethernet es el W5100 con 16K de buffer interno. No consume memoria.
  • El shield se comunica con el microcontrolador por el bus SPI, por lo tanto para usarlo siempre debemos incluir la libreria SPI.h: http://arduino.cc/en/Reference/SPI
  • Soporta hasta 4 conexiones simultaneas
  • Usar la librería Ethernet para manejar el shield: http://arduino.cc/en/Reference/Ethernet
  • El shield dispone de un lector de tarjetas micro-SD que puede ser usado para guardar ficheros y servirlos sobre la red. Para ello es necesaria la librería SD: http://arduino.cc/en/Reference/SD
  • Al trabajar con la SD, el pin 4 es usado como SS.

Nuestro Arduino UNO se comunica con W5100 y la tarjeta SD usando el bus SPI a través del conector ICSP. Por este motivo los pines 10, 11, 12 y 13 en el UNO y los 50, 51, 52 y 53 en el Mega no podrán usarse. En ambas placas los pines 10 y 4 se usan para seleccionar el W5100 y la tarjeta SD.

El W5100 y el SD no pueden trabajar simultáneamente y debemos tener cuidado al usar ambos de forma conjunta.

Para conectar el shield, se deben seguir estas instrucciones: http://arduino.cc/en/Guide/ArduinoEthernetShield

 El esquemático lo podéis encontrar en: http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-06-schematic.pdf

 El Ethernet shield es compatible con PoE gracias a un módulo adicional que extrae la energía eléctrica del cable ethernet, anteriormente inyectada desde el switch.

Las características del módulo PoE:

  • IEEE802.3af compliant
  • Low output ripple and noise (100mVpp)
  • Input voltage range 36V to 57V
  • Overload and short-circuit protection
  • 9V Output
  • High efficiency DC/DC converter: typ 75% @ 50% load
  • 1500V isolation (input to output)

Data sheet: http://arduino.cc/en/uploads/Main/PoE-datasheet.pdf

 Más información sobre el Power Over Ethernet:

 

Como funciona PoE:

http://www.bb-elec.com/Learning-Center/All-White-Papers/Ethernet/Power-over-Ethernet-PoE.aspx

 

 WIZnet W5100

 El integrado W5100 se conecta al arduino mediante SPI.

 

Para saber todo sobre el W5100 revisar este enlace que es muy completo: http://www.ermicro.com/blog/?p=1773

Básicamente el Wiznet W5100 implementa una pila TCP con todas las funciones del estándar IEEE 802.3 (Ethernet capa fisica y de enlace de datos) dentro del chip; esto hace que el chip Wiznet W5100 sea buena opción para integrar el sistema embebido en internet. La programación del chip de Wiznet W5100 es también fácil ya que sólo tenemos que escribir y leer desde y hacia los registros internos W5100 con el fin de utilizar el construir funciones de los protocolos TCP/IP.

El Wiznet W5100 actuará como un dispositivo esclavo SPI controlado por microcontrolador ATMega328 como el SPI Maestro. Necesita el protocolo SPI al menos cuatro señales, MOSI (Master Out Serial In), MISO (Master In Serial Out), SCK (señal de reloh proporcionada por el maestro) y CS (the SPI slave chip select). El chip W5100 también proporciona el pin de interrupción.

Para inicializar el chip W5100, tenemos que escribir en cada uno de los registros comunes W5100 nombrados MR ((Mode Register), SUBR (Subnet mask Register), SAR (Source Hardware Register), SIPR (Source IP Register), RMSR (Receive Memory Size Register) y TMSR (Transmit Memory Size Register).

Todos los registros de W5100 registros de direcciones tiene 16 bits de ancho y el registro en sí es de 8 bits de ancho; como utilizamos el microcontrolador ATMega328 de 8 bits, con el fin de realizar la operación de escritura o lectura tenemos que pasar los primeros 8 bits MSB (byte más significativo) y seguir los siguientes 8-bit LSB (byte menos significativo) de la direccion de memoria del registro de W5100. El Wiznet W5100 también utiliza dos comandos para diferenciar entre la escritura (0xF0) y operación de lectura (0x0F). La escritura y lectura en el SPI de Wiznet se implementa con SPI_Write () y SPI_Read ().

Especificaciones:

 Ver en el pdf el mapa de memoria y los registros comunes.

 ¿Es posible hacer pings con arduino? Sí, pero con una librería: http://playground.arduino.cc/Code/ICMPPing

¿Soporta Arduino IPv6?

El shield oficial de arduino basado en el WizNet 5100 implementa la pila de protocolos IPv4, por lo que esta shield no puede ser utilizada para implementar la pila IPv6.

Para implementar la pila IPv6, es necesario usar un shield basado en hardware que permita la gestión de la funciones de las capas de IP y ethernet. Shields basados en el chip MicroChip ENC28J60 son adecuados para la implementación de IPv6. Esto requiere la implementación de una gestión de los estados TCP, resultando un código de arduino más complejo.

 Datasheet Chip ethernet IPv6:

 Más información sobre IPv6: https://sites.google.com/site/ghoelzl/ipv6

 IPv6WebServer: https://sites.google.com/site/ghoelzl/ipv6ethershield/ipv6_http_server

 Y aun más… http://www.tweaking4all.com/hardware/arduino/arduino-enc28j60-ethernet/

 Y otro ejemplo: http://www.fut-electronics.com/wp-content/plugins/fe_downloads/Uploads/Ethernet-Module-ENC28J60-Arduino.pdf

 Librerías:

Wifi Shield

El WiFi Shield de Arduino conecta Arduino a Internet de forma inalámbrica.

Toda la información sobre este Shield en :

Y los datasheet de los integrados:

 Para conectarte al 32UC3: http://arduino.cc/en/Hacking/WiFiShield32USerial

Y la librería para manejar el shield en: http://arduino.cc/en/Reference/WiFi

 Actualizar su firmware: http://arduino.cc/en/Hacking/WiFiShieldFirmwareUpgrading

 

Wifi library:

 Otro integrado wifi muy usado con arduino es: CC3000 

 Y la librería: https://github.com/sparkfun/SFE_CC3000_Library

 Y un buen paso a paso para usar esta shield:

 Y un ejemplo de uso práctico para hacer domótica en casa:

 Librería Ethernet

Para manejar el Ethernet Shield usaremos la librería Ethernet, deberemos conocer todos los métodos que nos ofrece la librería para poder usarla.

http://arduino.cc/en/Reference/Ethernet

 La librería ethernet se compone de 5 clases, cada una con sus métodos

 Ethernet Class: Inicializa la librería ethernet y las configuraciones de red

  • begin() – Inicializa la librería Ethernet (Constructor)
  • localIP() – Obtiene la dirección IP. Útil al usar DHCP
  • maintain() – Solicita una renovación al servidor DHCP

 IPAddress Class: trabaja con IPs locales y remotas

 Server Class: crea un servidor que puede mandar y recibir datos de los clientes conectados.

  • Server() – Constructor de la clase server. No se usa directamente
  • EthernetServer() – Crea un servidor que escucha por las conexiones entrantes del puerto definido.
  • begin() – Le dice al servidor que comience a escuchar.
  • available() – Devuelve el cliente que está conectado al servidor y tiene datos disponibles a leer.
  • write() – Escribe datos a todos los cliente conectados al servidor.
  • print() – Escribe datos a todos los cliente conectados al servidor.
  • println() – Escribe datos a todos los cliente conectados al servidor seguido de una nueva línea.

 Client Class: crea un cliente que se conecta a un servidor y puede mandar y recibir datos

  • Client – Constructor de la clase client. No se usa directamente
  • EthernetClient() – Crea un cliente que se conecta a una determinada IP y puerto
  • if (EthernetClient) – Indica si el cliente Ethernet está preparado
  • connected() – Devuelve si el cliente está o no conectado
  • connect() – Conecta a una IP y puerto especificado. Soporta DNS lookup. Devuelve unos códigos en función del éxito o fallo de la conexión.
  • write() – Escribe datos al servidor al que está conectado.
  • print() – Escribe datos al servidor al que está conectado
  • println() – Escribe datos al servidor al que está conectado, seguido de una nueva línea
  • available() – Devuelve el número de bytes disponibles para leer.
  • read() – Lee el siguiente byte recibido desde el servidor.
  • flush() – Borrar todos los bytes que han sido escritos en el cliente pero no leidos
  • stop() – Desconecta el cliente del servidor

 EthernetUDP Class: habilita el envío y recepción de mensajes UDP

  • begin() – Inicializar la librería UDP
  • read() – Lee datos UDP
  • write() – Escribe datos UDP a la conexión remota.
  • beginPacket() – Comienza una conexión para escribir paquetes UDP
  • endPacket() – Finaliza una conexión UDP después de escribir
  • parsePacket() – Comprueba la presencia de un paquete UDP
  • available() – Devuelve el nº de bytes disponible para leer en el buffer
  • stop() – Desconecta del servidor
  • remoteIP() – Obtiene la IP de la conexión remota
  • remotePort() – Obtiene el puerto de la conexión remota

 Más información sobre el protocolo UDP: http://es.wikipedia.org/wiki/User_Datagram_Protocol

 Y varios ejemplo para usar:

 Snippets para ethernet: http://playground.arduino.cc/Main/SketchList#ethernetShield

 Recordar que tenemos un arduino Ethernet que es casi igual a un arduino UNO + un ethernet shield: http://arduino.cc/en/Main/arduinoBoardEthernet

 Ejercicio25-EthernetClient Crea un cliente ethernet que se conecte a una web y escriba los datos recogidos. Guarda los datos en un string.

webclient: http://playground.arduino.cc/Code/WebClient

Prueba a conectarte a varias páginas web y usa el servicio DNS poniendo la url en lugar de la IP.

Trata de conectarte a la AEMET para ver si sería posible obtener el tiempo de logroño.

Usa la API de http://www.openweathermap.org/ para obtener los datos del tiempo en una ciudad en concreto

Tiene aemet una API?

Serías capaz de sacar la temperatura en logroño actualizada por el display LCD sin necesidad de un sensor de temperatura?

Solución: https://github.com/jecrespo

 Un poco de información:

 Ejercicio26-EthernetServer Crea un servidor web sencillo que devuelva la petición http que le ha llegado. Luego añade el valor leído por un sensor.

Implementar también un servidor de telnet simple.

webserver: http://playground.arduino.cc/Code/WebServerST

Solución: https://github.com/jecrespo

 Ejercicio27-Boton Crea una web embebida con un botón que al pulsarlo desde el navegador encienda un led.

Ejercicio: http://diymakers.es/crear-servidor-web-con-arduino/

http://www.jackbarber.co.uk/notes/arduino-web-server-led-control

Solución: https://github.com/jecrespo

Ejercicio28-ChatEthernet: Hacer el mismo chat del puerto serie con ethernet

Chat server: http://arduino.cc/en/pmwiki.php?n=Tutorial/ChatServer

y chat client: http://arduino.cc/en/Tutorial/ChatClient

Solución: https://github.com/jecrespo

Anuncios

4 pensamientos en “Tema 6 – Comunicaciones con Arduino (2)

  1. Pingback: Proyectos final de curso | Aprendiendo Arduino

  2. Pingback: Tema 5 – Taller de Proyectos con Arduino | Aprendiendo Arduino

  3. Pingback: Comunicacion con Arduino | Alvaro Martin

  4. Pingback: Proyecto – Estación meteorológica | Aprendiendo Arduino

Los comentarios están cerrados.