Archivo por meses: julio 2016

Ethernet Shield

El Arduino ethernet shield nos da la capacidad de conectar un Arduino a una red ethernet. Es la parte física que implementa la pila de protocolos TCP/IP.

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 leer y escribir los flujos de datos que pasan por el puerto ethernet. Me permitirá escribir sketches 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 varios 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. El propio chip W5100 incluye el manejo de tarjetas SD.

Para usar la Ethernet Shield solo hay que montarla sobre la placa Arduino. Para cargar los sketches a la placa con el shield, 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 simultáneas
  • 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.

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

Arduino Ethernet Shield 2

Arduino Ethernet Shield es una placa que aparece en la web de arduino.cc como retirado, pero sigue estando disponible como clones o versiones derivadas.

Por otra parte arduino.org a sacado el Arduino Etherner Shield 2 con el nuevo Wiznet 5500 http://www.arduino.org/products/shields/arduino-ethernet-shield-2

Este Shield usa la librería ethernet2: http://www.arduino.org/learning/reference/Ethernet-two-Library

Data sheet de W5500: https://www.sos.sk/productdata/15/26/12/152612/W5500_datasheet_v1.0.2_1.pdf

Mejoras de W5500: https://feilipu.me/2014/11/16/wiznet-w5500-ioshield-a/

Power over Ethernet

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

Phantom Feeding:

Alimentación sobre cables libres:

WIZnet W5100

El integrado W5100 se conecta al arduino mediante SPI.

Para saber todo sobre el W5100 revisar: 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 física 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.

Especificaciones:

¿Es posible hacer pings con arduino?

Sí, pero por supuesto 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 está 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:

Protocolo HTTP

Hypertext Transfer Protocol o HTTP (en español protocolo de transferencia de hipertexto) es el protocolo de comunicación que permite las transferencias de información en la WWW. Se trata de un protocolo de capa 7 de aplicación.

En arduino con la librería ethernet solo trabajamos con la capa de aplicación, todas las otras capas de TCP/IP ya están implementadas por Hardware, ya sea con la ethernet shield o el módulo WiFi. Aunque si queremos realizar algunas funciones de capas inferiores, podemos hacerlo con los comandos adecuados comunicándonos con el chip ethernet o wifi via SPI.

Veamos algunos protocolos de la capa de aplicación que serán los que tengamos que implementar en nuestro arduino directamente o usando la librería adecuada:

HTTP es un protocolo muy importante puesto que es el que se va a usar para comunicar Arduino con cualquier elemento de la WWW o de una intranet. En el IoT es uno de los protocolos más usados y sobre todo si queremos obtener o mandar datos a servidores o usar las APIs que nos ofrecen algunos servicios para obtención de información, por ejemplo, para obtener el tiempo meteorológico y con esos datos que arduino actúe de una forma u otra.

Hypertext Transfer Protocol o HTTP (en español protocolo de transferencia de hipertexto) es el protocolo usado en cada transacción de la World Wide Web. HTTP fue desarrollado por el World Wide Web Consortium y la Internet Engineering Task Force.

HTTP define la sintaxis y la semántica que utilizan los elementos de software de la arquitectura web (clientes, servidores, proxies) para comunicarse. Es un protocolo orientado a transacciones y sigue el esquema petición-respuesta entre un cliente y un servidor. Al cliente que efectúa la petición (un navegador web) se lo conoce como «user agent» (agente del usuario). A la información transmitida se la llama recurso y se la identifica mediante un localizador uniforme de recursos (URL).

HTTP es un protocolo sin estado, es decir, que no guarda ninguna información sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener estado. Para esto se usan las cookies, que es información que un servidor puede almacenar en el sistema cliente. Esto le permite a las aplicaciones web instituir la noción de «sesión», y también permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado.

Una transacción HTTP está formada por un encabezado seguido, opcionalmente, por una línea en blanco y algún dato. El encabezado especificará cosas como la acción requerida del servidor, o el tipo de dato retornado, o el código de estado. El uso de campos de encabezados enviados en las transacciones HTTP le dan gran flexibilidad al protocolo. Estos campos permiten que se envíe información descriptiva en la transacción, permitiendo así la autenticación, cifrado e identificación de usuario. Ejemplos de encabezados: HTTP_ACCEPT y HTTP_USER_AGENT.

Más información sobre HTTP:

Para intercambio de archivos por HTTP usamos: http://es.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions

Líneas de encabezado o headers, son muy importantes y dan información adicional de la conexión y el comportamiento puede cambiar en función de ellas:

Métodos de petición

Lo más importante para comunicar arduino por HTTP con otros dispositivos, ya sean servidores, ordenadores, otros Arduinos, etc… es conocer los métodos GET y POST del protocolo HTTP. HTTP define 8 métodos que indica la acción que desea que se efectúe sobre el recurso identificado. Lo que este recurso representa, si los datos pre-existentes o datos que se generan de forma dinámica, depende de la aplicación del servidor. A menudo, el recurso corresponde a un archivo o la salida de un ejecutable que residen en el servidor.

