bclose

Jugando con WIFI Shield CC3000

Localizando tu posición global mediante tu IP pública

Objetivos

 

 

    • Continuar jugando con el WIFI Shield CC3000.
    • Introducir el concepto de servicios JSON en Internet.
    • Ver un pequeño ejemplo de cómo usarlo en nuestros programas.
    • Presentar un ejemplo de geo localización mediante un servicio de JSON.

 

Material requerido.

Version R3

Arduino MEGA.

 

Shield basado en CC3000

Un WIFI Shield basado en el chip Texas Instruments CC3000

El Shield WIFI CC3000

 

En la última sesión empezamos a jugar con este Shield WIFI que incorpora el chip de Texas Instruments CC3000, y la verdad es que me sorprendió gratamente, por lo que me he animado a profundizar un poco más con él para ver qué cosas podemos hacer.

Y entre las cosas que me han llamado la atención están los varios ejemplos que vienen con la librería de Adafruit, porque me han parecido muy interesantes e instructivos, para que los incorporemos en nuestros proyectos.

Una de las ventajas que supone esta librería está en que viene con  un buen número de ejemplos (15) a cual más interesante, tanto que vamos a revisar en este capítulo uno de ellos que nos muestra cómo obtener la localización aproximada de nuestra posición mediante el servicio web de freegeoIp.net.

Tal y como los chicos de Adafruit indican, este sistema no es ni de lejos tan preciso como un GPS, pero tiene la enorme virtud de estar disponible sin más que engancharte a la red y con una buena aproximación, aunque no hay garantía de que funcione en todos los sitios pero ya me contareis.

Conocer la posición en la que te encuentras te permite consultar la hora de salida y puesta de sol por ejemplo, lo que te puede permitir orientar un panel solar para conseguir la máxima carga, o quizás el tiempo que va a hacer, para saber si tienes que levantarte a por la tabla de Surf o es mejor quedarse en casa.

Desde otro punto de vista, mas practico, en esta sesión nos introduciremos en el concepto de servidores de información JSON, que nos proveen de casi innumerables opciones de datos de todo tipo de forma muchas veces gratuita, sobre lo que se os ocurra.

Tenemos servidores que nos informan sobre posición con latitud y longitud, nombres de ciudades, terremotos, meteorología, generadores de números o textos aleatorios, mapas y casi lo que se os ocurra.

Según la Wikipedia: JSON, acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.

La simplicidad de JSON ha dado lugar a la generalización de su uso, especialmente como alternativa a XML en AJAX que son siempre más complicadas de usar.

 

Geo localización con WIFI Shield CC3000

 

No hay duda de que los errores de este ejmplo son solo míos, pero cualquier merito que podáis encontrar en este ejemplo, tenéis que atribuírselo a los chicos de Adafruit que amablemente nos proporcionan tanto la librería como los ejemplos en licencia BSD, además su ciencia en la confección de los programas.

Este capítulo va a ser de lo más cómodo para mí (No es la primera vez que hablamos de mi vagancia). No voy a hacer nada más que traducir los textos del programa y comentarlos un poco, para todos esos que se acercan a Arduino con una idea y muchas ganas de hacer cosas.

Para empezar, tenéis que descargar e instalar la librería Adafruit_CC3000_Library-master o bien descargarla de Github, e instalarla por el procedimiento habitual que ya tenemos bien conocido, y si vais a

Archivo\Ejemplos\Adafruit C3000 Library

Encontrareis el original de este programa (entre otros varios). Como siempre empezamos con algunas definiciones:

#include <Adafruit_CC3000.h>
#include <SPI.h>

#define ADAFRUIT_CC3000_IRQ   3  // MUST be an interrupt pin!
#define ADAFRUIT_CC3000_VBAT  5
#define ADAFRUIT_CC3000_CS    10

Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,   SPI_CLOCK_DIVIDER);

Ahora acordaros de poner los datos de vuestra WIFI en la siguientes líneas:

