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:









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
*/
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
// El motor gira para avanzar
// El motor gira para retroceder
// El motor gira para avanzar
// 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: