Saltar al contenido

Coche dirigido por Bluetooth

Continuando con mi pasión con los coches me he decido montar una tanqueta teledirigida mediante una APK de Android.

Esta vez he utilizado una placa ESP32 ya que la misma placa lleva incorporado la señal Bleutooth y Wi-Fi

Si buscáis por internet la manera de conectar el Smartphone con la placa, veréis varias maneras de hacerlo. En mi caso he utilizado esta ya que es la que me permitía enlazar la placa con el teléfono. También hay que destacar que es la más entendedora.

Durante el montaje, me surgió el problema de conectar el Buzzer pasivo y las velocidades de la tanqueta; estuve indagando por la web y lo que encontré a diferencia de las placas Arduino es que la ESP32 si quieres usar un pin PWM, no tiene ninguno, lo que tienes que hacer hincándoselo tu mediante la programación definiendo el pin que tu quieres que sea PWM.

Materiales:

Tanqueta
ESP32
Puente H

2 Motores Mod.: 33GB
Buzzer pasivo
2 Leds delanteros
2 Leds traseros
Bateria 9V

Esquema de conexión:

Aplicación:

/*
 * Autor: Josep Martínez Tejedor
 * Control de la tanqueta via bluetooth con el aplicativo "Bluetooth RC Contoller"
 * Opciones de la aplicación para terminales Android
 * F ==> Hacia delante  B ==> Hacia atras   L ==> Girar a la izquierda  R ==> Giraa a la derecha
 * G ==> Adelente y a la izquierda   I ==> Adelente y a la derecha      H ==> Atras y a la izquierda
 * J ==> Atras y a la derecha        S ==> Stop
 * W ==> Luces delanteras ON         w ==> Luces delanteras OFF 
 * U ==> Luces traseras ON           u ==> Luces traseras OFF 
 * V ==> Bocina ON     v ==> Bocina OFF     X ==> 4 Intemitentes ON     x ==> 4 Intemitentes OFF 
 * 0 ==> Velocidad  0 (zero)   1 ==> Velocidad 10   2 ==> Velocidad 20  3 ==> Velocidad 30
 * 4 ==> Velocidad 40          5 ==> Velocidad 50   6 ==> Velocidad 60  7 ==> Velocidad 70
 * 8 ==> Velocidad 80          9 ==> Velocidad 90   10 ==> Velocidad 100    q ==> Máxima velocidad  
 */
#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

const int velocidad1 = 16;    // 16 corresponde a GPIO16  Motor dret
const int velocidad2 = 4;     // 16 corresponde a GPIO4    Motor esquerra

// Establecer propiedades PWM 
const int freqPWM = 5000;
const int ledChannel1 = 15;   // El canal admet del 0 al 15  Motor dret
const int ledChannel2 = 14;   // El canal admet del 0 al 15  Motor esquerra
const int resolutionPWM = 8;  // Te una resolució de 1 a 16 bits, he provat 16 bits i no em funciona
int vvelocidad1 = 180;
int vvelocidad2 = 180;

String res = "";

// Definicion de los motores
#define MOT_1F 18   // El motor gira para avanzar
#define MOT_1R 19   // El motor gira para retroceder
#define MOT_2F 17   // El motor gira para avanzar
#define MOT_2R 5    // El motor gira para retroceder

BluetoothSerial SerialBT;

// Butzina
int freq = 0;
int channel = 0;
int resolution = 16;
int vbuzi = 23;        // Bocina
int vdelantera = 13;   // Luz delantera
int vtrasera = 15;     // Luz trasera
// Contol de los intermitentes
int vintermitens = 0;  //Verifica si estan encendidod las leces de Stop
int vtemps = 0;        // Comprueva el tiempo de intermitencia *For casero

void setup() {
  Serial.begin(115200);
  
  pinMode(vbuzi, OUTPUT);
  SerialBT.begin("Tanqueta ESP32"); //Nombre del Bluetooth
  Serial.println("El dispositivo se inició, ¡ahora puede emparejarlo con bluetooth!");

  // Definicion de los motores
  pinMode(MOT_1F, OUTPUT);
  pinMode(MOT_1R, OUTPUT);
  pinMode(MOT_2F, OUTPUT);
  pinMode(MOT_2R, OUTPUT);

  // Configuramos el pin de la Bozina como PWM
  ledcSetup(channel, freq, resolution);
  ledcAttachPin(vbuzi, channel);

  pinMode(vdelantera, OUTPUT);
  pinMode(vtrasera, OUTPUT);

  // Configuramos los puertos PWM de los motores para controlar la velocidad 
  ledcSetup(ledChannel1, freqPWM, resolutionPWM);
  ledcSetup(ledChannel2, freqPWM, resolutionPWM);
  
  ledcAttachPin(velocidad1, ledChannel1);
  ledcAttachPin(velocidad2, ledChannel2);  
  
}

