Vistas de página en total

lunes, 9 de febrero de 2015

Módulo Wifi ESP8266




PRUEBA  INICIAL ESP-8266 CON ARDUINO



  Acabo de recibir un módulo wifi ESP8266. 

  Lo he pedido porque he oído hablar maravillas de él, en cuanto a la relación calidad precio. En este caso lo he comprado diréctamente a china.
  De este módulo hay varias versiones la más vendida es la ESP-01 y de esta dos versiones. Yo he recibido la ESP-1 en versión 2. Se diferencian por las tres componentes SMD situados al lado del a antena.
   Por supuesto es importante esta verificación ya que los pines son totalmente diferentes, y dispone de más señales.
   Hay que tener en cuenta que la alimentación es 3,3V.
   Pueden ver otros modelos de en la Wiki y elegir la que mas les convenga o tengan.

ESP-01, Version 1 and 2

  

Pins to chip names

PinNameDescription
1GNDGround
2U0TXDUART0 Transmit
3GPIO2Has internal pull-up
4CHIP_ENChip Enable, active high
5GPIO0Has internal pull-up
6EXT_RSTBExternal reset signal, active low, has no pull-up? Spurious blue LED activity when attaching a DMM between GND and RST to check voltage.
7U0RXDUART0 Receive, has internal pull-up
8VDD+3.3V power input

LEDs

ColorNameDescription
RedPWRTied to VCC, so always on when power is applied
BlueTXDUART TX indicator, tied in hardware to U0TXD







       En este caso voy a conectar el chip a los 3.3 volts de mi adaptador USB-Serial que dispone de 
salida a 5 y 3,3 V.

3.3v ESP8622 —> 3.3v FTDI
GND ESP8622 —> GND FTDI
RX ESP8622 —> TX FTDI
TX ESP8622 —> RX FTDI
CH_PD —-> 3.3v FTDI

    Es importante asegurarse de conectar el CH_PD para habilitar el circuito, Este pin permitirá inhabilitar el chip poniendo a cero la señal.-
      Una vez hecho esto ya emitirá la señal por lo que aparecerá una nueva wifi al alcance de nuestro pc con el nombre ESP_XXDXXX. Las X son números que identificarán el módulo y que no serán las que figuran en la pantalla de abajo, pues este es simplemente un ejemplo.


ESP8266_1

Con esto ya sabemos que el módulo funciona. 
Hasta aquí he seguido la página http://blog.theinventorhouse.org/mi-primer-acercamiento-al-modulo-wifi-esp8266/ que encontré para realizar esta prueba.
   Ahora iba a realizar el segundo paso, que es conectarlo a un conversor usb-TTL, para probar los comandos AT.

   Aquí me encontré con un problema que no indicaba la página anterior. Cuando conectaba la alimentación al conversor, parecía que no conseguía comunicar. El problema era la potencia entregada por el conversor en su salida de 3,3V.
3.3v ESP8622 —> 3.3v Arduino 
GND ESP8622 —> GND Arduino 
RX ESP8622 —> TX FTDI
TX ESP8622 —> RX FTDI
CH_PD —-> 3.3v Arduino

    Por lo tanto después de muchas pruebas, por si era un problema de conexión o de parametrización y viendo que al conectar el pin CH_PD el usb desaparecía de la lista de dispositivos, decidí hacer igual que en la página y usar un arduino como fuente de alimentación.

 Y efectivamente se solucionó. 

 Así mismo descubrí la página http://www.electrodragon.com/w/Wi07c#Firmware_uploading_tool. En ella se explica muy bien el funcionamiento del módulo con sus comandos AT y un programa ejemplo.
     Aprovechando esta página baje el terminal sscom32E en ingles para asegurarme de que no había interferencia con el terminal de arduino.

    Por lo que vi después hice bien, ya que en el terminal de arduino resulta diferente la forma de mandar el comando que en el sscom4.
   En el SScom4 y como indican las páginas la velocidad es de 9600 baudios y con solo "nueva línea" como envío.

Pero resulta que para que funcione en el de con de arduino debe de elegirse CR+LF.
               
  En este caso como se ve si  no elegimos la opción mostrada el resultado al comando es "ERROR" pero con Ambos es “OK”.
  
  Para saber la versión de nuestro firmware
AT+GMR


En este caso tenemos la versión 0.9.2, Por lo que no necesito actualizar el firmware.

 Esto también se puede ver con el comando AT+RST. En este caso se recive un texto con la web del fabricante y la versión.

    Como se ve en la pantalla, si escribimos un comando mal la tarjeta contestará ERROR.
  Mi tarjeta por lo tanto lleva la versión 9.2.4 y la página del fabricante es http://www.ai-thinker.com/ por si alguno sabe chino.

   Ahora ya podemos comenzar a probar comandos y para luego programar sobre el arduino o sobre el pic.

