Hola, compré un servomotor (mg955) y quería probar si funcionaba con arduino, lo conecté todo y hice un sencillo programa y no consigo que funcione, el servomotor solo gira hasta una posición al principio y ya no se mueve más, si ya estaba en esa posición no se mueve y si mientras está el programa en loop lo muevo con la mano, vuelve a girar hasta esa posición y no se vuelve a mover, me da la sensación de que solo gira hacia un lado y luego intenta girar hacia el otro y no puede porque se escucha un tac tac tac tac pero no gira, probé a alimentar el arduino con una fuente externa y es lo mismo. Gracias de antemano.
Probé con diferentes programas hechos por mi y sacados de google, como por ejemplo este
#include <Servo.h>
Servo servo1;
int PINSERVO = 2;
int PULSOMIN = 500;
int PULSOMAX = 2500;
void setup(){
servo1.attach(PINSERVO, PULSOMIN, PULSOMAX);
}
void loop(){
servo1.write(0);
delay(2000);
servo1.write(180);
delay(5000);
}
Hola, he probado a alimentar el servo con un cargador de 5v y 1000mAh y me ocurre lo mismo, gira una vez bien hasta llegar a su posición y luego solo hace el ruido.
Acabo de probar y nada, hace el primer giro bien y ya no se mueve más, además se nota que intenta moverse porque hace el ruido durante un segundo y después para el tiempo del delay y vuelve a hacer el ruido y así seguido, y no es problema de la alimentación además el primer giro lo hace bien con fuerza.
Por lo que vi, este servo es de giro continuo 360º, pero probé con programas también para servos 360º (que los grados que pones es la velocidad a la que gira el servo) y es lo mismo, haciendo un simple programa que ponga a 90º debería girar continuamente y ocurre lo mismo
#include <Servo.h>
Servo servo1;
int PINSERVO = 2;
int PULSOMIN = 500;
int PULSOMAX = 2500;
void setup(){
servo1.attach(PINSERVO);
}
void loop(){
servo1.write(90);
}
#include <Servo.h>
Servo servo1;
int PINSERVO = 2;
int PULSOMIN = 500;
int PULSOMAX = 2500;
void setup(){
servo1.attach(PINSERVO);
}
void loop(){
servo1.write(0); // debería girar a la derecha a velocidad máxima
delay(2000); // durante 2 segundos
servo1.detach(); // debería parar
delay(1000);
servo1.attach(PINSERVO);
servo1.write(180); // debería girar a la izquierda a velocidad máxima
delay(2000); // durante 2 segundos
servo1.detach(); // debería parar
delay(1000);
servo1.attach(PINSERVO);
}
Por cierto el valor 90 es para detenerlo pero aparentemente es mejor usar detach(), valores entre 0 y 89 giran a derecha, valores entre 91 y 180 giran a izquierda. La velocidad depende de cuan menor o mayor a 90 sea el valor, siendo 0 la máxima velocidad a la derecha y 180 la maxima a izquierda.
Dinos donde has comprado tu servo (me refiero a la página web del sitio) para que te indiquemos uno que no sea de giro continuo asi resuelves el problema
Ese servo deberá quedar para otra tarea que obviamente no es esta.
/*
Talos Electronics
Rafael Lozano Rolón
7/Septiembre/2015
*/
#include <Servo.h> //Libreria para Servomotores
Servo Servo_1;
int Angulo = 0; // Variable que contendra el angulo de giro del servo
void setup() {
Servo_1.attach(3); // Definir el pin (3) que se utilizara para el control del servo
}
void loop() {
for(Angulo= 0;Angulo < 180; Angulo += 1) { //Incrementar de 1 en 1 el angulo que va de 0° hasta 180°
Servo_1.write(Angulo); // Decirle al Servo_1 que se mueva los grados que estan en la variable angulo
delay(15); // Esperar 15 ms para que el servo alcance la posicion
}
delay(500); //Esperar 500 ms
for(Angulo = 180; Angulo>=1; Angulo-=1) { // Decrementar de 1 en 1 el angulo que va de 180° hasta 0°
Servo_1.write(Angulo); // Decirle al Servo_1 que se mueva los grados que estan en la variable angulo
delay(15); // Esperar 15 ms para que el servo alcance la posicion
}
delay(500); //Esperar 500 ms
}
Por lo que estuve viendo hay dos tipos de MG955, uno de giro continuo (360°) y otro de medio giro (180°)
El primer código que pasé (#8) es para probar el primer tipo, el segundo (#15) es para los de medio giro.
@tresvdoble fijate en el link que puse en #8 que lo explica.
Básicamente dice que al frenar con 0 es menos preciso el punto de frenado que con detach().
No miré la librería pero imagino que con 0 desacelera hasta llegar a ese valor, en cambio detach() desconecta en motor del puerto, entonces frena "de golpe" y por eso se transmite el torque al cuerpo del motor.
Supongo...
Probé con los dos, a parte de con otros muchos de google tanto para servos de 180 como 360 y nada, no debe ser problema del código.
No se que será porque con ninguno de los 2 servos iguales nuevos funciona, con ninguno de los dos arduino que tengo, y probé a alimentarlos de diferentes formas.
Compraré otro modelo de servo diferente y espero que con ese otro funcione.
Muchas gracias de todas formas.
te referiras a 90, el servo1.detach(); no esta pensado para frenar sino para desasignar el servo del pin, de echo fijate que despues de cada servo1.detach(); tiene que poner un servo1.attach(PINSERVO); y en el video del enlace que pusiste se ve que con servo1.detach(); el servo sigue girando un instante.
Con servo1.write(90); la detencion es inmediata, y en mi primer video que es con el codigo copiado tal cual cada vez que haces servo1.attach(PINSERVO); el servo inicia un ligero giro en el mismo sentido que el movimiento anterior y a continuacion empieza a girar en el sentido correcto.