La tendencia actual a la programación de microcontroladores se esta moviendo hacia el área del Internet of Things (IoT). Esto quiere decir que nuestros dispositivos deben de ser capaces de conectarse para poder utilizar las últimas librerías y ambientes de trabajo. En este post nos centraremos en una línea específica de dispositivos capaces de hacer esto: NodeMCU.
Los dispositivos utilizados comúnmente de la línea de Arduino no tienen conectividad a Internet. Sus últimos modelos han sido introducidos con este enfoque en mente, pero es difícil de vencer a un chip de tan bajo costo y mejores velocidades de procesamiento (en muchos casos) como es el ESP8266. Anteriormente se ha publicado sobre este dispositivo, específicamente sobre el ESP01.
En esta entrada conoceremos algunos de los nuevos dispositivos que han salido al mercado y que nos permiten conectarnos a Internet de forma nativa a través de WiFi. Se trata de placas de desarrollo similares a Arduino, programables en lenguaje Arduino y con WiFi embebido. Nos centraremos en la programación de estos microcontroladores por medio de la interfaz de Arduino IDE.
Una nueva generación de sistemas embebidos
En meses recientes el mercado se ha visto plagado por una infinidad de nuevos modelos y marcas de placas de desarrollo similares al Arduino. No me refiero a los Arduinos clonados, que son una simple copia de los modelos originales. Me refiero a placas basadas en los mismos microcontroladores que el Arduino, pero con capacidades nativas integradas tales como conectividad Bluetooth y/o WiFi.
Existe una línea open-source de placas de desarrolladores llamada NodeMCU. En el mercado podemos encontrar diferentes modelos de estas nuevas placas basadas en el ESP8266. Estos varían en su memoria interna y en la cantidad de pines de entrada/salida disponibles. En el caso del NodeMCU, esta placa fue diseñada principalmente para trabajar con Lua, aunque es posible utilizarla con Micropython o con Arduino.
En la imagen anterior tenemos dos versiones de estas placas NodeMCU: Amica y Lolin. La versión de Lolin no es una versión oficial de NodeMCU, pero fue diseñada como una mejora a la placa desarrollada por Amica. Esto es subjetivo, debido a que la única mejora es la presencia de un pin extra de 5V (antes de entrar al regulador de voltaje). Sin embargo posee la desventaja de que su tamaño es mucho mayor. No es posible utilizar esta versión en un breadboard sencillo (debido a que no tiene columnas sobrantes a los lados para hacer conexiones).
Especificaciones técnicas de NodeMCU 1.0 (Amica/Lolin)
Están basados en el ESP12E, el cual es una variante del ESP8266.
- Voltaje de entrada (USB): 5V
- Voltaje de salida en los pines: 3.3V
- Voltaje de referencia en el ADC: 3.3V
- Corriente nominal por pin: 12mA
- Frecuencia de procesador: 80MHz (160MHz max.)
- 4MB Flash
- Consumo de corriente en stand-by @80MHz: 80mA
- Consumo de corriente al recibir una peticion (librería WebServer en modo de punto de acceso) @ 80MHz: 90mA
- Consumo de corriente al utilizar HTTPClient.get() @ 80 MHz: 100-110mA
- Consumo de corriente en stand-by @160MHz: 90mA
- Consumo de corriente al recibir una peticion (librería WebServer en modo de punto de acceso) @ 160MHz: 90-100mA
- Consumo de corriente al utilizar HTTPClient.get() @ 160 MHz: 100-110mA
Lenguajes de programación
Para los ejemplos de este post, utilizaremos el lenguaje Arduino y el Arduino IDE. Como sabemos, el lenguaje Arduino es una plataforma con la que puedes compartir código entre diferentes placas y posee una gran cantidad de de librerías existentes. Las otras plataformas (Micropython y Lua) tienen sus ventajas y desventajas. Una de sus grandes deficiencias que podemos mencionar es que no son estables (especialmente Lua) y que son lenguajes interpretados. Esto quiere decir que procesan el código un poco más lento que las contrapartes en Arduino.
Integración con el lenguaje Arduino
Agregar la placas al Arduino IDE
El Arduino IDE es un entorno de desarrollo que ha ido evolucionando a través del tiempo hasta convertirse en una excelente opción para escribir código. Hoy día es posible contar con herramientas de gestión de repositorios, similares a Maven, Composer, etc. Para programar las placas de las que hemos estado escribiendo necesitaremos agregar un repositorio a nuestro Arduino IDE.
Abrimos la interfaz de Arduino y seleccionamos Archivo>Preferencias. En la lista de URLs de placas adicionales, agregamos la siguiente:
1 |
http://arduino.esp8266.com/stable/package_esp8266com_index.json |
Con esta configuración tendremos acceso a diferentes recursos de código que han sido desarrollados por otras personas y nos facilitarán el cumplimiento de los objetivos propuestos.
Instalación de paquetes
Vamos a Herramientas>Placas>Administrador de Placas y buscar el paquete «esp8266». Lo instalamos.
Con este paso estamos listos para empezar a programar la placa.
Subiendo códigos de prueba
Luego de instalar el paquete, reiniciamos el ambiente de desarrollo de Arduino y seleccionamos el puerto correcto de nuestro ESP en Herramientas > Puerto. Ahora hay que seleccionar el modelo de nuestro dispositivo en Herramientas > Placa.
En mi caso estoy utilizando un NodeMCU 1.0. Solo necesito seleccionar la placa y las opciones para la carga del código se ajustan automáticamente. Si tienes algún otro módulo deberás buscar cuales son las opciones óptimas (dependiendo del tamaño máximo de almacenamiento del dispositivo).
1 2 3 4 5 6 7 8 |
void setup() { Serial.begin(115200); } void loop() { Serial.println("Estoy vivo"); delay(1000); } |
Luego solo debemos subir este código y comprobar mediante el monitor serie que se esta imprimiendo la frase «Estoy vivo».
Código de prueba de punto de acceso
Armamos el pequeño circuito, y subimos el siguiente código:
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 |
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #define LED_PIN D8 //Pin a utilizar para controlar el LED const char *ssid = "PanamaHitek"; //Nombre de la red para el punto de acceso const char *password = "12345678"; //Debe ser mayor o igual a 8 caracteres o pueden ocurrir errores ESP8266WebServer server(80); //Iniciar servidor boolean ledStatus=0; //Estado del LED void toggleLed() { ledStatus=!ledStatus; digitalWrite(LED_PIN,ledStatus); server.send(200, "text/html", "Hola mundo!"); //Enviar mensaje de vuelta } void setup() { delay(10); pinMode(LED_PIN,OUTPUT); //Modo de operacion del pin WiFi.softAP(ssid, password); //Iniciar punto de acceso server.on("/", toggleLed); //Activar la funcion toggleLed() cuando se reciba una petición en la raíz server.begin(); } void loop() { server.handleClient(); } |
El código anterior nos permite iniciar un punto de acceso, y además de eso escuchar peticiones a través de la red. Cuando nos conectamos a este punto de acceso, debemos acceder al siguiente URL desde cualquier navegador:
1 |
192.168.4.1 |
Ahora el LED se encenderá. Cada vez que refresquemos la página el LED cambiará de estado.
Notas sobre placas basadas en la línea NodeMCU
- Los números de pines de están mal ordenados en la placa impresa. Esto fue corregido por medio de software, y los pines deben de tener el prefijo «D» (si es digital). Ejemplo: Si deseamos encender el pin digital 2:
1digitalWrite(D2,HIGH); - Estas placas cuentan con un divisor de voltaje interno en el convertidor de señales análogas a digitales , por lo cual el voltaje máximo (para tener una lectura de 1023) es de 3.3V.
Notas generales
- Los pines de salida tienen protecciones hasta 5V. Luego de aquí es posible que la placa sufra daños.
- El convertidor de señales analógicas a digitales tiene un voltaje de referencia de 1V.
Esperamos que la información compartida sea de utilidad para ustedes. Saludos.
Muy Util, Gracias!
Hola amigo, me gusto mucho tu explicación, espero me puedas ayudar con una duda, quiero conectarlo a un access point en modo station, solo para mandar avisos de mi estado, tambien pretendo conectarlo a una bateria de boton de 3v ¿Se puede reprogramar o ya una vez programado no se puede volver a configurar?
Hola, yo lo he reprogramado tantas veces como he querido. Es exactamente como un Arduino en ese aspecto… Solo necesitas el NodeMCU y tu electronica periferica (LEDs, sensores, LCD/TFT…) Ten en cuenta que el espacio para almacenar tu programa es muy limitado, por lo que olvidate de «muchisimas lineas de codigo»… Si es lo que necesitas porque tu programa es «muy grande», puedes usarlo tambien en conjunto con un Arduino, de modo que tu Arduino tenga «todo el programa gordo» y tu NodeMCU el «programa minimo» responsable de las primeras decisiones respecto a la conectividad WLan (WiFi).
Buenas una pregunta tengo un modelo de esa misma clase ESP8266mod[NodeMCU], el pin de *vin* hasta que máximo entrada de voltaje, permite? disculpa mi ignorancia
3.3 v solamente amigo metele mas y lo quemas
Es correcto
5 voltios ese pin esta conectado con la alimentación de USB.
Hola, como el cliente puede saber la URL o IP del punto de acceso a donde conectarse?.
Salu2.