El shield Wireless SD es un módulo para Arduino para proporcionar conectividad con modulos de comunicación variados tipo XBEE pero se le puede colocar cualquier otro que soporte la misma configuración física. En este caso lo usaremos para comunicar el Arduino con un módulo WiFly. Este shield tiene la ventaja de que dispone tambien de un slot para tarjetas SD lo que nos proporciona a su vez capacidad de almacenamiento para nuestros proyectos aunque su utilización no es obligatoria.
Preparando la configuración hardware
Lo primero que debemos realizar es la configuración hardware, donde en este caso, lo más importante es la forma de comunicar el microprocesador del Arduino con el módulo WiFly. El shield dispone de un pequeño interruptor que permite cierta flexibilidad en la configuración hardware de microprocesador, el módulo WiFly y el puerto de comunicaciones serie.
|
En la posición micro, la salida del Wifly está conectada al pin de escucha del micro y la entrada del Wifly a la salida del micro. De esta manera el módulo Wifle se puede comunicar con el microprocesador del Arduino, pero hay que tener en cuenta que los pines de comunicación del micro siguen conectados al puerto de comunicaciones del Arduino y este al ordenador. En este modo el microprocesador no puede ser programado desde nuestro ordenador, es decir, no podemos subir ningún sketch. Si queremos enviar comando de depuración estos saldrán por el usb y el módulo Wifly :( |
|
En el modo USB, el módulo Wifly estará conectado al puerto USB. Esto significa que el módulo se comunica directamente con nuestro ordenador y podemos configurarlo con el Teraterm pero para poder hacer esto debemos programar el micro con el sketch vacio: void setup() { } quitarlo de la placa Arduino o poner un puente entre GND y RESET :( |
Debido a que durante el desarrollo de nuestros proyectos, estar cambiando el switch y copiar el sketch vacío (o quitar el micro) es una tarea que, aunque sencilla, puede llevarnos a perder mucho tiempo yo he optado por deshabilitar la conexión física del puerto de comunicaciones entre el shield wireless y el Arduino y crear un canal serie software de comunicaciones entre el micro y el Wifly. De esta manera el puerto serie se comunica con el Arduino y el Arduino se comunica con el Wifly por otro puerto serie diferente por lo que podemos usar el puerto serie nativo para tareas de depuración.
para realizar esta configuración realizaremos algunas modificaciones algo radicales. Para empezar cortaremos los pines 1 y 2 de nuestro shield (o los podemos doblar para que no entren en contacto con el Arduino).
En mi caso y debido a que este shield se utilizará siempre para este módulo he decidido cortarlo. Tu puedes doblarlo u optar por quitar el micro, grabar el sketch vacío o poner un puente entre el reset y el GND de tu micro cada vez que quieras comunicarte directamente con el módulo Wifly. Si utilizas algún sketch ya probado quizás no sea necesario. En mi caso, al tratarse de una plataforma de desarrollo, esto me ahorra mucho tiempo ya que puedo depurar y probar mi software sin realizar cambios de configuración hardware.
Una vez que hemos inhabilitado la comunicación serie del shield con el Arduino pasamos a crear un canal virtual serie entre los pines 8 y 9 del Arduino. Esto se realiza con la librería SoftSerial donde podéis encontrar más información aquí. Más adelante veremos como utilizarla.
Recuerda qué lo que queremos es que el módulo Wifly se comunique con microprocesador para intercambiar comandos e información de configuración con él por lo que la posición del switch deberá estar en modo micro.
Así, el Arduino dispondrá de dos puertos serie: el nativo USB qué usaremos para programarlo y para enviar información de depuración y el puerto virtual para la comunicación entre el microprocesador y el WiFly.
Una vez disponemos de nuestro entorno hardware preparado vamos a por el software. Para ello utilizaremos una de las mejores librerías para la comunicación y configuración del WiFly RN-XV. La librería WiFlyHQ de Harlequin-tech.
La librería de comunicaciones WiFlyHQ de Harlequin-tech
Esta librería se encuentra alojada en Github aquí y es una de las mejores librerias que exiten. Además dispone de una buena documentación así como muchos ejemplos que nos ayudarán a aprender a utilizar esta librería de manera rápida y sencilla.
Existen muchos ramas o versiones de esta librería donde programadores han dotado de mayor potencia y añadido nuevas funcionalidades a la misma por lo que si queréis, podéis utilizar cualquiera de dichas variantes. En este caso usaremos la rama de desarrollo principal.
Para usarla tan sólo debéis descargar el zip e instalarla en vuestro IDE de desarrollo de Arduino (aquí os dejo cómo hacerlo) o si conocéis el funcionamiento de Git, clonar dicho repositorio en vuestro espacio. En este caso la descargaremos e instalaremos.
Para comprobar que hemos instalado bien la librería iremos al menu de nuestro IDE de programación y veremos si está instalada y accesible.
Si todo va bien, ya podemos cargar algunos de los programas de ejemplo que trae la librería para probar cómo nuestro Arduino se comunica con Internet por medio de una red Wifi.
Puedes probar abriendo la aplicación básica "httpclient" para probarlo todo. Vamos a ir desgranando a continuación las líneas clave del programa. Añado comentarios en el siguiente código y quitaré lo innecesario para comprender el uso de la librería.
// Incluimos la librería para trabajar con el módulo Wifly
#include <WiFlyHQ.h>
// Cargamos la librería para trabajar con el puerto serie virtual, el que nos permitirá
// comunicarnos entre el Arduino y el modulo Wifly a través, en este caso, de los pines 8 y 9
#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(8,9);
// Creamos la variable tipo Wifly que gestiona todo lo referente al módulo
WiFly wifly;
// Configuramos la red wifi a la que nos queremos conectar y la clave
const char mySSID[] = "myssid";
const char myPassword[] = "my-wpa-password";
void setup()
{
char buf[32];
// Iniciamos el puerto serie entre el arduino y el ordenador a 115200
Serial.begin(115200);
// Iniciamos el puerto serie virtual entre el arduino y el módulo Wifly a 9600
wifiSerial.begin(9600);
// Miramos si el módulo responde, esto nos ayudará a saber si toda la configuración
// hardware está correcta
if (!wifly.begin(&wifiSerial, &Serial)) {
Serial.println("Failed to start wifly");
terminal();
}
// Si no estamos conectados nos conectamos a la red Wifi
//usando los parámetros de configuración del inicio del programa
if (!wifly.isAssociated()) {
// Establecemos los parámetros de configuración de la conexión
wifly.setSSID(mySSID);
wifly.setPassphrase(myPassword);
wifly.enableDHCP();
// Nos conectamos a la red Wifi
if (wifly.join()) {
Serial.println("Joined wifi network");
}
}
// Mostramos información del adaptador: la mac, ip, etc..
Serial.print("MAC: ");
Serial.println(wifly.getMAC(buf, sizeof(buf)));
Serial.print("IP: ");
Serial.println(wifly.getIP(buf, sizeof(buf)));
Serial.print("Netmask: ");
Serial.println(wifly.getNetmask(buf, sizeof(buf)));
Serial.print("Gateway: ");
Serial.println(wifly.getGateway(buf, sizeof(buf)));
// Le ponemos un identificador a nuestro cliente
wifly.setDeviceID("Wifly-WebClient");
// Abrimos una conexión con el puerto 80
if (wifly.open("www.google.com", 80)) {
Serial.print("Connected to google");
// Y enviamos una petición http para recoger la página
wifly.println("GET / HTTP/1.0");
wifly.println();
}
}
// Mostramos todo lo que nos llega de la wifi, en este caso el código html
// de la página web de google.com
void loop()
{
if (wifly.available() > 0) {
char ch = wifly.read();
Serial.write(ch);
}
if (Serial.available() > 0) {
wifly.write(Serial.read());
}
}
He quitado algún código para hacerlo más legible y he añadido algunos comentarios que creo que pueden ser interesantes Espero que con este tutorial hayamos aprendido a sacarle todo el potencial a nuestro Arduino y nuestro módulo Wifly usando uno de los shields más usados para las comunicaciones Wifi.