GET

GET: Pide una representación del recurso especificado. Por seguridad no debería ser usado por aplicaciones que causen efectos ya que transmite información a través de la URI agregando parámetros a la URL. La petición puede ser simple, es decir en una línea o compuesta de la manera que muestra el ejemplo.

Ejemplo:

GET /images/logo.png HTTP/1.1 obtiene un recurso llamado logo.png

Ejemplo con parámetros:

/index.php?page=main&lang=es

POST

POST: Envía los datos para que sean procesados por el recurso identificado. Los datos se incluirán en el cuerpo de la petición. Esto puede resultar en la creación de un nuevo recurso o de las actualizaciones de los recursos existentes o ambas cosas.

Más información:

Entender los métodos get y post:

Un explicación muy buena de HTTP también se puede encontrar en:  http://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html

HTTP request

Un cliente HTTP debe formar una petición HTTP al servidor de una forma determinada para que sea entendida por el servidor. Cuando Arduino trabaja como cliente hay que programar esta petición correctamente.

Formación de un HTTP request, esta petición habrá que programar en Arduino:

Trama en HTTP, fijaros en el uso de cr (retorno de carro – carriage return – ASCII 13) y lf (line feed – nueva linea – ASCII 10): http://www1.ju.edu.jo/ecourse/abusufah/cpe532_Spr06/notes/BookOnLine/HTTP%20Request%20Message.htm

HTTP/1.1 se definió en el estándar RFC2616,que es la más usada actualmente. En junio de 2014 RFC2616 se retiró y HTTP/1.1 se redefinió en RFCs 7230, 7231, 7232, 7233, 7234, and 7235, HTTP/2 está en proceso de definición.

Y cuando usar GET o POST?: http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

HTTP response

Después de recibir e interpretar el servidor un HTTP request, el servidor debe responder con un mensaje de respuesta:

Para cumplir con el protocolo HTTP, arduino debe implementar estas respuestas cuando lo uso como servidor web.

Veamos esto gráficamente:

Ejercicio: Ver las tramas HTTP con las funciones de depuración del navegador y también con wireshark, un web sniffer on-line y algún plugin para el navegador.

WireShark: https://www.wireshark.org/

Chrome plugin Sniffer: http://5ms.ru/sniffer/

on-line: http://web-sniffer.me/

Listado de web sniffers: http://scraping.pro/web-sniffers-review/

TCP/IP

El modelo TCP/IP describe un conjunto de guías generales de diseño e implementación de protocolos de red específicos para permitir que un equipo pueda comunicarse en una red. TCP/IP provee conectividad de extremo a extremo especificando como los datos deberían ser formateados, direccionados, transmitidos, enrutados y recibidos por el destinatario.

Más información: https://es.wikipedia.org/wiki/Modelo_TCP/IP

La importancia del modelo TCP/IP es que es el modelo usado para acceder a Internet o a redes internas (Intranet) de ordenadores. Arduino va a permitir conectarse a Internet o a una red interna mediante TCP/IP y poder realizar múltiples operaciones o usarse como pasarela para conectar a Internet dispositivos que no tienen esa capacidad. La implementación de la pila de protocolos de TCP/IP en Arduino se hace mediante un shield o HW adicional que nos da la capa de acceso a red (ethernet o WiFi), internet (IP) y transporte. La capa de aplicación deberemos implementarla dentro de Arduino ya sea directamente o mediante una librería.

En el caso del protocolo TCP/IP la pila OSI se simplifica:

Capa de Aplicación. Invoca programas que acceden servicios en la red. Interactúan con uno o más protocolos de transporte para enviar o recibir datos, en forma de mensajes o bien en forma de flujos de bytes.
Capa de Transporte. Provee comunicación extremo a extremo desde un programa de aplicación a otro. Regula el flujo de información. Puede proveer un transporte confiable asegurándose que los datos lleguen sin errores y en la secuencia correcta. Coordina a múltiples aplicaciones que se encuentren interactuando con la red simultáneamente de tal manera que los datos que envíe una aplicación sean recibidos correctamente por la aplicación remota, esto lo hace añadiendo identificadores de cada una de las aplicaciones. Realiza además una verificación por suma, para asegurar que la información no sufrió alteraciones durante su transmisión.
Capa Internet. Controla la comunicación entre un equipo y otro, decide qué rutas deben seguir los paquetes de información para alcanzar su destino. Conforma los paquetes IP que será enviados por la capa inferior. Desencapsula los paquetes recibidos pasando a la capa superior la información dirigida a una aplicación.
Capa de Interfaz de Red. Emite al medio físico los flujos de bit y recibe los que de él provienen. Consiste en los manejadores de los dispositivos que se conectan al medio de transmisión.

