Controlar la velocidad de motores con bluetooth

Hola,

Me he hecho un coche controlado por bluetooth y le quiero controlar la velocidad a los motores desde el bluetooth.

El coche ya consigo manejarlo con el móvil por bluetooth a una velocidad fija pero cuando lo programo para regular la velocidad desde el móvil no me funciona, no hace nada, no se mueve y no se que estoy haciendo mal.

Adjunto el código.

#define bluetooth Serial
#include <SoftwareSerial.h>
#include <AFMotor.h>


#define rxPin 10
#define txPin 9

#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(x[0]))

// Creamos el puerto serie, le pasamos los pines que serán 
// Tx (donde esta conectado en Rx del bluetooth)
// y Rx (donde esta conectado el Tx del bluetooth)
SoftwareSerial miPuertoSerie(rxPin, txPin);

// Definicion de motores

AF_DCMotor Motor1(1);  //Trasero Izquierdo
AF_DCMotor Motor2(2);  //Delantero Izquierdo
AF_DCMotor Motor3(3);  //Delantero Derecho
AF_DCMotor Motor4(4);  //Trasero Derecho

//Velocidades motores
int v1;  //velocidad de motor 1 
int v2;  //velocidad de motor 2
int v3;  //velocidad de motor 3
int v4;  //velocidad de motor 4

//Luces Coche fantastico

byte pinesLed[] = {A0, A1, A2, A3, A4, A5};
unsigned int intervalo = 200; //medio segundo
unsigned long tiempo;
bool direccion = true; //hacia la izquierda o la derecha
byte 
contador = 0, //numeros de leds recorridos
indice = 0; //posición del array pinesLed por donde empezará a encenderse

void setup ()
{
  delay(500); // wait for bluetooth module to start

  // Y lo inicializamos como cualquier puerto serie
  
   miPuertoSerie.begin(9600);

  Serial.begin(9600);    // set up Serial library at 9600 bps
  
  // Definimos la velocidad de los Motores. 255 es el 100% de la velocidad
  Motor1.setSpeed(v1);         
  Motor2.setSpeed(v2);
  Motor3.setSpeed(v3);
  Motor4.setSpeed(v4);

// Luces coche fantastico
  for (byte i = 0; i < ARRAY_LENGTH(pinesLed); i++) {
    pinMode(pinesLed[i], OUTPUT);
  }
  tiempo = millis();
}
  


void Luces_coche_fantastico()
{   
if(millis() >= tiempo + intervalo ){ // al pasar el tiempo
    for(byte i = 0; i < ARRAY_LENGTH(pinesLed); i++){ //recorremos todos los leds
      digitalWrite(pinesLed[i], (i == indice) ? HIGH : LOW); //encendemos el led que coincida con ese indice
    }
    if(contador == ARRAY_LENGTH(pinesLed) - 1){ // cada vez el contador sea igual al número de leds es que ha dado la vuelta
      direccion = !direccion; //cambiamos la dirección de encendido
      contador = 0; //reiniciamos el contador
    }
    indice += (direccion) ? 1 : - 1; //según la direccion movemos un índice hacia arriba o hacia abajo
    contador++; //aumentamos el contador
    tiempo = millis(); //reiniciamos el tiempo para el siguiente intervalo
  }  
}

void Adelante ()
{
        Motor1.run(FORWARD);   
        Motor2.run(FORWARD);
        Motor3.run(FORWARD);
        Motor4.run(FORWARD);
         
}

void Atras ()
{
        Motor1.run(BACKWARD);  
        Motor2.run(BACKWARD);
        Motor3.run(BACKWARD);
        Motor4.run(BACKWARD);  
}


void Parar ()
{
        Motor1.run(RELEASE);   
        Motor2.run(RELEASE);
        Motor3.run(RELEASE);
        Motor4.run(RELEASE);
}


void Izquierda()  
{
        Motor1.run(FORWARD);  
        Motor2.run(BACKWARD);
        Motor3.run(FORWARD);
        Motor4.run(BACKWARD);
}


void Derecha()
{
        Motor1.run(BACKWARD);  
        Motor2.run(FORWARD);
        Motor3.run(BACKWARD);
        Motor4.run(FORWARD);
}


void Giro_Derecha()  
{
        Motor1.run(FORWARD);  
        Motor2.run(FORWARD);
        Motor3.run(BACKWARD);
        Motor4.run(BACKWARD);
}


void Giro_Izquierda()  
{
        Motor1.run(BACKWARD);  
        Motor2.run(BACKWARD);
        Motor3.run(FORWARD);
        Motor4.run(FORWARD);
}

void Diagonal_Derecha_Adelante()  
{
        Motor1.run(RELEASE);  
        Motor2.run(FORWARD);
        Motor3.run(RELEASE);
        Motor4.run(FORWARD);
}


void Diagonal_Izquierda_Adelante()  
{
        Motor1.run(FORWARD);  
        Motor2.run(RELEASE);
        Motor3.run(FORWARD);
        Motor4.run(RELEASE);
}

void Diagonal_Derecha_Atras()  
{
        Motor1.run(BACKWARD);  
        Motor2.run(RELEASE);
        Motor3.run(BACKWARD);
        Motor4.run(RELEASE);
}


void Diagonal_Izquierda_Atras()  
{
        Motor1.run(RELEASE);  
        Motor2.run(BACKWARD);
        Motor3.run(RELEASE);
        Motor4.run(BACKWARD);
}


