[Solucionado] Problema servos

Hola, tengo un problema con un proyecto que estoy haciendo, se trata de un servo y un sensor, por cada angulo que gira el servo obtengo un dato analógico, es decir: gira un grado, lee; gira otro grado,lee y así hasta 90º, el problema es que el servo no empieza a moverse hasta el paso 17, se queda parado, luego empieza a moverse desde la posición inicial bastante bien.
os escribo el programa:

#include <Servo.h>

Servo myservo;

int pos = 0;
int ldrPin = 3; //pin de toma de datos =3 //
int valor = 0; //valor inicial =0 //

void setup() {
{Serial.begin(9600);}

{
myservo.attach(9);
}

}

void loop(){
{valor = analogRead(ldrPin);
Serial.println(valor);
delay(100); }

{for(pos = 0; pos < 1; pos += 1)
{
myservo.write(pos);
delay(100);
}
}
{valor = analogRead(ldrPin);
Serial.println(valor);
delay(100); }

{for(pos = 1; pos < 2; pos += 1)
{
myservo.write(pos);
delay(100);
}
}

{valor = analogRead(ldrPin);
Serial.println(valor);
delay(100); }

{for(pos = 2; pos < 3; pos += 1)
{
myservo.write(pos);
delay(100);
}
}
{valor = analogRead(ldrPin);
Serial.println(valor);
delay(100); }

//................................. Sigue así cambiando los angulos..................................................//

{for(pos = 89; pos < 90; pos += 1)
{
myservo.write(pos);
delay(100);
}
} {valor = analogRead(ldrPin);
Serial.println(valor);
delay(100); }
{for(pos = 90; pos < 0; pos -= 90)
{
myservo.write(pos);
delay(100);
}
}
{while(1);}}

Por favor me seria muy útil vuestra ayuda, ya que estoy empezando y no se mucho.
Muchas gracias.

Hola dparedesroibas

Sin mirar el código en detalle, me he dado cuenta de que tienes bastantes corchetes recurrentes.
quizás por eso el programa haga cosas un poco raras.

Saludos

Aparte del tema de los corchetes recurrentes que ha mencionado Inizul, ¿haces un for() para cada angulo?.

Veo más lógico empezar por definir valor como un array para contener las 90 mediciones.

int valor[90]; // donde se almacenará un entero en cada posición coincidiendo con el ángulo

Y ahora hacemos un bucle for() que recorra todas las posiciones entre 0 o 90 grados almacenando cada valor en el array:

for (int angulo=0; angulo < 90; angulo++)
{  // ahora si un corchete
  myservo.write(angulo);  // gira 1 grado
  delay(15);   // no hace falta más tiempo para que el servo gire 1 grado
  valor[angulo] = analogRead(ldrPin);  // hacemos la lectura y terminamos
}  // corchete de cierre

Puedes sacar los datos por el puerto serie añadiendo un Serial.print() y un delay() dentro del bucle for() o puedes hacer otro bucle for() que recorra todo el array y muestre los datos uno a uno.

Espero te sea de utilidad.

Muchas gracias! si lo supiera antes de tirarme escribiendo3 horas XD
lo he probado y perfecto, muchas gracias.
¿Por cierto a que os referis con corchetes recurrentes?

Por ejemplo:

void setup() {
{Serial.begin(9600);}

{
myservo.attach(9);
}

}

cuando con esto es suficiente:

void setup() {
Serial.begin(9600);
myservo.attach(9);
}

Todo el programa está lleno de corchetes recurrentes. Salu2

Toma:

Aquí tienes una guía en castellano con los comandos más utilizados y su sintaxis con ejemplos.

Un saludo

Los corchetes recurrentes solo sirven para darte errores de compilación cuando te dejas uno, no influyen en el funcionamiento del programa.

Para ver con claridad qué instrucciones están dentro de una sentencia, lo mejor es usar el tabulador (indentar o identar, nunca me acuerdo del nombre concreto). Algunos editores (IDEs incluidos) insertan 2 o 4 espacios en blanco por cada tabulación.

