Aller au contenu


Photo
- - - - -

Driver I2C 16 servomoteurs [testé par Jekert]


31 réponses à ce sujet

#1 Jekert

Jekert

    Auteur

  • Modérateur
  • PipPip
  • 214 messages
  • Gender:Male

Posté 18 juin 2016 - 05:52

Salut,
J'ai commencé à toucher au driver 16 servos compris dans le kit pour robot quadrupède, donc voici le fil dédié au test de celui-ci.
 

6 - Driver.JPG

 
Donc le driver ressemble à ceci, il permet à une carte Arduino de contrôler jusqu'à 16 servomoteurs avec 2 broches de la carte. De plus on peut mettre plusieurs drivers en série (62 au maximum) et ainsi contrôler jusqu'à 992 servos avec seulement 2 sorties !
 
J'ai fait un petit montage afin de tester son fonctionnement ainsi que celui de la bibliothèque Adafruit_PWMServoDriver.h :

27 - Driver.jpg

 
Avec ce programme-ci, qui est une adaptation pour le driver du programme d'exemple de la bibliothèque Servo.h (je trouve qu'il est plus compréhensible que celui fourni avec la bibliothèque d'Adafruit) :

//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//Servos :
#define SERVOMIN 105 //Longueur minimum d'impulsion
#define SERVOMAX 460 //Longueur maximum d'impulsion
#define NBSERVO 0    //Nombre de servos-1
#define PAUSE 10
uint8_t servonum = 0;
int pos = 0;


void setup() 
{
  pwm.begin();

  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques

  yield();
}

void loop() 
{
   for (pos = SERVOMIN; pos <= SERVOMAX; pos++)
  //Rejoins un angle de 180° depuis 0° par pas de 1°
  {
    pwm.setPWM(servonum,0,pos);
    delay(PAUSE);
  }
  delay(2000);
  for (pos = SERVOMAX; pos >= SERVOMIN; pos--)
  //Rejoins un angle de 0° depuis 180° par pas de 1°
  {
    pwm.setPWM(servonum,0,pos);
    delay(PAUSE);
  }
  delay(2000);
  servonum++;
  if (servonum > NBSERVO) servonum = 0; 
}

Et voici une petite vidéo du programme en fonctionnement avec un servo (je la referais sûrement à cause de la mise au point) :

 
A bientôt ! :)



#2 Jekert

Jekert

    Auteur

  • Modérateur
  • PipPip
  • 214 messages
  • Gender:Male

Posté 19 juin 2016 - 05:37

J'ai un petit peu modifié le programme pour qu'il puisse gérer plus facilement plusieurs servos :
//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//Servos :
uint8_t servomin[] = {105,100}; //Liste des longueurs minimums d'impulsions
int servomax[] = {460,450};     //Liste des longueurs maximums d'impulsions
#define NBSERVO 1               //Nombre de servos - 1
#define PAUSE 5
uint8_t i = 0;
int pos = 0;


void setup()
{
  pwm.begin();

  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques

  yield();
}


void loop()
{
   for (pos = servomin[i]; pos <= servomax[i]; pos++)
  //Rejoins un angle de 180° depuis 0° par pas de 1°
  {
    pwm.setPWM(i,0,pos);
    delay(PAUSE);
  }
  delay(1000);
  for (pos = servomax[i]; pos >= servomin[i]; pos--)
  //Rejoins un angle de 0° depuis 180° par pas de 1°
  {
    pwm.setPWM(i,0,pos);
    delay(PAUSE);
  }
  delay(1000);
  i++;
  if (i > NBSERVO) i = 0;
}
Et la vidéo de ce programme avec 2 servos :

https://youtu.be/iSDU6_reOYU

 
J'ai aussi fait un autre programme qui permet de les faire tourner de 180° en même temps :
//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//Servos :
uint8_t servomin[] = {105,100}; //Liste des longueurs minimums d'impulsions
int servomax[] = {460,450}; //Liste des longueurs maximums d'impulsions
int x = 0;
int pos = 0;
uint8_t i = 0;
#define NBSERVO 2    //Nombre de servos
#define PAUSE 5
#define INTER 2000

