Skip to content

Robot WiFi

javierre edited this page Jun 21, 2019 · 6 revisions

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.

Motor DC

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();
}


Clone this wiki locally