Probando comandos

     Según las páginas anteriores estos serían los comandos.
   Como vereis hay algunos minúsculos cambios, pero importantes. El comando 2 de la sección general, está escrito en mayúsculas. Si la "e" final de CWMODE es minúscula como figura en las páginas da error.
          Al encendido del sistema debe de hacerse un RST para que se reconozcan los comandos, y además los comandos de Router no funcionan hasta un tiempo después del RST, cuando a revisado las wifis. Por lo tanto puede que si no tenemos paciencia para esperar unso 4 s antes de lanzar el primer comando este nos de ERROR.

      El comando AT+CIFSR, sin embargo si funcionará después del RST.

Generales


  1. AT+RST Resetea el módulo y recibe algunos datos como "Ready" y el fabricante
  2. AT+CWMODE=3 cambia el modo de trabajo a 3, AP + STA, sólo usado en el más versátil modo 3 (AT + RST puede ser necesario cuando se hace esto.)

Unirse a un Router
  1. AT+CWLAP busca wifis disponibles.
  2. AT+CWJAP=“you ssid”, “password” Indica las opciones de SSID y pasword de la wifi elegida.
  3. AT+CWJAP=? comprobar si está conectado con éxito , o AT+CWJAP?

  4. Cliente TCP
  5. AT+CIPMUX=1 activar la conexión múltiple
  6. AT+CIPSTART=4,"TCP","192,168.1.104",9999 conectar con el servidor TCP remoto 192.168.1.104 (the PC)
  7. AT+CIPMODE=1 opcionalmente entrar en el modo de transmisión de datos
  8. AT+CIPSEND=4,5 enviar datos a través del canal 4, 5 bytes de longitud (ver resultado de la prueba toma abajo, sólo "elegidos" recibidas), el enlace será "unlink" cuando no pasen datos.
TCP Server
  1. AT+CIPSERVER=1,9999 servidor de configuración de TCP, en el puerto 9999, 1 significa habilitado.
  2. AT+CIFSR comprobar la dirección IP del módulo
Aquí aparece la secuencia completa.
   Primero he verificado la dirección IP del módulo con AT+CIFSR.
   Luego he intentado hacer un cambio de modo con el comando AT+CEMODe=3 que indicaban las demás paginas y por último lo he hecho correctamente. Una vez hecho el cambio de modo he solicitado que me muestre las wifis disponibles.




  Si elegimos un modo en el que ya estábamos, por ejemplo el modo 1 después del RST, nos devolverá "no change".


MONTAJE SOBRE EL ARDUINO

Verificación comunicación con Arduino.

 Dado que tenemos muchos modelos de arduino, y quiero que el mío esté operativo antes de conectar con el módulo wifi. He decidido conectar el arduino por su puerto serie al módulo USB-TTL, para asegurarme de las identificación de las señales y de la comunicación por los dos puertos simultáneamente para la posterior verificación.
   Parece una tontería, pero yo no controlo todavía el Arduino... estoy acostumbrado a PIC y a trabajar directamente con los chip, por lo que prefiero ir verificando.
  Para ello he usado los pines 10 y 11 del Arduino leonardo para la comunicación serie con el USB-TTL. Aquí me he llevado la primera sorperesa. Aunque el manual de Arduino indica que se conecte el RX con el TX, como he hecho en el caso anterior, en este caso no funciona. He tenido que conectar el pin 10 con Rx del modulo y el 11 con el Tx.
  
    No sucede así ente el  usb y el ESP8266,  en la que si tuve que cruzarlos.

    Una vez bien conectado, probé el programa ejemplo SoftwareSerial. para poder monitorizar los dos puertos a la vez use el sscom4 para el USB-TTL y el terminal de AtmelStudio para el puerto de Arduino.

Conexión Arduino - Wifi.

     Ahora voy a dar un paso más. Pequeñito. Voy a conectar el puerto serie del arduino al módulo wifi. En este caso he necesitado conectar 10 a TX y 11 a RX. Con el mismo programa instalado. Esto hará que el arduino sirva de puente de comunicaciones transparente. Así he podido probar los comandos AT igual que inicialmente, pero esta vez a través del puerto del arduino. Es decir, el arduino me está operando como el conversor USB-TTL.
  • En este caso se tuve que cruzar de nuevo los pines Rx y Tx del uart del arduino, y configure el puerto serie a 9600 bauidos.
  • Por otro lado conectaremos el puerto usb del arduino al PC para recibir los estados.


    Dado que he tenido que cruzar de nuevo los hilos de datos, El esquema de conexiones queda así.

Arduino                   ESP8266                     USB-TTL 
   RX           -------        TX           ---------            RX
   TX           -------        RX           ---------            TX


   Aquí vemos como el módulo responde a través del arduino como lo hacía a través del USB-TTL
  

