Problema al controlar 2 servos y motores DC a través de un Shield L293D por Bluetooth

Hola a todos!, Soy nuevo en el uso de arduino tengo una duda sobre un detalle en el funcionamiento en paralelo de 2 servos MG995 y de 4 Motores DC en un Shield Motor Driver L293D en Arduino UNO, controlados por bluetooth. Los servos están conectados a los pines dedicados para servos del Shield.
Cuando cargo SOLO el código que controla los servos al arduino, estos funcionan perfectamente recibiendo las señales desde una app móvil, pero al momento de incluir la parte del código que se encarga de controlar el movimiento de los motores DC, automáticamente los servos dejan de responder, y el código solo responde a los comandos que controlan a los motores.
He leido sobre la ejecución de 2 o más tareas de forma simultánea y, aunque no se si se trate de eso, intenté usando "millis" y tampoco funcionó, los servos siguen sin responder.

Agradecería mcuho cualquier observación y sugerencia para hacer que el código funcione :).
Adjunto código.

#include <AFMotor.h>
#include <Servo.h>
        
//initial motors pin
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);


Servo ser_hor;           
Servo ser_ver;           

int servo_hor = 90;      // Posición inicial servo horizontal
int servo_ver = 90;      // Posición inicial servo vertical




char comando;



void setup() {
  
ser_hor.attach(10);
ser_ver.attach(9);



  Serial.begin(9600);  
}



void loop() {


if(Serial.available()>= 2 )                              //Leer mas de 2 bytes
{
  unsigned int servopos = Serial.read();                   
  unsigned int servopos1 = Serial.read();                  
  unsigned int realservo = (servopos1 *256) + servopos;    
 

  if (realservo >= 1000 && realservo <1180){               // Si el valor de la variable está entre 1000 y 1180
    int servo1 = realservo;                                
    servo1 = map(servo1, 1000,1180,0,180);                 
    ser_hor.write(servo1);                                 
    Serial.println("ser_hor activado");

  }
  
  if (realservo >= 2000 && realservo <2180){               // Si el valor de la variable está entre 2000 y 2180
    int servo2 = realservo;                                
    servo2 = map(servo2,2000,2180,0,180);                  
    ser_ver.write(servo2);                                 
    Serial.println("ser_ver activado");

  }
}




   if (Serial.available() > 0); {
    comando = Serial.read();

    Stop(); // Iniciar con motores apagados
    
    switch (comando) {
  case 'W':
    forward();
    Serial.println("Avanzar");
    break;
  case 'S':
    back();
    Serial.println("Retroceder");
    break;
  case 'A':
    left();
    Serial.println("Izquierda");
    break;
  case 'D':
    right();
    Serial.println("Derecha");
    break;
  case 'P':
    Stop();
    Serial.println("Alto");
    break;
    }
  }
  
}

void forward()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(FORWARD);  //rotate the motor clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(FORWARD);  //rotate the motor clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(FORWARD);  //rotate the motor clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(FORWARD);  //rotate the motor clockwise
}

void back()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(BACKWARD); //rotate the motor anti-clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(BACKWARD); //rotate the motor anti-clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(BACKWARD); //rotate the motor anti-clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(BACKWARD); //rotate the motor anti-clockwise
}

void left()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(BACKWARD); //rotate the motor anti-clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(BACKWARD); //rotate the motor anti-clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(FORWARD);  //rotate the motor clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(FORWARD);  //rotate the motor clockwise
}

void right()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(FORWARD);  //rotate the motor clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(FORWARD);  //rotate the motor clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(BACKWARD); //rotate the motor anti-clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(BACKWARD); //rotate the motor anti-clockwise
}

void Stop()
{
  motor1.setSpeed(0);  //Define minimum velocity
  motor1.run(RELEASE); //stop the motor when release the button
  motor2.setSpeed(0);  //Define minimum velocity
  motor2.run(RELEASE); //rotate the motor clockwise
  motor3.setSpeed(0);  //Define minimum velocity
  motor3.run(RELEASE); //stop the motor when release the button
  motor4.setSpeed(0);  //Define minimum velocity
  motor4.run(RELEASE); //stop the motor when release the button
}

