Proyecto Brazo Robotico

Proyecto Brazo Robotico 6 servos con BLUETOOTH y con memoria de movimientos

Material en uso:

  • 6 Servo Motores MG995 15K. (5V - 2A Lo que necesita)
  • Chasis de brazo robotico (Acero ligero).
  • Modulo Bluetooth.
  • Aplicación para moverlo desde el celular (hecha por mi).
  • Arduino UNO
  • Placa Shield V5 (para no usar protoboard).
  • Codigo al 90%
  • Cargador Conmutado (5V- 2000ma)

NOTA:
Tengo todo pero hay pequeños errores en los servos....al conectar el brazo robotico, se empieza a mover como LOCO! y hace muchos movimientos raros! pero después de que se controlan ya puedo moverlos con la aplicación..... al moverlo con la app jalan MUY BIEN LA MAYORIA, Pero... solamente uno de todos los servos no se mueve en absoluto como que le cuesta trabajo levantarse (SERVO = HOMBRO Lleva todo el peso del mismo brazo), hace el esfuerzo pero al rato se apaga todo el robot por completo, tengo que volver desconectar y conectar para reiniciar!

NOTA 2: Quisiera que al prender el robot no se pusiera loco al conectarlo y formará una postura adecuada al hora de conectarlo

¿Alguien me puede ayudar? (Soy principiante)
Lo hice todo yo solo hasta que me quedara, pero hasta apenas tome la decision de preguntarles a los expertos que son ustedes, ¿si me falta algo? o si le tengo que poner alguna fuente de alimentación conmutada y no un cargador conmutado.

PD: La otra parte del codigo no la puse, por que esa ya esta al 100% solo tengo problemas con el principio.

CODIGO

#include <Servo.h>

char dato;
Servo hombro, codo, muneca, pinzas, base,torque;
int phombro, pcodo, pmuneca, ppinzas, pbase,ptorque, contador=0;
int iniciohombro[] = {0,0,0,0,0}, finhombro[] = {0,0,0,0,0}, iniciotorque[] = {0,0,0,0,0}, fintorque[] = {0,0,0,0,0}, iniciocodo[] = {0,0,0,0,0}, fincodo[] = {0,0,0,0,0}, iniciomuneca[] = {0,0,0,0,0}, finmuneca[]= {0,0,0,0,0}, iniciopinzas[] = {0,0,0,0,0}, finpinzas[] = {0,0,0,0,0}, iniciobase [] = {0,0,0,0,0}, finbase[] = {0,0,0,0,0};
char ubicacion[25];
int incrementohombro = 0, incrementocodo = 0, incrementomuneca = 0, incrementopinzas = 0, incrementobase = 0,incrementotorque = 0, incremento = 0;
int const retraso = 30;
int posicioninicialbase, posicioninicialhombro, posicioninicialcodo, posicioninicialmuneca, posicioninicialpinzas, posicioninicialtorque;

void setup()
{
  hombro.attach(13);
  codo.attach(12);
  muneca.attach(11);
  pinzas.attach(10);
  base.attach(9);
  torque.attach(8);
  Serial.begin(9600);
}

