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);
}
}
}
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
}
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...