problema (???) con programa control remoto camara

Buenos días,

Mucho agradecería si alguien pudiera ayudarme a resolver lo siguiente:

el código funciona perfectamente salvo lo relativo al control de la cámara. este funciona, sin embargo, después de actuar correctamente , se repite en un ciclo infinito.
He realizado muchísimas pruebas sin éxito. Tal vez esa parte del código deba colocarla en otro sitio...?

Gracias por adelantado a cualquier sugerencia!

#include <Servo.h>
Servo ServoAndroid;
char t; 
int ang = 90; //Ángulo inicial 90 grados
 
void setup() {

 
//pinMode(13,OUTPUT);   // motores izq adelante
//pinMode(12,OUTPUT);   //motores izq reversa
pinMode(11,OUTPUT);   //motores der adelante
pinMode(10,OUTPUT);   //motores der reversa
pinMode(8,OUTPUT);    //enfoque camara
pinMode(9,OUTPUT);    //shutter camara

ServoAndroid.attach(3,600,2400); //Servomotor: PIN3 & AP(min)=600 AP(max)=2400

Serial.begin(9600);
 
}
 
void loop() {
if(Serial.available()){
  t = Serial.read();
  Serial.println(t);
}
//control motores 
if(t == 'F'){            //motores adelante
 // digitalWrite(13,HIGH);
 // digitalWrite(12,LOW);
  digitalWrite(11,HIGH);
  digitalWrite(10,LOW);
}
 
else if(t == 'B'){      //motores reversa
 // digitalWrite(13,LOW);
//  digitalWrite(12,HIGH);
  digitalWrite(11,LOW);
  digitalWrite(10,HIGH);
}
 
else if(t == 'X'){      //parar motores
 // digitalWrite(13,LOW);
 // digitalWrite(12,LOW);
  digitalWrite(11,LOW);
  digitalWrite(10,LOW);
} 
//control camara
else if(t == 'S'){      //enfoque/shutter

digitalWrite(8, HIGH); // enfoque 
delay(1500); //espera 1.5 segundos
digitalWrite(9, HIGH); // shutter 
delay(1000); // espera 1 segundo
digitalWrite(8, LOW); //( LOW para Pentax)
digitalWrite(9, LOW); // ( LOW para Pentax)
  
}
delay(100);

 if(Serial.available()){ 
   t = Serial.read(); 
   
//control dirección servo
    if (t == 'R'){ 
      ang = ang + 30; //Se aumenta el angulo en 30 grados
      Serial.print(ang); 
      }
    else if (t == 'L'){
      ang = ang -30; //Se disminuye el angulo en 30 grados
      Serial.print(ang);
      }
      
    ang = constrain(ang,0,180); //Se limita los valores del angulo
    }
    ServoAndroid.write(ang); //Se ingresa el valor de "ang" en el Servo
    delay(10); //tiempo de espera 10ms

}

Me parece que el error en tu código es que las llaves de tu primer if() donde capturas t no abarca todas las evaluaciones de la variable t.

Es por eso que sin tener una nueva entrada se repite la ultima acción.

No se si ya es meterme demasiado, pero te quedaría muco mas claro si en lugar de multiples if() usas un switch() asi:

void loop() {
	if (Serial.available()){
		t = Serial.read();
		Serial.println(t);
		//control motores
		Switch (t){
		//motores adelante
		case 'F':            
			//digitalWrite(13,HIGH);
			//digitalWrite(12,LOW);
			digitalWrite(11,HIGH);
			digitalWrite(10,LOW);
			break;
		//motores reversa
		case 'B':
			//digitalWrite(13,LOW);
			//digitalWrite(12,HIGH);
			digitalWrite(11,LOW);
			digitalWrite(10,HIGH);
			break;
		//parar motores
		case 'X':     
			//digitalWrite(13,LOW);
			//digitalWrite(12,LOW);
			digitalWrite(11,LOW);
			digitalWrite(10,LOW);
			break;
		//control camara
		//enfoque/shutter
		case 'S':
			digitalWrite(8, HIGH); //enfoque 
			delay(1500);
			digitalWrite(9, HIGH); //shutter 
			delay(1000);
			digitalWrite(8, LOW);  //LOW para Pentax
			digitalWrite(9, LOW);  //LOW para Pentax 
			break;
		//control dirección servo
		case 'R':
			ang = ang + 30; //Se aumenta el angulo en 30 grados
			ang = constrain(ang,0,180); //Se limita los valores del angulo
			ServoAndroid.write(ang); //Se ingresa el valor de "ang" en el Servo
 			Serial.print(ang);
			break;
		case 'L':
			ang = ang - 30; //Se disminuye el angulo en 30 grados
			ang = constrain(ang,0,180); //Se limita los valores del angulo
			ServoAndroid.write(ang); //Se ingresa el valor de "ang" en el Servo
			Serial.print(ang);
		}     
    }
}

Muchas gracias Kike_GL

Podrías orientarme sobre como probar eso? estoy empezando en este mundo y no tengo muchos conocimientos...

1ro un pedido: Cuando postes un código tómate el trabajo de indentarlo o simplemente usa AUTOFORMAT para que se lee prolijamente.

Ahora mi colaboración.

#include <Servo.h>
Servo ServoAndroid;
char t; 
int ang = 90, angAnt = 0; //Ángulo inicial 90 grados

