Muy simple, estoy controlando los servos (9g Micro Servos) en función de algunos datos leídos desde otro lugar. Todo funciona bien, excepto que los servos se "agitarán" constantemente. Es decir, vuelven a vibrar con movimientos muy sutiles (con movimientos intermitentes de 1/2 -> 1 cm más o menos).
Intenté corregir este problema en el software haciendo algo como:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("X position: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Y position: ");
lcd.print(yRead);
}while( readChange() ); //while there has been change
Donde sea necesario el do-while, inicialice las variables que almacenan el valor del servo mapeado (usando la biblioteca de servos arduino)
La función readChange () se define como:
int readChange(){
int x_Temp, y_Temp;
x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);
if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change
else return 1; //change
}
Donde xRead es el valor que se inicializó (la primera salida de servo asignada).
Aunque, esto realmente no es un buen enfoque. Requiere que AMBOS valores no deben haber cambiado por un factor de DEG (~ 10 grados, o ~ 0.28V en mi caso). Si escribo la función de manera que O sea menor que DEG, ¿qué sucede si solo estaba cambiando un servo a la vez? Entonces hay un delimma ...
¿Es esto simplemente una propiedad de los servos (¿quizás baratos?) O hay una solución alternativa?
Sería mucho más simple incluir un enlace pastie. Aquí está el código completo: http://pastie.org/8191459
He adjuntado dos servos junto con un puntero láser para permitir dos grados de libertad (X, Y). Existen opciones, basadas en el estado de varios botones, para controlar los servos de varias maneras. El primero es "Motion", donde tengo dos fotoresistores que, según la cantidad de exposición a la luz, afectan la posición de los servos. Todavía no he implementado el código para controlar los servos por un controlador Xbox. Y la tercera opción es solo movimiento aleatorio.