El ESP8266 es un chip de bajo costo Wi-Fi con una pila TCP/IP completa y un microcontrolador, fabricado por Espressif, una empresa afincada en Shanghai, China.
El primer chip se hace conocido en los mercados alrededor de agosto de 2014 con el módulo ESP-01, desarrollado por la empresa AI-Thinker. Este pequeño módulo permite a otros microcontroladores conectarse a un red inalámbrica Wi-Fi y realizar conexiones simples con TCP/IP usando comandos al estilo Hayes.1
Es importante recalcar que el ESP8266 es un microcontrolador que puede incluso reemplazar al Arduino dependiendo la aplicación, pudiendo cargar lógica de programación en su memoria, incluso, utilizando el Arduino IDE. La programación no es tan sencilla como en el Arduino, pero es una utilidad muy eficiente y de bajo costo. En otras entradas estaremos viendo como utilizar el ESP8266 sin el Arduino.
En esta ocasión vamos a configurar un módulo ESP-01 para que dote a nuestro Arduino de funcionalidad Wifi.
Inicialmente, debemos diferenciar el módulo ESP-01 y establecer comunicación con el. Estos módulos vienen con comunicación a 9600bps (azul) y 115200bps (negro).
Vamos a armar un circuito en el que el Arduino sirva de pasarela de comunicación (passthrough) para comunicarnos directamente con el ESP-01 a través del Puerto Serial del Arduino (Pin 0 y 1) usando el terminal. En mi caso, tengo un modulo de 115200 (negro).
Nótese que conecté el TX con TX y el RX con RX. De ese modo hacemos la pasarela. También es importante dejar en RESET el Arduino, para que no ejecute lógica. A continuación el diagrama:
Vamos a conectar el USB en el Arduino y abrir el Terminal, reiniciar el módulo y deberíamos obtener la respuesta “ready”. Ignorar los caracteres aleatorios que salen al inicio de la respuesta, forman parte del firmware del módulo. Nota que mi terminal esta en 115200bps.
Ingresé el comando “AT”, obteniendo la respuesta “OK”. Una lista de todos los comandos AT disponibles está aquí. Básicamente lo mas importante es entender lo siguiente:
En el programa, podemos usar el módulo ESP-01 en el puerto Serial del Arduino, pero perderíamos la comunicación. Si usamos un Arduino Mega no hay problemas, porque tenemos Serial1, Serial2 y Serial3 disponibles. Sin embargo, si vamos a utilizar Arduino UNO, lo hacemos a través de la libreria SoftwareSerial, por lo que es importante bajar la velocidad de comunicación del ESP-01 a 9600bps, ya que sencillamente el SoftwareSerial a 115200bps no funciona.
Para el fin mencionado anteriormente entonces utilizamos el siguiente comando: “AT+UART_DEF=9600,8,1,0,0”
Obtenemos la respuesta “OK” y es básicamente el único comando que vamos a utilizar antes de proceder a configurar el Arduino con el ESP-01 Wifi. Movemos el terminal a 9600bps, y con el comando “AT”, obtenemos “OK”.
Ahora hacemos las conexiones para el Cliente Web:
Existen diversos métodos de configuración del ESP-01 con el Arduino: usando los mismos comandos AT, o utilizando algunas librerías para tal efecto. Entre las librerías que existen, vamos a usar WiFiEsp. Esta librería provee una funcionalidad casi idéntica al Shield Arduino Wifi.
Abrimos el ejemplo de la librería: “WebClientRepeating”
Cambiamos:
char ssid[] = “wifiSSID”; // your network SSID (name)
char pass[] = “wifiPassword”; // your network password
Y nota que ahora RX y TX están cruzados:
SoftwareSerial Serial1(6, 7); // RX, TX
Recuerda quitar el jumper RESET del Arduino. Cargamos el programa y si todo sale bien en el terminal deberíamos obtener esta respuesta:
Cambié el Server de Conexión a mi servidor local (Apache) y creé un HTML sencillo que me mostrara un mensaje, para probar la funcionalidad. Aquí está el código y la respuesta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
/* WiFiEsp example: WebClientRepeating This sketch connects to a web server and makes an HTTP request using an Arduino ESP8266 module. It repeats the HTTP call each 10 seconds. For more details see: http://yaab-arduino.blogspot.com/p/wifiesp.html */ #include "WiFiEsp.h" // Emulate Serial1 on pins 6/7 if not present #ifndef HAVE_HWSERIAL1 #include "SoftwareSerial.h" SoftwareSerial Serial1(6, 7); // RX, TX #endif char ssid[] = "alis"; // your network SSID (name) char pass[] = "wifiPassword"; // your network password int status = WL_IDLE_STATUS; // the Wifi radio's status //char server[] = "arduino.cc"; char server[] = "192.168.0.51"; unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds const unsigned long postingInterval = 10000L; // delay between updates, in milliseconds // Initialize the Ethernet client object WiFiEspClient client; void setup() { // initialize serial for debugging Serial.begin(9600); // initialize serial for ESP module Serial1.begin(9600); // initialize ESP module WiFi.init(&Serial1); // check for the presence of the shield if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue while (true); } // attempt to connect to WiFi network while ( status != WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network status = WiFi.begin(ssid, pass); } Serial.println("You're connected to the network"); printWifiStatus(); } void loop() { // if there's incoming data from the net connection send it out the serial port // this is for debugging purposes only while (client.available()) { char c = client.read(); Serial.write(c); } // if 10 seconds have passed since your last connection, // then connect again and send data if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } } // this method makes a HTTP connection to the server void httpRequest() { Serial.println(); // close any connection before send a new request // this will free the socket on the WiFi shield client.stop(); // if there's a successful connection if (client.connect(server, 80)) { Serial.println("Connecting..."); // send the HTTP PUT request //client.println(F("GET /asciilogo.txt HTTP/1.1")); client.println(F("GET /arduino.html HTTP/1.1")); //client.println(F("Host: arduino.cc")); client.println(String("Host: ") + String(server)); client.println("Connection: close"); client.println(); // note the time that the connection was made lastConnectionTime = millis(); } else { // if you couldn't make a connection Serial.println("Connection failed"); } } void printWifiStatus() { // print the SSID of the network you're attached to Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your WiFi shield's IP address IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength long rssi = WiFi.RSSI(); Serial.print("Signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } |
Por último, las conexiones vistas son en ambiente de laboratorio. ES IMPORTANTE señalar lo siguiente:
- La alimentación 3.3v del ESP8266 en condiciones de alto trabajo llega a consumir 200ma. El pin de 3.3v del Arduino en sus especificaciones maneja 50mA. Es por esto, que en condiciones de trabajo podemos dañar el pin. Lo cual hace que sea necesario el uso de una fuente externa para la alimentación del ESP-01.
- Por el mismo motivo de diferencias de voltaje, se recomienda utilizar un divisor de voltaje entre el pin TX del Arduino y el RX del ESP-01, para ajustar los niveles de voltaje y evitar daños.
- Estas recomendaciones son para un montaje final, sin embargo, como comentado, en el laboratorio, sin tiempos de trabajo prolongados, todo funciona perfectamente sin daños.
- Esta serían las conexiones mencionadas.