void setup() {
    //pinMode(13,OUTPUT);   // motores izq adelante
    //pinMode(12,OUTPUT);   //motores izq reversa
    pinMode(11,OUTPUT);   //motores der adelante
    pinMode(10,OUTPUT);   //motores der reversa
    pinMode(8,OUTPUT);    //enfoque camara
    pinMode(9,OUTPUT);    //shutter camara

    ServoAndroid.attach(3,600,2400); //Servomotor: PIN3 & AP(min)=600 AP(max)=2400

    Serial.begin(9600);
}

void loop() {

    if (Serial.available()){
        t = Serial.read();
        Serial.println(t);
      
        //control motores 
        if (t == 'F'){            //motores adelante
           // digitalWrite(13,HIGH);
           // digitalWrite(12,LOW);
           digitalWrite(11,HIGH);
           digitalWrite(10,LOW);
        }

        if (t == 'B'){      //motores reversa
           // digitalWrite(13,LOW);
           //  digitalWrite(12,HIGH);
           digitalWrite(11,LOW);
           digitalWrite(10,HIGH);
        }

        if (t == 'X'){      //parar motores
           // digitalWrite(13,LOW);
           // digitalWrite(12,LOW);
           digitalWrite(11,LOW);
           digitalWrite(10,LOW);
        } 
        //control camara
        if (t == 'S'){      //enfoque/shutter
           digitalWrite(8, HIGH); // enfoque 
           delay(1500); //espera 1.5 segundos
           digitalWrite(9, HIGH); // shutter 
           delay(1000); // espera 1 segundo
           digitalWrite(8, LOW); //( LOW para Pentax)
           digitalWrite(9, LOW); // ( LOW para Pentax)

        }
        //control dirección servo
        if (t == 'R'){ 
          ang = ang + 30; //Se aumenta el angulo en 30 grados
          Serial.print(ang); 
        }
        if (t == 'L'){
          ang = ang -30; //Se disminuye el angulo en 30 grados
          Serial.print(ang);
        }

        ang = constrain(ang,0,180); //Se limita los valores del angulo
        angAnt = ang;
    }
    if (ang != angAnt)
        ServoAndroid.write(ang); //Se ingresa el valor de "ang" en el Servo
    delay(10); //tiempo de espera 10ms
}

Me gusta usar switch(t) y los case para cada caso en lugar de tantos if, por se mas eficiente.
Pero funcionalmente es lo mismo.
El servo se accionará cuando se establezca un angulo distinto del anterior.

Si aún asi no funciona como esperas, al final del if o concretamente aca

        ang = constrain(ang,0,180); //Se limita los valores del angulo
        angAnt = ang;
        t = 0;       // <== AGREGA esta linea
    }

Muchas gracias surbyte!

Tomo nota respecto de lo de la indentación.

En cuanto al código, las modificaciones que sugeriste, resolvieron el tema relativo al control de la cámara. Sin embargo, ahora no funciona el servo, incluso con el agregado que me dices que pruebe. No responde a ningún comando...

Me tomo la libertad de modificar lo que te propuso surbyte:

#include <Servo.h>
Servo ServoAndroid;
char t;
int ang = 90, angAnt = 0; //Ángulo inicial 90 grados

void setup() {
    //pinMode(13,OUTPUT);   // motores izq adelante
    //pinMode(12,OUTPUT);   //motores izq reversa
    pinMode(11,OUTPUT);   //motores der adelante
    pinMode(10,OUTPUT);   //motores der reversa
    pinMode(8,OUTPUT);    //enfoque camara
    pinMode(9,OUTPUT);    //shutter camara

    ServoAndroid.attach(3,600,2400); //Servomotor: PIN3 & AP(min)=600 AP(max)=2400

    Serial.begin(9600);
}

void loop() {

    if (Serial.available()){
        t = Serial.read();
        Serial.println(t);
     
        //control motores
        if (t == 'F'){            //motores adelante
           // digitalWrite(13,HIGH);
           // digitalWrite(12,LOW);
           digitalWrite(11,HIGH);
           digitalWrite(10,LOW);
        }

        if (t == 'B'){      //motores reversa
           // digitalWrite(13,LOW);
           //  digitalWrite(12,HIGH);
           digitalWrite(11,LOW);
           digitalWrite(10,HIGH);
        }

        if (t == 'X'){      //parar motores
           // digitalWrite(13,LOW);
           // digitalWrite(12,LOW);
           digitalWrite(11,LOW);
           digitalWrite(10,LOW);
        }
        //control camara
        if (t == 'S'){      //enfoque/shutter
           digitalWrite(8, HIGH); // enfoque
           delay(1500); //espera 1.5 segundos
           digitalWrite(9, HIGH); // shutter
           delay(1000); // espera 1 segundo
           digitalWrite(8, LOW); //( LOW para Pentax)
           digitalWrite(9, LOW); // ( LOW para Pentax)

        }
        //control dirección servo
        if (t == 'R'){
          ang = ang + 30; //Se aumenta el angulo en 30 grados
          Serial.print(ang);
        }
        if (t == 'L'){
          ang = ang -30; //Se disminuye el angulo en 30 grados
          Serial.print(ang);
        }

        ang = constrain(ang,0,180); //Se limita los valores del angulo
        // angAnt = ang; Esto se le colo ,va mas abajo
    }
    if (ang != angAnt)
        ServoAndroid.write(ang); //Se ingresa el valor de "ang" en el Servo
        angAnt = ang;
        delay(10); //tiempo de espera 10ms
}

Muchas gracias Jose

Trabaja perfectamente ahora. Ya puedo seguir adelante con mi proyecto!

Un saludo