void loop ()
{

 Luces_coche_fantastico();
 
 if (miPuertoSerie.available())
 switch (miPuertoSerie.read())
 {
 
 case 'F':
 Adelante();
 break;
 
 case 'B':
 Atras();
 break;
 
 case 'R':
 Derecha();
 break;
 
 case 'L':
 Izquierda();
 break;

 case 'G':
 Giro_Izquierda();
 break;

 case 'I':
 Giro_Derecha();
 break;

 case 'H':
 Diagonal_Izquierda_Atras();
 break;

 case 'J':
 Diagonal_Derecha_Atras();
 break;
 
 case 'S':
 Parar();
 break;

 case '1':  //Velocidad min
 v1=55;
 v2=55;
 v3=55;
 v4=55;
 break;
 
 case '2':  //Velocidad 2
 v1=77;
 v2=77;
 v3=77;
 v4=77;
 break;
 
 case '3':  //Velocidad 3
 v1=99;
 v2=99;
 v3=99;
 v4=99;
 break;
 
 case '4':  //Velocidad 4
 v1=121;
 v2=121;
 v3=121;
 v4=121;
 break;
 
 case '5':  //Velocidad 5
 v1=143;
 v2=143;
 v3=143;
 v4=143;
 break;
 
 case '6':  //Velocidad 6
 v1=165;
 v2=165;
 v3=165;
 v4=165;
 break;
 
 case '7':  //Velocidad 7
 v1=187;
 v2=187;
 v3=187;
 v4=187;
 break;
 
 case '8':  //Velocidad 8
 v1=209;
 v2=209;
 v3=209;
 v4=209;
 break;
 
 case '9':  //Velocidad 9
 v1=231;
 v2=231;
 v3=231;
 v4=231; 
 break;
 
 case 'q':  //Velocidad máxima
 v1=255;
 v2=255;
 v3=255;
 v4=255;
 break;

 default: break;

 }


}

A ver si alguien me puede echar una mano.

Gracias

Pero este tema ya lo presentaste hace poco y tenias el problema de las luces, porque habres otro?

Por que es un problema diferente al de las luces aunque esté dentro del mismo programa.

No se si esta es la manera correcta de hacerlo.

Por favor, si alguien me pudiera echar una mano lo agradecería

3Dadicto, lo extraño que veo es que la velocidad la determinas en el setup, y después cuando cambias el valor de la velocidad no lo haces en el loop, luego cambias el valor de la variable global en el switch pero no lo asignas con setSpeed() que es lo que deberías hacer directamente con cada motor. Vamos que no estás haciendo nada. Ya si tienes otro error que te bloquee los motores no lo sé.

Y si me permites el comentario:

Me choca visualmente el código de leds que te pasé con el uso de los movimientos o el uso de mil variables... Que no estoy seguro me parece que surbyte ya te había comentado al respecto.

¿Te has dado cuenta que si tienes la función "Alante" Y niegas sus valores (el inverso) tienes "Atrás" y lo mismo puedes hacer con "Izquierda" y "Derecha"?

Entonces ... Si disminuyes las funciones de 4 a 2 ¿No te das cuentas que puedes quitarte de encima tantas líneas para las diagonales? Imagina lo cortito y limpio que quedaría el código :slight_smile:
Ahora mismo es como ver francés e inglés mezclado en un mismo párrafo.

Lo comento porque es muy mejorable tu parte, pero es mera opinión, es tu código...

Y si el hilo ya existía y no tiene un candado ni es muy antiguo lo comentan de nuevo editando parte del título si hace falta y no hacen 1, 2 , 3, 6, 10... post con el mismo código por cada duda que tengan sobre su proyecto. No entiendo ni la lógica de hacer dobles post, pero se arriesgan a que les cierren los hilos.

Ok, aclarado. He asignado la velocidad con setSpeed() en el switch y ya funciona.

No entiendo cuando dices: si tienes la función "Alante" Y niegas sus valores (el inverso) tienes "Atrás"

¿Como se niegan sus valores?

Vuelvo a repetir que no soy programador y lo que es para ti muy claro, yo seguramente no lo conozco.

En cuanto a abrir un nuevo post, lo tendré en cuenta la próxima vez y no abriré uno nuevo.

Un saludo y gracias

Era simple ¿Verdad? Me alegro que te funcione ya :slight_smile:

En cuanto a las funciones me refiero que pases de esto:

void Derecha()
{
        Motor1.run(BACKWARD);  
        Motor2.run(FORWARD);
        Motor3.run(BACKWARD);
        Motor4.run(FORWARD);
}

void Izquierda()  
{
        Motor1.run(FORWARD);  
        Motor2.run(BACKWARD);
        Motor3.run(FORWARD);
        Motor4.run(BACKWARD);
}

A algo así (un ejemplo no del todo optimizado, hecho bien el ejercicio tiene menos de la mitad de las líneas que usas)

void loop(){
//ir a la izquierda:
lado('L');
//ir a la derecha:
lado('R');
}

void lado(char option){ // option puede ser p.e L y R (left, right)
  Motor1.run( (option == 'L') ? FORWARD  : BACKWARD);  
  Motor2.run( (option == 'L') ? BACKWARD : FORWARD);
  Motor3.run( (option == 'L') ? FORWARD  : BACKWARD);
  Motor4.run( (option == 'L') ? BACKWARD : FORWARD);
}

Así te has "comido" ya una función.
Luego si haces lo mismo para atrás y alante te quitas otra.
Puedes modificar también las diagonales e incluso si pones las variables de motor en un array y usas un for te quitas líneas. En vez de 4 líneas por función pasarían a ser también la mitad.

En resumen serían la mitad de funciones y la mitad de líneas dentro de la función.