- SOLUCIONADO - Pausa entre giros de servo sin delay

Muy buenas,
como buen novato llevo atascado desde hace tiempo en algo de lo más simple, intentar que un servo gire 180º, espere 8 segundos, vuelva a 0º, y espere otra vez 8 segundos. Lo interesante es conseguirlo sin usar delay, ya que el intervalo final entre giros del proyecto será de varias horas.
Desde mi inexperiencia me parece que el sketch lo tengo bien, pero lo único que consigo es: rotar a 180º, rotar a 0º y esperar 8 segundos.
Como podréis observar he usado la librería metro, al principio usaba millis pero lo cambié por si estaba ahí el problema.

#include <Metro.h>
#include <Servo.h>

int pos = 0;
Servo servo;
Metro intervalo = Metro(8000); // tiempo entre giros

void setup()
{
servo.attach(9);
servo.write(0);
}

void loop()
{

if (intervalo.check() == 1){ // comprueba el intervalo de tiempo

servo.read(); // comprueba la posición actual del servo

if (pos <= 89){ // si esta en 0 va a 180
servo.write(180);
delay(1500);
}

else(pos >= 90);{ // si esta a 180 va a 0
servo.write(0);
delay(1500);
}
}
}

Ejecuta los pasos “if” y “else” de manera consecutiva, en lugar de ejecutar uno de los dos y volver a esperar a que se repita el intervalo de tiempo. ¿Dónde he metido la gamba?

Gracias y un saludo

Lo que yo veo

if (pos <= 89){ // si esta en 0 va a 180 LO PONE A 180
servo.write(180);
delay(1500);
}

else(pos >= 90);{ // si esta a 180 va a 0 POR TANTO ESTE SE EJECUTA AL CUMPLIR LA CONDICIÓN DE > DE 90
servo.write(0);
delay(1500);
}

Jopapa
www.jopapa.me

Hola Jopapa, no creo que sea eso, porque si le cambio el delay a, por ejemplo, 100. El servo intenta ir a 180º, pero en cuanto pasan esos 100 milisegundos (mucho antes siquiera de llegar a los 90º) ya esta girando de vuelta a 0º :~

Te aconsejo que actives la comunicación serie y leas el valor de la variable “pos” entre el if y el else. Y donde tengas dudas. Osea, depuración de código.
Por cierto, no tiene porque haber correlación entre la posición mecánica (inercia) y el valor de las variables.

Jopapa
www.jopapa.me

Ok, tomo nota y en cuanto pueda lo pruebo y te cuento. Gracias por tus respuestas y tu tiempo ;)

¡¡ Conseguido !! Seguramente haya una manera de hacerlo con un código más bonito, pero por lo menos funciona.

#include <Servo.h>

int pos = 0;
Servo servo;
unsigned long tiempo, tiempoA=0, retardo=8000;

void setup(){
  servo.attach(9);
  servo.write(0);
  Serial.begin(9600);
}

void loop() {
tiempo= millis();
servo.read();
pos=servo.read();

if( tiempo > tiempoA+retardo){
    if (pos <= 89){                // si esta en 0º...   
    tiempoA=tiempo;
        servo.write(180);           // ... lo manda a 180º
         delay(1200);                 // espero a que llegue
         servo.read();                // lee la posición del servo
        pos = servo.read();         // actualiza la variable "pos"
         Serial.println("mandado a 180 grados");
         Serial.println(tiempo);
    }
}
if( tiempo > tiempoA+retardo){
      if (pos >= 90){                // si esta a 180º... 
        tiempoA=tiempo;
        servo.write(0);              // ... lo manda a 0º
        delay(1200);                  // espero a que llegue
        servo.read();                  // lee la posición del servo
        pos = servo.read();          // actualiza la variable "pos"   
        Serial.println("mandado a 0 grados");     
        Serial.println(tiempo);
        }
}
}

Un saludo,
XampaX