Video. Conectar ESP8266 a Internet. WifiClient

TODO: poner enlace al vídeo

Una vez escaneadas las redes, vamos a conectarnos a una de ellas y acceder a internet llegando a un servidor y ver su contenido.

El ejemplo WiFiClientBasic que podemos encontrar en Archivos – Ejemplos – ESP8266WiFi – WiFiClientBasic.

Este ejemplo se conecta a una red WiFi y manda un mensaje a un servidor TCP, en este caso a la IP 192.168.1.1 y al puerto 80.

La clase ESP8266WiFiMulti es igual que la clase ESP8266WiFi pero que permite configurar múltiples conexiones a puntos de acceso que en caso de perder la conexión se conecte al siguiente: http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-examples.html?highlight=ESP8266WiFiMulti

Con WiFi.mode(WIFI_STA); pongo el ESP8266 en modo estación, es decir, para conectar a una red WiFi de un punto de acceso.

Para más información:

Una vez conectado entramos en el loop y me conecto a un servidor como cliente. La clase cliente permite acceder a servicios de los servidores pudiendo enviar y recibir datos:

NOTA: en caso que el router wifi de una IP en otro rango que no sea el 192.168.1.x, cambiar la IP de la variable host por la IP del router wifi al que nos conectamos.

Ejercicio propuesto: conectar a https://www.aprendiendoarduino.com/servicios/aprendiendoarduino/ y leer el mensaje que devuelve.

Solución: https://github.com/jecrespo/aprendiendoarduino-curso-esp8266-youtube/blob/master/WiFiClientBasicMejorado/WiFiClientBasicMejorado.ino

En este caso debemos usar un lenguaje de comunicación común para hablar entre el servidor y el ESP8266, es el mismo lenguaje que usa cualquier navegador que se conecta a una página web y es el HTTP.

Una vez conectados al puerto 80 debe mandar un GET con la ruta del servidor y acabar con una línea nueva, tal y como funciona este protocol. Para ello mando:

client.println("GET /servicios/aprendiendoarduino/ HTTP/1.0");
client.println("Host: www.aprendiendoarduino.com");
client.println();

Si todo funciona bien recibiré la respuesta “HTTP1.1 200 OK” seguido de las cabeceras y luego una línea nueva, tras la cual aparecerá la respuesta del servidor. Para leer todas las líneas y no solo la primera es necesario hacer un bucle while mientras haya datos recibidos con la instrucción client.available(): https://www.arduino.cc/en/Reference/WiFiClientAvailable

NOTA: es necesario añadir la cabecera HTTP “Host: www.aprendiendoarduino.com” para que el hosting de la web resuelva el nombre del dominio.

La respuesta obtenida es:

Mensaje oculto: “Bienvenido al servidor de www.aprendiendoarduino.com

Más información sobre el protocolo HTTP: https://aprendiendoarduino.wordpress.com/2017/06/26/protocolo-http-2/

Resultado de imagen de Cliente-servidor-tcp.jpeg

Video. Primeros Pasos con ESP8266

Una vez que sabemos que es el ESP8266 y tenemos el IDE instalado, vamos a aprender a usar el Wifi del ESP8266. No entramos en el uso de otras características que son comunes a Arduino y que trataré de forma genérica en otros vídeos dentro del curso de Arduino en vídeo https://www.aprendiendoarduino.com/videos/curso-arduino/.

Si quieres saber más de Arduino y de su programación puedes ver los cursos de https://www.aprendiendoarduino.com

Una forma de aprender a manejar un dispositivo hardware o una librería es leer los ejemplos y ponerlos en práctica mientras se revisa la documentación en lugar de leer toda la documentación antes de empezar a practicar. Para empezar con los módulos ESP8266 una vez instalado el soporte para las placas, lo más sencillo es ejecutar los ejemplos que vienen con el soporte instalado para los módulos ESP8266.

Para ver los ejemplos debemos primero seleccionar la placa que vamos a usar, en nuestro caso la Wemos D1 mini o la nodeMCU.

Todos los ejemplos disponibles en el IDE de Arduino los puedes encontrar en los ejemplos de las librerías que vienen con el soporte del ESP8266 para Arduino que hemos instalado anteriormente en: https://github.com/esp8266/Arduino/tree/master/libraries

WiFiScan

