Problema con PCA9685

Buenos días

Intento mover 12 servomotores desde un solo Arduino.
Para esto conseguí el módulo PCA9685

Estoy siguiendo este tutorial y realicé esta conexión en primer lugar:

Controlando un motor no hay ningún inconveniente y si conecto dos o tres motores no hay problema tampoco

El problema radica cuando intento hacer más conexiones de esta forma:

Al realizar la conexión de 4 o más motores siempre sucede lo mismo: al comienzo los motores se mueven correctamente (ya sea uno a uno o por ejemplo 4 motores al tiempo) pero después de un tiempo se evidencia que los motores pierden “fuerza” y en lugar de hacer un recorrido completo, por ejemplo de los 180°, hace solo un pequeño barrido para finalmente quedarse detenido y no vuelve a funcionar con ninguna otra orden, hasta desconectar el circuito del Arduino y de la fuente de alimentación

El circuito de alimentación que estoy usando es el siguiente (con un L7805CV):

El Vin lo estoy sacando de una batería como esta:

  • 12 V
  • 1.2 Ah

L7805CV
datasheet

Servo Motor Futaba S3003
datasheet

Quisiera saber si me pueden ayudar con este inconveniente ya que no entiendo qué puede estar sucediendo

Anexo los códigos con los que he probado el PCA:

Ejemplo de la librería de Adafruit