Más información en: http://www.uca.edu.sv/investigacion/tutoriales/tcp-ip.html

Los elementos de red (switches, routers, etc…) no llegan hasta la última capa y se podría representar así la comunicación entre dos dispositivos.

Algunos elementos de la red de comunicación pueden llegar a capas superiores a la de red e incluso hasta la capa de aplicación como los firewalls para detectar ataques en capas superiores. Es el caso de firewalls de estado y de aplicación. Un cortafuegos de aplicación puede filtrar protocolos de capas superiores tales como FTP, TELNET, DNS, DHCP, HTTP, TCP, UDP y TFTP (GSS). Por ejemplo, si una organización quiere bloquear toda la información relacionada con una palabra en concreto, puede habilitarse el filtrado de contenido para bloquear esa palabra en particular. No obstante, los cortafuegos de aplicación resultan más lentos que los de estado.

Conexión y desconexión

El proceso de establecimiento de una conexión TCP se denomina “three way handshake” Durante el establecimiento de la conexión, se configuran algunos parámetros tales como el número de secuencia con el fin de asegurar la entrega ordenada de los datos y la robustez de la comunicación.

Aunque es posible que un par de entidades finales comiencen una conexión entre ellas simultáneamente, normalmente una de ellas abre un socket en un determinado puerto TCP y se queda a la escucha de nuevas conexiones. Es común referirse a esto como apertura pasiva, y determina el lado servidor de una conexión. El lado cliente de una conexión realiza una apertura activa de un puerto enviando un paquete SYN inicial al servidor como parte de la negociación en tres pasos. En el lado del servidor (este receptor también puede ser una PC o alguna estación terminal) se comprueba si el puerto está abierto, es decir, si existe algún proceso escuchando en ese puerto, pues se debe verificar que el dispositivo de destino tenga este servicio activo y esté aceptando peticiones en el número de puerto que el cliente intenta usar para la sesión. En caso de no estarlo, se envía al cliente un paquete de respuesta con el bit RST activado, lo que significa el rechazo del intento de conexión. En caso de que sí se encuentre abierto el puerto, el lado servidor respondería a la petición SYN válida con un paquete SYN/ACK. Finalmente, el cliente debería responderle al servidor con un ACK, completando así la negociación en tres pasos (SYN, SYN/ACK y ACK) y la fase de establecimiento de conexión. Es interesante notar que existe un número de secuencia generado por cada lado, ayudando de este modo a que no se puedan establecer conexiones falseadas (spoofing).

Más información:

La fase de finalización de la conexión utiliza una negociación en cuatro pasos (four-way handshake), terminando la conexión desde cada lado independientemente. Sin embargo, es posible realizar la finalización de la conexión en 3 fases; enviando el segmento FIN y el ACK en uno solo. Cuando uno de los dos extremos de la conexión desea parar su «mitad» de conexión transmite un segmento con el flag FIN en 1, que el otro interlocutor asentirá con un ACK. Por tanto, una desconexión típica requiere un par de segmentos FIN y ACK desde cada lado de la conexión.

Una conexión puede estar «medio abierta» en el caso de que uno de los lados la finalice pero el otro no. El lado que ha dado por finalizada la conexión no puede enviar más datos pero la otra parte si podrá.

Es importante conocer este apartado porque a pesar que esta negociación la hace el shield de Ethernet o Wifi y no se programa en Arduino, sirve para saber qué está pasando cuando Arduino actúa como cliente o servidor y poder hacer depuración cuando tenemos errores.

Todo este proceso o cualquier otro podemos verlo con una analizado de protocolos como wireshark https://www.wireshark.org/

Ver con el wireshark el proceso de 3 way handshaking:

Direccionamiento IP

TCP/IP utiliza un identificador denominado dirección internet o dirección IP, cuya longitud es de 32 bytes. La dirección IP identifica tanto a la red a la que pertenece una computadora como a ella misma dentro de dicha red.

  • Longitud de 32 bits.
  • Identifica a las redes y a los nodos conectados a ellas.
  • Especifica la conexión entre redes.
  • Se representan mediante cuatro octetos, escritos en formato decimal, separados por puntos.

Existen ciertas direcciones en cada clase de dirección IP que no están asignadas y que se denominan direcciones privadas. Las direcciones privadas pueden ser utilizadas por los hosts que usan traducción de dirección de red (NAT) para conectarse a una red pública o por los hosts que no se conectan a Internet. En una misma red no pueden existir dos direcciones iguales, pero sí se pueden repetir en dos redes privadas que no tengan conexión entre sí o que se conecten mediante el protocolo NAT. Las direcciones privadas son:

  • Clase A: 10.0.0.0 a 10.255.255.255 (8 bits red, 24 bits hosts).
  • Clase B: 172.16.0.0 a 172.31.255.255 (16 bits red, 16 bits hosts). 16 redes clase B contiguas, uso en universidades y grandes compañías.
  • Clase C: 192.168.0.0 a 192.168.255.255 (24 bits red, 8 bits hosts). 256 redes clase contiguas, uso de compañías medianas y pequeñas además de pequeños proveedores de internet (ISP).