void loop(){
  // Valor inicial de los motore
  ledcWrite(ledChannel1, vvelocidad1);  //Velocidad mínima 180 del motor derecho
  ledcWrite(ledChannel2, vvelocidad2);  //Velocidad minima 180 del motor izquierdo

  // Control de los intermitentes cuando se activan
  if (vintermitens == 1){
    vtemps++;
    Serial.println(vtemps);   //Si no está no funciona correctamente
    if (vtemps >= 1000){
      digitalWrite(vtrasera, !digitalRead(vtrasera));
      digitalWrite(vdelantera, !digitalRead(vdelantera));
      vtemps = 0;
    }
  }
 
  while (SerialBT.available()) // Lea hasta que el cliente bluetooth esté enviando.
  {
    
    char add = SerialBT.read();
    res = res + add;
    Serial.println(res);

   // Asignación de acciones en condiciones particulares
      if (res == "F"){  // Avanzar
        mot_avanca(); 
        Serial.println("Avanza");
      }

      if (res == "B"){   // Retroceder
        mot_retrocedir();
        Serial.println("Retrocede");
      }

      if (res == "R"){   // Derecha
        mot_deta();
        Serial.println("Gira a la derecha");
      }

      if (res == "L"){  // Izquierda
        mot_esquerra();
        Serial.println("Gira a la izquierda");
      }

      if (res == "S"){  //Para
        mot_stop();
        Serial.println("Motores parados .. reposo");
      }

      if (res == "W"){  // Luces delanteras ON
        Serial.println("Focos davant on");
        digitalWrite(vdelantera, HIGH);
      }

      if (res == "w"){  // Luces delanteras Off
        Serial.println("Focos davant off");
        digitalWrite(vdelantera, LOW);
      }

      if (res == "U"){   // Luces traserras ON
        Serial.println("Focos traseros on");
        digitalWrite(vtrasera, HIGH);
      }

      if (res == "u"){   // Luces traseras OFF
        Serial.println("Focos traseros off");
        digitalWrite(vtrasera, LOW);
      }

      if (res == "V"){   // Claxon ON
        freq = 2005;
        ledcWriteTone(channel, freq);
        Serial.println("Suena la bocina"); 
      }

      if (res == "v"){  // Claxon OFF
        freq = 0;
        ledcWriteTone(channel, freq);
        Serial.println("Para bocina"); 
      }
       
      if (res == "X"){   // 4 intermitentes ON
        Serial.println("Luz delantera on"); 
        digitalWrite(vtrasera, HIGH);
        digitalWrite(vdelantera, HIGH);
        vintermitens = 1;
        vtemps=0;
       // vtemps=millis();
      }

      if (res == "x"){   // 4 intermitentes OFF
        Serial.println("Luz delantera off");
        digitalWrite(vtrasera, LOW);
        digitalWrite(vdelantera, LOW);
        vintermitens = 0;
      }

      //Velocidades
      if (res == "0"){   //Velocidad mínima
        vvelocidad1 = 180;
        vvelocidad2 = 180;
        Serial.println("Velocidad mínima"); 
      }
      if (res == "2"){   
        vvelocidad1 = 190;
        vvelocidad2 = 190;
        Serial.println("Velocidad de 190"); 
      }
      if (res == "3"){   
        vvelocidad1 = 200;
        vvelocidad2 = 200;
        Serial.println("Velocidad de 200"); 
      }
      if (res == "4"){   
        vvelocidad1 = 210;
        vvelocidad2 = 210;
        Serial.println("Velocidad de 210"); 
      }
      if (res == "5"){   
        vvelocidad1 = 220;
        vvelocidad2 = 220;
        Serial.println("Velocidad de 220"); 
      }
      if (res == "6"){   
        vvelocidad1 = 230;
        vvelocidad2 = 230;
        Serial.println("Velocidad de 230"); 
      }
      if (res == "7"){   
        vvelocidad1 = 240;
        vvelocidad2 = 240;
        Serial.println("Velocidad de 240"); 
      }
      if (res == "8"){   // Velocidad máxima
        vvelocidad1 = 255;
        vvelocidad2 = 255;
        Serial.println("Velocidad maxima"); 
      }
      if (res == "q"){   // Velocidad máxima
        vvelocidad1 = 255;
        vvelocidad2 = 255;
        Serial.println("Velocidad maxima"); 
      }


  res = ""; // clearing the string.
  }

}


//********** Control Motors *************
void mot_avanca() {
   digitalWrite(MOT_1F, 1); // turn on 
   digitalWrite(MOT_2F, 1); // turn on 
}

void mot_retrocedir() {
   digitalWrite(MOT_1R, 1); // turn on 
   digitalWrite(MOT_2R, 1); // turn on 
}
void mot_esquerra() {
   digitalWrite(MOT_1F, 1); // turn on 
   digitalWrite(MOT_2R, 1); // turn on 
}

void mot_deta() {
   digitalWrite(MOT_1R, 1); // turn on 
   digitalWrite(MOT_2F, 1); // turn on 
}

void mot_stop() {
  digitalWrite(MOT_1F, 0); // turn off
  digitalWrite(MOT_2F, 0); // turn off
  digitalWrite(MOT_1R, 0); // turn off
  digitalWrite(MOT_2R, 0); // turn off
} 

Para descargaro la APK para Android hacer clic en el botón:

 13 total visitantes