Robot WiFi - javierre/nodemcu GitHub Wiki
TBD
Versión con motores DC. Nótese que los motores se ponen "enfrentados", por lo que los sentidos de giro son contrarios cuando el robot se desplaza en línea recta.
Para testearlo es necesario conectarse a la WiFi del robot (ssid "NodeMCU-ESP8266", password 12345678) y entrar en la IP 192.168.4.1
/*
NodeMCU Access Point - Servidor Web por Dani No www.esploradores.com
Crea un servidor Web en modo Access Point que permite encender y apagar un LED conectado a la salida D4 (GPIO02) del módulo NodeMCU.
Este código de ejemplo es de público dominio.
http://www.esploradores.com/access-point-servidor-web-nodemcu/
*/
#include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi
#define RightMotorSpeed 4 // POWERB
#define RightMotorDir 2 // DIRB
#define LeftMotorSpeed 5 // POWERA
#define LeftMotorDir 0 // DIRA
#define turnspeed 1000 //0--> 1024
#define forwardspeed 1000 //0 --> 1024
const char ssid[] = "NodeMCU-ESP8266"; //Definimos la SSDI de nuestro servidor WiFi -nombre de red-
const char password[] = "12345678"; //Definimos la contraseña de nuestro servidor
WiFiServer server(80); //Definimos el puerto de comunicaciones
int estado = 0; //Definimos la variable que va a recoger el estado del motor
void halt() //0
{
digitalWrite(RightMotorSpeed, LOW);
digitalWrite(LeftMotorSpeed, LOW);
analogWrite(RightMotorSpeed, 0);
analogWrite(LeftMotorSpeed, 0);
}
void forward()//1
{
Serial.println("forward");
digitalWrite(RightMotorDir, LOW);
digitalWrite(LeftMotorDir, HIGH);
analogWrite(RightMotorSpeed, forwardspeed);
analogWrite(LeftMotorSpeed, forwardspeed);
}
void reverse()//2
{
Serial.println("reverse");
digitalWrite(RightMotorDir, HIGH);
digitalWrite(LeftMotorDir, LOW);
analogWrite(RightMotorSpeed, forwardspeed);
analogWrite(LeftMotorSpeed, forwardspeed);
}
void right()//3
{
Serial.println("right");
digitalWrite(RightMotorDir, HIGH);
digitalWrite(LeftMotorDir, HIGH);
analogWrite(RightMotorSpeed, turnspeed);
analogWrite(LeftMotorSpeed, turnspeed);
}
void left()//4
{
Serial.println("left");
digitalWrite(RightMotorDir, LOW);
digitalWrite(LeftMotorDir, LOW);
analogWrite(RightMotorSpeed, turnspeed);
analogWrite(LeftMotorSpeed, turnspeed);
}
void setup() {
pinMode(RightMotorSpeed, OUTPUT);
pinMode(RightMotorDir, OUTPUT);
pinMode(LeftMotorSpeed, OUTPUT);
pinMode(LeftMotorDir, OUTPUT);
Serial.begin(9600);
halt();
server.begin(); //inicializamos el servidor
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password); //Red con clave, en el canal 1 y visible
//WiFi.softAP(ssid, password,3,1); //Red con clave, en el canal 3 y visible
//WiFi.softAP(ssid); //Red abierta
Serial.println();
Serial.print("Direccion IP Access Point - por defecto: "); //Imprime la dirección IP
Serial.println(WiFi.softAPIP());
Serial.print("Direccion MAC Access Point: "); //Imprime la dirección MAC
Serial.println(WiFi.softAPmacAddress());
//IPAddress local_ip(192, 168, 1, 1); //Modifica la dirección IP, por defecto es http://192.168.4.1
//IPAddress gateway(192, 168, 1, 1);
//IPAddress subnet(255, 255, 255, 0);
//WiFi.softAPConfig(local_ip, gateway, subnet);
//Serial.println();
//Serial.print("Access Point - Nueva direccion IP: ");
//Serial.println(WiFi.softAPIP());
}
void loop()
{
// Comprueba si el cliente ha conectado
WiFiClient client = server.available();
if (!client) {
return;
}
// Espera hasta que el cliente envía alguna petición
Serial.println("nuevo cliente");
while(!client.available()){
delay(1);
}
// Imprime el número de clientes conectados
Serial.printf("Clientes conectados al Access Point: %dn", WiFi.softAPgetStationNum());
// Lee la petición
String peticion = client.readStringUntil('\r');
Serial.println(peticion);
client.flush();
// Comprueba la petición
if (peticion.indexOf('/robot=H') != -1) {
estado = 0;
halt();
}
if (peticion.indexOf('/robot=F') != -1) {
estado = 1;
forward();
}
if (peticion.indexOf('/robot=B') != -1) {
estado = 2;
reverse();
}
if (peticion.indexOf('/robot=R') != -1) {
estado = 3;
right();
}
if (peticion.indexOf('/robot=L') != -1) {
estado = 4;
left();
}
// Envía la página HTML de respuesta al cliente
client.println("HTTP/1.1 200 OK");
client.println(""); //No olvidar esta línea de separación
client.println("<!DOCTYPE HTML>");
client.println("<meta charset='UTF-8'>");
client.println("<html>");
String chck0="";
String chck1="";
String chck2="";
String chck3="";
String chck4="";
//Imprime el estado del led
client.print("<h1>El Robot está ahora: ");
if(estado == 0) {
chck0=" checked ";
client.print("PARADO</h1>");
} else if(estado==1){
chck1=" checked ";
client.print("AVANZANDO</h1>");
} else if(estado==2){
chck2=" checked ";
client.print("RETROCEDIENDO</h1>");
} else if(estado==3){
chck3=" checked ";
client.print("GIRANDO A LA DCHA</h1>");
}
else if(estado==4){
chck4=" checked ";
client.print("GIRANDO A LA IZDA</h1>");
}
//Se crean enlaces para modificar el estado del LED
client.println("Presiona <a href='/robot=H'>AQUÍ</a> para parar el robot<br>");
client.println("Presiona <a href='/robot=F'>AQUÍ</a> para avanzar<br>");
client.println("Presiona <a href='/robot=B'>AQUÍ</a> para retroceder<br>");
client.println("Presiona <a href='/robot=R'>AQUÍ</a> para girar a la derecha<br>");
client.println("Presiona <a href='/robot=L'>AQUÍ</a> para girar a la izquierda<br>");
//Se crean cajas de comprobación (checkbox) para modificar el estado del LED
client.println("<input type='checkbox' "+chck0+" onClick=location.href='/robot=H'> PARAR </input><br>");
Serial.println("<input type='checkbox' "+chck0+" onClick=location.href='/robot=H'> PARAR </input><br>");
client.println("<input type='checkbox' "+chck1+" onClick=location.href='/robot=F'> AVANZAR </input><br>");
client.println("<input type='checkbox' "+chck2+" onClick=location.href='/robot=B'> RETROCEDER </input><br>");
client.println("<input type='checkbox' "+chck3+" onClick=location.href='/robot=B'> GIRAR DCHA </input><br>");
client.println("<input type='checkbox' "+chck4+" onClick=location.href='/robot=R'> GIRAR IZDA </input><br>");
//Se crean botones con estilos para modificar el estado del LED
client.println("<button type='button' onClick=location.href='/robot=F' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> AVANZAR</h2> </button>");
client.println("<button type='button' onClick=location.href='/robot=H' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> PARAR</h2> </button>");
client.println("<button type='button' onClick=location.href='/robot=B' style='margin:auto; background-color:yellow; color:black; padding:5px; border:2px solid black; width:200;'><h2> RETROCEDER</h2> </button>");
client.println("<button type='button' onClick=location.href='/robot=R' style='margin:auto; background-color:orange; color:black; padding:5px; border:2px solid black; width:200;'><h2> GIRAR DCHA</h2> </button>");
client.println("<button type='button' onClick=location.href='/robot=L' style='margin:auto; background-color:blue; color:black; padding:5px; border:2px solid black; width:200;'><h2> GIRAR IZDA</h2> </button><br><br>");
client.println("</html>");
delay(1);
Serial.println("Petición finalizada"); // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición.
//Desconexión de los clientes
//WiFi.softAPdisconnect();
}