Clases de direcciones IP:

Clases Número de Redes Número de Nodos Rango de Direcciones IP
A 127 16,777,215 1.0.0.0 a la 127.0.0.0
B 4095 65,535 128.0.0.0 a la 191.255.0.0
C 2,097,151 255 192.0.0.0 a la 223.255.255.0

Subredes en IP:

  • Las Subredes son redes físicas distintas que comparten una misma dirección IP.
  • Deben identificarse una de otra usando una máscara de subred.
  • La máscara de subred es de cuatro bytes y para obtener el número de subred se realiza un operación AND lógica entre ella y la dirección IP de algún equipo.
  • La máscara de subred deberá ser la misma para todos los equipos de la red IP.

El enrutamiento sirve para alcanzar redes distantes. Las direcciones IP se agrupan en clases. Ahora bien para cada clase se pueden contar con un número determinados de subredes. Las subredes son redes físicas independientes que comparten la misma dirección IP (es decir aquella que identifica a la red principal). La pregunta entonces es ¿cómo se logra que equipos que comparten el mismo identificador de red pero se sitúan en redes físicas diferentes podrán comunicarse usando compuertas? La solución a este problema es determinando una máscara de dirección.

Supóngase que la dirección IP de  una equipo es 148.206.257.2. La máscara de subred es 255.255.255.0. El equipo por tanto está en la subred 148.206.257.0

Una dirección IP dinámica es una IP asignada mediante un servidor DHCP (Dynamic Host Configuration Protocol) al usuario. La IP que se obtiene tiene una duración máxima determinada. El servidor DHCP provee parámetros de configuración específicos para cada cliente que desee participar en la red IP. Entre estos parámetros se encuentra la dirección IP del cliente.

Las IP dinámicas son las que actualmente ofrecen la mayoría de operadores. El servidor del servicio DHCP puede ser configurado para que renueve las direcciones asignadas cada tiempo determinado.

Más información de DHCP: http://es.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol

Protocolo de Mensajes de Control de Internet ICMP (Internet Control Message Protocol)

  • Reporta sobre destinos inalcanzables.
  • Control de flujo de datagramas y congestión.
  • Controla los requerimiento de cambio de rutas entre compuertas.
  • Detecta rutas circulares o excesivamente largas.
  • Verifica la existencia de trayectorias hacia alguna red y el estatus de la misma.

La función de la dirección IPv6 es exactamente la misma que la de su predecesor IPv4, pero dentro del protocolo IPv6. Está compuesta por 128 bits y se expresa en una notación hexadecimal de 32 dígitos. IPv6 permite actualmente que cada persona en la Tierra tenga asignados varios millones de IPs, ya que puede implementarse con 3.4×10E38 hosts direccionables. La ventaja con respecto a la dirección IPv4 es obvia en cuanto a su capacidad de direccionamiento.

IPv6 admite 340.282.366.920.938.463.463.374.607.431.768.211.456 (340 sextillones de direcciones) —cerca de 6,7E17 (670 mil billones) de direcciones por cada milímetro cuadrado de la superficie de La Tierra.

Su representación suele ser hexadecimal y para la separación de cada par de octetos se emplea el símbolo «:». Un bloque abarca desde 0000 hasta FFFF. Algunas reglas de notación acerca de la representación de direcciones IPv6 son:

Los ceros iniciales se pueden obviar.

Ejemplo: 2001:0123:0004:00ab:0cde:3403:0001:0063 -> 2001:123:4:ab:cde:3403:1:63

Los bloques contiguos de ceros se pueden comprimir empleando «::». Esta operación sólo se puede hacer una vez.

Más información en: http://es.wikipedia.org/wiki/IPv6

Más información sobre el direccionamiento IP en: http://es.wikipedia.org/wiki/Direcci%C3%B3n_IP

Ethernet: http://es.wikipedia.org/wiki/Ethernet

Dirección MAC

En las redes, la dirección MAC (siglas en inglés de media access control; en español «control de acceso al medio») es un identificador de 48 bits (6 bloques hexadecimales) que corresponde de forma única a una tarjeta o dispositivo de red. Se conoce también como dirección física, y es única para cada dispositivo. Está determinada y configurada por el IEEE (los últimos 24 bits) y el fabricante (los primeros 24 bits) utilizando el organizationally unique identifier. La mayoría de los protocolos que trabajan en la capa 2 del modelo OSI usan una de las tres numeraciones manejadas por el IEEE: MAC-48, EUI-48, y EUI-64, las cuales han sido diseñadas para ser identificadores globalmente únicos. No todos los protocolos de comunicación usan direcciones MAC, y no todos los protocolos requieren identificadores globalmente únicos.

