ciclos anidados? saltos??... ayuda

Creo que haría falta una descripción mucho más detallada tanto del código como del hardware.

En principio, un servo puede estar en su estado original o "trucado" de dos formas diferentes.

Un servo normal de fábrica está formado por un motor que mueve el mecanismo y un sensor que mide la posición del mecanismo. El sensor que mide la posición viene a ser un potenciómetro y la posición se mide midiendo la resistencia. Este potenciómetro suele tener una carrera mecánica (el ángulo de giro que abarca) de unos 240º grados y una carreta eléctrica de unos 220º. Así que el mecanismo puede moverse hasta 240º antes de dar en el tope mecánico pero la resistencia solo cambia y la posición solo puede medirse en los 220º centrales.

El control del servo suele estar ajustado para que cuando la señal de control va de extremo a extremo el servo se mueva unos 90º.

Si se truca este potenciómetro la amplitud del movimiento se puede ampliar hasta 200 o 220º.

Otro "truco" consiste en suprimir y los topes mecánicos y entonces el servo se convierte en un "servo de rotación continua", que puede dar, por ejemplo, 12 vueltas en un sentido y luego 16 en el otro. El problema es que con este "truco" deja de ser posible conocer la posición en que está el servo y el servo, en realidad, deja de ser un servomotor.

El código típico para una cosa de estas podría tener esta pinta general:

Vamos a suponer que la posición del servo (pos) puede moverse desde 0 (extremo izquierda) hasta 255 (derecha), que y que el valor medido en la fotoresistencia (val) crece cuando el servo se mueve hacia la derecha y que queremos pararnos el el valor de fotoresistencia TARGET.

Necesitamos una función, o unas líneas de código que ordenen al servo una nueva posición, lo llamaremos servo_pos() y otra función o lineas de código que miden el valor de la resistencia, lo llamaremos mide_val()

#define MIN_SERVO    0
#define MAX_SERVO   255

#define T_INICIAL     1500
#define T_PASO         15

#define TARGET         1000

servo_pos(MIN_SERVO);
delay(T_INICIAL);              // Damos tiempo al servo a llegar al extremo izquierdo

for(n = MIN_SERVO; n<= MAX_SERVO; n++){
       if(mide_val()>TARGET) break;
       servo_pos(n);
       delay(T_PASO);
       }

if(TARGET<mide_val()) Serial.printnl(Error: El target no ha sido alcanzado);

La instrucción break; hace que la ejecución "salte fuera" del bucle y continúe, el problema es que no sabemos si hemos salido del bucle porque val ha alcanzado el target o porque se ha alcanzado el extremo izquierdo de las posiciones del servo.

Con "while" se puede emplear break; o hacer falsa la condición del while

#define MIN_SERVO    0
#define MAX_SERVO   255

#define T_INICIAL     1500
#define T_PASO         15

#define TARGET         1000

servo_pos(MIN_SERVO);
delay(T_INICIAL);              // Damos tiempo al servo a llegar al extremo izquierdo

int continua = 1;
int posicion = MIN_SERVO;

while(continua==1){
       if(mide_val()>TARGET)        continua=2;

       servo_pos(posicion); 
       posicion++;
       if(posicion>MAX_SERVO)      continua=3;

       delay(T_PASO);
       }

if(continua==2) Serial.printnl(Target alcanzado); 
if(continua==3) Serial.printnl(Error: Target no alcanzado);