Controlar un carro robot mediante Wifi
16 de noviembre de 2021Hola bienvenidos a un nuevo blog, en esta ocasión vamos a controlar un carro robot por wifi a través de un aplicativo Android desarrollado en Android Studio.
Hola bienvenidos a un nuevo blog, en esta ocasión vamos a controlar un carro robot por wifi a través de un aplicativo Android desarrollado en Android Studio.
Circuito electronico que permite controlar el giro en ambos sentidos, avance, retroceso y la velodcidad de giro de dos motores DC.
Estructura diseñada para el montaje de un carro robot que incluye los siguientes componentes:
Es para desarrollar la aplicación que controle el carro robot
ProgressBar progressBar = findViewById(R.id. speedProgressBar );TextView maxSpeedTextView = findViewById(R.id. maxSpeedTextView );Joystick joystick = findViewById(R.id. carJoystick );
Es el widget encargado de proporcionar la velocidad y los ángulos.
joystick .setJoystickListener(new JoystickListener() {@Override public void onDown () {} @SuppressLint ("SetTextI18n" )@Override public void onDrag (float degrees, float offset) {int speed = (int )(offset*250 );int b = (int )degrees/20 ;int y = (int )((offset*10 )/2.5 );progressBar .setProgress(speed);maxSpeedTextView .setText((int )(offset*100 ) +"%" );if (b==0 |b==5 |b==-5 ){if (i!=y&y>0) {typeDaTa(( int ) degrees, offset);i=y; } } else {if (a!=b&y>1) {typeDaTa(( int ) degrees, offset);a=b; } } } @Override public void onUp () {// STOP senData( 0 ,0 ,0 );progressBar .setProgress(0 );} });
Antes de enviar los datos al servidor se debe establecer la velocidad del primer y segundo motor DC segun el angulo del joystick.
public void typeDaTa (int degrees, float offset) {int turn = (int )(degrees/0.8 );int speed = (int )(offset*250 );// ARRANQUE if (degrees>=-25 &°rees<=25 ) {senData(speed, speed, 0 );} // DERECHA if (degrees>=-146 &°rees<=-26 ) {senData(speed, speed-(turn*- 1 ),0 );} // IZQUIERDA if (degrees>=26 &°rees<=146 ) {senData(speed-turn, speed, 0 );} // REVERSA if (degrees>=-180 &°rees<=-147 ) {senData(speed, speed, 1 );} if (degrees>=147 &°rees<=180 ) {senData(speed, speed, 1 );} }
Para poder enviar los datos antes se debe saber la direccion IP del servidor.
private void senData (int motorA,int motorB,int state){RequestQueue queue = Volley .newRequestQueue(this );String url = "http://192.168.43.10/car" ;StringRequest stringRequest = new StringRequest(Request.Method. POST , url,response -> { }, error -> { }) { @Override public byte []getBody () {String data = "motora=" +motorA+"&motorb=" +motorB+"&state=" +state;return data .getBytes();} }; queue .add(stringRequest);}
Para obtener los datos se da a través de las siguientes peticiones:
// Punto de acceso Wifi #define WIFI_SSID"end" #define WIFI_PASSWORD"Developer-1234" #define INA 5#define IN1 4#define IN2 2#define IN3 14#define IN4 12#define INB 13
Para este proyecto se debe establecer el servidro en el puerto 80.
ESP8266WebServer server(80);
A continuación, se muestra la codificación para realizar una conexión a punto de acceso Wifi desde el NodeMCU ESP8266.
WiFi .begin (WIFI_SSID, WIFI_PASSWORD);while (WiFi. status () != WL_CONNECTED) {delay (500);Serial ."." );} Serial .println ("Conexión exitosa" );
Importante. Es necesario obtener la ip del servidor, que básicamente la ip del esp8266. Para enviar de los datos desde la Aplicación android.
Serial ."Dirección IP del servidor ESP8266: " );Serial .println (WiFi .localIP ());
Para obtener los datos debemos inicializar el servidor con el siguiente código.
server .on ("/car" , getData);server .begin ();
Se debe establecer como los pines como señales eléctricas de salida para controlar los motores DC
pinMode (IN1,OUTPUT );pinMode (IN2,OUTPUT );pinMode (IN3,OUTPUT );pinMode (IN4,OUTPUT );pinMode (INA,OUTPUT );pinMode (INB,OUTPUT );
Administrar las peticiones HTTP de los clientes y llama a las funciones establecidas en el server.on("/car", getData); para leer los datos enviados por los clientes.
server. handleClient ();
A continuación, se muestra el código para obtener los datos específicos.
int speedMotorA =server .arg ("motora" ).toInt();int speedMotorB =server .arg ("motorb" ).toInt();int state =server .arg ("state" ).toInt();// Imprimir los datos en la consola Serial .println (server .arg ("plain" ));
El giro y la velocidad del carro robot se debe controlar a través del analogWrite, el avance y el retroceso a través del digitalWrite
analogWrite (INA, speedMotorA);analogWrite (INB, speedMotorB);if (state == 0){digitalWrite (IN1, HIGH);digitalWrite (IN2, LOW);digitalWrite (IN3, HIGH);digitalWrite (IN4, LOW);} else { digitalWrite (IN1, LOW);digitalWrite (IN2, HIGH);digitalWrite (IN3, LOW);digitalWrite (IN4, HIGH);}
Importante para poder utilizar la beteria de 9 volteos se debe desabilitar el Jumper regulador
Desarrollador de paginas web, aplicaciones Android y proyectos de Internet de las cosas.