Veamos primero el ejemplo WiFiScan que podemos encontrar en Archivos – Ejemplos – ESP8266WiFi – WiFiScan.

Este sketch muestra cómo escanear redes WiFi y el código es casi similar al usado con el WiFi shield de Arduino pero incluyendo la librería “ESP8266WiFi.h” en lugar de “WiFi.h”

La documentación de la librería “ESP8266WiFi” está en http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html y dentro de la librería hay varias clases, entre ellas está scan para escanear redes y la client para conectarnos a un servidor: http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html#scan

Al usar la librería ESP8266WiFi, lo primero es configurar el WiFi del ESP8266, en este caso en modo estación (WIFI_STA), es decir, para conectarse a un AP, pero en este caso nos desconectamos para poder escanear todas las redes.

ESP8266 operating in the Station mode

Para scanear la red usamos la clase scan de WiFi: http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-class.html y este proceso tarda aproximadamente un segundo y devuelve un número entero con el número total de redes encontradas. Luego mediante una serie de métodos puedo obtener los datos de SSID, RSSI, etc… de las redes encontradas en el scaneo.

Luego saco por pantalla el nombre de la red (SSID), la potencia (RSSI) y si es una red protegida. En la línea 40 hay un operador que no es común es un operador ternario https://es.wikipedia.org/wiki/Operador_ternario que es un if simplificado.

Luego para acceder a los datos de las redes encontradas en el scan, uso las funciones SSID, RSSI y encryptionType para encontrar el SSID, la señal y el tipo de cifrado de las redes encontradas.

Para más información ver la documentación de la clase scan en : http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-class.html

Más ejemplos de uso de la clase scan: http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-examples.html

Ejercicio propuesto: modificar el ejemplo WiFiScan para que también busque las redes WiFi ocultas y también muestre el canal y la MAC del punto de acceso o BSSID https://es.wikipedia.org/wiki/BSSID

Solución: https://github.com/jecrespo/aprendiendoarduino-curso-esp8266-youtube/blob/master/WiFiScanMejorado/WiFiScanMejorado.ino

En este caso he usado dos funciones:

  • muestra_encriptacion() que me dice la encriptación de la red wifi que me da el método WiFi.encryptionType()
  • muestra_SSID() que me da el nombre de SSID y en caso que sea una red oculta se dice.

También uso tabuladores “\t” para mostrar la información de forma más clara.

Con la información obtenida de las MACs, RSSI y canal, usando la librería de Germán Martín puedo obtener la localización https://github.com/gmag11/ESPWifiLocation gracias a  Google Maps GeoLocation API. Un tutorial completo realizado por Luis del Valle puede verse en https://programarfacil.com/blog/arduino-blog/geolocalizacion-wifi-arduino-nodemcu/

Video. Preparación IDE Arduino para ESP8266

Una vez conocido el hardware del ESP8266 visto en el anterior vídeo https://www.aprendiendoarduino.com/2018/01/23/video-iniciacion-a-esp8266-hardware/ vamos a ver como preparar el entorno de programación de Arduino (IDE) para programar el ESP8266.

Estas son las dos placas que vamos a usar.

Instalación Drivers Uso NodeMCU y Wemos D1 Mini

Para conectar las placas de prototipado NodeMCU y Wemos D1 Mini usamos el puerto USB y al contrario que con Arduino donde los drivers ya se instalan con el IDE, en este caso debemos instalar los drivers que emula un puerto serie (COM) en el USB de la placa utilizada.

Para el Wemos D1 Mini es necesario instalar el driver del conversor USB a serie que es el CH340G y excepto para el D1 mini Pro que es el chip CP2104:

Para el NodeMCU es necesario instalar el driver del adaptador USB CP210x de silicon labs:

Preparación IDE Arduino para usar con ESP8266

El ESP8266 dispone internamente de un pequeño procesador, prácticamente es capaz de replicar casi cualquier cosa los Arduinos puedan hacer. Usando el entorno de programación y el lenguaje de programación de Arduino podemos programar un ESP8266 cargando un firmware programado por nosotros mismo. Esto permite que la CPU ESP8266 y sus componentes Wi-Fi sean programados como cualquier otro dispositivo Arduino.

  • Puedes desarrollar con el mismo IDE que ya conoces
  • La comunidad ha hecho un Cross compiler, de forma que prácticamente utilizas los mismos comandos que utilizas con Arduino.
  • Puedes programar el procesador de tu ESP8266 exactamente como si fuera un Arduino con los mismos comandos, y en lo que se refiere a la WIFI, puedes olvidarte de los comandos AT, porque incluye una serie de librerías, que imitan la librería WIFI de Arduino con lo que se pueden reutilizar muchos programas hechos para Arduino y compilarlos para un ESP8266.  