/*************************************************** 
  This is an example for our Adafruit 16-channel PWM & Servo driver
  Servo test - this will drive 16 servos, one after the other

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate, 2 pins are required to  
  interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary, you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period"); 
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit"); 
  pulse *= 1000;
  pulse /= pulselength;
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void loop() {
  // Drive each servo one at a time
  Serial.println(servonum);
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
    pwm.setPWM(servonum, 0, pulselen);
  }
  delay(500);
  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    pwm.setPWM(servonum, 0, pulselen);
  }
  delay(500);

  servonum ++;
  if (servonum > 15) servonum = 0;
}

Código propio manejado con un HC-05

#include <SoftwareSerial.h>
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

SoftwareSerial BT(10, 11); //10 RX, 11 TX.
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVO0  140
#define SERVO180  600
#define SERVO90  370

const int led =  13;
int estadoo = LOW;
int estado = LOW;
int num = 0;

void setup()
{
  BT.begin(9600);
  pwm.begin();
  pwm.setPWMFreq(60);
  pinMode(led, OUTPUT);
}

void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  pulselength = 1000000;
  pulselength /= 60;
  pulselength /= 4096;
  pulse *= 1000;
  pulse /= pulselength;
  pwm.setPWM(n, 0, pulse);
}

void loop()
{
  while (BT.available() > 0)
  {
    int pos = BT.parseInt();
    if (pos == 0)
    {
      estadoo = digitalRead(led);
      if (estadoo == LOW)
      {
        estado = HIGH;
      }
      else
        estado = LOW;
      digitalWrite(led, estado);
    }
    if (pos == 1)
    {
      pwm.setPWM(0, 0, SERVO0);
    }
    if (pos == 2)
    {
      pwm.setPWM(0, 0, SERVO90);
    }
    if (pos == 3)
    {
      pwm.setPWM(0, 0, SERVO180);
    }
    if (pos == 4)
    {
      pwm.setPWM(1, 0, SERVO0);
    }
    if (pos == 5)
    {
      pwm.setPWM(1, 0, SERVO90);
    }
    if (pos == 6)
    {
      pwm.setPWM(1, 0, SERVO180);
    }
    if (pos == 7)
    {
      pwm.setPWM(2, 0, SERVO0);
    }
    if (pos == 8)
    {
      pwm.setPWM(2, 0, SERVO90);
    }
    if (pos == 9)
    {
      pwm.setPWM(2, 0, SERVO180);
    }
    if (pos == 10)
    {
      pwm.setPWM(3, 0, SERVO0);
    }
    if (pos == 11)
    {
      pwm.setPWM(3, 0, SERVO90);
    }
    if (pos == 12)
    {
      pwm.setPWM(3, 0, SERVO180);
    }    
    if (pos == 100)
    {
      for(num=0;num<4;num++)
      {
        pwm.setPWM(num, 0, SERVO0);
      }
    } 
    if (pos == 101)
    {
      for(num=0;num<4;num++)
      {
        pwm.setPWM(num, 0, SERVO90);
      }
    }
    if (pos == 110)
    {
      for(num=0;num<4;num++)
      {
        pwm.setPWM(num, 0, SERVO180);
      }
    } 
  }
}

Para saber, hay que medir. Lo demás son palos de ciego. Los servos consumen mucha corriente. El L7805CV solo puede dar 1,5A y eso en las mejores condiciones de refrigeración. Repito, hay que medir. Usa el multímetro y mide los amperios que consume uno o dos servos y luego multiplica. O mide el voltaje a la salida del L7805CV y verás caídas de tensión incompatibles con un funcionamiento estable.

mas que el 7805 yo pensaría en el PCA9685, que tiene una capacidad de 25 mA por salida, y en total 400 mA en todas las salidas, por eso va bien con algunos, por que aun que pases los 25mA por motor no llegas a los 400mA en total, pero cuando ya conectas varios pues pasas fácilmente de los 400mA

Para el control de esta cantidad de servomotores qué recomiendan utilizar ???

No pone cuanto consumen, conecta uno y mide el consumo com la carga máxima (o bloqueando el movimiento del servo en una posición y enviándole señal para moverlo a otra. Con eso te podremos decir que driver usar

Primero que todo, muchas gracias a todos por sus comentarios

Antes que nada, y para evitar cualquier duda, dejo el circuito que tengo armado:

|500x244

Para hacer una aclaración de lo que mostraré a continuación, en el PCA hay dos conexiones: una bornera que llamaré "+" y un pin que llamaré "V+"

Descripción del tutorial:

The VCC pin is just power of the chip itself. If you want to connect servos or LEDs that use the V+ pin, you MUST connect the V+pin as well. The V+ pin can be as high as 6V even if VCC is 3.3V (the chip is 5V safe). We suggest connecting power through the blue terminal block since it is polarity protected.

Y una traducción burda pero entendible:

El pin VCC es sólo el poder del propio chip. Si desea conectar servos o LED que utilizan el pin V +, debe conectar el V + pin también. El pasador de V + puede ser tan alta como 6V incluso si VCC es de 3,3 V (el chip es de 5V seguro). Se aconseja conectar la energía a través del bloque de terminales azul ya que está protegida polaridad.

Ahora bien, en este primer video se aprecia cómo es el movimiento del servo conectando el pin + (la bornera) a los 5V

Movimiento +

Y aquí el movimiento conectando el pin V+ (pin a los costados del PCA)

Movimiento V+

Como se puede apreciar, con el pin + el servo tiene un mayor recorrido que con el pin V+ y realmente no entiendo por qué

Dejo los siguientes videos con Voltajes y Corrientes en cada una de las conexiones

Voltaje +

Voltaje V+

Corriente +

Corriente V+

Encuentro que la corriente máxima que puede tener el servo es de 0.22 A cuando está bloqueado.

Haciendo unos breves cálculos sería:

Con esto supongo que el problema es por la corriente que alimenta la totalidad de los servos

Podrían ayudarme para solucionar este inconveniente ???

Podrían ayudarme para solucionar este inconveniente ???

No se por qué nadie ha respondido en este tiempo. Creo que el problema tiene dos faciles soluciones: 1- Pon un regulador 7805 por cada pocos servos. Alimentandolos directamente al regulador en lugar de a traves de la placa, pero compartiendo masas. 2-Consigue una fuente de 5V con suficientes amperios y alimentalo todo con esa fuente.

Suerte.

No uses un 7805.
Necesitas 3A minimo. Busca una fuente de Switching 3A Tal vez una Step Down que alimentes con 9 a 12V .
Puedes usar una fuente de PC vieja y su salida 5V es como de 20A minimo.