void loop()
{
  if(contador==0)
  {
    // Leer posicion inicial
    phombro=hombro.read();
    pcodo=codo.read();
    pmuneca=muneca.read();
    ppinzas=pinzas.read();
    pbase=base.read();
    ptorque=torque.read();
    
    //Escribir posicion inicial
    hombro.write(phombro);
    codo.write(pcodo);
    muneca.write(pmuneca);
    pinzas.write(ppinzas);
    base.write(pbase);
    torque.write(ptorque);
    contador++;
  }
  dato='x';
  dato=Serial.read();
  switch(dato)
  {
    case 'B': //HOMBRO DERECHA
    {
       while(Serial.read()!='x')
       {
          if(phombro<=180 && phombro>=0)
          {
            if(phombro!=180)
            {
              phombro++;
            }
            hombro.write(phombro);
            delay(15);
          }
       }
      break;  
    }
    
    case 'b': //HOMBRO IZQUIERDA
    {
       while(Serial.read()!='x')
       {
          
         if(phombro<=180 && phombro>=0)
          {
            if(phombro!=180)
            {
              phombro--;
            }
            hombro.write(phombro);
            delay(15);
          }
      }
      break;  
    }
    case 'C': //CODO ARRIBA
    {
        while(Serial.read()!='x')
        {
          if(pcodo<=180 && pcodo>=0)
          {
            if(pcodo!=180)
            {
              pcodo++;
            }
            codo.write(pcodo);
            delay(15);
          }
        }
      break;   
    }
    case 'c': //CODO ABAJO
    {
       while(Serial.read()!='x')
       {
          if(pcodo<=180 && pcodo>=0)
          {
            if(pcodo!=0)
            {
              pcodo--;
            }  
            codo.write(pcodo);
            delay(15);
          }
       }
      break;   
    }
    case 'D': //MUNECA ARRIBA
    {
      while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            if(pmuneca!=180)
            {
              pmuneca++;
            }
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break;      
    }
    case 'd': //MUNECA ABAJO
    {
       while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            if(pmuneca!=0)
            {
              pmuneca--;
            }
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break; 
    }
    case 'F': //PINZA ABRIR
    {
      while(Serial.read()!='x')
       {
           if(ppinzas<=180 && ppinzas>=0)
          {
            if(ppinzas!=180)
            {
              ppinzas++;
            }
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break; 
    }
    case 'f': //PINZA CERRAR
    {     
       while(Serial.read()!='x')
       {
          if(ppinzas<=180 && ppinzas>=0)
          {
            if(ppinzas!=0)
            {
              ppinzas--;
            }  
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break; 
    }
    case 'A': //BASE IZQUIERDA
    {  
       while(Serial.read()!='x')
       {
           if(pbase<=180 && pbase>=0)
          {
            if(pbase!=180)
            {
              pbase++;
            }
            base.write(pbase);
            delay(15);
          }
       }
      break; 
    }
    case 'a': //BASE DERECHA
    {
       while(Serial.read()!='x')
       {
          if(pbase<=180 && pbase>=0)
          {
            if(pbase!=0)
            {
              pbase--;
            }
            base.write(pbase);
            delay(15);
          }
       }
      break;
      }
    case 'E': //TORQUE IZQUIERDA
    {  
       while(Serial.read()!='x')
       {
           if(ptorque<=180 && ptorque>=0)
          {
            if(ptorque!=180)
            {
            ptorque++;
            torque.write(ptorque);
            delay(15);
          }
       }
      break; 
    }
    case 'e': //TORQUE DERECHA
    {
       while(Serial.read()!='x')
       {
          if(ptorque<=180 && ptorque>=0)
          {
            if(pbase!=0)
            {
          
            ptorque--;
            torque.write(ptorque);
            delay(15);
          }
       }
      break; 
    }

Bueno, tu principal problema es la corriente. Parece que 5V 2A no son suficientes.
Razones:

No load operating current draw 170MA
Stall current draw 1200MA

Consumo 170mA sin carga
Consume hasta 1200mA máximo.

En tu condición, el hombro tal como dices esta a full, asi que si los demas estan solo activos tienes 5x 170 = 850 mA mas 1200 mA estas al límite.

Lo mejor es que uses una fuente de PC que te dará minimo 5V 20A**. Coloca FUSIBILE!!!** y es preferible quemar varios fusibles de digamos 3A, 5A como para tener margen de maniobra.
Si tuvieras 6 servos a 1200 estarías en 7.2A, ese es un cálculo que no hiciste.
Y ese es un análisis de peor caso que debe siempre considerarse.

Mi mejor consejo es que desconectes todo, y pruebes ese servo, el mas solicitado y midas su corriente.
Si mueve todo el brazo robótico todo lo anterior es para llevarlo adelante. Si no lo mueve, es porque tienes mas de 10kgcm
Stall torque: 9.4kg/cm (4.8v); 11kg/cm (6v)
Esto dice para 4.8 y para 6V.