Estoy haciendo un brazo Robótico controlado a través de una app del móvil con el HC05, los servomotores pequeños SG90 funcionan bien pero los SG996R se ponen a girar sin ningún tipo de control, y cuando intento controlar el movimiento con el móvil se ponen a girar más rápido o más lento o cambian de dirección.
Todos los servomotores van conectados a los 5 voltios y a la tierra de Arduino, si alguien me puede ayudar ![]()
Si los servomotores SG996R giran sin ningún tipo de control, es posible que el problema tenga que ver con la falta de potencia. Los servomotores SG996R consumen más corriente que los SG90, y es posible que la alimentación a través de los 5 voltios de Arduino no sea suficiente para alimentarlos adecuadamente. Una solución posible es alimentar los servomotores a través de una fuente de alimentación externa que pueda proporcionar la cantidad de corriente necesaria.
Además de esto, es importante asegurarse de que estás utilizando las bibliotecas de servo adecuadas para controlar los servomotores y de que estás configurando la señal PWM correctamente. Es posible que esté enviando una señal incorrecta que está provocando que los servomotores se muevan de manera impredecible.
También es importante asegurarse de que los pines utilizados para controlar los servomotores no estén siendo utilizados por otras funciones o dispositivos y que se esté utilizando la frecuencia PWM adecuada para los servomotores que estás utilizando.
En resumen, asegúrate de que estás suministrando suficiente potencia a los servomotores, utiliza las bibliotecas de servo adecuadas y configura la señal PWM correctamente para controlarlos.
Olvídate, cada 996 consume desde 500 hasta 900 mA en movimiento (y hasta 2A si se frena), no puedes alimentarlos desde el arduino.
Si o sí debes usar una fuente externa (recuerda unir la masa con la del arduino).
El módulo bluetooth lo he conectado a los 5 voltios del Arduino y los servomotores SG90 y SG996R a una fuente de alimentación externa, he utilizado un cargador de móvil con salida a 5 voltios pero sigue pasando lo mismo los SG90 bien pero los otros a su rollo (he conectado el gnd de la fuente externa y la de Arduino)
¿Cuantos amperios entrega el cargador?
Para mi tu problema es la corriente.
Prueba con un solo motor a ver como responde.
1,55 Amperios y en el datasheet del servo pone que su rango de voltaje es de 4 a 7 y de amperaje de 0,5 a 0,9 amperios para controlarlo, eso sin cargar ningún objeto pesado, no entiendo que hay mal...
No se si el problema es de amperaje, pero en el datasheet pone entre 0,5 a 0,9 a 6V, imagino que a 5V el consumo será mayor, deberías comprobar que el cargador sigue dando 5V cuando los servos se activan y también medir que consumo real te están haciendo los servos.
Creo que tiene que ver con el código de arduino, es copiado, pero entiendo algunas cosas sueltas, creo que el problema está en la calibración de los servomotores MG996R en la parte de:
servo1.attach(5,510,1200);
El código del chaval que lo hizo pone que esos son los valores max y min (510 y 1200, el 5 es el pin al que va conectado al arduino), esos valores tienen que ver con el ancho del pulso no?, también he probado con:
servo1.attach(5, 500, 2400);** // MG996R base
Pero nada no funciona.
En la app lo que tengo es una barra que la puedo mover a la izquierda o a la derecha y controlar así el ángulo de giro, solo funciona cuando pongo la barra en el medio para pedirle que se quede quieto, si muevo a la izquierda o a la derecha se pone a girar 360 grados todo el rato sin parar
No se que valores máx y mín tengo que coger para que cuando mueva la barra a la izquierda me gire en función de cuanto he movido la barra, y lo mismo a la derecha
Aquí está el código:
#include <Servo.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(3, 4); // RX, TX
Servo servo1; //BASE
Servo servo2; //HOMBRO1
Servo servo3; //HOMBRO2 no se usa en este proyecto, la idea principal era usar 2 servos para HOMBRO
Servo servo4; //CODO1
Servo servo5; //CODO2
Servo servo6; //MUÑECA
Servo servo7; //GRIPPER
//10rapido 15medio 20lento
int s1Vel = 15; //BASE
int s2Vel = 25; //HOMBRO
int s4Vel = 20; //CODO1
int s5Vel = 20; //CODO2
int s6Vel = 15; //MUÑECA
int s7Vel = 10; //GRIPPER
int index=0;
int velG=25;
int s1Act,s2Act,s3Act,s4Act,s5Act,s6Act,s7Act; //posicion actual de los servos
int s1Ant,s2Ant,s3Ant,s4Ant,s5Ant,s6Ant,s7Ant; //posicion anterior de los servos
int s1[50],s2[50],s3[50],s4[50],s5[50],s6[50],s7[50]; //matrices para almacenas las posiciones de cada servo
String bt,btS;
void setup(){
Serial.begin(115200);
Bluetooth.begin(9600);
Bluetooth.setTimeout(10);
servo1.attach(5,510,1200); //ancho min y max exclusivo para MG996R base
servo2.attach(11,650,1400); //ancho min y max exclusivo para MG946R hombro1
servo3.attach(6,650,1400); //ancho min y max exclusivo para MG946R hombro2
servo4.attach(7,650,1400); //ancho min y max exclusivo para MG946R codo1
servo5.attach(8,650,1400); //ancho min y max exclusivo para MG995 codo2
servo6.attach(9,800,1290); //ancho min y max exclusivo para MG995 muneca
servo7.attach(10,700,1290); //10 700 1290 ancho min y max exclusivo para MG995 gripper
s1Ant=90; //BASE
servo1.write(s1Ant);
//Importante empezar s2 y s3 complementados a 180°;es decir; s2+s3=180;
s2Ant=100; //HOMBRO1
s3Ant=80; //HOMBRO2
servo2.write(s2Ant);
servo3.write(s3Ant);
s4Ant=115; //CODO1
servo4.write(s4Ant);
s5Ant=60; //CODO2
servo5.write(s5Ant);
s6Ant=90; //MUÑECA
servo6.write(s6Ant);
s7Ant=60; //GRIPPER
servo7.write(s7Ant);
delay(50);
}
void loop() {
if(Bluetooth.available()>0){
bt = Bluetooth.readString(); // leemos cadena
//////////////////////////// SERVO 1 - BASE /////////////////////////////////////////////////////////////////////////////////
if(bt.startsWith("s1")){ // comprueba si la cadena comienza con "s1"
btS = bt.substring(2,bt.length()); // extraigo los caracteres desde la poisicion 2 en adelante ejem:"s1120" a "120"
s1Act = btS.toInt(); //convierto de string a entero
//MUEVO EL SERVOMOTOR CON UN BARRIDO
if(s1Ant > s1Act){
for(int j=s1Ant; j>=s1Act; j--){
servo1.write(j);
delay(s1Vel);}}
else{
for(int j=s1Ant; j<=s1Act; j++){
servo1.write(j);
delay(s1Vel);}}
s1Ant = s1Act;} //el angulo movido(s1Act) se convierte en la posicion anterior
//////////////////////////// SERVO 2 y 3 - HOMBRO 1 y 2 /////////////////////////////////////////////////////////////////////////////////
if(bt.startsWith("s2")){
btS = bt.substring(2,bt.length());
s2Act = btS.toInt();
Serial.println(s2Act);
if(s2Ant > s2Act){
for(int j=s2Ant; j>=s2Act; j--){
servo2.write(j);
servo3.write(180-j);
delay(s2Vel);}}
else{
for(int j=s2Ant; j<=s2Act; j++){
servo2.write(j);
servo3.write(180-j);
delay(s2Vel);}}
s2Ant = s2Act;}
//////////////////////////// SERVO 4 - CODO1 /////////////////////////////////////////////////////////////////////////////////
if(bt.startsWith("s4")){
btS = bt.substring(2,bt.length());
s4Act = btS.toInt();
if(s4Ant > s4Act){
for(int j=s4Ant; j>=s4Act; j--){
servo4.write(j);
delay(s4Vel);}}
else{
for(int j=s4Ant; j<=s4Act; j++){
servo4.write(j);
delay(s4Vel);}}
s4Ant = s4Act;}
//////////////////////////// SERVO 5 - CODO2 /////////////////////////////////////////////////////////////////////////////////
if(bt.startsWith("s5")){
btS = bt.substring(2,bt.length());
s5Act = btS.toInt();
if(s5Ant > s5Act){
for(int j=s5Ant; j>=s5Act; j--){
servo5.write(j);
delay(s5Vel);}}
else{
for(int j=s5Ant; j<=s5Act; j++){
servo5.write(j);
delay(s5Vel);}}
s5Ant = s5Act;}
//////////////////////////// SERVO 6 - MUÑECA /////////////////////////////////////////////////////////////////////////////////
if(bt.startsWith("s6")){
btS = bt.substring(2,bt.length());
s6Act = btS.toInt();
Serial.println(s6Act);
if(s6Ant > s6Act){
for(int j=s6Ant; j>=s6Act; j--){
servo6.write(j);
delay(s6Vel);}}
else{
for(int j=s6Ant; j<=s6Act; j++){
servo6.write(j);
delay(s6Vel);}}
s6Ant = s6Act;}
//////////////////////////// SERVO 7 - GRIPPER /////////////////////////////////////////////////////////////////////////////////
if(bt.startsWith("s7")){
btS = bt.substring(2,bt.length());
s7Act = btS.toInt();
if(s7Ant > s7Act){
for(int j=s7Ant; j>=s7Act; j--){
servo7.write(j);
delay(s7Vel);}}
else{
for(int j=s7Ant; j<=s7Act; j++){
servo7.write(j);
delay(s7Vel);}}
s7Ant = s7Act;}
//////////////////////////// SAVE //////////////////////////////////////////////////
if(bt.startsWith("SAVE")){
s1[index]= s1Ant;
s2[index]= s2Ant;
s4[index]= s4Ant;
s5[index]= s5Ant;
s6[index]= s6Ant;
s7[index]= s7Ant;
index++;}
///////////////////////// RESET ///////////////////////////////////////////////////
if(bt.startsWith("RESET")){
//memset se utiliza para rellenar un bloque de memoria con un valor determinado
//memeset("matriz","dato a rellenar","tamaño de la matriz")
memset(s1,0,sizeof(s1)); //rellena con el valor de "0" todas las posiciones de la matriz
memset(s2,0,sizeof(s2));
memset(s4,0,sizeof(s4));
memset(s5,0,sizeof(s5));
memset(s6,0,sizeof(s6));
memset(s7,0,sizeof(s7));
index=0;}
//////////////////////////// RUN ////////////////////////////////////////////////////
if(bt.startsWith("RUN")){
//Ejecuta los pasos una y otra vez hasta que se pulse el botón "RESET" o espera hasta que se vuelva a pulsar "RESET"
while(bt.startsWith("RESET") != true){//MIENTRAS NO SE PRESIONE 'RESET' SE MANTIENE EN EL BUCLE y SOLO FUNCIONA BOTON "PAUSE"
for(int i=0; i<= index-2;i++){
if(Bluetooth.available()>0){
bt = Bluetooth.readString();
if(bt.startsWith("PAUSE") == true){
//Ejecuta los pasos una y otra vez hasta que se pulse el botón "RUN" o espera hasta que se vuelva a pulsar "RUN"
while(bt.startsWith("RUN") != true){//MIENTRAS NO SE PRESIONE 'RUN' SE MANTIENE EN EL BUCLE Y SOLO FUNCIONA BOTON "RESET"
if(Bluetooth.available()>0){
bt = Bluetooth.readString();
if(bt.startsWith("RESET") == true){
break;}
}
}
}//end if(PAUSE)
if(bt.startsWith("ss")){
btS = bt.substring(2,bt.length());
velG = btS.toInt();}
}//end 1er Bluetooth.available
//////// SERVO 1 ////////////////////////
if(s1[i] == s1[i+1]){}
if(s1[i] > s1[i+1]){
for(int j = s1[i]; j >= s1[i+1];j--){
servo1.write(j);
delay(velG);}}
if(s1[i] < s1[i+1]){
for(int j = s1[i]; j <= s1[i+1];j++){
servo1.write(j);
delay(velG);}}
//////// SERVO 2 y 3 /////////////////////
if(s2[i] == s2[i+1]){}
if(s2[i] > s2[i+1]){
for(int j = s2[i]; j >= s2[i+1];j--){
servo2.write(j);
servo3.write(180-j);
delay(velG);}}
if(s2[i] < s2[i+1]){
for(int j = s2[i]; j <= s2[i+1];j++){
servo2.write(j);
servo3.write(180-j);
delay(velG);}}
//////// SERVO 4 ////////////////////////
if(s4[i] == s4[i+1]){}
if(s4[i] > s4[i+1]){
for(int j = s4[i]; j >= s4[i+1];j--){
servo4.write(j);
delay(velG);}}
if(s4[i] < s4[i+1]){
for(int j = s4[i]; j <= s4[i+1];j++){
servo4.write(j);
delay(velG);}}
//////// SERVO 5 ////////////////////////
if(s5[i] == s5[i+1]){}
if(s5[i] > s5[i+1]){
for(int j = s5[i]; j >= s5[i+1];j--){
servo5.write(j);
delay(velG);}}
if(s5[i] < s5[i+1]){
for(int j = s5[i]; j <= s5[i+1];j++){
servo5.write(j);
delay(velG);}}
//////// SERVO 6 ////////////////////////
if(s6[i] == s6[i+1]){}
if(s6[i] > s6[i+1]){
for(int j = s6[i]; j >= s6[i+1];j--){
servo6.write(j);
delay(velG);}}
if(s6[i] < s6[i+1]){
for(int j = s6[i]; j <= s6[i+1];j++){
servo6.write(j);
delay(velG);}}
//////// SERVO 7 ////////////////////////
if(s7[i] == s7[i+1]){}
if(s7[i] > s7[i+1]){
for(int j = s7[i]; j >= s7[i+1];j--){
servo7.write(j);
delay(velG);}}
if(s7[i] < s7[i+1]){
for(int j = s7[i]; j <= s7[i+1];j++){
servo7.write(j);
delay(velG);}}
}// end FOR INDEX
}//end 1er WHILE "RESET"
}
}//if(Bluetooth.available()>0){
}//end void loop
Nota: Editado por moderador luego de 9dias sin hacerlo
¿ No serán servos de 360º ?. Pon un link exacto al producto que compraste. O Compruébalo:
- ¿Al mover a izquierda o derecha cambia el sentido de giro o la velocidad ?.
- Con el mismo código, coloca un sg90 en el pin destinado a un MG996R
a ver que hace el sg90.
Este es el enlace de compra de los servos:
https://a.aliexpress.com/_EzEXfJl
En respuesta a tus preguntas, si, cambia el sentido de giro y la velocidad, y si lo cambio por un sg90 si que hace lo que yo quiero.
Puede ser eso el fallo no? que los servos sean de 360º
¿Qué tendría que haberlos comprado de 180º?
Gracias y un saludo!
Son servos de 360º y te estan funcionando como deben. Tienes que comprar unos de 180º como dices.
Saludos.
Si, en los servos 360° se controla sentido de giro y velocidad, no se puede controlar la posición.
Definitivamente debes cambiar los servos por los de 180°.
Edito: Me "pisé" con el amigo @gonpezzi ![]()
Moderador:
Por favor, lee las Normas del foro y edita tu post #8 código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en (<CODE/>)
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.