Las direcciones MAC son únicas a nivel mundial, puesto que son escritas directamente, en forma binaria, en el hardware en su momento de fabricación.

En Arduino es importante poner la dirección MAC correcta para evitar problemas.

En el caso del shield ethernet, la MAC no está incluida en el integrado que implementa la pila de protocolos TCP/IP, sino que se debe configurar y eso lo hace Arduino desde el setup().

Más información en: http://es.wikipedia.org/wiki/Direcci%C3%B3n_MAC

Tutorial TCP/IP: http://www.uca.edu.sv/investigacion/tutoriales/tcp-ip.html

Uso de Motores

Motores DC

Ejercicio. Mover un motor DC de 9V usando un integrado L293D (Quadruple Half-H driver). Para controlar la velocidad del motor se usará un potenciómetro conectado al pin A0. Además se usarán dos botones, uno conectado al pin digital 4 para controlar el sentido de giro del motor y otro conectado al pin digital 5 que controlará el encendido y apagado del motor. Con cada pulsación encendemos y apagamos el motor o usamos una dirección de giro u otra con el otro botón.

Datasheet: https://www.arduino.cc/documents/datasheets/H-bridge_motor_driver.PDF

Montaje:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio21-MotorDC_1

Ejercicio Avanzado. Añadir rampa de aceleración/deceleración para arranque, parada y cambio de sentido para que pase por cero con una compilación de “seguridad” y sin ella. Añadir una parada de emergencia que tenga preferencia sobre todo y pare de golpe al pulsar un botón de emergencia (seta de emergencia), ver manejo de prioridades.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio21-MotorDC_2

Ejercicio Motor Shield: Uso del Arduino Motor Shield para controlar la dirección de giro un motor DC. En este caso es necesario alimentar Arduino con una fuente de alimentación o mediante una batería, puesto que con la energía de USB no es posible mover el motor. También es posible alimentar Arduino por USB y alimentar independientemente el shield a través de las bornas marcadas con + y -. El voltaje debe ser el correspondiente al que use el motor DC.

Tutorial: https://www.arduino.cc/en/Tutorial/DueMotorShieldDC

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio47-Motor_Shield

Servo

Ejercicio: Controlar la posición de un servo con un potenciómetro.

Solución: http://arduino.cc/en/Tutorial/Knob

Ejercicio: Programar un barrido continuo del 0 a 180º en un servo. Activar y desactivar el barrido con una pulsación de un botón. p.e. activación de un limpiaparabrisas.

Solución: http://arduino.cc/en/Tutorial/Sweep

Motores

Como ya se ha visto anteriormente, un pin de Arduino solo puede tener los valores de 0 y 5 voltios y dar hasta 40 mA. Esto es insuficiente para mover un motor del tipo que sea, por lo tanto si queremos que Arduino maneje un motor, deberemos usar un driver.

Un motor driver es un amplificador de corriente cuya función es tomar una pequeña señal de control de baja corriente y convertirla en una señal de alta corriente que pueda alimentar el motor.

Hay muchos tipos de motor drivers en función del motor a manejar, máximo voltaje, máxima corriente de salida, etc…

Más información: http://www.futureelectronics.com/en/drivers/motor-driver.aspx

Motor DC

Un motor de corriente continua convierte la energía eléctrica en mecánica. Se compone de dos partes: el estator y el rotor. El estator es la parte mecánica del motor donde están los polos del imán. El rotor es la parte móvil del motor con devanado y un núcleo, al que llega la corriente a través de las escobillas. Si queremos cambiar el sentido de giro del rotor, tenemos que cambiar el sentido de la corriente que le proporcionamos al rotor, basta con invertir la polaridad de la pila o batería.

Para controlar un motor DC desde Arduino, tendremos que usar un driver para motores para proporcionar más corriente al motor ya que las salidas del Arduino sólo dan hasta 40mA. Con el driver podemos alimentar el motor con una fuente de alimentación externa.

Más información: http://www.prometec.net/motorcc/

El L293D es un integrado para controlar motores DC que usa el sistema puente en H. Es un sistema para controlar el sentido de giro de un motor DC usando cuatro transistores y también la velocidad del motor.  En la imagen vemos que los transistores se comportan como interruptores y dependiendo que transistores conducen y cuáles no cambia la polarización del motor, y con esto el sentido de giro.

El L293D tiene dos puentes H y proporciona 600mA al motor y soporta un voltaje entre 4,5V y 36V tal y cómo pone en el datasheet: http://www.ti.com/lit/ds/symlink/l293d.pdf

Nosotros usaremos la parte de la izquierda (los diodos externos hay que ponerlos para evitar las corrientes inducidas del motor si usamos el modelo L293 y están incluidos en el integrado si usamos el L293D). Como se aprecia en la imagen, los pins 3 y 6 son las salidas y se conectan a los bornes del motor. Y los pins 2 y 7 son las entradas donde conectaremos las salidas del Arduino. Dependiendo qué valor ponemos entre los pines 2 y 7 el motor girará en un sentido o en otro.

