Objetivos
Material requerido.
Arduino Uno o similar. | |
Shield Eternet | |
Cables Dupont Macho-Hembra | |
Cables Dupont Macho-Hembra | |
Un cable Ethernet RJ45 | |
Acceso a la red local y al Switch |
Los Shield de Arduino
La ventaja de trabajar con un Arduino, es que la comunidad ha ido creando cantidad de electrónica lista para usarse, sin necesidad de protoboard. En muchos casos son placas que vienen diseñadas para encajar encima de los pines hembra de que dispone Arduino, añadiéndole funcionalidad.
A este tipo de placas prediseñadas para encajar en los pines de nuestros Duinos se les llama genéricamente Shields (Escudos), y en esta sesión vamos a utilizar un shield Ethernet que nos da acceso a la red local de que dispongamos, lo que nos abre unas posibilidades de lo más interesantes.
Para ello lo primero es encajar el shield en nuestro Arduino:
Una vez que haya encajado podéis alimentar el Arduino y luego conectar el cable de red, debería tener un aspecto similar a este, y veréis parpadear una serie de LEDs:
Por si no sabéis como conectar el Shield a la red Ethernet (Y todos hemos tenido una primera vez), la idea es que uséis un cable Ethernet con RJ45 en ambos extremos, uno de ellos va al Shield y el otro al Router o Swicth de que dispongas.
Si te conectas con un ADSL, es probable que tengas instalado un Router Swicth cuya trasera se parezca a la imagen derecha. Suelen incluir 4 entradas RJ45 (Y una RJ11, la típica telefónica)
Conecta un extremo al Swicth, oirás un clic característico y el otro al Shield Ethernet y eso es todo, tu Arduino ya está conectado a la red local y probablemente a Internet.
Probando la conexión con DHCP
Tenemos que comprobar que la conexión es válida. No es posible conocer todos los modelos de Shields Ethernet, pero normalmente incluirán un LED bajo el conector que se encenderá con el cable conectado al Swicth, y se apagará si lo sueltas. (Y lo mismo ocurrirá en el Swicth, que encenderá un piloto en el frontal, cuando detecte la conexión Ethernet.
Vamos lo primero a buscar una dirección IP valida. Para ello y por simplificar vamos a comprobar si en vuestra red existe un servidor DHCP, que recordar servía para asignarnos una dirección IP al arrancar.
Vamos a probar con uno de los ejemplos que vienen con la librería Ethernet, que por cierto viene preinstalada en el IDE de Arduino.
Tenemos que importar en primer lugar un par de librerías, la SPI que ya conocemos y la Ethernet que es nueva. Podéis hacerlo directamente desde \\Pprograma\importarLibreria
#include <SPI.h> #include <Ethernet.h
Ahora vamos a definir una dirección mac. Lo normal es que no os de problemas la habitual, pero si vais a usar más de un Shield, necesitareis cambiar al menos una. Recordad que tiene que ser diferentes para cada nodo.
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 } ;
Y ahora vamos a crear una instancia de cliente Ethernet:
EthernetClient client;
En el setup, inicializamos la puerta serie:
void setup() { Serial.begin(9600); while (!Serial) { ; // Solo para el Leonardo } }
En las versiones actuales de la librería Ethernet, si no suministramos una dirección IP propia (Luego veremos cómo), al inicializar la Ethernet, intentara conseguir una dirección mediante DHCP automáticamente, y devolverá 1 si lo consigue y 0 en caso contrario:
if (Ethernet.begin(mac) == 0) //Si devuelve error { Serial.println("No ha sido possible configurar la Ethernet por DHCP"); while (true; ) ; // No sigas, quédate aquí eternamente }
Si por el contrario devuelve un valor positivo, habrá rellenado un array Ethernet.localIP()[4],de 4 bites, con la dirección IP obtenida del DHCP
Serial.print("Mi direccion IP es: "); for (byte B = 0; B < 4; B++) { Serial.print(Ethernet.localIP()[B], DEC); Serial.print("."); } Serial.println();
El programa imprimirá, la dirección IP obtenida.
Antes de cerrar el tema el DHCP, aquí os dejo un programa que lo usa para conectar a la red e imprime los valores recibidos Prog_61_1. La salida es esta:
Si recurrís al DHCP, tenéis que ser conscientes de que tiene un coste en uso de memoria. Si queréis economizarla especificad solamente la IPAddress.ip y Arduino asignara por defecto al Gateway la dirección 1 dentro de la subred.
Que hacemos si no tenemos DHCP
Si en nuestra red no hay disponible un DHCP, o necesitamos la memoria que usa, aun no estamos perdidos. Tenemos que determinar nuestro rango de direcciones y asignarlas manualmente a nuestro Shield Ethernet.
En Windows tenemos que abrir la configuración de red. El procedimiento depende mucho de la versión, pero si podéis abrir la consola del sistema (SI, la terrible pantalla negra) acabaremos enseguida.
Normalmente, al pulsar el boto de inicio, abajo del todo hay una ventana en la que puedes escribir que pone “Buscar programas y archivos”, escribe CMD y pulsa intro. Te saldrá la temida consola en negro funesto. Escribe ipconfig y pulsa intro.
Esos valores muestran los datos de tu conexión. Como mi dirección IP es la 192.168.1.50, lo lógico es probar una dirección del tipo 192.168.1.xx, donde xx es un valor entre 0 y 255, que no coincida con otra dirección de tu red.
Prueba con un valor tipo 237, por aquello de que es una dirección rara improbable en una red doméstica.
Para forzar a nuestro Shield a una dirección determinada, sin recurrir al DHCP, podéis hacerlo creando antes de llamar a Ethernet.begin (mac), uno o varios arrays de 4 bytes:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1, 177); IPAddress gateway(192,168,1, 1); IPAddress subnet(255, 255, 0, 0);
En Mac podemos ir a Preferencias del Sistema, Red y nos saldra la configuracion directamente:
Y después podemos ya probar una dirección tipo la que definíamos para Windows.
Accediendo a una página WEB desde Arduino
El IDE incluye un ejemplo muy interesante de acceso a Google desde la Ethernet y para hacerle una consulta. Vamos s cargarlo y comprobar que nuestra conexión y configuración funcionan correctamente.
Haremos una petición desde nuestro programa de búsqueda en Google y mostraremos el resultado en la pueta serie.
Es importante que tengáis en cuenta lo siguiente:
Si vas a buscar datos concretos en el texto recibido prepararos para hacer parsing (análisis) abundante y es fácil que un UNO se os quede corto de memoria.
Aquí teneis una copia del ejemplo Ethernet\WebClient
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) char server[] = "www.google.com"; // name address for Google (using DNS) // Set the static IP address to use if the DHCP fails to assign IPAddress ip(192, 168, 1, 177); EthernetClient client ; void setup() { Serial.begin(115200); while (!Serial) ; // Para Leonardo if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, ip); } delay(1000); // Esperar a que Ethernet se inicie Serial.println("connecting..."); if (client.connect(server, 80)) { Serial.println("connected"); // Make a HTTP request: client.println("GET /search?q=arduino HTTP/1.1"); client.println("Host: www.google.com"); client.println("Connection: close"); client.println(); } else Serial.println("connection failed"); }
void loop() { if (client.available()) { char c = client.read(); Serial.print(c); } if (!client.connected()) // Si no hay conexion { Serial.println(); Serial.println("disconnecting."); client.stop(); while (true) ; // No hagas mas } }
Resumen de la sesión