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 */ #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: