Usando el módulo WIFI ESP8266

Objetivos

 

  • Usar el módulo WIFI ESP8266 para gobernar unos LEDs conectados a pines de Arduino.
  • Escribir un pequeño programa que vuelque comandos de configuración AT al módulo.
  • Probar la comunicación unidireccional con una página web.
  • Probar la comunicación bidireccional con un programa terminal como Putty.
  •  

    Material requerido

     

     

    Imagen de Arduino UNO Arduino Uno o similar.
    Protoboard

    conexiones

    Una Protoboard mas  cables.
    Vista frontal  Un ESP8266 ESP-01

     

    Mas sobre WIFI y ESP8266

     

    En la última sesión vimos como conectar el módulo WIFI ESP8266 a nuestros Arduinos para conseguir una conexión WIFI barata y de pequeño tamaño, y además estuvimos familiarizándonos con los comandos AT más habituales para manejar el modulo.

    En esta sesión, vamos a construir a partir de esos comandos algunos circuitos de prueba similares a los que hicimos con el shield Ethernet, para que veáis que es de lo más sencillo adaptar aquellos programas a este módulo WIFI.

    Y el primer, y más sencillo programa a probar es el de manejar unos LEDs desde un navegador Web desde un PC o desde un móvil.

    Vamos a utilizar un montaje similar al de la última sesión, para activar el servidor Web y pasarle parámetros mediante un navegador, de modo que nuestro programa busque la cadena “P13”, y si la encuentra invierta el valor del LED conectado al pin13 de Arduino.

    Vamos a usar una fuente de alimentación externa de 3,3V para protoboard.


    Esquema de protoboard

    • Por favor que no se os ocurra olvidaros de conectar la masa común entre la protoboard ( O el regulador que uséis) y la masa GND de Arduino. Ignorar esto puede ser muy perjudicial para la buena salud de vuestra electrónica.
    • Recordad que unir las masas, es lo único que nos garantiza un nivel cero de referencia, común. Si lo omitís, las diferencias de tensión entre el alimentador de vuestro Arduino y el de la protoboard, pueden ser más que suficientes para daros una sorpresa y chamuscar algo.

     

    El programa de control

     

    Ya estamos familiarizados con todos los conceptos que vamos a usar, así que empezaremos directamente. En primer lugar  nos interesa crear un sistema que nos permita reprogramar el módulo WIFI en los arranques.

    Vamos a empezar creando un array con los comandos precisos:

    String ordenes[]=
      {  "AT+CWMODE=3",
         "AT+CWQAP",
         "AT+CWJAP=\"charly\",\"contrase\"",
         "AT+CIFSR" ,
         "AT+CIPMUX=1",
         "AT+CIPSERVER=1,80",
         "END"                 // Para reconocer el fin de los comandos AT
      };

    La idea es recorrer este array al reiniciar y enviar los diferentes comandos AT al módulo WIFI.

    • Fijaros que para poder enviar un comando String que contenga el carácter “, tenemos que precederlo por la barra ‘\’.

    Y para poder enviar las órdenes de mando, podemos usar en el setup, el siguiente código:

         int index = 0;
         while(ordenes[index] != "END")
            {  WIFI1.println(ordenes[index++]);
               while ( true)
                  {   String s = GetLineWIFI();
                      if ( s!= "") Serial.println(s);
                      if ( s.startsWith("no change"))  
                              break;
                      if ( s.startsWith("OK"))  
                              break;
                      if ( s.startsWith("ready"))  
                             break;
                      // if (millis()-T >10000) break; 
                  }
              Serial.println("....................");
          }

    Recorremos con index el array órdenes [] hasta que encontremos “END” y las enviamos al módulo con la línea:

    {  WIFI1.println(ordenes[index++]);

    Luego entramos en un while que lo único que hace es leer líneas completas de la respuesta del módulo y las imprime, hasta que recibe una de las claves de salida.

    • La mayor parte de los comandos AT, provocan una o más líneas de respuesta, que acaban con un sencillo OK, y por eso es una de las condiciones de salida.
    • Pero también hay ordenes AT, que devuelven “no change”o “ready”.
    • Si recibe FAIL, es que no ha sido capaz de programar correctamente el modulo y por tanto terminamos la ejecución del programa.

    El problema es que con el montaje que hemos hecho, mis dos módulos parecen tener mucha tendencia a colgarse cuando les envío desde programa algunos comandos como AT+CWJAP y AT+CWLAP.

    • Esto es probablemente debido a que aunque el modulo parece soportar bien que RX y TX vayan a 5 Voltios pudiera, a pesar de todo, convenir usar un convertidor de nivel de tensión.
    • Arduino solo puede suministrar 50 mA en el pin de 3.3V y este módulo puede necesitar hasta 300 mA según el fabricante, por eso vamos a utilizar una fuente de alimentación externa. Alimentándolo con Arduino consigues que arranque una de cada 5 veces, pero siempre es preferible evitar el olor a quemado que es molesto.
    • Personalmente he experimentado bastantes problemas a la hora de arrancar el modulo, sin alimentación externa, y aunque al final se consigue a base de quitar y poner tensión repetidamente hasta que arranca. Una vez arrancado, en general va bastante bien pero al principio cuesta.

    Así, que en lugar de volcar los comandos por programa, vamos a hacerlo manualmente, porque además el modulo tiene la buena costumbre de recordar la última conexión que hizo y restáurala al re arrancar, por lo que nos podemos ahorrar el reprogramar la conexión al WIFI.

    El modulo recuerda también el modo de funcionamiento con AT+CWMODE=3, pero olvida  tranquilamente los comandos necesarios para montar el servidor web AT+CIPMUX=1″ y «AT+CIPSERVER=1,80», así que esto sí que son necesarios enviar.

    Para no complicar el programa de ejemplo, os recomiendo de momento conectar a mano al punto de acceso WIFI que tengáis, y programar a mano estos dos últimos comandos AT.

    Cuando empecé con este programa quería que combinase tanto la capacidad de interpretar los comandos AT que enviamos, como la capacidad de recibir las respuestas del módulo, sin que ello suponga impedimento para poder revisar los mensajes entrantes para tomar las decisiones de gobernar señales en Arduino.

    La forma que he encontrado ha sido algo como esto:

    Descargar: Prog_75_1

    #include <SoftwareSerial.h>
    SoftwareSerial BT1(3, 2); // RX | TX
    String W =" ";
    char w ;
    
    void setup()
       {  Serial.begin(19200);
          BT1.begin(19200);
          pinMode(13, OUTPUT);
       }
    
    void loop()
       {  if (BT1.available())                // Lo que entra por WIFI à Serial
             { w = BT1.read() ;
               Serial.print(w);
               W = W + w ;                    // Vamos montando un String con lo que entra
             }
          if (Serial.available())             // Lo que entra por Serial à WIFI
             {  char s = Serial.read();
                BT1.print(s);
             }
          if ( w == '\n')                     // Sin han pulsado intro
             { if ( W.indexOf("P13") > 0 )    // Comprobamos si P13 esta incluido en el string
                   { digitalWrite( 13, !digitalRead(13)) ;
                     Serial.println("Invirtiendo pin 13");
                   }
               W = "" ;  w = ' ' ;                    // Limpiamos las variables
             }
      }

    Este programa nos permite seguir enviando y recibiendo comandos AT manuales y ver la respuestas de vuelta, y además revisa la entrada buscando cadenas de texto completas que identifique una acción a realizar.

    Si queremos manejar más de una señal, en digamos el pin 12, bastaría con añadir:

    if ( W.indexOf("P12") > 0 )    // Comprobamos si P12 esta incluido en el string
        { digitalWrite( 12, !digitalRead(12)) ;
          Serial.println("Invirtiendo pin 12");
        }

    Por ultimo os voy a poner un mini video con el resultado, pero antes he enviado a mi modulo los siguientes comandos AT manualmente:

    At+RST
    AT+CWMODE=3
    AT+CWJAP=”CHARLY”,”CONTRASE”      // Conectar al punto de acceso
    AT+CIFSR                          // Para saber mi IP
    AT+CIPMUX=1                       // Permitir multiples conexiones
    AT+CIPSERVER=1,80                 // Arrancar el servidor web en el puerto 80

    Aquí tenéis un minivideo con el resultado:

     

     

    Enviando y recibiendo ordenes mediante WIFI

     

    En el ejemplo anterior recibíamos órdenes desde un navegador pero no devolvíamos información al navegador. En esta sesión haremos un ejemplo de conexión desde un terminal como Putty y veremos la forma de enviar textos en ambas direcciones.

    Aunque nosotros usaremos un terminal de PC para ilustrar el ejemplo, podríamos hacer exactamente lo mismo desde una tableta o móvil con un terminal que acepte conexiones TCPIP.

    Asegúrate de volcar el programa Prog_75_1 a nuestro Arduino y abre la consola. Necesitamos dar algunos comandos manuales:

    AT+CIFSR
    AT+CIPMUX=1
    AT+CIPSERVER=1,80

    Inicalizacion

    Asegúrate de poner la dirección IP de tu modulo y pulsa open. Veras que Arduino recibe un mensaje de Link:

    Parametros basicos

    Asegúrate de poner la dirección IP de tu modulo y pulsa open. Veras que Arduino recibe un mensaje de Link.

    Estableciendo la conexion

    Lo que escribas ahora en la consola del Putty pasara a la consola serie de Arduino

    comunicando con Arduino
    Cominicacion con Putty

    Son mensajes que podemos reconocer con nuestro programa de recepción y se pueden usar para activar acciones en Arduino como ya hemos visto.

    Para enviar mensajes desde Arduino a la consola de Putty debemos usar el comando:

    AT+CIPSTART=0,"TCP","192.168.1.50",80

    Que le indica a nuestro módulo WIFI que inicie una sesión TCPIP por el puerto 80 con la IP especificada que corresponde a mi Putty, vosotros deberéis poner la dirección de vuestro PC o tableta.

    Nos devolverá el mensaje “Already connected” ( Ya conectado), indicando que la conexión ya está establecida.

    putty_2

    La conexión se inició automáticamente, cuando Putty se conectó al servidor y por eso nos podríamos haber ahorrado este comando, pero si somos nosotros quienes iniciamos la conexión debemos darlo irrevocablemente.

    Y ahora para enviar mensajes a la consola de Putty usaremos

    At+CIPSEND=0, N

    Donde 0 es la sesión abierta en automático y N es la longitud del mensaje a enviar, y después podemos enviar el mensaje:

    AT+CIPSTART

    Y como la longitud del mensaje es de más de los 24 caracteres especificados, simplemente corta al llegar a los 24:

    recepcion de mensajesAquí os dejo un pequeño video con la interacción que siempre es mas fácil de ver.

    En la próxima sesión veremos cómo presentar una página web usando estos comandos AT.

     

    Resumen de la sesión

     

  • Vimos cómo usar el módulo WIFI ESP8266 para modificar el estado de un LED en nuestro Arduino desde un navegador Web.
  • Seguimos probando comandos AT para el WIFI ESP8266
  • Vimos como conectar al servidor web a través de WIFI con un terminal serie y usarlo para establecer la comunicación bidireccional.
  •  

    Deja una respuesta