El Arduino Core ESP8266 está disponible a través de GitHub: https://github.com/esp8266/Arduino

Reference de Arduino core para el ESP8266:

Listado de URLs para soporte de tarjetas no oficiales: https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls

Podemos instalar el soporte a terceros en nuestro IDE simplemente añadiendo el texto “http://arduino.esp8266.com/stable/package_esp8266com_index.json” en propiedades:

Y luego desde el gestor de tarjetas dar a instalar al soporte para ESP8266.

Blink con ESP8266

Una vez preparado nuestro IDE de Arduino para programar placas con ESP8266, podemos probar que funciona. Para ello vamos a probar blink en el Wemos D1 Mini y en el NodeMCU.

Paso 1: Abrir el ejemplo blink del IDE de Arduino:

void setup()
  { pinMode(LED_BUILTIN, OUTPUT); }

void loop()
  { digitalWrite(LED_BUILTIN, HIGH);  
    delay(1000);  
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);   
  }

Paso 2: seleccionar la tarjeta que vamos a programar

  • Wemos R2 & D1 mini
  • NodeMCU 1.0 (ESP-12E module)

Paso 3: Cargar el programa y comprobar que el led integrado funciona.

Ejercicio Propuesto

Revisar los ejemplos para ESP8266 que aparecen en el IDE y ejecutar el scanner de redes wifi llamado “WifiScan”.

Video. Iniciación a ESP8266. Hardware

Qué es ESP8266

El ESP8266 es un chip Wi-Fi de bajo coste con pila TCP/IP completa y capacidad de MCU (Micro Controller Unit) producida por el fabricante chino Espressif Systems, con sede en Shanghai.

ESP8266 vs Arduino

El chip que primero llamó la atención de los fabricantes occidentales en agosto de 2014 con el módulo ESP-01. Este pequeño módulo permite a los microcontroladores conectarse a una red Wi-Fi y realizar conexiones TCP/IP sencillas utilizando comandos de tipo Hayes. Sin embargo, en ese momento casi no había documentación en inglés sobre el chip y los comandos que aceptaba. El precio muy bajo y el hecho de que había muy pocos componentes externos en el módulo que sugiere que podría ser muy barato en el volumen, atrajo a muchos hackers para explorar el módulo, el chip y el software en él, así como para traducir la documentación china.

Web del producto: http://espressif.com/en/products/hardware/esp8266ex/overview

Datasheet: http://espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf

Wikipedia:

Características ESP8266

El esp8266 es un módulo que va alimentado a 3.3V. El ESP8266 no tiene ROM y usa una ROM externa SPI y soporta hasta 16MB.

Características:

  • 32-bit RISC CPU: Tensilica Xtensa LX106 running at 80 MHz
  • 64 KiB of instruction RAM, 96 KiB of data RAM
  • External QSPI flash – 512 KiB to 4 MiB* (up to 16 MiB is supported)
  • IEEE 802.11 b/g/n Wi-Fi
  • Integrated TR switch, balun, LNA, power amplifier and matching network
  • 16 GPIO pins
  • SPI, I²C,
  • I²S interfaces with DMA (sharing pins with GPIO)
  • UART on dedicated pins, plus a transmit-only UART can be enabled on GPIO2
  • 1 port 10-bit ADC

Pinout ESP8266:

Módulos ESP8266

El ESP8266 se presenta con muchos encapsulados: http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family

Los módulos ESP8266 los podemos encontrar en diferentes encapsulados y placas:

Características de los módulos:

Name Active pins Pitch Form factor LEDs Antenna Shielded? dimensions (mm) Notes
ESP-01 6 0.1″ 2×4 DIL Yes PCB trace No 14.3 × 24.8
ESP-02 6 0.1″ 2×4 castellated No U-FL connector No 14.2 × 14.2
ESP-03 10 2 mm 2×7 castellated No Ceramic No 17.3 × 12.1
ESP-04 10 2 mm 2×4 castellated No None No 14.7 × 12.1
ESP-05 3 0.1″ 1×5 SIL No U-FL connector No 14.2 × 14.2
ESP-06 11 misc 4×3 dice No None Yes 14.2 × 14.7 Not FCC approved
ESP-07 14 2 mm 2×8 pinhole Yes Ceramic + U-FL connector Yes 20.0 × 16.0 Not FCC approved
ESP-08 10 2 mm 2×7 castellated No None Yes 17.0 × 16.0 Not FCC approved
ESP-09 10 misc 4×3 dice No None No 10.0 × 10.0
ESP-10 3 2 mm? 1×5 castellated No None No 14.2 × 10.0
ESP-11 6 0.05″ 1×8 pinhole No Ceramic No 17.3 × 12.1
ESP-12 14 2 mm 2×8 castellated Yes PCB trace Yes 24.0 × 16.0 FCC and CE approved[14]
ESP-12E 20 2 mm 2×8 castellated Yes PCB trace Yes 24.0 × 16.0 4 MB Flash
ESP-12F 20 2 mm 2×8 castellated Yes PCB trace Yes 24.0 × 16.0 FCC and CE approved. Improved antenna performance. 4 MB Flash
ESP-13 16 1.5 mm 2×9 castellated No PCB trace Yes W18.0 x L20.0 Marked as ″FCC″. Shielded module is placed sideways, as compared to the ESP-12 modules.
ESP-14 22 2 mm 2×8 castellated +6 No PCB trace Yes 24.3 x 16.2

Interesante artículo sobre que módulo wifi ESP8266 elegir: http://polaridad.es/esp8266-modulo-wifi-elegir-caracteristicas/

Buena explicación de los módulos: http://visystem.ddns.net:7442/ESP8266-modulos/

Placas de Prototipado con ESP8266

Wemos D1 Mini

Wemos son una serie de placas de prototipado con chip ESP8266 integrado para conexión WiFi. Hay varios modelos y la página web oficial es https://www.wemos.cc/

En los microcontroladores ESP8266 y en las placas WeMos es posible varios firmware:

Tienda oficial de WeMos: https://es.aliexpress.com/store/1331105

Wemos ha apostado por el formato pequeño de placa.

Dentro de la Wemos D1 mini tenemos 3 modelos:

WeMos D1 Mini Pinout:

ATENCIÓN: Al usar el WeMos D1 mini con Arduino los número de los pines no corresponden con los números que pongamos en el IDE de Arduino, es decir, el pin D4 de WeMos D1 Mini puedo llamarlo como D4 o como 2, estas dos líneas son equivalentes y ponen a HIGH el pin D2 del WeMos:

  • digitalWrite(D4,HIGH)
  • digitalWrite(2, HIGH)

Shields Wemos D1 mini

Listado de shields oficiales Wemos: https://www.wemos.cc/en/latest/d1_mini_shield/ 

Shields: http://wiki.robotpersonal.es/index.php?title=Placas_WeMos_Mini

Resultado de imagen de wemos d1 mini shields

Tienda oficial de WeMos: https://es.aliexpress.com/store/1331105

NodeMCU

NodeMCU es una plataforma IoT de código abierto. Incluye firmware para programar en Lua que se ejecuta en el ESP8266 Wi-Fi SoC de Espressif Systems y está basado en el módulo ESP-12.

Web oficial: http://www.nodemcu.com/index_en.html

El término “NodeMCU” por defecto se refiere al firmware en lugar de los kits de desarrollo de ESP8266. El firmware utiliza el lenguaje de secuencias de comandos Lua.

Pinout:

Github: https://github.com/nodemcu

Documentación: http://nodemcu.readthedocs.io/en/master/

Versiones HW de la NodeMCU:

Comprar nodeMCU: https://es.aliexpress.com/wholesale?SearchText=nodemcu

Ejercicio Propuesto

Instalar el IDE de Arduino. Descargar desde https://www.arduino.cc/en/Main/Software

Tutorial paso a paso de instalación: https://aprendiendoarduino.wordpress.com/2017/06/18/instalacion-software-arduino/

Para saber más sobre el IDE y su configuración: https://aprendiendoarduino.wordpress.com/2017/06/18/ide-arduino-y-configuracion/