Busqueda del Mac del ESP8266.

   Una vez que he probado el hard y las conexiones, ya me atrevo a insertar el código de un programa sobe la configuración.
   Antes de lanzarme a utilizar las librerías de arduino, necesito conectrame a mi router.... pero claro yo lo tengo con filtrado MAC, por lo que debería de validar la entrada de este nuevo equipo wifi. ¿Peor cual es su MAC?
   Dado que ahora tengo conectado el ESP8266 al arduino y este al PC, y tengo el programa  SoftwareSerial cargado en el arduino, me puedo permitir usar el terminal del SDK de arduino o de Atmel para enviar cómodamente datos al módulo.
         Para conocer la MAC, dado que no he encontrado nada en la red, he decidido abrir mi router momentáneamente y conectar el módulo en modo AP. Para ello, después del deshabilitar el filtro MAC de mi router, escribí los siguientes comandos AT:
           AT+RST
           AT+CWMODE=3
           AT+CWJAP="xxx","xxxxxxxxx"
           AT+CIFSR
     Cada uno que indique su SID y su clave.

   Para mayor comodidad al escribir los comandos AT en el Terminal recomiendo algo que he visto a hacer en un video de youtube. Escribir los comandos en el notepad, para poder recogerlos con ctrl-c y pasarlos con ctrl-v al terminal. Es una idea simple pero nos ahorrará mucho tiempo.
  
   Hecho esto el módulo se ha conectado al router, ahora solo tengo que ir al router y visualizar los equipos conectados a él. y ahí aparecerá el MAC.
   Conocido el Mac, puedo añadirle a la lista de Equipos permitidos, y volver a validad el filtro MAC.

   Perfecto. Ahora puedo trabajar con el ESP8266 manteniendo mi nivel de seguridad en el router.


Intercomunicación con otro equipo.

   Con el último comando, AT+CIFSR, conoceremos la dirección IP en la que se ha conectado el ESP. En mi caso aparece:
192.168.4.1
192.168.1.17


     La primera es la dirección de la puerta de enlace del ESP. y la segunda es la direccion en la que se encuentra el SP en mi red.

   Ahora vamos a verificar la comunicación ente el arduino y una ip de la red.
  Para ello tomo el programa Terminal Tera. Teraterm, para enlazar con el modulo ESP8266 desde el PC. Y usaré el terminal de Arduino, para enviar y recibir lo que llega al arduino por la tarjeta ESP8266.
    El resultado es este:



  A la derecha vemos la secuencia de comandos AT que he enviado para configurar el ESP como servidor de datos.
  A la izquierda esta el Tera Term conectado como telnet a la direcci'on y puerto del ESP. Cuando escribo "HOLA" en el Tera, llega el mensaje "+IPD:0,6:HOLA". Indicándome que ha llegado desde la conexión 0 y son 6 caracteres.


   Para hacerlo en sentido contrario, escribimos en el terminal de arduino el comando AT+CIPSEND=0,6, paa luego escribir "BIEN". El resultado es:




   Ahora ya dispongo de todas las herramientas y conozco y entiendo el funciomaniento del módulo y de su conexión.
   Por lo tanto ahora ya puedo usarlo con cualquier uP, y usarlo a mi manera para transferir y recibir datos de cualquier equipo.

Librerías

En las páginas anteriores expuestas y en otras existen programas ejemplos para enviar y conectar el modulo a wifi, pero les faltan comandos y opciones. Puede que me sirvan algo en Pic.
Pero en arduino ya existe la Librería ESP8266 para Arduino. Existe otra, ITEADLIB_Arduino_ESP8266, pero no es tan completa.

Con esto ya está analizado todo el módulo y ya puedo comparar y manipular las librerías, si es necesario. Ahora toca crear un servidor, apoyandonos en las librerías... pero eso será otro blog.

ATENCIÓN:
Lo que ya he detectado es que el módulo parece que no tiene un buffer de entrada en su uart suficiente. En mensajes largos de recepción y envío de páginas web, pierde caracteres. En mensajes cortos funciona bien.
Una cosa más a tener en cuenta es que el comando AT+UPDATE, puede destrozar el módulo. En mi caso al ejecutar el comando, pasó por todos los pasos y al llegar al 4 en vez contestar OK comenzó a enviar basura a través del puerto serie. No ha habido forma de reiniciarle. Le doy por perdido.

1 comentario :

  1. Hola, buen post. Dices que tu modulo se actualizo y ya no funciona, si funciona, lo que pasa es que al tener un nuevo firm este viene con una frecuencia diferente a la que intentas leer, por ejemplo tu intentas comunicarte con el a 9600, pero el esta a 115200, trata de buscar una a una la frecuencia hasta que leas todo correctamente. Saludos.

    ResponderEliminar