Limite servo moteur

Portrait de Wozeo

Salut,

Je débute en arduino, j'ai un projet où je connecte 8 servo moteur (Servo SG90 TowerPro) à un arduino, sauf qu'une fois le code lancé, seul 5 fonctionnent et 3 restent inactif. J'ai vérifié qu'ils fonctionnaient tous et j'ai tester sur arduino nano et arduino uno mais rien n'y fait.

Est-ce que vous savez d'où viens cette limite, et savez vous comment résoudre ce problème ?

Portrait de Walter

Bonjour,
comment as tu connecté tes servos et comment les pilotes tu ?
Normalement on le pilote le servo en largeur d'impulsion.
Utilise tu la librairie servo d'arduino ou un signal PWM directement?

Portrait de Wozeo

J'utilise effectivement la librairie -> #include <Servo.h>

J'initialise les servos avec servo.attach(numPin) et je les déplace avec servo.write(angle)

Chaque servo moteur est relié au 5v (les 8 sont lié au même pin 5v de l'arduino) au gnd (de même les 8 sur le même) et à un pin de commande (entre le pin n°2 et le n°9)

Mon code complet : 

#include <Servo.h>
Servo stG[4], stH[4];
int aMin = 40;
int aMax = 90;

int e = 0;
int emax = 3;

void setup() {

  Serial.begin(9600);
  for (int i = 0 ; i < 4 ; i ++) {
    stG[i].attach(2 + 2 * i);
    Serial.println(2 + 2 * i);
    stG[i].write(aMin);

    stH[i].attach(3 + 2 * i);
    Serial.println(3 + 2 * i);
    
    stH[i].write(aMin);
  }
}

void loop() {
  for (int i = 0 ; i < 4 ; i ++) {
    cycle(stG[i], stH[i], e+i);
    
  }

  e ++;
  if (e > emax) {
    e = 0;
  }
  delay(500);
}

void cycle(Servo sGD, Servo sHB, int etat) { //sGD min -> arrière ; sHB min -> bas
  switch (etat) {
    case (0):
      sGD.write(aMin);
      sHB.write(aMin);
      break;
    case (1):
      sGD.write(aMin);
      sHB.write(aMax);
      break;
    case (2):
      sGD.write(aMax-10);
      sHB.write(aMax);
      break;
    case (3):
      sGD.write(aMax-10);
      sHB.write(aMin);
      break;
  } 
}

Portrait de Wozeo

.

Portrait de Walter

Ok, peut tu aussi indiquer quels servos fonctionnent.

Portrait de Wozeo

Si je branche le servo a au pin 2 (ect ... jusqu'au servo h au pin 9 ) alors les servos f,g,h ne marche pas. Si maintenant je branche le servo h au pin 2 et le sevo a au pin 9, alors les servos f,g,a ne marche pas.

Portrait de Walter

Tu as essayé de brancher que les 3/4 dernières pour voir, si tu aussi le problème ou les pin supérieurs à 9.
 

Portrait de Wozeo

Si je branche que les 4 derniers ils fonctionnent tous.

Est-ce que ça pourrait être un problème de puissance ?

Portrait de Wozeo

Dans la boucle for (int i = 0 ; i < 4 ; i ++) { j'initialise 2 servo moteur à chaque boucle : 

stG[i].attach(2 + 2 * i); 

stH[i].attach(3 + 2 * i);

Ainsi les 8 servo moteurs sont bien initialisé, de plus il y a 3 servo moteur ne répondant pas et ils sont liés au pin 9,8 et 7. 

Cependant merci pour votre réponse !

Portrait de Wozeo

J'ai fait mon code en 2 partie surtout pour me souvenir du branchement des différent servo moteur

J'utilise un arduino uno, et je comprend enfin à quoi correspond les ~ ! Par contre je peux brancher un servo moteur à un pin qui n'est pas ~ et il fonctionne (de même les ~ fonctionnent)

Est-ce que ça pourrait être un problème de puissance ?

Portrait de Walter

Bonjour, la librairie servo permet de gérer 12 servos sur une uno et 48 sur une méga, car la librairie n'utilise pas les sortie PWM, mais un seul timer (pour le atmega 328) et les sorties digitales pour générer la largeur d'impulsion pour chaque sortie.

Pourquoi seulement 5 sur 12 sont disponibles, j'avoue que je ne sais pas,
Par contre normalement tu ne devrait pas alimenter les servos par la carte arduino, mais par l'alimentation général car je n'ai pas trouvé de données officielles, mais il est question de 100 * 500mA par servo en charge

La data étant uniquement un contrôle "digital", il ne devrait pas consommer grand chose, tu peut surement le mesurer à l'ampère mètre.

 

Portrait de hercule124

bonjour,

Avec une carte Arduino UNO ou nano, l'utilisation de la bibliothèque Servo rend inutilisable la broches D9 et D10 PWM avec analogWrite.
l'alimentation des servos doit se faire sur l'alim externe et pas sur le regulateur integré de la carte arduino ,+de 100ma par servo.
courant max sur arduino 500ma