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 Zebra

Comment le savoir sans plan de câblage ni code ??

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 Zebra

Essaye de remplacer les lignes :

for (int i = 0 ; i < 4 ; i ++) { // i ne prend que les valeurs 0, 1, 2 et 3
    stG[i].attach(2 + 2 * i); // donc seuls 2, 4, 6 et 8 sont déclarés (attach)
    Serial.println(2 + 2 * i);

Par

for (int i = 0 ; i < 8 ; i ++) { // i  prend que les valeurs 0, 1, 2, 3, 4, 5, 6 et 7
    stG[i].attach(2 +  i); // ici les 8 sont déclarés
    Serial.println(2 + i);

Dans la commande :  for (int i = 0 ; i < 4 ; i ++) {

Tu ne déclares que 4 servos avec i qui reçoit 0, 1, 2 et 3 successivement donc seuls les servos sur les pins 2, 4, 6 et 8 sont déclarés !!!!!! Cela me semble tout à fait normal que les servos sur les pins 3, 5 , 7 et 9 ne fonctionnent pas puisque jamais déclarée !

Bon Week End confiné !!

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 Zebra

Ok désolé je n'avais pas vu la suite du code mais pourquoi le diviser en 2 parties  ?

J'espère que tu as bien utilisé un Arduino Méga (tu ne le précises pas me semble-t'il. Car les autres Arduino du style UNO et autres qui n'ont pas toutes les pins de 2 à 9 compatible PWM pour UNO par exemple seul les pin 3, 5, 6, 9 et 11 sont des sorties PWM les autres non ! Regarde le "~" au droit des pins sur Arduino UNO par exemple, ceux sont les pins utilisables en PWM.

Les pins PWM sont des sortie pseudo analogiques (pourcentage créneau à l'état haut par rapport au temps total de la somme des créneaux haut et bas qui seul reste constant !

C'est ce rapport qui donne la position des servos. 0% servo à fond dans un sens et à 100% à fond dans l'autre sens et proportionnellement à toutes les valeurs intermédiaires.

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 Zebra

La datasheet de l'Arduino donne des pins pour le PWM, si tu utilises d'autres sorties tu auras les problèmes que tu as....

Voir ici

Il n'y a pas besoin de puissance sur les sorties PWM ceux ne sont que des courant très faibles !

Si tu persistes dans ton projet ne t'étonne pas d'avoir des soucis de fonctionnement.

Utilise un Arduino méga et tu n'auras plus de soucis il n'est pas cher chez Aliexpress

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