Falta de potencia, Proyecto Brazo robot con nunchuk y por placa ic2 PCA9685

Buenas, llevo unos meses con arduino, empece con un kit de iniciación y ya que una de mis aficiones es el modelismo tenia servos por ahí tirados no he podido resistirme a crearme un brazo robot, la idea es controlarlo con un nunchuk, he terminado de montar e independiente funciona todo genial el problema es cuando conecto mas 4 servos o mas se ve que me quedo sin potencia.
estoy usando una fuente de alimentación atx tuneada al efecto tanto para alimentar por 5v la placa i2c como para alimentar por 12v el arduino uno, la fuente des una atx de 500w en buenas condiciones por lo tanto la falta de potencia no esta ahí,
he leído que la placa i2c esta diseñada en un principio para control del led y que puede ser lo que me este causando el problema pero no acabo de ver claro cual es el limite de amperios en sus especificaciones.
estoy usando 6 servos mg996r. adjunto unas fotos y código para ver si me podéis indicar donde esta el problema.
si es que no se puede hacer con esa placa i2c por favor indicarme cual seria la mejor para usarlo, seria una pena porque la librería adafruit pwm servodriver es una caña

gracias

brazo_y_nunchuck_con_i2c_ambos_y_controlanado_con_boton_c.ino (3.53 KB)

1.- Antes que nada te invito a leer las normas del foro que están por todos lados y edites tu mensaje para poder ver las imágenes.

2.- Tu problema está en que le estás pidiendo al Arduino más corriente de la que puede entregar. Lo puedes alimentar con una fuente de 100A que el no va a entregar más de 200mA a todos tus circuitos conectados a la misma.

Usa una fuente externa, comparte GND con Arduino y que el haga las tareas de control solamente. Las de potencia las debe llevar adelante los drivers y tu fuente externa. Recomendación barata y simple para etapa de desarrollo, una fuente vieja de PC.

Gracias por vuestras respuestas,
he ledio las normas del foro y no veo que hago mal a la hora de subir las fotos, a mi me aparecen correctamente, las proximas las pondre de otra manera.
...
surbyte: efectivamente como indico en el foro uso una fuente externa, una atx convertida.

como ya indico la salida de 5v va a la controladora i2c pca9685 y la de 12v a al arduino uno,


Lo que no entiendo es que a veces funciona bien 10 o 30 segundos y seguidamente se viene como abajo y otras veces directamente no va.

se me olvidaba, pero con 3 servos va siempre bien es a partir del 4 cuando da problemas y normalmente no funciona pero algunas veces si

y este es el codigo

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



#define BAUDRATE 19200 //pongo los baudios para la pantalla

ArduinoNunchuk nunchuk = ArduinoNunchuk(); //creo el objeto nunchuck

Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40); //creo el objeto servos y le asigno la direcion por defecto 0x40 del i2c que comparte con el nunchuck en 0x55 creo

unsigned int pos0=172; // ancho de pulso en cuentas para pocicion 0°
unsigned int pos180=565; // ancho de pulso en cuentas para la pocicion 180°
//estas variables hay que estudiarlas porque no se si coinciden con mis servos

void setup()
{
 Serial.begin(BAUDRATE); //inicio la pantalla serie 
 nunchuk.init();           //inicio el nunchuck

 servos.begin();         //inicio servos
 servos.setPWMFreq(60); //Frecuecia PWM de 60Hz o T=16,66ms //a estudiar tambien
 
}

void setServo(uint8_t n_servo, int angulo) {
 int duty;
 duty=map(angulo,0,180,pos0, pos180);
 servos.setPWM(n_servo, 0, duty);  
}


void loop()
{
 nunchuk.update();  //leo posicion real del nunchuck

  if (nunchuk.cButton==1 && nunchuk.zButton==0){
       setServo(0,map(nunchuk.analogX, 33, 233, 0, 90));
       setServo(1,map(nunchuk.analogY, 27, 215, 0, 180));}
  if (nunchuk.cButton==0 && nunchuk.zButton==1){
       setServo(2,map(nunchuk.analogX, 33, 233, 0, 180));
       setServo(3,map(nunchuk.analogY, 27, 215, 0, 180));}
  if (nunchuk.cButton==1 && nunchuk.zButton==1){
       setServo(4,map(nunchuk.analogX, 33, 233, 0, 180));
       setServo(5,map(nunchuk.analogY, 27, 215, 30, 180));}
  if (nunchuk.cButton==0 && nunchuk.zButton==0){
       setServo(0,90);
       setServo(1,90);
       setServo(2,90);
       setServo(3,90);
       setServo(4,90);
       setServo(5,90);}
 }

Se ve que no lees o interprestas debidamente las normas del foro, a cada post nuevo algo haces mal.
Edita el post anterior con el código usando tags, por favor!

Estas con una fuente ATX de modo que no podemos pensar en que sea un problema de falta de corriente.