Es muy IMPORTANTE que se utiliza el driver L293, hay que poner diodos para evitar dañar el integrado con las corrientes parásitas generadas por los propios solenoides de las cargas. No obstante el modelo L293D no los necesita, ya que, los lleva incorporados el propio integrado, lo que se hace “más sencillo” y “económico” su uso. También es cierto que L293 al no llevarlos integrados nos permite escoger los que mejor se adapten a nuestras cargas o necesidades.

Para controlar la velocidad del motor se usa la técnica de PWM. Sabemos que hay que atacar los pins 2 y 7 del L293D desde dos salidas del Arduino. En estas dos salidas habrá un PWM a cada una. Pero tenemos que invertir un PWM. ¿Qué quiere decir invertir? Pues que cuando en un PWM tengamos un pulso a un valor alto, en el otro PWM el mismo pulso sea valor bajo. En la imagen lo entenderemos de una manera más gráfica.

Montaje:

Más información y código en: http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/

Tutorial para controlar un motor con Arduino: http://www.allaboutcircuits.com/projects/use-an-arduino-to-control-a-motor/

Ejemplo del playground de Arduino: http://playground.arduino.cc/Main/DirectionalMotorControlWithAL293D

Otro driver de motor muy utilizado es el L298 (datasheet) que es el utilizado por el motor shield. Este driver es similar en funcionamiento al anterior pero posee un sensor de corriente muy útil.

Montaje

Diagrama

Esquema de conexión

Diferencias entre el L293 y el L298:

  • L293 es un quadruple half-H driver y el L298 es un dual full-H driver
  • El L293 al tener 4 canales permite manejar motores paso a paso de 4 hilos y el L298 solo tiene dos canales perfecto para manejar dos motores DC. En el L293 las cuatro lineas de entrada/salida son independientes.
  • La corriente de salida por canal en el L293 es de 1A, mientras que en el L298 es de 2A, por ese motivo el L298 puede llevar un disipador.
  • Los diodos protectores del L293D deben ponerse externamente en el L293 y L298

Motores DC Brushless

Hay motores DC brushless: https://en.wikipedia.org/wiki/Brushless_DC_electric_motor

Para cotrolar los motores brushless necesitaremos un ESC (Electronic Speed Control) https://en.wikipedia.org/wiki/Electronic_speed_control

Los motores brushless se usan habitualmente en los drones son trifásicos con un variador para controlar de forma muy exacta la velocidad del motor.

Más información: https://learn.adafruit.com/adafruit-motor-selection-guide/brushless-dc-motor-control  

Arduino Motor Shield

El Arduino motor shield está basado en el L298 que es un dual full-bridge diseñado para cargas inductivas como relés, solenoides y motores DC o paso a paso. Me permite manejar dos motores DC controlando las velocidad y dirección de cada motor de forma independiente. También permite medir la corriente absorbida por cada motor entre otras características. La corriente máxima que puede manejar con 2A por canal y el voltaje máximo de suministro es de 50V.

Esquemático: https://www.arduino.cc/en/uploads/Main/arduino_MotorShield_Rev3-schematic.pdf

Arduino motor shield puede ser alimentado por una fuente externa, por lo tanto debemos alimentar al Arduino conectado al motor shield mediante el alimentador y no es posible alimentarlo por USB porque la corriente del motor puede exceder la corriente máxima del estándar USB. El L298 también tiene un alimentación lógica que toma de los 5V de Arduino.

El L298 necesita dos alimentaciones, una para la parte de control (5V) y otra para los motores (12V). La de los motores en tu caso la coge del Vin al que conectas la fuente conmutada de 12V.

Al alimentar desde LSP5 (Borna marcada con Vin MAX 12V), es el VMOT que alimenta Vin según el esquemático de motor shield y al L298P. La alimentación lógica del L298P se hace a través del regulador de tensión del Arduino.

Al alimentar el Arduino mediante el Vin el Motor Shield, puede ser problemático, puesto que al alimentar Arduino a través del Vin no tenemos la protección del diodo M7 ni el condensador para estabilizar el voltaje, por lo que en caso de intercambiar la polaridad se puede dañar Arduino y además si al arrancar un motor el voltaje de Vin cae por debajo de un valor puede ocurrir que el regulador de tensión NCP1117 no sea capaz de dar 5V a su salida y en ese caso Arduino se reiniciaría. Además el NCP1117 tiene una caída de tensión, por lo que para alimentar el Arduino a través de Vin como indica la documentación de Arduino debe ser con un valor entre 7 y 12 V.

Tener en cuenta que si alimento a través de Vin, pero tengo conectado el USB a Arduino, entonces, el MOSFET FDN340P permitirá alimentar el microcontrolador cuando Vin/2 < 3.3V y no se produce el reinicio de la MCU, actuando como una fuente de alimentación de backup.