void setup() 
{
  pwm.begin();

  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques

  yield();
}

void loop() 
{
  for (pos = 0; pos <= 180; pos++)
  //Rejoins un angle de 180° depuis 0° par pas de 1°
  {
    servo();
  }
delay(INTER);

  for (pos = 180; pos >= 0; pos--)
  //Rejoins un angle de 0° depuis 180° par pas de 1°
  {
    servo();
  }
delay(INTER);
}

void servo() {
  for (i = 0; i< NBSERVO; i++)
  {
    x = map(pos,0, 180, servomin[i], servomax[i]);
    pwm.setPWM(i,0,x);  
    delay(PAUSE);
  }
}

Dont voici le résultat avec 2 servomoteurs :


#3 Jekert

Jekert

    Auteur

  • Modérateur
  • PipPip
  • 214 messages
  • Gender:Male

Posté 20 juin 2016 - 10:07

Salut,

J'ai fait un petit programme pour tester rapidement les MIN et MAX de chaque servo avec le driver. Il vous suffit d'entrer une donnée de cette forme dans l'interface Série : 2085380 (2->Numéro du servo a tester (entre 0 et 15), 085 -> le min, 380->le max).

J'ai ajouté une longueur d'onde de "repos" qui permet de ne pas forcer sur le servo si l'ordre est en dehors de ses limites physiques, elle est de 300 mais n'importe quel nombre entre 150 et 350 aurait fait l'affaire sur ces servomoteurs.

//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//Servo :
uint8_t servo = 0;
int mini = 0;
int maxi = 0;
#define PAUSE 2000
#define REPOS 300

//Serial :
int ava;      //Variable pour vérifier qu'une donnée est disponible
String mail; //Variable qui contient le message
String num;  //Contient le numéro du servo
String mi;   //Le min
String ma;   //Le max

void setup() {
  Serial.begin(9600);
  pwm.begin();

  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques

  yield();
}

void loop() {
  ava = Serial.available();
  if (ava > 0)
  {
    //Lecture des données reçues :
    mail = Serial.readString();

    //Séparation des données :
    num = mail.substring(0,1);
    mi = mail.substring(1,4);
    ma = mail.substring(4,7);

    //Affichage sur l'interface Série :
    Serial.print(num); Serial.print(" ");
    Serial.print(mi); Serial.print(" ");
    Serial.println(ma);

    //Conversion en int :
    servo = num.toInt();
    mini = mi.toInt();
    maxi = ma.toInt();

    for(uint8_t i = 0; i < 1; i++)
    {
      pwm.setPWM(servo,0,mini);
      delay(PAUSE);
      pwm.setPWM(servo,0,maxi);
      delay(PAUSE);
      pwm.setPWM(servo,0,mini);
      delay(PAUSE);
      pwm.setPWM(servo,0,maxi);
      delay(PAUSE);
      pwm.setPWM(servo,0,REPOS);
    }

    delay(2000);
    }
}


#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 112 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 20 juin 2016 - 10:25

super ! =) 

Une vidéo de démonstration de ton programme serait top ;) Ainsi les lecteurs veront tout l'intérêt de cet " outil " de test de servo que tu proposes ;) 


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 ! 

 

Les réalisations de Mike118  

 

 

 


#5 Jekert

Jekert

    Auteur

  • Modérateur
  • PipPip
  • 214 messages
  • Gender:Male

Posté 21 juin 2016 - 09:53

La voilà :)
Le Servo en haut à gauche a un petit peu de mal à rejoindre la consigne, faut que je vois si je peut changer ça.

Désolé pour l'image un peu jaune, les blancs sont réglés sur l'écran pour qu'il soit lisible.

#6 Jekert

Jekert

    Auteur

  • Modérateur
  • PipPip
  • 214 messages
  • Gender:Male

Posté 24 juin 2016 - 10:55

Et un dernier petit programme pour ce fil qui permet de contrôler facilement les servos grâce à des ordres en degrés :
//Bibliothèques :
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