#define WLAN_SSID       "charly"   // No mas de 32 caracteres.
#define WLAN_PASS       "contrase"
#define WLAN_SECURITY   WLAN_SEC_WPA2
 
  • Todos los ejemplos del Shield necesitan que adaptéis los valores de vuestra conexión, de lo contrario os va a costar conectar y que funcionen los ejemplos (Y lo digo porque me ha pasado repetidamente).
  • Podemos definir varios tipos de encriptación, en función de como hayáis definido la seguridad WIFI en vuestro Route.

    Encriptación
    FlagWLAN_SEC_UNSECWLAN_SEC_WEPWLAN_SEC_WPAWLAN_SEC_WPA2
 

Vamos con el programa de posicionamiento GeoLocation .Creamos una instancia el cliente WIFI mediante:

Adafruit_CC3000_Client client;

Definimos algunas constantes para los diferentes TimeOuts que vamos a necesitar:

const unsigned long
dhcpTimeout     = 60L * 1000L, // Max time to wait for address from DHCP
connectTimeout  = 15L * 1000L, // Max time to wait for server connection
responseTimeout = 15L * 1000L; // Max time to wait for data from server
 
  • Fijaros en la sintaxis de estas declaraciones. En lugar de repetir tres veces const unsigned long, lo hacemos solo una vez para las tres variables, poniendo una “,” al final de las dos primeras líneas, y un “;” al final de todo.
  • C++ interpretará las cuatro líneas como una sola instrucción. 

Vamos a intorregar al servidor de freegeoip.net para obtener información de nuestra posición, deducida por nuestra IP publica, la que nos asigna nuestro proveedor de Internet, y por eso vamos a definir algunas variables para guardar los resultados recibidos:

char
   country[20],
   region[20],
   city[20],
   name[13],  // Temp space for name:value parsing
   value[64]; // Temp space for name:value parsing
   float   longitude, latitude;

Las primeras instrucciones del setup, son exactamente iguales a las de la sesión previa por lo que nos las vamos a comentar:

if(!cc3000.begin())
  {  Serial.println("Error.");
     return;
  }
Serial.print(("OK.\r\nConnectando a la red..."));
if(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY))
  { Serial.println("Fallo!");
    return;
  }
Serial.println("Conectado!");

Vamos a ver ahora como conseguimos una dirección del servidor  DHCP:

Serial.print("Solicitando direccion IP...");
for(t=millis(); !cc3000.checkDHCP() && ((millis() - t) < dhcpTimeout); delay(1000));
if(cc3000.checkDHCP())
   Serial.println("OK");
else 
  {  Serial.println("failed");
     return;
  }
 
  • Para quienes seáis nuevos en TCPIP, Un servidor DHCP asigna los datos como dirección IP y servidores DNS, a un cliente o nodo que lo solicite. De este modo nuestra red se configura con valores diferentes según donde conectemos, sin necesitar de cambiar valores a mano.
  • Si no teneis claro que es todo esto, os recomendamos que leáis la introducción al TCPIP que hicimos en una sesion previa aqui. 

Imprimimos aquí  los valores asignados mediante la función que vimos en la sesión previa:

while(!displayConnectionDetails()) delay(1000);

Y vamos a conseguir la dirección del servidor de freegeoip.net mediante una consulta al DNS:

Serial.print("Resolviendo la direccion de freegeoip.net... ");
t = millis();
while((0L == ip) && ((millis() - t) < connectTimeout))
  {  if(cc3000.getHostByName("freegeoip.net", &ip)) 
         break;  // Aqui esta la consulta
         delay(1000);
  }
if(0L == ip)
  { Serial.println("Error.");
    return;
  }

cc3000.printIPdotsRev(ip);     // Formatea e imprime la IP obtenida
Serial.println();

Vamos a usar el cliente que creamos mas arriba para hacer una petición al servidor de freegeoip.net

 
  • Conviene recordar, que el servicio de geo localización es gratuito, por lo que no hay que abusar, para no sobrecargar a quien le lo proporciona amablemente, y por ello, haremos una única llamada en el programa. 