Esquema del Arduino UNO: https://www.arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf

Para evitar posibles daños al Arduino sobre el que va montado el motor shield, si el motor requiere más de 9V, es recomendable separar las líneas de alimentación del shield y del Arduino, esto es posible cortando el jumper “Vin Connect” que está en la parte trasera del shield.

En caso de problemas, la solución es alimentar por separado Arduino y el motor shield y cortar el Vin-Connect.

Los pines de alimentación en el Arduino motor shield son:

  • Vin en la borna de conexiones, es la entrada de alimentación a los motores conectados al shield. Una fuente de alimentación externa conectada a esta borna también alimenta a la placa Arduino sobre la que va montada el shield. Cortando el jumper “Vin Connect” se elimina esta alimentación a Arduino.
  • GND es la masa de los motores que va unida a la masa del Arduino.

Este shield dispone de dos canales llamados A y B y cada uno usa 4 de los pines de Arduino para manejar o monitorizar el motor. En total se usan 8 pines. Se pueden usar los canales separados para manejar dos motores DC o combinarlos para manejar un motor paso a paso bipolar.

Los pines son:

Function pins per Ch. A pins per Ch. B
Direction D12 D13
PWM D3 D11
Brake D9 D8
Current Sensing A0 A1

Si no se necesita el freno y el sensor de corriente, es posible deshabilitar estas características cortando los correspondientes jumpers en la parte trasera del shield.

Los pines de freno al ponerlos a HIGH frenan el motor en lugar de dejarlos correr libremente al cortar la alimentación.

Mediante la función analogRead()  es posible leer la corriente en los pines de current sensing  como una entrada analógica normal. Está calibrado para medir 3.3V para la corriente máxima de 2A.

Esquema: https://www.arduino.cc/en/uploads/Main/arduino_MotorShield_Rev3-schematic.pdf

Más información: https://www.arduino.cc/en/Main/ArduinoMotorShieldR3

Ejemplos de uso:

NOTA: El Motor Shield de arduino.cc ha sido retirado, pero arduino.org comercializa el Arduino Motor Shield que es el mismo: http://www.arduino.org/products/shields/arduino-motor-shield

Otros shields y breakout board para motores DC

Adafruit Motor Shield:

L298N Breakout Board (Esta breakout board es muy sencilla y bien documentada):

Specification:

  • chipset: L298N
  • Driving power supply voltage Vs: +5V  to +46V
  • Peak current of driving power supply Io: 2A
  • Vss: +5V to +7V
  • Current of logic power supply: 0 – 36mA
  • PWM control signal range:
    • Low level: -0.3V < Vin < 1.5V
    • High level: 2.3V < Vin< Vss
  • Enable signal range:
    • Low level: -0.3V
    • High level: 2.3V < Vin< Vss
  • Maximum power consumption: 25W
  • Working temperature: -25C to 130C
  • Regulador de tensión para los 5V.

Esquemático:

Servomotor

Servomotor (o también llamado servo) es similar a un motor de corriente continua pero con la capacidad de posicionarse en una posición determinada y permanecer fija en esta. Normalmente el ángulo es de 0 a 180 grados, y se alimentan a 5 voltios mínimo.

Algunos servos servos pueden alimentarse directamente desde Arduino sin necesidad de un driver, lo que supone una ventaja en algunos casos.

Un servomotor está formado por un motor de corriente continua, una caja reductora, un juego de engranajes, un potenciómetro y un circuito de control. Puede aguantar cierto peso a través del par o torque del servo indicado en sus características. Normalmente se indica con Kg/cm, que quiere decir los kilos que aguanta a 1 cm de distancia.

 

Para controlar un servo, se usa el PWM. La mayoría trabaja en una frecuencia de 50 Hz (20ms). Cuando se manda un pulso, la anchura de este determina la posición angular del servo. La anchura varía según el servomotor pero normalmente es entre 0,5ms a 2,5ms.

El Arduino utiliza la librería <Servo.h> para controlar los servos y usa las siguientes funciones:

Fuente, más información y códigio en: http://diymakers.es/controlar-servomotor-con-mando-ir/

Más información: http://en.wikipedia.org/wiki/Servomotor

Si queremos tener control de bucle cerrado con un motor DC como tenemos con los servos, podemos hacerlo incorporando un encoder al motor DC.

Servo de rotación continua

Un servo de rotación continua es un motor cuyo circuito electrónico nos permite controlar la dirección de giro. A diferencia del servos anteriormente mencionados, no se detiene en una posición, sino que gira continuamente. Son muy utilizados en robótica y en muchas aplicaciones electrónicas, como en lectores de DVD.

En un servo de rotación continua, la función write() configura la velocidad del servo en lugar del ángulo de posición. En este caso 0 es máxima velocidad en giro contrario al sentido horario, 180 es máxima velocidad en sentido horario y 90 motor parado.

