22 votos

¿Hay alguna forma de detener que los servos "se sacudan"?

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.

introducir descripción de la imagen aquí

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.

2voto

Boris Samardžija Puntos 125

Mi mejor opción en este caso fue adjuntar y desajuntar los Servos en cada operación.

servo1.attach(pinServo1);
for (pos = 0; pos <= servoMax; pos += 1) {
    servo1.write(pos);
    delay(10);
}
servo1.detach(pinServo1);

PD. Esto realmente no es de calidad en absoluto, solo una solución temporal.

2voto

maan81 Puntos 128

Mientras que otros han sugerido varias soluciones a este problema de zumbido del servo, en este hilo y en otros foros de Arduino, concretamente:

  • Generar nuestro propio pulso
  • Suministrar energía de 5V por separado
  • Avoid pushing to its limits (e.g. use 10-170 instead of 0-180)
  • Ejecutar un condensador a través de
  • Desconectar después de mover

En mi caso, descubrí que el zumbido se detenía cuando se conectaba una fuente de alimentación de 9V/2A a la placa de Arduino. Pero la solución definitiva más fácil fue simplemente mover el servo lentamente:

for (pos = servo.read(); pos < 180; pos += 2) {
  servo.write(pos);
  delay(40);
}

Tu experiencia puede variar.

1voto

EBlake Puntos 171

Para mí, esto parece errores o desajuste del bucle de retroalimentación. Los sistemas de control de servos de alta gama tienen cierto conocimiento de las características del motor (inductancia, par, corriente máxima, número de polos), la carga (momento de inercia) y las condiciones instantáneas (posición, rpm, back-emf, corriente). Con esta información, el programa de control del motor puede hacer predicciones sobre lo que hará el servo en respuesta a una entrada dada desde el controlador (es decir, entrada de corriente/voltaje) y en base a eso generar la entrada óptima para lograr la salida deseada.

Como puedes imaginar, esto es algo complicado, pero una búsqueda en internet sobre retroalimentación de servos te ayudará a empezar.

1voto

#include              // Biblioteca Servo
Servo servo_test;        // Inicializar un objeto de servo para el servo conectado  

int angle = 0;
int sw1 = 7;   // botón de presión conectado al pin digital 7
int val=0;

void setup()
{
   servo_test.attach(2);     // adjuntar el pin de señal del servo al pin 2 de arduino
   pinMode(sw1, INPUT_PULLUP);
}

void loop()
{
    val = digitalRead(sw1);
    if (val == LOW)
    {  
        servo_test.attach(2);     // adjuntar el pin de señal del servo al pin 2 de arduino
        for(angle = 0; angle < 90; angle += 1)   // comando para moverse de 0 grados a 90 grados 
        {                                  
            servo_test.write(angle);                 //comando para rotar el servo al ángulo especificado
            delay(5);                     
        } 
    }
    else
    {
        servo_test.detach();// Después de que el motor del servo se detenga, necesitamos el comando detach para detener la vibración
    }
}

1voto

Kunati Puntos 31

Asegúrate de que el Arduino esté recibiendo la alimentación adecuada.

Estaba conectando un Arduino Uno a un portátil que tenía poca batería a través de un cable USB, lo que provocaba que el servo se moviera de manera errática. ¡Tan pronto como puse el portátil a cargar, el servo empezó a funcionar correctamente!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X