Carro con varios accesorios

Feliz Navidad a todos.

Tengo un carro controlado vía BT mediante APP en el smartphone. Avanza, retrocede, gira, enciende y apaga luces, bocina, circulina de policía y u diodo láser. Además tiene instalado un sensor de obstáculos para que en modo automático el carro ande dando vueltas sin controlarlo.

El siguiente código hace que me funcione todo bien:

#include <SoftwareSerial.h> // TX RX software library for bluetooth
#include <Servo.h> // servo library 

SoftwareSerial bluetooth(0, 1);   //Instancia la conexion al bluetooth - PIN 0 a TX y PIN 1 a RX
int BUZZER = 12;
int LED = 13;
int CIRCULINA = 6;
int LASER = 5;
//Variables para el sensor ultrasonico
int trigPin = 11;
int echoPin = 8;
int maxDist = 20;
int minDist = 1;

float distancia;

//Entrada de los motores
int motor1A = 14; // INPUT 1
int motor1B = 15; // INPUT 2
int motor2A = 17; // INPUT 3
int motor2B = 16; // INPUT 4

// Dato recibido atraves de la aplicacion movil
char data = 'S';

void setup()
{
  pinMode(echoPin, INPUT);    // echo como entrada
  pinMode(trigPin, OUTPUT);   // trigger como salida
  pinMode(LED, OUTPUT);    // LED como salida
  pinMode (CIRCULINA, OUTPUT);
  pinMode (LASER, OUTPUT);
  
  //Definimos las salidas del arduino
  pinMode(motor1A , OUTPUT);
  pinMode(motor1B , OUTPUT);  
  pinMode(motor2A , OUTPUT);  
  pinMode(motor2B , OUTPUT);
  pinMode(BUZZER , OUTPUT);
      
  Serial.begin(9600); //Inicia la comunicación en el monitor serial a 9600 Baudios
  bluetooth.begin(9600); // inicialmente la comunicacion serial a 9600 Baudios (velocidad de convencional)

  Serial.println("Módulo conectado");
}
 
void loop()
{
    //Esperamos hasta que haya un Stream de datos
    if(bluetooth.available() > 0){
      data = bluetooth.read();
      Serial.println(data);
    }
    
    switch (data) {
    case 'F':
      avanzar();        // Forward | AVANZAR
      break;
    case 'B':
      retroceder();     // Backward | RETROCEDER
      break;
    case 'L':
      izquierda();  //Left | IZQUIERDA
      break;
    case 'R':
      derecha();    //Right | DERECHA
      break;
    case 'S':
      detener();    //Stop | DETENER
      break;
    case 'A':
      automatico(); // Modo automatico depende del sensor ultrasonico 
      break;
    case 'M':
      bocina1(); // Toca bocina
      break;
     case 'N':
      bocina0(); // Apaga bocina
      break;
     case 'U':
      luces1(); // Enciende luces
      break;
     case 'X':
      luces0(); // Apaga luces
      break;
      case 'P':
      laser1(); // Enciende laser
      break;
     case 'Q':
      laser0(); // Apaga laser
      break;
     case 'J':
      circulina1(); // Enciende circulina
      break;
     case 'K':
      circulina0(); // Apaga circulina
      break;
    }
    delay(20);
}

void avanzar(){
  // Forward | AVANZAR
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
      
}