//Driver :
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//Servos :
uint8_t servomin[] = {105, 100, 85, 100, 90, 100}; //Liste des longueurs minimums d'impulsions
int servomax[] = {460,450, 380, 430, 420, 420}; //Liste des longueurs maximums d'impulsions
#define PAUSE 500

void setup()
{
  pwm.begin();

  pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques

  yield();
}

void loop() 
{
  servo(0,90); //Numéro du servo, angle à atteindre
  servo(1,45);
  servo(2,125);
  servo(3,90);

  delay(PAUSE);

  servo(0,120);
  servo(1,90);
  servo(2,45);
  servo(3,120);

  delay(PAUSE);
}

void servo(uint8_t i,int pos)
{
  int x = map(pos,0,180,servomin[i],servomax[i]);
  pwm.setPWM(i,0,x);
}

Pour ajouter un servo, il suffit d'ajouter à la suite des listes ses valeurs min et max.
Et une petite vidéo de démonstration :


#7 mthibs

mthibs

    Nouveau membre

  • Membres
  • 71 messages
  • Gender:Male

Posté 25 mars 2017 - 03:57

Salut !

Tu peux me dire à quoi sert la broche "OE" du driver stp?  ^_^



#8 Telson

Telson

    Membre chevronné

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

Posté 25 mars 2017 - 11:57

Super travail. Bravo.

 

Attention toutefois, il faudrait faire des tests avec 16 servomoteurs connectés en mouvement ......Et attention à la puissance max totale disponible.

 

L'utilisation avec des servomoteurs en charge peut surprendre ....

 

il faudrait aussi tester la différence de précision de positionnement/stabilité, en charge, de 16 servomoteurs entre une carte originale et un clone....



#9 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 424 messages
  • Gender:Male
  • Location:Paris

Posté 26 mars 2017 - 12:08

@mthibs, le peu d'infos que j'ai sur la broche OE vient d'adafruit. C'est pour chainer les drivers. 'Output Enable'

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#10 Jekert

Jekert

    Auteur

  • Modérateur
  • PipPip
  • 214 messages
  • Gender:Male

Posté 26 mars 2017 - 10:04

@mthibs, comme l'a dit Path, ce pin semble servir pour connecter plusieurs drivers entre eux. Tu peux retrouver un schéma ici.

 

@Telson, Merci :) , j'avais fait une vidéo avec une "charge" pour 4 servos mais on dirait que j'avais oublié de la poster ici...

 

 

J'utilisais encore le bornier à vis pour ce test mais depuis j'alimente les servos du robot à partir d'un des emplacements pour servo.

Je n'ai pas fait de tests avec 16 servos mais tu peux regarder les vidéos du quadrupède  qui utilise 12 servos avec ce driver.



#11 mthibs

mthibs

    Nouveau membre

  • Membres
  • 71 messages
  • Gender:Male

Posté 27 mars 2017 - 10:00

Cool ! Merci pour la réponse Jekert et Path !  ;)



#12 Telson

Telson

    Membre chevronné

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

Posté 28 mars 2017 - 03:13

Super génial l'idée des élastiques pour la mise en charge. Bravo !!



#13 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 579 messages
  • Gender:Male

Posté 26 juillet 2018 - 11:07

Est-ce que le "Driver I2C pour 16 servomoteurs" doit être impérativement alimenté en 5V ?
Si oui, peut on envisager une alimentation séparée pour des servos qui serait en 7,4V ?
Ma chaine vidéo YouTube : https://www.youtube....wMz-IzZqyvqEUek

#14 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 26 juillet 2018 - 11:38

Je n'ai pas la réponse à tes questions, par contre dans le tout premier message Jekert a dit : 

 

Donc le driver ressemble à ceci, il permet à une carte Arduino de contrôler jusqu'à 16 servomoteurs avec 2 broches de la carte. De plus on peut mettre plusieurs drivers en série (62 au maximum) et ainsi contrôler jusqu'à 992 servos avec seulement 2 sorties !

 