un ejemplo en C

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    
    for(i=0; i <10; i++)
    {
       j = random(100);
       if( j % 2 == 0)
       {
           printf("%d: esto es un numero par\n", j);
           i = i  * 2;
       }
       else
       {
           printf("%d: y este es un numero impar\n", j);
           i = i / 2;
       }
    }
    return 0;
}

Así se puede ver qué instrucciones están dentro de cada anidación (entre los corchetes y los tabuladores, se hace más visual).

Lo que no entiendo es que usas el for() para solo una iteración (una vuelta).

 {valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }
  
{for(pos = 0; pos < 1; pos += 1)  
  {                                   
    myservo.write(pos);              
    delay(100);                      
  } 
 }   
  {valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }
                                      
{for(pos = 1; pos < 2; pos += 1)  
  {                                   
    myservo.write(pos);              
    delay(100);                      
  } 
 }

Como bien dice josemanu, es más claro poner;

for(pos = 0; pos < 90; pos += 1)  
{       
    valor = analogRead(ldrPin);
    Serial.println(valor);  
    delay(100);  

    myservo.write(pos);              
    delay(100);                      
  }

Con eso repites el bucle 90 veces (desde 0 a 89), te queda el código más legible, usas menos espacio en la memoria del procesador y es más fácil encontrar fallos. Consejo, repásate como funcionan los bucles.

Otra cosa, ¿en esto no se te queda el código colgado?

{while(1);}}

traducido sería, "mientras 1 sea cierto", pero no le das instrucciones para hacer nada, teoricamente, se quedaría ahí en un bucle infinito, esto no lo necesitas, las instrucciones están dentro del "void loop()", con lo que se repetirán constantemente.

Antes que nada volver a daros las gracias.
Utilizo el for() por que es la forma en que me funciono, no es la mas correcta pero soy novato y todavia tengo que aprender mucho.
con el while pasa lo mismo quiero que el programa al final se pare, que no se repita una y otra vez, esta claro que no es la forma correcta pero me funciona XD la verdad es que con vuestara ayuda he simplificado todo muchisimo, otra vez muchas gracias

El programa me ha simplificado todo muchísimo, pero sigo teniendo el problema de que el servo no empieza a moverse hasta pasado un rato,sin embargo las lecturas empiezan al empezar el programa, ¿que puede ser?¿ Estará roto el servo? Aunque cambie los angulos que se desplaza sigue sin empezar a la vez, no se que hacer.
Gracias de antemano

Si quieres que solo lo haga una vez, vale, aunque es matar moscas a cañonazos :grin:

para eso, en lugar de void loop() ponle void escaneo() y lo llamas desde setup, es más claro y como dirían los expertos, más elegante :stuck_out_tongue:

void setup()
{
    Serial.begin(9600);
    myservo.attach(9);  
 
    escaneo();   
}

void escaneo()
{
    ...
}

void loop()
{}

De esta forma, si luego quieres ampliarle cosas, puedes realizar una llamada a escanear() cuando te haga falta.

Lo del servo, no se, prueba con el ejemplo del sweep, a ver si realiza todo el barrido.

Con el Sweep me hace el barrido entero perfectamente, pero en mi programa no empieza a la vez que empiezan las lecturas,no se que hacer me esta volviendo loco.
Exactamente cuando empieza hace unas 15 lecturas y luego empieza a girar los ángulos que le mando, lo podría utilizar simplemente no haciendo caso a las 15 primeras pero claro no es lo que me gustaría.

Pon el bucle por aquí, a ver si entre todos vemos el fallo.

Esta arriba el programa entero, copiado y pegado, pero bueno ya da igual porque lo he cambiado como me habéis dicho y después de probar varias veces ya funciona, gracias por la ayuda.

me refería al código corregido, pero si ya va, de lujo 8)