void retroceder(){
  // Backward | RETROCEDER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}

void derecha(){
  //Right | DERECHA
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void izquierda(){
  //Left | IZQUIERDA
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}

void detener(){
  //Stop | DETENER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void bocina1(){
   // Toca bocina
  digitalWrite(BUZZER, HIGH);
}

void bocina0(){
   // Apaga bocina
  digitalWrite(BUZZER, LOW);
  
}
void luces1(){
   // Enciende luces
  digitalWrite(LED, HIGH);
}

void luces0(){
   // Apaga luces
  digitalWrite(LED, LOW);
  
}

void laser1(){
   // Enciende laser
  digitalWrite(LASER, HIGH);
  
}

void laser0(){
   // Apaga laser
  digitalWrite(LASER, LOW);
  
}

void circulina1(){
   // Enciende circulina
  digitalWrite(CIRCULINA, HIGH);
  
}

void circulina0(){
   // Apaga circulina
  digitalWrite(CIRCULINA, LOW);
  
}

void automatico(){
  
     distancia = calcularDistanciaCm(); // Calculamos la distancia de la pulso
     Serial.println(distancia);
     if (distancia <= maxDist && distancia >= minDist){    // si la distancia es menor de 20cm
        //digitalWrite(LED,HIGH);      // Enciende LED
        
        detener(); //DETENEMOS LOS MOTORES 200 ms     
        delay (200);
        
        retroceder();          // RETROCEDE DURANTE 1000 ms
        delay(1000);           
        
        izquierda();     // Girar durante 600 milisegundos     
        delay(600);
        
        digitalWrite(LED,LOW);
     }
     else{                            
        avanzar(); //SI NO EXISTE OBSTACULO CONTINUA AVANZANDO
     }
}

float calcularDistanciaCm() {
  
  float duracion, distancia; // Variable para calcular el tiempo y distancia
  
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duracion = pulseIn(echoPin, HIGH);
  distancia = (duracion * 0.0343) / 2;
  
  delay(10);
  
  return distancia;
}

Tengo un Pan&Tilt que deseo instalarle para instalar el laser en una especie de cañon. Por ello he dejado los pines 10 y 9 libres para controlar los dos servos. el siguiente código subido a modo de prueba en la Arduino UNO funciona perfectamente:

#include <SoftwareSerial.h> // TX RX software library for bluetooth
#include <Servo.h> // servo library 
Servo myservo1, myservo2, myservo3, myservo4; // servo name
int bluetoothTx = 0; // bluetooth tx to 0 pin
int bluetoothRx = 1; // bluetooth rx to 1 pin
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
void setup()
{
  myservo1.attach(9); // attach servo signal wire to pin 9
  myservo2.attach(10); //   attach servo signal wire to pin 10
                        //You can add more than 2 servos pin here
  //Setup usb serial connection to computer
  Serial.begin(9600);
  //Setup Bluetooth serial connection to android
  bluetooth.begin(9600);
}
void loop()
{
  //Read from bluetooth and write to usb serial
  if(bluetooth.available()>= 2 )


  
  {
    unsigned int servopos = bluetooth.read();
    unsigned int servopos1 = bluetooth.read();
    unsigned int realservo = (servopos1 *256) + servopos;
    Serial.println(realservo);
    if (realservo >= 1000 && realservo <1180) {
      int servo1 = realservo;
      servo1 = map(servo1, 1000, 1180, 0, 180);
      myservo1.write(servo1);
      Serial.println("Servo 1 ON");
      delay(10);
    }
    if (realservo >= 2000 && realservo <2180) {
      int servo2 = realservo;
      servo2 = map(servo2, 2000, 2180, 0, 180);
      myservo2.write(servo2);
      Serial.println("Servo 2 ON");
      delay(10);
    }
   //*/Add more servos/*
  }
}

pero cuando hago la unión de ambos,todo me deja de funcionar.

Va el código ''unificado'':

#include <SoftwareSerial.h> // TX RX software library for bluetooth
#include <Servo.h>
Servo myservo1, myservo2;
int bluetoothTx = 0; // bluetooth tx to 0 pin
int bluetoothRx = 1; // bluetooth rx to 1 pin

SoftwareSerial bluetooth(0, 1);
//SoftwareSerial bluetooth(0, 1);   //Instancia la conexion al bluetooth - PIN 0 a TX y PIN 1 a RX



int BUZZER = 12;
int LED = 13;
int CIRCULINA = 6;
int LASER = 5;
//Variables para el sensor ultrasonico
int trigPin = 11;
int echoPin = 8;
int maxDist = 20;
int minDist = 1;

float distancia;

//Entrada de los motores
int motor1A = 14; // INPUT 1
int motor1B = 15; // INPUT 2
int motor2A = 17; // INPUT 3
int motor2B = 16; // INPUT 4

// Dato recibido atraves de la aplicacion movil
char data = 'S';

void setup()
{

  myservo1.attach(9); // attach servo signal wire to pin 9
  myservo2.attach(10); //   attach servo signal wire to pin 10
                        //You can add more than 2 servos pin here

  
  pinMode(echoPin, INPUT);    // echo como entrada
  pinMode(trigPin, OUTPUT);   // trigger como salida
  pinMode(LED, OUTPUT);    // LED como salida
  pinMode (CIRCULINA, OUTPUT);
  pinMode (LASER, OUTPUT);
  
  //Definimos las salidas del arduino
  pinMode(motor1A , OUTPUT);
  pinMode(motor1B , OUTPUT);  
  pinMode(motor2A , OUTPUT);  
  pinMode(motor2B , OUTPUT);
  pinMode(BUZZER , OUTPUT);
      
  Serial.begin(9600); //Inicia la comunicación en el monitor serial a 9600 Baudios
  bluetooth.begin(9600); // inicialmente la comunicacion serial a 9600 Baudios (velocidad de convencional)

  Serial.println("Módulo conectado");
}
 
void loop()
{
    //Esperamos hasta que haya un Stream de datos
    //if(bluetooth.available() > 0){
      
      
      if(bluetooth.available() > 0)
      data = bluetooth.read();
      Serial.println(data);
    
      {
    unsigned int servopos = bluetooth.read();
    unsigned int servopos1 = bluetooth.read();
    unsigned int realservo = (servopos1 *256) + servopos;
    Serial.println(realservo);
    if (realservo >= 1000 && realservo <1180) {
      int servo1 = realservo;
      servo1 = map(servo1, 1000, 1180, 0, 180);
      myservo1.write(servo1);
      Serial.println("Servo 1 ON");
      delay(10);
    }
    if (realservo >= 2000 && realservo <2180) {
      int servo2 = realservo;
      servo2 = map(servo2, 2000, 2180, 0, 180);
      myservo2.write(servo2);
      Serial.println("Servo 2 ON");
      delay(10);
    }
    }
    
    switch (data) {
    case 'F':
      avanzar();        // Forward | AVANZAR
      break;
    case 'B':
      retroceder();     // Backward | RETROCEDER
      break;
    case 'L':
      izquierda();  //Left | IZQUIERDA
      break;
    case 'R':
      derecha();    //Right | DERECHA
      break;
    case 'S':
      detener();    //Stop | DETENER
      break;
    case 'A':
      automatico(); // Modo automatico depende del sensor ultrasonico 
      break;
    case 'M':
      bocina1(); // Toca bocina
      break;
     case 'N':
      bocina0(); // Apaga bocina
      break;
     case 'U':
      luces1(); // Enciende luces
      break;
     case 'X':
      luces0(); // Apaga luces
      break;
      case 'P':
      laser1(); // Enciende laser
      break;
     case 'Q':
      laser0(); // Apaga laser
      break;
     case 'J':
      circulina1(); // Enciende circulina
      break;
     case 'K':
      circulina0(); // Apaga circulina
      break;
    }
    delay(20);
}

void avanzar(){
  // Forward | AVANZAR
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
      
}

void retroceder(){
  // Backward | RETROCEDER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}

void derecha(){
  //Right | DERECHA
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void izquierda(){
  //Left | IZQUIERDA
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}

void detener(){
  //Stop | DETENER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void bocina1(){
   // Toca bocina
  digitalWrite(BUZZER, HIGH);
}

void bocina0(){
   // Apaga bocina
  digitalWrite(BUZZER, LOW);
  
}
void luces1(){
   // Enciende luces
  digitalWrite(LED, HIGH);
}

void luces0(){
   // Apaga luces
  digitalWrite(LED, LOW);
  
}

void laser1(){
   // Enciende laser
  digitalWrite(LASER, HIGH);
  
}

void laser0(){
   // Apaga laser
  digitalWrite(LASER, LOW);
  
}

void circulina1(){
   // Enciende circulina
  digitalWrite(CIRCULINA, HIGH);
  
}

void circulina0(){
   // Apaga circulina
  digitalWrite(CIRCULINA, LOW);
  
}

void automatico(){
  
     distancia = calcularDistanciaCm(); // Calculamos la distancia de la pulso
     Serial.println(distancia);
     if (distancia <= maxDist && distancia >= minDist){    // si la distancia es menor de 20cm
        //digitalWrite(LED,HIGH);      // Enciende LED
        
        detener(); //DETENEMOS LOS MOTORES 200 ms     
        delay (200);
        
        retroceder();          // RETROCEDE DURANTE 1000 ms
        delay(1000);           
        
        izquierda();     // Girar durante 600 milisegundos     
        delay(600);
        
        digitalWrite(LED,LOW);
     }
     else{                            
        avanzar(); //SI NO EXISTE OBSTACULO CONTINUA AVANZANDO
     }
}

float calcularDistanciaCm() {
  
  float duracion, distancia; // Variable para calcular el tiempo y distancia
  
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duracion = pulseIn(echoPin, HIGH);
  distancia = (duracion * 0.0343) / 2;
  
  delay(10);
  
  return distancia;
}

Estimados,
No encuentro el error u omisión.
Agradeceré la ayuda al respecto. Gracias anticipadas.

A primera vista lo único que no me gusta es que estés usando para SofwareSerial los mismos pines que Serial, desde mi punto de vista es un error porque vas a tener conflicto con las señales.
Pero como dices que así te funciona entonces usaría directamente Serial y dejaría de lado SoftwareSerial.
Ademas el sentido de SofwareSerial es tener otro puerto serie independiente del puerto hardware entonces deberías usar pines diferentes sino no tiene sentido usarlo.

Gracias @gatul, mañana haré los cambios y probaré cómo va.

Varios errores ademas del 0 y 1 bien indicado por @gatul

    if (bluetooth.available() > 0) {
        data = bluetooth.read();
        Serial.println(data);
    }

En su lugar tienes una llave que abre al final del Serial.print(data).
Solo imprimes si haydatos de lo contarios para que imprimir data siempre?

Si ya leiste los datos, esto no tiene sentido

    unsigned int servopos = bluetooth.read();
    unsigned int servopos1 = bluetooth.read();

No estas sincronizados con la información de que hay datos realmente en el buffer.

No es como envias los datos porque si tu envias letras para indicar como mover el carro y luego envias posiciones debes tener elementos que te perminan discernir entre uan cosa y la otra.
La parte de data y el switch case estan bien.
La de los servos esta mal.

Juntar todo requiere que hagas algo que detecte que estas enviando y para qué.
Tienes comandos y tienes dos servos
podrias enviar algo asi

CA indicando C de comando y A de automático
o
CF de nuevo la C indica comando y F Forward.

En cambio para los servos algo asi
SXXXX donde S es servo1 y XXXX es el entero
TXXXX donde T es el servo2 y XXXX es el entero

eso obligaría a modificar tu rutina de lectura del puerto serie.

Si te parece lo hacemos.

Hola @surbyte, correcto lo que indicas....son los copy & paste que no llegué a limpiar en algunos de los casos.
Gracias por tu apoyo.

He resumido y cambiado el código para solo usar Serial. el siguiente donde solo están los servos para el Pan&Tilt. todo ok con su funcionamiento.

#include <Servo.h>
Servo myservoTILT, myservoPAN;

void setup()
{
  myservoTILT.attach(9);
  myservoPAN.attach(10);

  Serial.begin(9600);
}
void loop()
{
  if(Serial.available()>= 0 )
  
  {
    unsigned int servopos = Serial.read();
    unsigned int servopos1 = Serial.read();
    unsigned int realservo = (servopos1 *256) + servopos;
    Serial.println(realservo);
    if (realservo >= 1000 && realservo <1180) {
      int servoTILT = realservo;
      servoTILT = map(servoTILT, 1000, 1150, 0, 180);
      myservoTILT.write(servoTILT);
      delay(10);
    }
    if (realservo >= 2000 && realservo <2180) {
      int servoPAN = realservo;
      servoPAN = map(servoPAN, 2000, 2180, 0, 180);
      myservoPAN.write(servoPAN);
      delay(10);
    }
  }
}

Nuevamente, al juntar todo en el código siguiente, todo responde y funciona bien, pero no los servos.

#include <Servo.h>
Servo myservoTILT, myservoPAN;


int BUZZER = 12;
int LED = 13;
int CIRCULINA = 6;
int LASER = 5;
//Variables para el sensor ultrasonico
int trigPin = 11;
int echoPin = 8;
int maxDist = 20;
int minDist = 1;

float distancia;

//Entrada de los motores
int motor1A = 14; // INPUT 1
int motor1B = 15; // INPUT 2
int motor2A = 17; // INPUT 3
int motor2B = 16; // INPUT 4

// Dato recibido atraves de la aplicacion movil
char data = 'S';

void setup()
{

  myservoTILT.attach(9);
  myservoPAN.attach(10);

  
  pinMode(echoPin, INPUT);    // echo como entrada
  pinMode(trigPin, OUTPUT);   // trigger como salida
  pinMode(LED, OUTPUT);    // LED como salida
  pinMode (CIRCULINA, OUTPUT);
  pinMode (LASER, OUTPUT);
  
  //Definimos las salidas del arduino
  pinMode(motor1A , OUTPUT);
  pinMode(motor1B , OUTPUT);  
  pinMode(motor2A , OUTPUT);  
  pinMode(motor2B , OUTPUT);
  pinMode(BUZZER , OUTPUT);

  Serial.begin(9600);

}
 
void loop()
{
    //Esperamos hasta que haya un Stream de datos
    if(Serial.available() >= 0){
      data = Serial.read();
      Serial.println(data);
    unsigned int servopos = Serial.read();
    unsigned int servopos1 = Serial.read();
    unsigned int realservo = (servopos1 *256) + servopos;
    Serial.println(realservo);
    if (realservo >= 1000 && realservo <1180) {
      int servoTILT = realservo;
      servoTILT = map(servoTILT, 1000, 1150, 0, 180);
      myservoTILT.write(servoTILT);
      delay(10);
    }
    if (realservo >= 2000 && realservo <2180) {
      int servoPAN = realservo;
      servoPAN = map(servoPAN, 2000, 2180, 0, 180);
      myservoPAN.write(servoPAN);
      delay(10);
    }}
    
    switch (data) {
    case 'F':
      avanzar();        // Forward | AVANZAR
      break;
    case 'B':
      retroceder();     // Backward | RETROCEDER
      break;
    case 'L':
      izquierda();  //Left | IZQUIERDA
      break;
    case 'R':
      derecha();    //Right | DERECHA
      break;
    case 'S':
      detener();    //Stop | DETENER
      break;
    case 'A':
      automatico(); // Modo automatico depende del sensor ultrasonico 
      break;
    case 'M':
      bocina1(); // Toca bocina
      break;
     case 'N':
      bocina0(); // Apaga bocina
      break;
     case 'U':
      luces1(); // Enciende luces
      break;
     case 'X':
      luces0(); // Apaga luces
      break;
      case 'P':
      laser1(); // Enciende laser
      break;
     case 'Q':
      laser0(); // Apaga laser
      break;
     case 'J':
      circulina1(); // Enciende circulina
      break;
     case 'K':
      circulina0(); // Apaga circulina
      break;
    }
    delay(20);
}

void avanzar(){
  // Forward | AVANZAR
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
      
}

void retroceder(){
  // Backward | RETROCEDER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}

void derecha(){
  //Right | DERECHA
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void izquierda(){
  //Left | IZQUIERDA
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}

void detener(){
  //Stop | DETENER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void bocina1(){
   // Toca bocina
  digitalWrite(BUZZER, HIGH);
}

void bocina0(){
   // Apaga bocina
  digitalWrite(BUZZER, LOW);
  
}
void luces1(){
   // Enciende luces
  digitalWrite(LED, HIGH);
}

void luces0(){
   // Apaga luces
  digitalWrite(LED, LOW);
  
}

void laser1(){
   // Enciende laser
  digitalWrite(LASER, HIGH);
  
}

void laser0(){
   // Apaga laser
  digitalWrite(LASER, LOW);
  
}

void circulina1(){
   // Enciende circulina
  digitalWrite(CIRCULINA, HIGH);
  
}

void circulina0(){
   // Apaga circulina
  digitalWrite(CIRCULINA, LOW);
  
}

void automatico(){
  
     distancia = calcularDistanciaCm(); // Calculamos la distancia de la pulso
     Serial.println(distancia);
     if (distancia <= maxDist && distancia >= minDist){    // si la distancia es menor de 20cm
        //digitalWrite(LED,HIGH);      // Enciende LED
        
        detener(); //DETENEMOS LOS MOTORES 200 ms     
        delay (200);
        
        retroceder();          // RETROCEDE DURANTE 1000 ms
        delay(1000);           
        
        izquierda();     // Girar durante 600 milisegundos     
        delay(600);
        
        digitalWrite(LED,LOW);
     }
     else{                            
        avanzar(); //SI NO EXISTE OBSTACULO CONTINUA AVANZANDO
     }
}

float calcularDistanciaCm() {
  
  float duracion, distancia; // Variable para calcular el tiempo y distancia
  
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duracion = pulseIn(echoPin, HIGH);
  distancia = (duracion * 0.0343) / 2;
  
  delay(10);
  
  return distancia;
}

Es que no se hace asi!!

 unsigned int servopos = Serial.read();
    unsigned int servopos1 = Serial.read();

Te explico para que lo comprendas.

cada vez que hay un caracter y solo UNO esto se pone en true

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

luego tu lees servopos con el primer Serial.read()

el segundo servopos1 = si tiene suerte leera algo y sino se queda en 0.

La solución es una lectura pensando que siempre te llega de a 1 byte x vez y que debes procesar y concatenar los datos para entender donde ubicarlos.

Entonces, la idea es que envias servopos y como sabes que terminaste de hacerlo pues leyendo el \n correspondiente, pero eso insume como mínimo dos ciclos loop
Ahora dime si no le pones algo antes a servopos como sabes que es el dato de servopos o de servopos1? No lo sabes.

Por eso te segerí un método donde envias un comando previo para identificar.

Una forma muy simple pero que puede fuencionar sería esta: ya que tienes una serie de comandos para mover el carro... usa un par de comandos para los servos y luego te quedas esperando a que se complete la orden.

digamos algo asi, no se si funcionará

void loop()
{
    //Esperamos hasta que haya un Stream de datos
    if (Serial.available() >= 0){
        data = Serial.read();
        Serial.println(data);

        switch (data) {
            case 'F': avanzar();        // Forward | AVANZAR
                      break;
            case 'B': retroceder();     // Backward | RETROCEDER
                      break;
            case 'L': izquierda();  //Left | IZQUIERDA
                      break;
            case 'R': derecha();    //Right | DERECHA
                      break;
            case 'S': detener();    //Stop | DETENER
                      break;
            case 'A': automatico(); // Modo automatico depende del sensor ultrasonico
                      break;
            case 'M': bocina1(); // Toca bocina
                      break;
            case 'N': bocina0(); // Apaga bocina
                      break;
            case 'U': luces1(); // Enciende luces
                      break;
            case 'X': luces0(); // Apaga luces
                      break;
            case 'P': laser1(); // Enciende laser
                      break;
            case 'Q': laser0(); // Apaga laser
                      break;
            case 'J': circulina1(); // Enciende circulina
                      break;
            case 'K': circulina0(); // Apaga circulina
                      break;
            case 'C': unsigned int realservo = 0;
                      while (Serial.available() < 2)
                             realservo = Serial.read();
                             realservo += Serial.read()<<8;
                             Serial.println(realservo); 
                      }
                      break;
        }
        delay(20);
    }

Hola @surbyte, gracias por tu tiempo.
Los CASE son de cada uno de los botones de la App, adjunto imagen. Las barras de abajo son las controladoras del Pan & Tilt. Pregunto, para el código que indicas con un case 'C', ¿debería agregar un botón ("C") para, digamos, "abrir o iniciar" la señal hacia los servos?

Ok. Ya veo como es la cosa.
Bien... recalculando.

Pregunto, para el código que indicas con un case 'C', ¿debería agregar un botón ("C") para, digamos, "abrir o iniciar" la señal hacia los servos?

No puedes simplemente enviar junto con el slide una C previa?

Voy a revisar lo que indicas respecto a enviar una "C" con el slider. No estoy seguro si se pueda... Recién estoy conociendo App Inventor.

Hola nuevamente...
ya quemé cerebro un buen rato y no llegué a nada aún.
Mañana serán los nuevos intentos.
Gracias @surbyte

he dejado el código tal cual hasta el funcionamiento del total menos el pan&tilt.

en AppInventor (imagen adjunta) incluí la ''C'' pero no me funcionó.

int BUZZER = 12;
int LED = 13;
int CIRCULINA = 6;
int LASER = 5;
//Variables para el sensor ultrasonico
int trigPin = 11;
int echoPin = 8;
int maxDist = 20;
int minDist = 1;

float distancia;

//Entrada de los motores
int motor1A = 14; // INPUT 1
int motor1B = 15; // INPUT 2
int motor2A = 17; // INPUT 3
int motor2B = 16; // INPUT 4

// Dato recibido atraves de la aplicacion movil
char data = 'S';

void setup()
{
  pinMode(echoPin, INPUT);    // echo como entrada
  pinMode(trigPin, OUTPUT);   // trigger como salida
  pinMode(LED, OUTPUT);    // LED como salida
  pinMode (CIRCULINA, OUTPUT);
  pinMode (LASER, OUTPUT);
  
  //Definimos las salidas del arduino
  pinMode(motor1A , OUTPUT);
  pinMode(motor1B , OUTPUT);  
  pinMode(motor2A , OUTPUT);  
  pinMode(motor2B , OUTPUT);
  pinMode(BUZZER , OUTPUT);
      
  Serial.begin(9600); }
 
void loop()
{
    //Esperamos hasta que haya un Stream de datos
    if(Serial.available()> 0){
      data = Serial.read();
      Serial.println(data);
    }
    
    switch (data) {
    case 'F':
      avanzar();        // Forward | AVANZAR
      break;
    case 'B':
      retroceder();     // Backward | RETROCEDER
      break;
    case 'L':
      izquierda();  //Left | IZQUIERDA
      break;
    case 'R':
      derecha();    //Right | DERECHA
      break;
    case 'S':
      detener();    //Stop | DETENER
      break;
    case 'A':
      automatico(); // Modo automatico depende del sensor ultrasonico 
      break;
    case 'M':
      bocina1(); // Toca bocina
      break;
     case 'N':
      bocina0(); // Apaga bocina
      break;
     case 'U':
      luces1(); // Enciende luces
      break;
     case 'X':
      luces0(); // Apaga luces
      break;
      case 'P':
      laser1(); // Enciende laser
      break;
     case 'Q':
      laser0(); // Apaga laser
      break;
     case 'J':
      circulina1(); // Enciende circulina
      break;
     case 'K':
      circulina0(); // Apaga circulina
      break;
    }
    delay(20);
}

void avanzar(){
  // Forward | AVANZAR
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
      
}

void retroceder(){
  // Backward | RETROCEDER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, HIGH);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, HIGH); 
}

void derecha(){
  //Right | DERECHA
  digitalWrite(motor1A, HIGH);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void izquierda(){
  //Left | IZQUIERDA
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, HIGH);
  digitalWrite(motor2B, LOW);
}

void detener(){
  //Stop | DETENER
  digitalWrite(motor1A, LOW);
  digitalWrite(motor1B, LOW);
  digitalWrite(motor2A, LOW);
  digitalWrite(motor2B, LOW); 
}

void bocina1(){
   // Toca bocina
  digitalWrite(BUZZER, HIGH);
}

void bocina0(){
   // Apaga bocina
  digitalWrite(BUZZER, LOW);
  
}
void luces1(){
   // Enciende luces
  digitalWrite(LED, HIGH);
}

void luces0(){
   // Apaga luces
  digitalWrite(LED, LOW);
  
}

void laser1(){
   // Enciende laser
  digitalWrite(LASER, HIGH);
  
}

void laser0(){
   // Apaga laser
  digitalWrite(LASER, LOW);
  
}

void circulina1(){
   // Enciende circulina
  digitalWrite(CIRCULINA, HIGH);
  
}

void circulina0(){
   // Apaga circulina
  digitalWrite(CIRCULINA, LOW);
  
}

void automatico(){
  
     distancia = calcularDistanciaCm(); // Calculamos la distancia de la pulso
     Serial.println(distancia);
     if (distancia <= maxDist && distancia >= minDist){    // si la distancia es menor de 20cm
        //digitalWrite(LED,HIGH);      // Enciende LED
        
        detener(); //DETENEMOS LOS MOTORES 200 ms     
        delay (200);
        
        retroceder();          // RETROCEDE DURANTE 1000 ms
        delay(1000);           
        
        izquierda();     // Girar durante 600 milisegundos     
        delay(600);
        
        digitalWrite(LED,LOW);
     }
     else{                            
        avanzar(); //SI NO EXISTE OBSTACULO CONTINUA AVANZANDO
     }
}

float calcularDistanciaCm() {
  
  float duracion, distancia; // Variable para calcular el tiempo y distancia
  
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duracion = pulseIn(echoPin, HIGH);
  distancia = (duracion * 0.0343) / 2;
  
  delay(10);
  
  return distancia;
}

La "C" debe ir primero, entiendo que no es el caso o si?

Buen punto. Tendré que probar.