Aller au contenu


Photo
- - - - -

Problème avec shield servo PCA9685


23 réponses à ce sujet

#1 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 05 juillet 2016 - 09:29

Bonjour à tous,

 

 

Je travaille en ce moment sur une carte qui traîne depuis lgtps dans les placards, le module pca9685

 

Pour le câblage tout est Ok mais j'ai quelques problèmes inexplicables pour le moment ! dès fois la carte s’emballe est fait n'importe quoi ? les servos se mettent à faire des battements et se mette en butée !! Le courant augmente aussi ...

Je coupe cela redemarre correctement !!

 

 

 

Avez vous eu ce genre prbs avec cette carte ?

 

 

cdlt,

bypbop

 

 

 



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 05 juillet 2016 - 09:55

ton bras fait n'importe quoi là sur la vidéo ?? 

Perso je n'ai jamais eu le problème que tu décris spécifiquement avec le module pca9685. Cependant j'ai déjà eu un problème similaire avec une alimentation des servo et de la carte qui gère les PWM qui saturent dû au courant consommé et qui du coup " provoque des bugs " du type de ceux que tu décris.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 05 juillet 2016 - 09:57

Oh punaise !!! Que oui j'ai eu ce genre de problème avec les driver pca9685 type adafruit mais de provenance Asie....

 

  1. 6 servomoteurs sur ton driver et quelle est l'intensité consommée totale...
  2. ton alimentation passe telle par le régulateur du driver....Si oui ...évite....trop faible pour supporter une forte consommation
  3. tu as branché tous tes servomoteurs directement sur le driver.....Si oui......évite....Les pistes peuvent être trop étroites pour supporter la consommation

 

Voici une réponse d'adafruit :

 

by adafruit_support_bill on Tue Apr 26, 2016 12:42 pm
With all moving at the same time, that is over 10A. If they are heavily loaded, it could be considerably more.

At that point, you are pushing the limits of not only the reverse polarity MOSFET, but the traces on the board. I'd consider connecting servo power & GND directly to the servo headers via the 4 un-used servo positions.

 

En clair, tu alimentes, via une source d'énergie régulée, directement tes servomoteurs :

 

soit en connectant ta source d'alimentation régulée directement sur les broches + et - des emplacements servomoteur du driver non utilisés,

soit sans passer par les broches du driver et tu utilises que les broches de commande du driver pour piloter tes servomoteurs. Dans ce cas de figure il faut donc déporter l'alimentation des servomoteurs.

 

 

Tu peux aussi lire ce post :

 

controleur-maestro-24-ch-vs-adafruit-16-ch

 

La réponse de mike118 arrivée pendant que j'écrivais la mienne est très juste......La puissance délivrée par ton alimentation peut aussi tout simplement être trop juste .....

 

1 - vérifie que ton alimentation arrive à sortir l'intensité totale réclamé par tes servomoteurs,

2 - ensuite vérifie que ce ne soit pas l'alimentation supporter par le driver qui est trop élevée.



#4 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 05 juillet 2016 - 10:05

Bonjour @ tous,

 

 

Merci pour vos réponses ... Oui en provenance d'Asie moi aussi ;-)

 

alors j'alimente ma carte pca9685 avec une alimentation stabilisée en 5v par la broche V+ et Ground ...

 

le reste passe par mon arduino nano ... 

 

Pour L'alimentation je régule à 5v 2A ...

 

Voila mon cablage ...

servo-PCA9685.png



#5 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 05 juillet 2016 - 10:14

ton bras fait n'importe quoi là sur la vidéo ?? 

 

Salut Mike118 ! non sur la vidéo cela fonctionne mais c'est aléatoire ...

 

 

Au niveau de mon alimentation j'en suis sur !! c'est bon car je la règle à 2.0A et je ne les atteins pas ...

 

 

donc pour vous il faut alimenter directement sur le + et - d'un servo non utilisé ????

 

cdlt,

bypbop



#6 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 06 juillet 2016 - 06:15

L'alimentation ne doit pas être connectée sur le bornier du driver : le mofset du régulateur ne supportera pas ainsi que les pistes qui conduisent l'énergie, la puissance.

 

