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).