Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?
03/04/2015 #1

Avatar de superdog13

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

Código:
/*************************************************** 
 *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

Código:
#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);
 * * *}
 * *} 
 *}
}
05/04/2015 #2


Me parece que ese controlador no esta orientado para cargas inductivas
05/04/2015 #3

Avatar de pandacba

Esa placa es para el manejo de leds, no para cargas inductivas, la podes dañar busca la hoja de datos
05/04/2015 #4

Avatar de superdog13

Es verdad lo que dicen del datasheet, solo se menciona para el control de LEDs

Pero en el tutorial que puse en el primer comentario y en todas las referencias a proyectos con varios servomotores y un arduino hacen referencia a este módulo, por esa razón lo compré

Para el control de esta cantidad de servomotores qué recomiendan utilizar ???
06/04/2015 #5


Hola, el echo que no tenga experiencia con el modulo PCA9685 en particular, no quiere decir que no pueda ayudar a poner algunos conceptos en orden.

Primero que nada, los servomotores futaba y compatibles se les controla por medio del pin SIGNAL que esta basado en una frecuencia (PWM), pero eso no quiere decir que la señal sea una carga significativa para quien lo controla, en este caso el modulo PCA9685 o algun microcontrolador; eso discrimina por completo el hecho de ser una carga inductiva, puesto que esa carga (Del MOTOR) la lleva el controlador embebido dentro del propio servomotor y no quien pretende controlarlo.

Yo considero que el problema que enfrenta el compañero es una insuficiencia de corriente al modulo PCA9685 y es el razon por lo que este aparentemente falla, y pierde sincronía con el arduino provocando todo este cuadro que nos comparte.

No se si el compañero super dog contara con una fuente de 5 volts con buena corriente o en su defecto una fuente de PC y de ahí alimente al modulo para hacer sus pruebas y confirme esto que comento y si fuera el caso re diseñe su fuente de poder.

Así que en conclusión, para la fuente de poder si le afecta la carga de los motores en conjunto, pero las señales PWM del modulo no se ven afectadas por que la carga en el pin SIGNAL de los servomotores ya no significan una carga para el modulo.

Saludos
06/04/2015 #6

Avatar de pandacba

Otro problema asociado al control de motores con arduino o con cualquier microcontrolador es quere alimentar la carga con la misma fuente del dispositivo controlador, por ser una carda inductiva en la linea de alimentación cada vez que se apaga de golpe incluso al encender hay pulsos de varias veces la tensión de alimentación.
Nunca debe alimentarse de ese modo ya que esos picos y ruido muchas veces resetean los micros
El control (arduino , pingüino, pic, avr, s9,8051 o el micro que sea )debe tener una fuente independiente de lo que controla...........
07/04/2015 #7

Avatar de J2C

.



Recomiendo que se lea nuevamente y con detenimiento en la página 8 (ocho) los siguientes párrafos:

1-) Adding a Capacitor to the thru-hole capacitor slot

2-) Power for the Servos/LEDs


Personalmente siempre le hago caso a una frase que hace mas de 30 años solían traer escrita en alguna de sus primeras páginas los manuales de Instrumentos de Medida HP, W&G, etc.:


Before Operation, READ the Manual !!!


Es algo que quienes intentamos realizar diseños deberíamos utilizar constantemente leyendo las Datasheet's de los elementos que usamos.




Saludos, JuanKa.-
P.D.: Por otro lado no olvidemos nunca de poner en movimiento las neuronas del pensamiento antes de poner los dedos sobre el teclado .-
19/04/2015 #8

Avatar de superdog13

Primero que todo, muchas gracias a todos por sus comentarios

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



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 ???
19/04/2015 #9

Avatar de J2C

Superdog13

Para aclarar mejor el esquema que utilizas:

a-) el Arduino desde donde lo alimentas ??.

b-) Usas el L7805C (original de ST) ó el LM7805 (standard de cualquiera) ó el LM323 ??.
esto lo pregunto por que según las datasheet's tienen las siguientes limitaciones de corriente:
L7805C ~ I < 1.5A
LM7805 ~ I < 1.0A
LM323 ~ I < 3.0A

c-) Usas con fuente de energía una batería de 1.2A y pretendes usar mucha mas corriente que la provee ella misma !!!.



Por otra parte en mi post #7 te pedí que leyeras la pagina 8 del Tutorial de Adafruit por que te indica que coloques un capacitor sobre dicha placa dependiendo de la cantidad de servos que uses en tu circuito final a razón de 100 µF por servo !!!.

En esa misma página recomienda NO usar la alimentación del Arduino Uno para alimentar los servos por varios motivos, entre ellos: Ruidos Eléctricos y Brownout's debido al alto consumo de corriente de los servos.

Y también recomienda unas buenas opciones de Fuentes para alimentarla.




Finalmente mi recomendación es mejorar totalmente la Fuente de Energía que usas. Si piensas conectar hasta 12 Servos seria buena medida usar una fuente de 5V - 4A regulada.

A modo rápido podrías pensar en usar una fuente de alimentación de PC de escritorio que entregan mas de 5 A sobre los 5V y también te entrega +12V para que alimentes el Arduino Uno directamente desde esa tensión con el conector negro !!!.

Son fuentes que se consiguen de PC's de Escritorio viejas que se dejan de usar.




Saludos, JuanKa.-
19/04/2015 #10

Avatar de superdog13

J2C, primero gracias por las respuestas anteriores y esta.

Estoy alimentando el Arduino desde un PC por conexión USB. Esto digamos a modo de prueba ya que como el código se está cambiando constantemente es más fáciles programar y probar así.

Bueno, el componente físico que estoy usando dice literalmente "L7805CV"

Lo de la batería pues
En este momento la tengo para pruebas, según los cálculos de mi anterior post da para un soporte de 5 servomotores, pero las pruebas las estoy realizando en este momento solamente con 4 y aún así falla

Lo del capacitor lo había leído desde el comienzo, pero no le había prestado atención antes.
Al leer el comentario lo volví a revisar y haciendo pruebas con dos de 47uF mientras puedo conseguir los acordes a los diferentes servos

Lo que me sigue causando dudas es lo que muestro en los videos, con las conexiones "+" y "V+" ya que no se comporta exactamente igual

Decir que al PCA sólo lo conecto al arduino en cuatro cables: Vcc, Gnd, SCL y SDA (tal cual como dice el código de ejemplo y el tutorial)

Ahora bien, como antes no había usado una placa de estas (no movía más de 2 o 3 servomotores) no estaba seguro si la falla era la parte de "potencia" o podía ser algo directamente en la placa

Cómo podría hacer para que este "robot" fuera autónomo en la parte de energía, es decir que no necesite estar conectado a la pared para nada ???
La batería podría suplir esto para unos usos básicos, pero ya para los 12 servomotores qué podría hacer ???
20/04/2015 #11

Avatar de J2C

Superdog13

Como decia nuestro amigo Jack: "Vamos por partes"!!!.



superdog13 dijo: Ver Mensaje
..... Estoy alimentando el Arduino desde un PC por conexión USB. Esto digamos a modo de prueba ya que como el código se está cambiando
constantemente es más fáciles programar y probar así ....
En este momento inicial de pruebas no habría problemas con que alimentes "solo" el Arduino y la lógica "VCC" de la plaqueta PCA9685 desde el USB de la PC.




superdog13 dijo: Ver Mensaje
..... Bueno, el componente físico que estoy usando dice literalmente "L7805CV" ....
Según la datasheet del mismo (si fuese original) soporta solo 1,5A ; pero como tienes una caida de 7V sobre el mismo y con 4 servos a 0,88A disipara casi 7W y calentara de lo lindo, aparte que deberías controlar que la regulación del mismo sea correcta por que si lo que mides con tu multimetro en los videos es esa tensión deja muchísimo que desear en cuanto a estabilidad !!!.




superdog13 dijo: Ver Mensaje
..... Lo de la batería pues
En este momento la tengo para pruebas, según los cálculos de mi anterior post da para un soporte de 5 servomotores, pero las pruebas las estoy realizando en este
momento solamente con 4 y aún así falla ....
Y te seguira fallando por que estas realizando las pruebas iniciales en una situación casi limite, muy ajustada !!!!!. Tu circuito de alimentación y regulación no tiene resto de capacidad a nivel de corriente para picos de consumo.

Yo para pruebas utilizaria un fuente de PC con un buen regulador serie de 3 ó 4A como te he dicho en mi post anterior, por supuesto que el ideal seria tener una fuente estilo de laboratorio; pero la de PC usada de modelos viejos son una alternativa muchisimo mas económica. Ni hablar que le sobraria capacidad de corriente para el tipo de pruebas que realizas.




superdog13 dijo: Ver Mensaje
..... Lo que me sigue causando dudas es lo que muestro en los videos, con las conexiones "+" y "V+" ya que no se comporta exactamente igual
Decir que al PCA sólo lo conecto al arduino en cuatro cables: Vcc, Gnd, SCL y SDA (tal cual como dice el código de ejemplo y el tutorial) ....
No puedo encontrar en la imagen de la PCA la conexion "+" que dices usar, podrías identificarla mejor ??.



También se observa que las tensiones que mides no son constantes y si fuesen las de "+V" deberian serlo, tu a eso no lo notaste como una posibilidad de problemas y en mi post anterior cuando escribi "Brownout's" tampoco hiciste click para ver a que se referia !!!.




superdog13 dijo: Ver Mensaje
..... Lo del capacitor lo había leído desde el comienzo, pero no le había prestado atención antes.
Al leer el comentario lo volví a revisar y haciendo pruebas con dos de 47uF mientras puedo conseguir los acordes a los diferentes servos ....
No lo tomes a mal, pero creeria que solo lees y no "analizas" lo que lees !!! ó no le das importancia !!!.




superdog13 dijo: Ver Mensaje
..... Cómo podría hacer para que este "robot" fuera autónomo en la parte de energía, es decir que no necesite estar conectado a la pared para
nada ???
La batería podría suplir esto para unos usos básicos, pero ya para los 12 servomotores qué podría hacer ???
Si primero verificas lo que deseas realizar sobre tu mesa de trabajo que mejor que usar una fuente que no te genere problemas durante la "etapa de pruebas" ???.

Una vez que tu diseño funciona correctamente en la mesa de trabajo ya conociendo perfectamente las necesidades de corriente del mismo y antes de montarlo sobre tu "robot" es el momento de comenzar a buscar la batería ó el elemento que te permita la autonomía del mismo.
También deberás pensar como alimentaras el Arduino en ese momento.

Hay baterias de 6V 4A y de 12V A como las imagenes que adjunto, pero en definitiva eres tu quien conoce mejor que los foristas que respondemos a tus inquietudes la capacidad de carga (peso que seria capaz de soportar tu robot) y el tiempo que deseas que el mismo sea autónomo (sin recargar la batería).

----




En los videos he visto que utilizas un tester/multimetro de baja calidad para hacer las comprobaciones, yo personalmente no me confiaria de las mediciones como para decir que es "la realidad" y utilizaría un buen porcentaje como resguardo.

Ese tester no mide picos como es el caso de la corriente inicial que toma el servo para comenzar el movimiento, entonces la mediciones de corriente que realices no seran ciertas.






Mi idea al respecto, hay una nueva versión actualizada al 2014 del Tutorial de Adafruit y me referiré a ella.

En la página 9 en el apartado "Power for the Servos/LEDs" da varias recomendaciones teniendo en cuenta la máxima tensión que soportan los Servos y me guio por eso:

Usar una batería de 6V 4A con dos diodos tipo 1N5403 en paralelo ambos y conectados en serie con la alimentación + para asi de esa manera tener unos 5,2V para alimentar los servos en la entrada "V+" de la plaqueta PCA9685.

Usar un "holder" para 4 pilas recargables de NiMH ó del tipo que te gusten que te proveerán de 4,8V para alimentar el Arduino y la entrada "VCC" de la plaqueta PCA9685. Dicho con otras palabras independizar las alimentaciones de la potencia consumida por los servos de la usada por la lógica Arduino + PCA.



Y no olvides nunca de leer y si no entiendes el otro idioma usa algún "traductor en línea" que hay muchos, es importante que tengas la menor cantidad de dudas (por no decir ninguna) antes de comenzar a dar vueltas y vueltas como te ha pasado en este proyecto.




Saludos, JuanKa.-

P.D.: Disculpa la extensión pero tantas dudas que posees ameritaban tratar de responderlas por partes.-
Imágenes Adjuntas
Tipo de Archivo: jpg 03-815-06.jpg (312,9 KB (Kilobytes), 29 visitas)
Tipo de Archivo: jpg 05-Bateria6V4A.jpg (30,7 KB (Kilobytes), 29 visitas)
Tipo de Archivo: jpg 06-Bateria12V4A.jpg (98,0 KB (Kilobytes), 29 visitas)
20/04/2015 #12

Avatar de pandacba

Algo seu se ve seguido en el foro, muy a menudo o saben de micros y nada de electrónica o viceversa...
Tipico error del primer caso de quere alimetar cuanto objeto quieran conrolar de la misma fuente del micro o Arduino, PingÜino, Picaxe, etc etc.....
Hay algunos que se desviven por conseguir un relay de bobina de 5V para luego terminar que su placa(cualquera de los anteriores fala) por un lado porque al no saber de electrónica y la fobia crónica a leer, nunca va un diodo polarizado en inversa, y al laimentar de la misma fuente del dispositivo lógico este tiene que soportar todo tipo de perturbaciones y luego viene que tal cosa no sirve........

Recomendación, a todo el que le gusta el control si no estudian electrónica terminaran fracasando, si no se estudia cosas muy simples se transforman en barreras insalvables, lo malo que no le interesa
Hay tipos que saben que hay que poner un dioso en paralelo con los relay no saben porque ni les importa solo saben que si no lo ponen hay problemas....

Tambien tienen que etudiar sobre el tema energia, potencia y su conversión que significan Ah que no puede extraer más energia que la que me provee mi fuente, en general que la energia no se crea de la nada y que toda transformación implica perdias

Es más fáctible que tenga más exito quien sabe de electrónica y se inicia con los micros que los otros
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.