Has revisado el BUS I2C? Veo muchas cosas ahi, y puedes llegar a tener algun problema.
O sea.. 3 servos van bien y el agregado del 4to tira todo abajo.
Ese 4 es indistinto o es uno en particular?
Puedes hacer un esquema a mano alzada y luego le tomas una foto y la subes y muestras como te hemos venido pidiendo. Es para poder entender bien tu problema y sugerirte algo coherente.

fragers:
Gracias por vuestras respuestas,
he ledio las normas del foro y no veo que hago mal a la hora de subir las fotos, a mi me aparecen correctamente, las proximas las pondre de otra manera.

El punto es que no puedes obligar a nadie, por mejor buena voluntad que tenga, a bajar algo a su disco rígido simplemente para verlo un rato y darte una ayuda.

Esta forma que usas ahora está mejor presentada.

Cuando yo dije que no se veían tus imágenes, fue porque no se veían en el foro de un solo vistazo, vi que habían imágenes adjuntas, pero esa no es la manera de presentarlas.

Perdon voy aprendiendo sobre la marcha.
este seria el esquema

el cableado en el bus i2c solo lo comparte con el nunchuk la placa pca :esta por defecto en el 0x40 y el nunchuck en el 0x55

Bien, mucho mejor ahora la comprensión del proyecto y del problema.
Ahora que veo todo.. te pediré unos links de las placas que estas usando para poder ver datos técnicos del I2C.

Entoces al conectar el 4to servo se queda sin potencia.
Donde estan conectados los servos? No veo eso en tu esquema o no lo entiendo. Ahora si.. al esquema de la izquierda y has dibujado uno conectado.
Esta es la placa.. acabo de releer tus primeros post y estaba escondida entre dos fotos la info

Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface - PCA9685

Ya lo analizo y te doy alguna idea.

La hoja de datos del PCA9685 dice

Each LED output can be off or on (no PWM control), or set at its individual PWM controller value. The LED output driver is programmed to be either open-drain with a 25 mA current sink capability at 5 V or totem pole with a 25 mA sink, 10 mA source capability at 5 V.

Asi que te recomiendo potenciar esas salidas usando algun mosfet por ejemplo

Sin embargo aca dice que puedes hacerlo
Adafruit 16-Channel Servo Driver with Arduino

Lee esta página recomdada por Adafruit y verifica conexionados

Gracias por tu respuesta,
leyendo el enlace que me has pasado hay algo que se me habia pasado por alto

Adding a Capacitor to the thru-hole capacitor slot
We have a spot on the PCB for soldering in an electrolytic capacitor. Based on your usage, you may
or may not need a capacitor. If you are driving a lot of servos from a power supply that dips a lot
when the servos move,
n * 100uF
where
n
is the number of servos is a good place to start - eg
470uF
or more for 5 servos. Since its so dependent on servo current draw, the torque on each
motor, and what power supply, there is no "one magic capacitor value" we can suggest which is why
we don't include a capacitor in the kit.

mi ingles es muy mediocre pero entiendo que que si necesito mucha potencia deberia añadir un condensador, ¿imagino que uno para cada servo? ¿como irian conectados?, podria ser esto, me he dado cuenta que sin duda es problema de potencia, porque incluso cuando solo uso 3 servos que funciona bien si fuerzo uno de ellos algo mas de la cuenta ya se viene todo abajo.

Buen detalle has visto asi que la página sirvió.
N x100 uF o sea 470uF que es el valor mas próximo para 5 servos y
para 6 será 680uF (valor mas proximo).
Es un electrolítico asi que + (positivo) con pin positivo y negativo con GND.
Debes comprarlo con un valor de tensión que supere al de la tensión de los servos. Tu sabras cual es.

NOTA: 3er pedido que te hago. No editas aún el post con tu código. Ve y hazlo. Vas al post#3 luego abajo a la derecha dice More, luego Modify (ya estas en edicion), luego selecciona todo el código y click en el ícono </> arriba del emoticon. Es muy facil.

Ya edité su código mal pegado porque veo que usted no lo supo hacer según las normas del foro.

Gracias Hector_A, no sabia como hacerlo, estoy viendo como va, la proxima vez me saldra bien.
Un Saludo.

No sabías como hacerlo? Y esto que es?

NOTA: 3er pedido que te hago. No editas aún el post con tu código. Ve y hazlo. Vas al post#3 luego abajo a la derecha dice More, luego Modify (ya estas en edicion), luego selecciona todo el código y click en el ícono </> arriba del emoticon. Es muy facil.

Uno invierte tiempo en tu proyecto y tu no puedes tomarte 2 min para cumplir con lo que se te pide.
Sin palabras.

que te digo, estaba en ello, he visto tu correo e iba a hacerlo, no sale lo mismo cuando le as una respuesta rapida, pero vamos que ya he visto que cuando le das al preview si se puede, pero habia adelantado hector y ya lo ha arreglado,
si te sirve de consuelo ya se hacerlo

me gustaria poder estas mas horas delante el ordenador y verlo hecho mas rapido. De todos modos os lo agradezco porque asi sigo aprendiendo.