En esta práctica pondremos a prueba a la WeMos Mega WiFi, esta tarjeta une las mejores cualidades de 2 microcontroladores como lo son el ATmega2560 y el ESP8266. Realizaremos una aplicación en una interfaz móvil que usará una interfaz WiFi (via ESP8266) que controla dos motores de manera independiente.
Introducción
La WeMos Mega WiFi es una tarjeta dual, que contiene 2 microcontroladores dentro de ella : el ATmega2560 y el ESP8266. Se puede trabajar de forma individual o en conjunto, esta última forma de trabajo es lo que nos permite incrementar las aplicaciones de nuestros proyectos al unir lo mejor de ambos, tiene una velocidad de reloj de 16MHz para ATmega2560 y 160 MHz para ESP8266EX.
Funciona con un voltaje de operación de 2.7V a 3.6V y consume aproximadamente 45mA a 3.0V. Tiene una sensibilidad de seguimiento de -161 dBm y una precisión de posicionamiento horizontal de 2.5 metros CEP. Su interfaz de comunicación UART permite una fácil integración con microcontroladores como Arduino, operando típicamente a 9600 bps. El módulo soporta frecuencias de actualización de hasta 5Hz y utiliza protocolos NMEA y UBX para la transmisión de datos. Además, incluye una antena cerámica de alta ganancia con un amplificador LNA integrado, mejorando la recepción de la señal.
- Digitales : 54 para ATmega2560 y 8 para ESP8266EX.
- Analógica: 16 para ATMEGA328P y 1 para ESP8266.
Se puede alimentar por medio de un cable MicroUSB de 5 V (500 mA máx.) o VIN Power Jack de 7V a 16V DC.
Para poder trabajar con la WeMos Mega WiFi se tienen que realizar unas configuraciones físicas en la tarjeta, modificando el DIP Switch que se encuentra en la parte central de la tarjeta. En la siguiente tabla se muestran las configuraciones del DIP switch para cada modo de trabajo con la WeMos.
El DIP switch está numerada del 1 al 8, estos se deben cambiar de posición de acuerdo al modo de trabajo que se quiera emplear, la posición de los switch indican el estado: arriba indican un ON y abajo indican un OFF.
Materiales
- WeMos Mega WiFi
- Servomotor SG90 RC 9g X2
- Motor R150 DC 1V – 5V 5000 RPM X2
- L298N Módulo Driver Motor A pasos
- Cables Dupont Largos 20cm HH MH MM
Desarrollo
Por medio del ATMEGA se realizará la conexión de los servomotores y motores DC , con el ESP8266 realizaremos la conexión a la red WiFi.
Este arreglo es muy interesante ya que, si tienes un poco de experiencia con tarjetas de la familia ESP sabrás que el modelo ESP8266 no tiene una gran número de entradas y salidas, lo que limita de cierta forma su uso en aplicaciones de grandes dimensiones a pesar de integrar conexión a WiFi mientras que el AtMega cuenta con una cantidad ingente de entradas/salidas.
Al unir estas 2 características potenciamos a cada microcontrolador al sumar la robustez del ATMEGA y la conexión a WiFi de la ESP.
La práctica se divide en 4 fases de configuración y programación , las cuales son:
- Realización de interfaz de servidor Web.
- Control de servomotores.
- Comunicación por puerto serial para ambos microcontroladores.
- Control por medio de la aplicación Web.
Diagrama de conexiones
A continuación, se detallan las conexiones de los componentes:
Requerimientos previos software
Para poder usar la tarjeta debemos descargar el gestor de tarjeta correspondiente a la ESP8266 esto lo haremos de la siguiente forma. Dentro de IDE Arduino cambiaremos las preferencias por medio de la barra de herramientas:
File > Preference > https://arduino.esp8266.com/stable/package_esp8266com_index.json
Realización de interfaz de servidor Web
Para la interfaz del sistema de control subiremos el sketck del servidor web al microcontrolador ESP8266EX, para esto se debe realizar la siguiente configuración física en el DIP Switch en modo “CH340 conectado a ESP8266(subir sketch)”
Además debemos configurar en Arduino IDE: Tools>Placa> Generic ESP8266 Module
Y colocar el puerto asignado en nuestro caso fue el “COM11”
Código
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> // Configura los detalles de tu red WiFi const char* ssid = "Aquí pones el nombre de tu red"; const char* password = "La contraseña de tu red"; ESP8266WebServer server(80); void setup() { Serial.begin(115200); // Conecta a la red WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); // Serial.println("Conectando a la red WiFi..."); Serial.println("1000"); } // Serial.println("Conectado a la red WiFi"); Serial.println("Dirección IP: "); Serial.println(WiFi.localIP()); // Manejadores de ruta para el servidor web server.on("/", HTTP_GET, []() { server.send(200, "text/html", "<html><body>" "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" "<h1>WEMOS</h1>" "<h2>Control de Servomotores </h2>" "<input type=\"range\" min=\"0\" max=\"180\" value=\"0\" id=\"slider1\" onchange=\"updateSlider(1, this.value)\">" "<p id=\"slider1-value\">0</p>" "<input type=\"range\" min=\"0\" max=\"180\" value=\"0\" id=\"slider2\" onchange=\"updateSlider(2, this.value)\">" "<p id=\"slider2-value\">0</p>" "<h2>Control de Motores DC</h2>" "<input type=\"range\" min=\"0\" max=\"256\" value=\"0\" id=\"slider3\" onchange=\"updateSlider(3, this.value)\">" "<p id=\"slider3-value\">0</p>" "<form action=\"/button1\" method=\"get\"><button> Adelante </button></form>" "<form action=\"/button2\" method=\"get\"><button> Apagado </button></form>" "<form action=\"/button3\" method=\"get\"><button> Atras </button></form>" "<script>" "function updateSlider(button, val) {" "document.getElementById('slider' + button + '-value').innerHTML = val;" "var xhttp = new XMLHttpRequest();" "xhttp.open('GET', '/slider?button=' + button + '&value=' + val, true);" "xhttp.send();" "}" "</script>" "</body></html>"); }); server.on("/button1", HTTP_GET, []() { Serial.println("800"); server.send(302, "text/plain", "OK"); }); server.on("/button2", HTTP_GET, []() { Serial.println("820"); server.send(200, "text/plain", "OK"); }); server.on("/button3", HTTP_GET, []() { Serial.println("840"); server.send(200, "text/plain", "OK"); }); server.on("/slider", HTTP_GET, []() { int button = server.arg("button").toInt(); int value = server.arg("value").toInt(); if(button==1) { value= value+100; } if(button==2) { value= value+300; } if(button==3) { value= value+500; } Serial.print("Slider "); Serial.print(button); Serial.print(" : ajustado a: "); Serial.println(value); server.send(200, "text/plain", "OK"); }); server.begin(); Serial.println("Servidor HTTP iniciado"); } void loop() { server.handleClient(); }
Control de servomotores
Ahora para realizar el control de los servomotores y motores de dc utilizaremos los puertos del ATmega2560, por lo que subiremos el siguiente sketch, para esto desconectamos y realizaremos los cambios físicos en la configuración del DIP Switch en modo “CH340 conectado a ATmega2560(subir sketch”)
Conectaremos el cable USB al WeMos y configuraremos en el Arduino IDE : Herramientas>Placa >”Arduino Mega or Mega 2560”
Y el puerto asignado , en nuestro caso es “COM5”
Sketch para el ATmega2560
#include <MemoryFree.h> #include <EEPROM.h> #include <Servo.h> String inString; Servo myservo1; Servo myservo2; int num2=0; int IN1 = 2 ; int IN2 = 3 ; int IN3 = 4 ; int IN4 = 5 ; int ENA1 = 6; int ENA2 = 7; int vel=0; void setup() { // Inicialización de puertos y salidas Serial.begin(115200); Serial3.begin(115200); myservo1.attach(8); myservo2.attach(9); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(ENA1, OUTPUT); pinMode(ENA2, OUTPUT); } void loop() { } // Verificacion de la conectividad entre la Mega y ESP8266 void serialEvent3() { while (Serial3.available()>0) { //EL MEGA se comuncia con la ESP via su puerto serial numero 3; para comunicar cualquier datos se pede hacer mediante este puerto // Lectura de datos del Serial3 // Serial.print("Si lee los datos "); num2= Serial3.parseInt(); if(num2 == 1000) { Serial.println("Se conecto a la red : .... Todo Listo"); } //***** Movimiento de los servos if( num2 > 100 && num2<300) { num2=num2-100+0; Serial.print("El angulo del servo es : "); Serial.println(num2); myservo1.write(num2); } if( num2 > 300 && num2<500) { num2=num2-300+0; Serial.print("El angulo del servo es : "); Serial.println(num2); myservo2.write(num2); } //***** Velocidad de los motores if( num2 > 500 && num2<800) { num2= num2 - 500+0; Serial.print(" La velocidad de los motores es : "); Serial.println(num2); vel=num2; analogWrite(ENA1,vel); analogWrite(ENA2,vel); } //*** Botones if( num2 ==800 ) { Serial.print(" El motor va hacia delante : "); analogWrite(ENA1,255); analogWrite(ENA2,255); digitalWrite(IN2, HIGH); digitalWrite(IN1, LOW); digitalWrite(IN4, HIGH); digitalWrite(IN3, LOW); } if( num2 ==820 ) { Serial.print(" El motor se apago : "); digitalWrite(IN2, LOW); digitalWrite(IN1, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } if( num2 ==840 ) { Serial.print(" El motor va hacia atras : "); analogWrite(ENA1,255); analogWrite(ENA2,255); digitalWrite(IN2, LOW); digitalWrite(IN1, HIGH); digitalWrite(IN4, LOW); digitalWrite(IN3, HIGH); } } }
Comunicación por puerto serial para ambos microcontroladores
Una vez cargado los sketch correspondientes al ESP8266 y al ATmega2560, desconectamos una vez más el cable USB y realizaremos los cambios físicos en la configuración del DIP Switch en modo “CH340 conectado a ATmega2560 COMX conectado a ESP8266”, esto es para accionar los dos microcontroladores y que estén comunicados por puerto serial.
Control por medio de la aplicación Web
Dentro de la interfaz dirígete al IP asignada que aparece en el puerto serial y posteriormente abrirá una ventana de interfaz gráfica de control para los servomotores y los motores de DC.
Conclusión
Gracias a la práctica con Wemos Mega WiFi se pudo observar su funcionamiento en términos de conectividad WiFi, la velocidad de procesamiento y estabilidad durante la ejecución de las tareas de control son satisfactorias.
Otro punto importante es la facilidad con la que se pudo configurar y programar el dispositivo utilizando la configuración del DIP switch.
Es una gran tarjeta de desarrollo con mucho potencial gracias al número de pines disponibles, logrando conectar más dispositivos, actuadores y sensores, esto hace a la tarjeta de desarrollo una opción para proyectos más complejos.