Muy simplemente, estoy controlando servos (servos micro 9g) basados en algunos datos leídos desde otro lugar. Todo funciona bien excepto que los servos constantemente "tiemblan". Es decir, vibran hacia atrás con movimientos muy sutiles (con movimientos intermitentes de 1/2 -> 1 cm aproximadamente).
Intenté corregir este problema en el software haciendo algo como:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Posición X: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Posición Y: ");
lcd.print(yRead);
}while( readChange() ); //mientras haya habido cambio
Donde el do-while es necesario para inicializar las variables que almacenan el valor mapeado del servo (usando la biblioteca de servo de arduino).
La función readChange() está definida 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; // sin cambio
else return 1; //cambio
}
Donde xRead es el valor que se inicializó (la primera salida mapeada del servo).
Realmente este no es un buen enfoque. Requiere que AMBOS valores no hayan cambiado en un factor de DEG (~10 grados, o ~0.28V en mi caso). Si escribo la función de tal manera que cualquiera de ellos sea menos que DEG, ¿qué pasa si solo estaba cambiando un servo a la vez? Así que hay un dilema.
¿Es esto simplemente una propiedad de los servos (¿tal vez baratos?) o hay una solución alternativa?
Sería mucho más simple incluir un enlace de pastie. Aquí está todo el código.
He adjuntado dos servos juntos con un puntero láser para permitir dos grados de libertad (X, Y). Hay opciones, basadas en el estado de varios botones, para controlar los servos de varias maneras. La primera es "Movimiento" donde tengo dos fotorresistencias que, según la cantidad de luz expuesta, afectan la posición de los servos. Aún no he implementado el código para controlar los servos mediante un controlador de Xbox. La tercera opción es simplemente movimiento aleatorio.
4 votos
Aparentemente tienes un poco de inestabilidad o ruido en tu controlador de servos. Sin embargo, te adentras en muchos detalles de cosas que parecen no tener nada que ver con el controlador de servos, aparte de la línea no documentada "positionServo();", que podemos suponer es donde están enterrados los detalles. ¿El controlador de servos está cerrado en el micro? ¿Cerrado externamente? ¿Análogo o digital? Si es digital, ¿a qué resolución se está midiendo? Muestra un diagrama de todo el sistema.
0 votos
¿Qué carga está poniendo en los servos?
0 votos
@OlinLathrop ¿Qué quieres decir con "cerrado"? Estoy usando la biblioteca de servos de Arduino. Si te refieres a algunos detalles que puedan estar tratados en el código de la biblioteca, no estoy seguro.
0 votos
@SimpleCoder Aquí tienes una imagen del dispositivo. Realmente no hay ninguna resistencia que el servo tenga que superar. Por lo tanto, imagino que hay poca carga en los motores. i.imgur.com/lXJ4VRp.jpg
4 votos
@OlinLathrop - (S)he's using standard radio-controlled model servos, which have the entire
servo
loop baked into the device. sherrellbc - "Servo
" is a very, very general term. Unfortunately, RC model component manufacturers chose about the least descriptive term for the devices the produce. Since we deal with most different kinds of servos and servo-systems here, specifying that your "servos
" are radio-controlled model servos is probably a good idea.0 votos
@ConnorWolf Soy bastante nuevo en trabajar con estos dispositivos electrónicos. Los compré en una tienda física y me puse a trabajar directamente. No tengo idea de los diferentes tipos que están disponibles. Dado que estos son controlados por pines de salida analógicos en el Arduino, imagino que son controlados por radio. Disculpa si te causé confusión.
0 votos
¿Estás seguro de que no es "sacudida aleatoria" (mode == 1) cuando debería estar haciendo otra cosa? mode == 1 se establece como predeterminado, ¿cómo estás cambiando MOTCP? ¿Está conectado al riel de 5v o hay hardware que lo enciende y apaga? ¿Estás seguro de que se está afirmando alto cuando se llama a readMode?
12 votos
Nota general para el diseño de sistemas de direccionamiento láser: coloque espejos en los servos, luego dirija uno hacia el otro. De esta manera, no es necesario tener un servo montado sobre el otro, ni el láser montado en los servos, y luego puede sujetarlos todos firmemente.
0 votos
Intenta colocar una férula en uno de los cables del servo. Debido a que tienes dos, esto puede ser debido a la interferencia entre los dos servos.
1 votos
Su sistema es demasiado complejo para que podamos solucionarlo por usted. Simplifíquelo y vea si aún tiene el problema. Cuando tenga un sistema minimal que reproduzca el problema y aún no pueda solucionarlo por sí mismo, entonces es apropiado pedir ayuda.