L'alimentation doit être directement connectée sur les broches + et - d'un emplacement servomoteur non utilisé....



#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 06 juillet 2016 - 01:08

6 servos avec 5V 2A ... C'est un peu juste ... Même si tes servo bougent pas ils doivent se maintenir en position et consomment ... 

 

Il te faudrait peut être un convertisseur 5V 7A dispo en boutique  :whistle2:  ( C'est pas pour rien que j'ai choisis ce produit pour la boutique ;)

Plus sérieusement, essaye de te trouver une source d'alimentation 5V plus puissante et dit nous si ça corrige ton problème =) 

En tout cas sympas ton bras :P  Il ressemble beaucoup à celui  :P


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#8 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 06 juillet 2016 - 01:31

Ca marche je test ce soir directement aux bornes + et - d'un emplacement servo directement !

Sinon pour les 5v 2A je ne les depasse pas car j'ai un affichage du courant sur mon alimentation ...
J arrive généralement à 1.5 a et j ai déja essayé à 5v 6A cela faisait pareil ...

#9 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 06 juillet 2016 - 01:33

;-) oui c est quasiment le même ;-)
Aprés je me lance dans la construction d un bras avec des moteurs pas à pas ....
Car la ca gigote de partout lol

#10 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 06 juillet 2016 - 08:19

tu as acheté où ton driver PCA9685......



#11 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 06 juillet 2016 - 09:33

Sur Ebay ... made in chine ;-) !

 

ca à l'air d'aller beaucoup mieux je poursuis mes test et je vous tiens au jus !



#12 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 13 juillet 2016 - 09:30

Bonjour @ tous !!! 

 

J’espère que vous allez tous profiter de votre long weekend en perspective !!!

 

 

Alors ca a l'air d"aller un peu mieux avec ma carte ! j'ai effectivement brancher directement l'alimentation en direct sur un port d'un servo dispo !!

 

j'ai fait ce petit bout de code qui fonctionne plutôt bien !

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

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  590 // this is the 'maximum' pulse length count (out of 4096)

const int DePin = 3;

void parkarm (){

  
}

void armpos (int pulse0, int pulse1, int pulse2, int pulse3, int pulse4, int pulse5){
pwm.setPWM(5, 0, pulse5);
pwm.setPWM(4, 0, pulse4);
pwm.setPWM(3, 0, pulse3);
pwm.setPWM(2, 0, pulse2);
pwm.setPWM(1, 0, pulse1);
pwm.setPWM(0, 0, pulse0);  
}


void setup() {
  pinMode(DePin, OUTPUT);

  digitalWrite(DePin, LOW);
  Serial.begin(9600);
  Serial.println("K ARM ROBOT");

  pwm.begin();
  delay(1000);
  pwm.setPWMFreq(60);

  yield();
}

void loop() {
armpos(365,337,0,406,353,309);
delay(5000);
armpos(362,427,0,504,353,309);
delay(5000);
}

Petite question comment je pourrais faire pour avoir un mouvement progressif dans ma fonction sur chaque servo ...

car la c est un peu sec !!!

 

 

cordialement,

bypbop



#13 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 13 juillet 2016 - 09:38

Tu pourrais faire une boucle pour incrémenter l'angle du servomoteur, ça marche très bien.

 

Exemple par pas de 5°

 

For (a=pos_ini; a=<pos_final; a += 5)

{

pwm.setPWM(5, 0, a)

delay(5)

}

 

 

Il est aussi possible d'avoir une variable pour l’incrémentation du pas et le délais :

pas = 5;

tempo =10;

For (a=pos_ini; a=<pos_final; a += pas)

pwm.setPWM(5, 0, a)

delay(tempo)

}

 

Tu peux faire varier le pas et la tempo dans ton programme. Regarde sur ce site il existe beaucoup d'exemple et surtout google et ton ami ....

 

 

++



#14 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 13 juillet 2016 - 10:57

donc cela implique une position de début et de fin à chaque fois ;-)

 

si je veux faire un déplacement progressif sur les 6 en mm temps avec comme tu le dis une varaible de pas  = 5 par exemple 

 

 

