bclose

Usando el módulo WIFI ESP8266

Comunicación con PC mediante 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 equivalente.
ProtoboardUna Protoboard .
conexionesAlgunos cables de protoboard, preferiblemente Dupont macho/hembra.
Vista frontal Un módulo WIFI ESP8266
Fuente para protoboard Una fuente de alimentación externa de 3.3V

 

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: 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 minivideo 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.

 

 

 

 

 

(177) Comments

  • EXCELENTES códigos y tutoriales mi amigo.

  • Hola Chicos/as
    Estoy haciendo un servidor multi funcion con un arduino uno y un esp8266. Una de las funcionalidades que quería incorporar era la de poder encender un equipo por “Wake on Lan” desde el arduino, ya que mi router vodafone no lo permite.
    Estuve mirando un montón de sitios y encontré muchos códigos para programar directamente en el esp8266 pero ninguno para ser enviado via comando AT, así que me puse manos a la obra.
    Aquí os dejo la función sendMagicPacket dónde se ha de configurar la mac del equipo que queremos encender y asegurarnos que este soporta WOL desde la bios de la placa base.

    void sendMagicPacket(const int timeout, boolean debug){

    String response = “”;
    byte magic_packet[144] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
    byte mac[6] = { 0x00, 0x24, 0x1D, 0xD6, 0x2F, 0x58 };

    for (byte i = 6; i < 144; i++)
    {
    magic_packet[i] = mac[i%6];
    }

    for (byte i = 0; i millis())
    {
    while(wifi.available())
    {
    // The esp has data so display its output to the serial window
    char c = wifi.read(); // read the next character.
    response+=c;
    }
    }
    if(debug)
    {
    Serial.print(response);
    }
    return response;
    }

    // Y el uso sería algo así

    sendCommand(“AT+CIPSTART=4,\”UDP\”,\”192.168.0.255\”,9,9,0\r\n”,1000,DEBUG);
    for(int i = 0; i<10; i++) {
    sendCommand("AT+CIPSEND=4,102\r\n",1000,DEBUG); // Send 102 bytes to transmission num.4
    sendMagicPacket(1000,DEBUG);
    delay(1000);

    lcd.setCursor(0,2);
    lcd.print("Magic packet sent: ");
    lcd.print(i+1);
    }

    Isaac

    • Gracias por el aporte Isaac.

      • Gracias a vosotros por esta gran página.

    • Hola Isaac, Muchas gracias por el aporte. Si te apetece escribir una pequeña sesion sobre esto te la publicaremos encantados en la parte de los tutoriales. Animate que seras bienvenido

Give a Reply

WordPress Anti-Spam by WP-SpamShield