Está mal planteada la lectura de los datos.
En aproximadamente 1 mseg, que es lo que tarda en completarse la lectura de un caracter a 9600 bps, el procesador ejecuta decenas (por no decir cientos) de veces el loop().
Entonces, llega un caracter (no sabemos si es para los servos o los DC), no se cumple la primer condición porque el 2do caracter todavía no llegó, y pasas a la segunda condición que sí se cumple. Si no es un comando válido el caracter leído se pierde.
Como resultado, los servos nunca reciben su comando.

Okey, muchas gracias por la observación. ¿Entonces si se bajan los bps a a una velocidad óptima puede funcionar ? O también necesito modificar el código?

Tenés que modificar el código.

Una idea, usa un caracter distinto a los de comandos que indique que lo que sigue es un dato de posición, por ej. "Zhl" donde "Z" sería el indicador posición y "h" e "l" los dos bytes del valor.
Haz un solo

if (Serial.available() > 0); {

que contemple tanto los comandos como la velocidad, dentro de éste verificas que se debe hacer y con qué.´

Algo así

#include <AFMotor.h>
#include <Servo.h>
        
//initial motors pin
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);


Servo ser_hor;           
Servo ser_ver;           

int servo_hor = 90;      // Posición inicial servo horizontal
int servo_ver = 90;      // Posición inicial servo vertical




char comando;



void setup() {
  
ser_hor.attach(10);
ser_ver.attach(9);



  Serial.begin(9600);  
}

void loop() {

   if (Serial.available() > 0); {
    comando = Serial.read();

    Stop(); // Iniciar con motores apagados
    
    switch (comando) {
  case 'Z':  // es posicion de  servos
     while(Serial.available()  < 2) ; // si no los hay, espera que haya 2 caracteres para leer
     unsigned int servopos = Serial.read();                   
     unsigned int servopos1 = Serial.read();                  
     mover_servos( (servopos1 *256) + servopos);
     break;
  case 'W':
    forward();
    Serial.println("Avanzar");
    break;
  case 'S':
    back();
    Serial.println("Retroceder");
    break;
  case 'A':
    left();
    Serial.println("Izquierda");
    break;
  case 'D':
    right();
    Serial.println("Derecha");
    break;
  case 'P':
    Stop();
    Serial.println("Alto");
    break;
    }
  }
}

void mover_servos(unsigned int realservo) {

  if (realservo >= 1000 && realservo <1180){               // Si el valor de la variable está entre 1000 y 1180
    int servo1 = realservo;                                
    servo1 = map(servo1, 1000,1180,0,180);                 
    ser_hor.write(servo1);                                 
    Serial.println("ser_hor activado");
  }
  
  if (realservo >= 2000 && realservo <2180){               // Si el valor de la variable está entre 2000 y 2180
    int servo2 = realservo;                                
    servo2 = map(servo2,2000,2180,0,180);                  
    ser_ver.write(servo2);                                 
    Serial.println("ser_ver activado");
  }
}
void forward()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(FORWARD);  //rotate the motor clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(FORWARD);  //rotate the motor clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(FORWARD);  //rotate the motor clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(FORWARD);  //rotate the motor clockwise
}

void back()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(BACKWARD); //rotate the motor anti-clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(BACKWARD); //rotate the motor anti-clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(BACKWARD); //rotate the motor anti-clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(BACKWARD); //rotate the motor anti-clockwise
}

void left()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(BACKWARD); //rotate the motor anti-clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(BACKWARD); //rotate the motor anti-clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(FORWARD);  //rotate the motor clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(FORWARD);  //rotate the motor clockwise
}

void right()
{
  motor1.setSpeed(200); //Define maximum velocity
  motor1.run(FORWARD);  //rotate the motor clockwise
  motor2.setSpeed(200); //Define maximum velocity
  motor2.run(FORWARD);  //rotate the motor clockwise
  motor3.setSpeed(200); //Define maximum velocity
  motor3.run(BACKWARD); //rotate the motor anti-clockwise
  motor4.setSpeed(200); //Define maximum velocity
  motor4.run(BACKWARD); //rotate the motor anti-clockwise
}

void Stop()
{
  motor1.setSpeed(0);  //Define minimum velocity
  motor1.run(RELEASE); //stop the motor when release the button
  motor2.setSpeed(0);  //Define minimum velocity
  motor2.run(RELEASE); //rotate the motor clockwise
  motor3.setSpeed(0);  //Define minimum velocity
  motor3.run(RELEASE); //stop the motor when release the button
  motor4.setSpeed(0);  //Define minimum velocity
  motor4.run(RELEASE); //stop the motor when release the button
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.