Trucar un servo a rotación continua: http://www.ardumania.es/trucar-servo-a-rotacion-continua/

Servo de rotación continua comerciales:

Tutorial sencillo de BQ: http://diwo.bq.com/muevete-el-servo-de-rotacion-continua/

Tutorial más completo de servos de rotación continua:

Calibrador de servo: http://www.instructables.com/id/Servo-calibrator-GUI/

Servo driver para Raspberry Pi: https://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/overview

Motor paso a paso

Un motor paso a paso (también llamado stepper) es un dispositivo electromagnético que convierte impulsos eléctricos en movimientos mecánicos de rotación. La principal característica de estos motores es que se mueven un paso por cada impulso que reciben. Normalmente los pasos pueden ser de 1,8º a 90º por paso, dependiendo del motor. Son motores con mucha precisión, que permiten quedar fijos en una posición (como un servomotor) y también son capaces de girar libremente en un sentido u otro (como un motor DC).

Cuando circula corriente por una o más bobinas del estator se crea un campo magnético creando los polos Norte-Sur. Luego el rotor se equilibrará magnéticamente orientando sus polos Norte-Sur hacia los polos Sur-Norte del estator. Cuando el estator vuelva a cambiar la orientación de sus polos a través de un nuevo impulso recibido hacia sus bobinas, el rotor volverá a moverse para equilibrarse magnéticamente. Si se mantiene esta situación, obtendremos un movimiento giratorio permanente del eje. El ángulo de paso depende de la relación entre el nombre de polos magnéticos del estator y el nombre de polos magnéticos del rotor.

Los motores bipolares son más complejos de controlar ya que el flujo de corriente tiene que cambiar de dirección a través de las bobinas con una secuencia determinada. Para esto debemos conectar cada una de las dos bobinas en un puente en H (H-Bridge). Para esto, utilizaremos el integrado L293 que contiene dos H-Bridge (datasheet).

Para controlar motores paso a paso con Arduino, utilizaremos la librería <Stepper.h>:

Fuente, más información y código en:

Un ejemplo de driver de un motor paso a paso https://www.pololu.com/product/2133

Datasheet del driver: https://www.pololu.com/file/download/drv8825.pdf?file_id=0J590

Este tipo de motor es más lento, su rotación es más precisa, es de fácil configuración y control, además mientras que los servos requieren un mecanismo de retroalimentación y circuitos de soporte para accionamiento de posicionamiento, un motor paso a paso tiene control de posición a través de su naturaleza de rotación por incrementos fraccionales.

Los motores paso a paso son adecuados para las impresoras 3D y dispositivos similares en los que la posición es fundamental.

Además de los drivers de motores paso a paso como los puente H y los darlingtong array, es posible usar otros drivers como Easydriver que funciona dando los pasos y la dirección. Más información:

Para los motores paso a paso podemos usar las mismas shields que para los motores DC:

Más Motores

Los de alterna monofásicos podemos controlar su encendido, apagado y sentido de giro con un relé o un contactor y estos a su vez controlados con un Arduino como se ha visto anteriormente.

Los motores trifásicos habrá que usar un arrancador para controlar su encendido y apagado y un variador para controlar la velocidad y podríamos controlarlos estos mediante señales adecuadas desde Arduino como modbus.

Disponemos de shields para controlar múltiples motores, ya sean DC, servos o paso a paso.

A la hora de seleccionar un motor, hay varios factores que deben evaluarse antes de decidir qué tipo utilizar. Estos factores incluyen velocidad, par, bucle abierto o cerrado, resolución, precio y mantenimiento.

La velocidad es uno de los criterios más importantes a tener en cuenta al elegir entre servo y motor paso a paso. Hay una relación inversa entre velocidad y par en los motores por pasos. Cuando la velocidad se incrementa, el par decrece. Los motores servo tienen un par constante hasta la velocidad nominal. Como criterio general, por encima de 1000 rpm, debe seleccionarse servo. Si la velocidad está por debajo de 500 rpm, los motores por pasos son una buena elección porque producen un par más alto que el servomotor de tamaño equivalente. Los servomotores tienen la capacidad de producir un par pico en cortos periodos de tiempo que es hasta 8 veces su par nominal continuo. Esto es particularmente útil cuando la resistencia del movimiento no es constante. Los motores por pasos no tienen esta capacidad.

En algunos casos que requieren la alta velocidad, alta aceleración o aplicaciones críticas, el bucle cerrado es importante. Esto ocurre por ejemplo cuando se trabaja con accesorios caros en los que los fallos no son aceptables.

Guía de selección de motores: https://learn.adafruit.com/adafruit-motor-selection-guide/types-of-motors

Web como muchos motores: https://www.servocity.com/

Por ejemplo de un motor CC con reductora y encoder: https://www.servocity.com/html/26_rpm_planetary_gearmotor_w__.html#.VpfFM_nhDct