Cochecito con control sensor orientación teléfono


          Esto es el montaje de un carrito controlado con el sensor de orientación de un teléfono Android. No es perfecto (ni se pretendo) ni en hardware ni en software. Solo en plan demostrativo y a perfeccionar por los más interesados.

          Aprovechando el bajo precio (1,67€) del cochecito en formato de kit, pedí dos que uní por el centro. Solo uso la placa, motores (3v) y ruedas.

          El control de los motores lo hago con el driver DRV8833 en sustitución del clásico L298, es mucho más pequeño y solo necesita dos pines para controlar cada motor (sentido y velocidad) frente a los tres necesarios en el L298.

          El micro es esp8266 Nodemcu D1 mini para tener conexión Wifi con nuestro cochecito y poder controlarlo con el tel´fono.

          El circuito es muy simple y permite su montaje en una placa de tiras
         En el programa para el esp8266 lo definimos como Web Server con WiFi en modo Access Point (AP), en nuestro teléfono aparecerá en la WiFi como "RobotWifi" y clave 12345678 y ya podremos controlarlo con nuestra apk de Android..
/* http://www.jopapa.me  2024
* ESP8266 como Web Server con WiFi en modo Access Point (AP)
* Conectar en el telefono al AP "Robot Wifi", password = "12345678"
* Driver de motores de 3v con DRV8833
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "Robot Wifi";
const char* password = "12345678";

#define MOT_A1_PIN  D5    //Pines del esp8266 para el DRV8833       
#define MOT_A2_PIN  D6           
#define MOT_A3_PIN  D7          
#define MOT_A4_PIN  D8          

String command0;             //Variable String para almacenar el estado del comando de la aplicación
String command;             //Variable String para almacenar el estado del comando de la aplicación
int speed = 0;

ESP8266WebServer server(80);  //Creamos un objeto servidor WEB que escuchará en el puerto 80

void setup() {
  Serial.begin(115200);

  pinMode(MOT_A1_PIN, OUTPUT);  
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_A3_PIN, OUTPUT);
  pinMode(MOT_A4_PIN, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
 
// Conecta a Wifi
  WiFi.mode(WIFI_AP);           //Solo Access point
  WiFi.softAP(ssid, password);  //HOTspot

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);

// Starting WEB-server
     server.on ( "/", HTTP_handleRoot );  //indicamos una función como respuesta del servidor cuando el navegador solicita cierta URL
     server.onNotFound ( HTTP_handleRoot );
     server.begin();   // Le dice al servidor que comience a escuchar las conexiones entrantes. 
}

void loop() {
      server.handleClient();      //escuchamos las conexiones entrantes:    
      command0 = server.arg("State");
      //Serial.println(command.substring(1));
      command=(command0.substring(0,1));  //Extrae la letra inicial
      speed=(command0.substring(1).toInt()); speed=speed*4;  //Extrae la velocidad y ajusta para DRV8833
      if (speed > 254) speed = 254;
     
      if (command == "F") goForward();
      else if (command == "B") goBack();
      else if (command == "L") goLeft();
      else if (command == "R") goRight();
      else if (command == "S") stopRobot();
}

void HTTP_handleRoot(void) {
  if( server.hasArg("State") ){
    Serial.println(server.arg("State"));
  }
  server.send ( 200, "text/html", "" ); 
  delay(1);
}

void goForward(){    //Adelante
      Serial.println("Adelante");
  analogWrite(MOT_A1_PIN, speed);
  digitalWrite(MOT_A2_PIN, LOW);
  analogWrite(MOT_A3_PIN, speed);
  digitalWrite(MOT_A4_PIN, LOW);
}

void goBack(){     //Retrocede
      Serial.println("Atras");
  analogWrite(MOT_A2_PIN, speed);
  digitalWrite(MOT_A1_PIN, LOW);
  analogWrite(MOT_A4_PIN, speed);
  digitalWrite(MOT_A3_PIN, LOW); 
}

void goRight(){     //Gira a derecha
        Serial.println("Derecha");
  analogWrite(MOT_A1_PIN, speed);
  digitalWrite(MOT_A2_PIN, LOW);
  analogWrite(MOT_A4_PIN, speed);
  digitalWrite(MOT_A3_PIN, LOW);
}

void goLeft(){
        Serial.println("Izquierda");
  analogWrite(MOT_A2_PIN, speed);
  digitalWrite(MOT_A1_PIN, LOW);
  analogWrite(MOT_A3_PIN, speed);
  digitalWrite(MOT_A4_PIN, LOW);
}

void stopRobot(){ 
      Serial.println("Detener");
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_A3_PIN, LOW);
  digitalWrite(MOT_A4_PIN, LOW); 
}
          Programa del esp8266 y del App Inventor para teléfono Android. Puede bajarse la apk desde AQUI
Menu