sauf que la norme I²C impose une numérotation des éléments codée sur 7bits (128 en base 10)
mais bon... 16 lignes de 8 servos c'est déja pas mal.

encore désolé Oracid d'avoir posté juste sous ta question...  :pardon:



#15 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 579 messages
  • Gender:Male

Posté 26 juillet 2018 - 12:59

J'ai une idée. Je peux faire un autre râtelier pour les 16 servos. L'alim serait en 7,4V et le signal viendrait du driver.
Cela complique bêtement le câblage, mais s'il n'y a pas moyen de faire autrement…
En espérant que sur un servo 7,4V le signal soit compatible TTL.
Ma chaine vidéo YouTube : https://www.youtube....wMz-IzZqyvqEUek

#16 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 26 juillet 2018 - 01:20

c'est en effet la piste que j'aurai suivi... il faudra vérifier que la partie puissance du pont en H supporte le 7,4V.
 



#17 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 424 messages
  • Gender:Male
  • Location:Paris

Posté 26 juillet 2018 - 01:57

Je n'ai pas la réponse à tes questions, par contre dans le tout premier message Jekert a dit : 
 
sauf que la norme I²C impose une numérotation des éléments codée sur 7bits (128 en base 10)
mais bon... 16 lignes de 8 servos c'est déja pas mal.

encore désolé Oracid d'avoir posté juste sous ta question...  :pardon:

Sisi :) c'est la carte qui prend une adresse. Pas le servo. Jusqu'à 62. D'où 62*16 992

Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#18 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 112 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 26 juillet 2018 - 02:11

Il y a deux ligne d'alimentations sur la carte, une pour les servo et une pour le circuit logique. 

Le circuit logique doit être alimenté en 5V mais la ligne pour les servo peut sans problème être en 7.4V si tes servo aiment le 7.4V. 

Comme sur Briel si tu utilises beaucoup de servo qui consomment beaucoup et que tu as pas besoin de 16 prises pour servo je recommande de passer par une prise pour servo pour alimenter l'ensemble. 

Genre perso j'utilise le convertisseur 5V 7A de cette façon sur cette carte sur Briel. ( Et j'en utilise même 2 ... )


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 ! 

 

Les réalisations de Mike118  

 

 

 


#19 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 579 messages
  • Gender:Male

Posté 26 juillet 2018 - 08:40

Il y a deux ligne d'alimentations sur la carte, une pour les servo et une pour le circuit logique. 
Le circuit logique doit être alimenté en 5V mais la ligne pour les servo peut sans problème être en 7.4V si tes servo aiment le 7.4V.

C'est une très bonne nouvelle !

Je suppose que le bornier serait pour l'alimentation 7,4V. Et Vcc en 5V, pour le driver lui-même et le Nano.

"je recommande de passer par une prise pour servo pour alimenter l'ensemble." je ne comprends pas vraiment.
J'ai bien vu que sur Briel, tu utilises 2 convertisseurs 5V, mais je ne comprends pas le schéma.
Le 5V 7A 1 prend son courant à partir de la batterie, alors que le 5V 7A 2 prend son courant sur le Nano !!!
Que tu prélève le 5V sur le Nano, pour alimenter le Vcc du driver, ok.
Mais tu branches les connecteurs 5V sur 2 borniers pour servo. Là, je suis perdu.
Ma chaine vidéo YouTube : https://www.youtube....wMz-IzZqyvqEUek

#20 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 112 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 26 juillet 2018 - 10:38

Les deux convertisseur 7V 5A prennet leur courant sur la batterie. 

 

 

Mes servo consomment plus que 7A en pointe. Du coup je met deux convertisseur en parallèle ... 

Si ça te parait plus simple, imagine qu'au lieu de deux convertisseurs 7A j'ai un seul gros convertisseur 14A mais qui a deux fils de sortie pour éviter d'avoir des trop gros fils...

 

La nano elle elle a son propre régulateur interne. Je l'alimente elle aussi par la batterie 12V sur VIN. 


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 ! 

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users