cela devrait faire un truc du genre non ?

for (a = pos_ini0 ; a=<pos_fin0; a +=5) {
pwm.setPWM(0, 0, a);
delay(tempo);
    for (b = pos_ini1 ; b=<pos_fin1; b +=5) {
    pwm.setPWM(1, 0, b);
    delay(tempo);
    }
}

Cordialement,

bypbop



#15 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 13 juillet 2016 - 11:14

Si tu combines tout les éléments donné par telson en une seule fonction pour un servo ça peut te donner un truc du genre : 

void softmoove(uint8_t servoNum, uint8_t targetPos, uint8_t pas, uint8_t tempo ) 
{
   if(currentPos[servoNum]<targetPos)
   { 
      for (int i=currentPos[servoNum]; i<(targetPos-pas); i += pas)
      {
       pwm.setPWM(servoPin[servoNum], 0, i);
       delay(tempo);
      }
   }
   else if(currentPos[servoNum]>targetPos)
   {
     for (int i=currentPos[servoNum]; i>(targetPos-pas); i -= pas)
     {
       pwm.setPWM(servoPin[servoNum], 0, i);
       delay(tempo);
     }
   }
   else 
   {
     pwm.setPWM(servoPin[servoNum],0,targetPos);
     currentPos[servoNum]=targetPos;
   }
}

Il est possible d'optimiser et de simplifier le code de plusieurs façon différentes mais cette façon me parraît suffisament simple / fonctionnel / compréhensible. 


Alors que si tu veux le faire " proprement" pour plusieurs servo en même temps. 

Il est plus judicieux de faire une fonction qui est répété en continu du genre  

=> 

void runServo()
{
   for( servoNum=0;servoNum<maxNum; servoNum++)
   {
     pwm.setPWM(servoPin[servoNum],0,targetPos[servoNum]);
     currentPos[servoNum] = targetPos[servoNum];
   }  
}

et d'en faire une setTargetPos qui en fonction du pas défini pour chaque servo, du délais pour chaque servo, et du finalPos pour chaque servo va te changer le " targetPos"  de chaque servo. 

 

du genre 

void setTargetPos(){
  for(servoNum=0;servoNum<maxNum; servoNum++)
  {
    timeServo[servoNum]=timeServo[servoNum]+1; 
    if(  timeServo[servoNum]> tempo[servoNum]) 
    {
        timeServo[servoNum]=0; 
        if(currentPos[servoNum]<(finalPos[servoNum]-pas[servoNum]))
        { 
           targetPos[servoNum]= currentPos[servoNum]+ pas[servoNum];
        }
       else if(currentPos[servoNum]>(finalPos[servoNum]+pas[servoNum])
       {
           targetPos[servoNum] = currentPos[servoNum]- pas[servoNum];
       }
       else targetPos[servoNum] = finalPos[servoNum];
    }  
  }
}

Et du coup à un interval de temps régulier tu répètes 

setTargetPos();

runServo();

 

faisable dans une interruption générer par un timer par exemple. (mais essayer tant que faire ce peut de réduire le temps d'éxécution de cette fonction =) 

Bon là j'ai fait comme si chaque type de variable était stocké dans des tableau mais si besoin pour mieux structurer l'ensemble il est possible d'utiliser une structure ... 



 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#16 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 14 juillet 2016 - 01:09

Haaaaaa !!!! Il n'à pas pu s'en empêcher......Mike118 revend ses structures....Bravo....Bien placé......



#17 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 14 juillet 2016 - 01:22

Attend je reviens à la charge et en force ! :P car après les structure l'union ! ( oui oui puisque l'union fait la force ...   :P


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#18 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 14 juillet 2016 - 09:47

:thank_you: :king:



#19 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 14 juillet 2016 - 12:10

ok merci @ tous je vais regarder tout ca je pense utiliser la fonction qui me permet de les piloter tous progressivement ...

 

Merci 



#20 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 14 juillet 2016 - 01:59

@ Mike118

 

 

tu aurais un exemple avec ta fonction runServo et setTargetPos ?

 

 

cdlt,

bypbop





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users