Serial.print("Connectando al servidor...");
client = cc3000.connectTCP(ip, 80);
if(client.connected())
   {   Serial.print("Conectado.\r\nSolicitando informacion...");
       client.print("GET /json/ HTTP/1.1\r\nHost: freegeoip.net\r\n\r\n");
   }
else
   {   Serial.println("Error");
       return;
   }
Serial.println("OK");

Vamos ahora con la parte que lee la respuesta y la procesa:

Serial.print("\r\nLeyendo respuesta...");
country[0] = region[0] = city[0] = 0; // Clear data
jsonParse(0, 0);
client.close();
Serial.println("OK");

Tenéis la función jsonParse() (Entre otras) al final del programa pero parece una de esas cosas que hay que usar sin mirar dentro demasiado.

El resto es gimnasia. Desconectar e imprimir el resultado:

Serial.println(F("\nDisconnecting"));
cc3000.disconnect();
Serial.print(F("\r\nRESULTADO:\r\n  Pais:\t "));
Serial.println(country);
Serial.print(F("  Region:\t "));
Serial.println(region);
Serial.print(F("  Ciudad:\t "));
Serial.println(city);
Serial.print(F("  Longitud:\t "));
Serial.println(longitude);
Serial.print(F("  Latitud:\t "));
Serial.println(latitude);

El resultado es lo pongo a continuación:

Salida formateada de posicion a consola arduino

 

 

 

Resumen de la sesión

 

 

    • Hemos visto más posibilidades del  Shield WIFI basado en CC3000.
    • Presentamos la idea de los servicios JSON en la Web.
    • Vimos un ejemplo de Adafruit de como localizar nuestra posición a aproximada, mediante la conexión a un servicio JSON.

 

 

 

 

 

