Pregunta:
El servo no deja de girar
Stedy
2014-04-28 10:27:02 UTC
view on stackexchange narkive permalink

Tengo una placa Arduino Uno R3 y después de un tiempo sin usarla parece estar dañada. Mi código está debajo, básicamente quiero rotar un servo 90 grados cada 12 horas, pero tan pronto como lo conecto, el servo comienza a girar sin parar. He intentado varios pasos de retraso y acortar y alargar la escritura, pero ocurre el mismo efecto.

  #include <Servo.h>Servo myservo; void setup {myservo.attach (10);} void loop () { myservo.write (90); retraso (3600000);}  
Supongo que es un servo continuo. En esta situación, con su código se espera lo que observa: el servo funciona para siempre a velocidad constante. Si fuera un servo normal, su código tampoco funcionaría, ya que nunca cambia el valor de `90` grados, por lo que el servo permanecería para siempre en esa posición.
Tenga en cuenta que su Arduino UNO probablemente esté en perfecto estado, de todos modos.
No está relacionado con el problema del servo, pero creo que su retraso es de 10 horas.
Dos respuestas:
#1
+6
jfpoilpret
2014-04-28 23:26:53 UTC
view on stackexchange narkive permalink

Supongo que estás usando un servo continuo, de lo contrario no podrás hacerlo girar 90 ° más de dos veces (un servo normal tiene un ángulo variable de solo 180 °).

Ahora si está utilizando un servo continuo, debe tener en cuenta que el valor que pasa a myservo.write () ya no representa un ángulo.

Con un servo continuo, el el valor pasado a myservo.write () ahora significa una velocidad de rotación donde, pero el rango de valores aceptables es el mismo que para un servo normal, es decir, [0; 180] :

  • 0 significa velocidad máxima en el sentido de las agujas del reloj
  • 90 significa que no hay movimiento
  • 180 significa velocidad máxima en sentido antihorario

Ahora, si desea girar el servo exactamente 90 °, debe conocer la velocidad máxima del servo, y a partir de eso, calcule el tiempo durante el cual debe dejarlo girar:

  // Empiece a girar en el sentido de las agujas del reloj myservo.write (0); // Siga girando durante el tiempo correcto delay (TURN_TIME) ; // Deja de convertirmyservo.write (90);  

El problema aquí es calcular TURN_TIME . Para ello, debes consultar la hoja de datos de tu servo.

En mi propio servo, un Feetech Micro 1.3kg Continuous Rotation Servo FS90R, la velocidad máxima es:

  • 0.12s / 60 ° cuando se alimenta con 4.8V
  • 0.10s / 60 ° cuando se alimenta con 6V

Sin embargo, con Arduino UNO, el voltaje suministrado debe ser exactamente 5V, ni 4.8V, ni 6V .

Si tomamos una aproximación lineal, entonces podemos aplicar la siguiente fórmula para averiguar la velocidad T (en s/60°×):

  T = (0.12 - 0.10) * (V - 4.8) / (4.8 - 6.0) + 0.12  

Por lo tanto, para 5V, podemos dar por sentado que la velocidad máxima debe ser:

  T = (0.12 - 0.10) * ( 5.0 - 4.8) / (4.8 - 6.0) + 0.12 = 0.116667  

Dado que necesitamos 90 °, esto significa que debemos ejecutar el servo a su velocidad máxima durante:

  T '= T * 1.5 = 0.175s  

Por lo tanto, ahora tenemos el siguiente programa:

  #include <Servo.h> # define TURN_TIME 175Servo myservo; void setup {myservo.attach (10); // Inicialmente el servo debe estar parado myservo.write (90);} void loop () {// Empiece a girar en el sentido de las agujas del reloj myservo.write (0); // Continuar girando durante el tiempo correcto delay (TURN_TIME); // Deja de girar myservo.write (90); // Espere 12h de retraso (12 * 3600 * 1000);}  

Por supuesto, necesitará algunos experimentos para encontrar los valores exactos correctos; también puede descubrir que el servo puede ser sensible al ruido e incluso cuando no debería moverse (value = 90 ), se mueve (no rápido, pero aún se mueve).

También tenga en cuenta: el cristal arduino no es una fuente de tiempo confiable. Se puede esperar que pierda o gane hasta un minuto por día, sin incluir la compensación del tiempo real que se tarda en ejecutar el programa. Si desea una hora precisa, compre un módulo de reloj de tiempo real (RTC) y configure una alarma en él, que luego puede activar una función en el Arduino cada 12 horas.
No sé por qué, pero el servo continuo FS90R mío se detiene con `servo.write (95);`
#2
+2
David Stanton
2019-03-16 13:26:43 UTC
view on stackexchange narkive permalink

Eso fue útil. Estaba obteniendo la misma rotación cuando tenía los servos a 90. Lo que hice para detener eso fue usar el comando de separación. Usando el Particle Photon con un servo continuo adjunto.

  bool state = LOW; Servo servo1; Servo servo2; // crear servoobjetos para controlar un servo // se pueden crear un máximo de ocho servoobjetos creado int pos = 90; // variable para almacenar la posición del servo void setup () {servo1.attach (D0); servo2.attach (D1); Spark.function ("prueba", función de prueba); servo1.attach (10); servo1.write (90); servo2.attach (10); servo2.write (90);} bucle vacío () {servo2.detach (), servo1.detach (); retraso (25); servo2.attach (D0), servo1.attach (D1); retraso (25); servo1.write (0), servo2.write (180); retraso (1000); servo2.write (180), servo1.write (0); retraso (1000); // Hice esto para que el servo no se mueva cuando está a 90. servo2.detach (), servo1.detach (); retraso (25); servo1.write (90), servo2.write (90); retraso (1000); // fin // Debes conectar los servos nuevamente para que se muevan nuevamente. servo2.attach (D0), servo1.attach (D1); retraso (25); // fin de servo1.write (180), servo2.write (0); retraso (1000); servo2.write (180), servo1.write (100); delay (1000);} int testFunction (String args) {return 200; // Esto se comprueba en el controlador de la aplicación web para su validación}  


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...