(18) Comments

    • Luis Angel

    hola muy interesante y buena información, estoy creando un servidor web con Arduino Mega + la shied WiFi CC300, el entorno gráfico lo estoy cargando desde la SDcar mediante código HTML, pero tengo errores, se cae el servidor después de actualizarse 10 veces y no puedo entrar, ademas no he avanzado en la activación de salidas digitales desde los botones creados en la html, que esta en la SDcar.

    Agradecería tu Colaboración. mi correo es loisck@hotmail.com

    • Hola Luis Angel, seria conveniente que posteases en el foro lo que estas haciendo y lo que buscar para poderte echar una mano desde alli

  • Hola! Tengo un problema con el shield al programar el buildtest. El programa se me cuelga en “Iniciando CC3000…” y se queda ahí. Alguna idea de que puede ser?

    • Pues no se q decirte juan, porque eso es simplemente el inicio del programa cuando confirma que ve el chip

  • buenas tardes. EL shield wifi cc3000 tambien tiene un servidor web incorporado? necesito ver desde internet los valores que me arroja los sensores que le hemos conectado a nuestro arduino.

    • Hola Cristian, El shield CC3000 no lleva ncorporado nada, pero puedes programarlo para que monte un servidor web WIFI, y usarlo para publicar los valores de tus sensores. Tienes alguna sesion con este tema que puedes usar como base para tu proyecto

    • RJ

    Hola, muy buena tu pagina, ejemplos sencillos y explicados en lenguaje humano 🙂
    Estoy probando lo de la geo-localizacion, pero me pasa el mismo problema que he tenido con cualquier otro codigo que pongo a mi arduino mega + wifi cc3000. aun cuando esta solicitando IP por dhcp siempre me muestra esto, en algún momento se lo configuré pero no se donde quedará guardado y como se limpia.

    Hello, CC3000!
    Free RAM: 6979
    Initializing…OK.
    Connecting to network…connected!
    Requesting address from DHCP server…OK

    IP Addr: 192.168.1.23
    Netmask: 255.255.255.0
    Gateway: 192.168.1.254
    DHCPsrv: 0.0.0.0
    DNSserv: 8.8.8.8

    Getting server IP address…failed

    • Hola Rj, estos chips CC3000 conservan la ultima configuración y la activan en cuanto arrancan salvo orden en contra, porque es bastante cómodo y así puede empezar a funcionar en cuanto se encienden.
      Si quieres cambiarlo, basta con le fuerces a usar una IP asignada por ti mismo y no por DHCP y ya está

        • RJ

        Hice lo que me dijiste, le puse una IP estatica y la toma sin problemas, luego volví a habilitar DHCP y me muestra la IP que habia configurado estaticamente. en el AP el dhcp esta funcionando bien, con mi pc toma una IP sin problemas…

  • Hola
    Quería saber como se podría en un dado caso, si por error ingreso mal algún dato en WLAN_SSID, poder salir de este punto, he notado que si no logra acceder al AP, no hay manera de retornar o regresar a otra parte en el programa, es en esta sección de código donde se da el problema: if(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY))

    • Hola Adam, no estoy seguro de entenderte

    • Sergio

    Buenas tardes, me gustaría saber si le has echado un ojo al blog, gracias!

    • Hola sergio, no se que ha paado con tu correo que no lo encuentro.¿Me puedes dar tu blog de nuevo, por favor?
      Le echare una ojeada encantado

    • Sergio

    Hola de nuevo, ha sido un fallo mío al cambiar la dirección del bloc; ésta es la correcta http://ibrobot13.blogspot.com.es

    • Sergio

    Hola, soy Sergio, el mismo del comentario anterior, esta vez te escribo para comunicarte que ya tengo casi finalizado mi proyecto. Te paso la dirección de mi bloc por si te interesa echarle un vistazo ya que he visto que en tu pagina también pones otros proyectos de otra gente. http://arduinopanzer.blogspot.com.es.
    Quizá esta vaya a ser mi ultima pregunta jeje. Al conectar el modulo a mi Arduino, pude comprobar que amenos en mi caso no necesitaba ningún tipo de fuente de alimentación externa del ordenador a la placa ya era suficiente. El problema es que ahora necesito conectarle alguna batería para que el robot se pueda desplazar sin el cable de alimentación de la placa. Me podrías indicar cual es la adecuada? Muchas gracias, Sergio.

    • Hola de nuevo Sergio,
      Me alegra oir que tu proyecto avanza y me encantaria echar un vistazo a tu proyecto y publicarlo en nuestra wqeb si te parece bie, y estoy seguro de que habrá mas lectores interesados, pero no he podido verlo porque me dice que la pagina que nos indicas ya no existe.

      No me atrevo a recomendarte ninguna bateria de momento porque aun estoy probando varias a ver con cual me quedo y de momento te recomendaria unas pilas normales AAA con un portapilas, que es algo muy barato y hasta puedes usar unas pilas recargables

    • Sergio

    Buenas, soy el chico del comentario sobre el esp del otro día
    Hace un tiempo compré un cc3000 pero aun no lo he probado porque no sabia como alimentarlo y aun no he encontrado ninguna fuente de alimentación así que lo dejé de lado.
    Sabes si con este modulo podría mover servomotores? Es fácil crear un servidor web para controlarlos desde mi ordenador?
    Muchísimas gracias por tu ayuda

    • Hola Sergio,
      No estoy seguro de si lo que has comprado es un WFI shield con el CC3000 o solo el chip con algun breaout board. Este es un shield magnifico y tienes varios ejemplos con el en los tutoriales de comunicaciones.
      No deberias tener ningun problema en manejar un servo con el, ya que tienes un Arduino completo debajo que te los mueve y el wifi es muy comodo para enviar y ecibir los mensajes de mando.

      Si lo que tienes es un Shield WIFI, con una fuente de 1A es mas que de sobra para el shield y el arduino. calcula 200 mA + 100 mA respectivamente en el peor caso y aun tienes 700 mA para alimentar un par de servos pero no mas ¿De acuerdo?

Give a Reply

WordPress Anti-Spam by WP-SpamShield