Servomoteur tourne de façon incontrôlable

Bonjour,
Je viens d'acheter des servomoteurs SG90 sur Amazon pour un projet, et une fois branchés le servomoteur émet un son "tic tic tic" en continue cela veut t'il dire que le servo à un problème ou cela vient de mon programme ?

J'avais déjà réalisé un projet avec un servomoteur SG90 mais ce problème n'est jamais apparu.

Cordialement

Il est branché comment?
Alimenté comment?

Quel programme?

On est pas devins. Il faut donner des informations pour avoir des réponses.

Bonsoir nat_bc

Cela fait à toutes les positions où il est arrêté?

As tu essayé, avec la bibliothèque Servo.h, de régler les valeurs d'impulsions minimum et maximum par:

myservo.attach(int pin, int min, int max)

Ou tu peux régler finement les positions avec l'instruction:

myservo.write(position);

Si position est < 200, c'est un angle si >= c'est une largeur d'impulsion en microsecondes.

Cordialement
jpbbricole

Comment est-il brancher et bien comme un SG90 donc négatif, positif et information, et directement sur la sortie du PC, le programme n'est pas important, il est commandé par mise en position myservo.Write(XX)
Cordialement

Dès que le servo est mis sous tension le bruit apparait,
je n'ai pas essayer de changer les valeurs avec le attach car le servo ne bouge pas alors que si j'utilise l'ancien (celui de ma phase propo) tout fonctionne correctement.
Peut-être qu'il doit être piloté en microseconde.
Cordialement

Qu'il soit piloté en angle ou en microseconde ne change rien au type de signal qu'il reçoit.
En principe, il ne devrait pas vibrer si:

  • l'alimentation est de bonne qualité ( stable et dans la fourchette de tension préconisé par le constructeur en général 4,8 à 6V)
  • la commande ne tente pas de l'envoyer dans ses butés ou au-delà.
  • le programme ne tente pas de lui faire faire des mouvements trop rapides.

Si tu le dis, c'est quand même toi qui a demandé si le problème pouvait être causé par le programme.

  #include <Servo.h>

    // crée l’objet pour contrôler le servomoteur
      Servo monservo; 

    // constantes ne change pas. Elles sont utilisées pour donner les pins:
      const int BoutonD = 11; //le numéro de la pin du bouton départ
      const int BoutonR = 10; //le numéro de la pin du bouton RAZ
      const int LedF = 6; //le numéro de la pin de la Led fin de cycle
      const int LedV = 3;//le numéro de la pin de la Led verte
      const int LedJ = 2;//le numéro de la pin de la Led jaune
      const int LedR = 7;//le numéro de la pin de la Led rouge
      const int ReedV = 4;//le numéro de la pin du capteur REED vert
      const int ReedJ = 5;//le numéro de la pin du capteur REED jaune
      
    // les variables vont changées :
      int etatBoutonD = 0;//état du bouton de départ
      int etatBoutonR = 0;//état du bouton de RAZ
      int etatReedV = 0;//état du capteur reed vert
      int etatReedJ = 0;//état du capteur reed jaune
      int pos = 0;//variable pour stocker la position du servomoteur
      
      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
  void setup() {

    Serial.begin(9600);
  
    // initiliser les LEDs en tant que sortie :
      pinMode(LedF, OUTPUT);
      pinMode(LedV, OUTPUT);
      pinMode(LedJ, OUTPUT);
      pinMode(LedR, OUTPUT);
    
    //initiliser les boutons en tant que entrer :
      pinMode(BoutonD, INPUT);
      pinMode(BoutonR, INPUT);

      //capteur Reed en tant qu'entrer :
      pinMode(ReedV, INPUT_PULLUP);
      pinMode(ReedJ, INPUT_PULLUP);
      
      
    //initialisation du servomoteur
      monservo.attach(13);  // utilise la broche 13 pour le contrôle du servomoteur
     }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
void loop() {
  
  //Contrôle du reed jaune avant cycle (détection capteur bloqué fermé)
    {etatReedJ = digitalRead(ReedJ);
        if (etatReedJ == LOW){
            digitalWrite(LedR, HIGH);
            }else{
                digitalWrite(LedR, LOW);
            }
        }
  //Contrôle du reed vert avant cycle (détection capteur bloqué fermé)         
    {etatReedV = digitalRead(ReedV);
        if (etatReedV == LOW){
            digitalWrite(LedR, HIGH);    
            }else{
                digitalWrite(LedR, LOW);  
            }
        }
                
  //Lit la broche d'entrée du bouton départ
    etatBoutonD = digitalRead(BoutonD);

  //Si le bouton est HIGH alors...
    if (etatBoutonD == HIGH){

  //Demande au servo de se déplacer à ... puis attendre ...    
        for(pos = 0; pos < 135; pos+= 1);
         {
          monservo.write(pos);
         delay(150);
         } 

  //Contrôle du capteur reed vert, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind
                {etatReedV = digitalRead(ReedV);
                    if (etatReedV == LOW){
                        digitalWrite(LedV, HIGH);
                            }else{
                                digitalWrite(LedV,LOW);      
                                }
                              }
                
  //Demande au servo de se déplacer à ... puis attendre ...
        for(pos = 150; pos >=5; pos -=1)
          {monservo.write(pos);
            delay(10); 
          }
          
  //Contrôle du capteur reed jaune, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind          
                {etatReedJ = digitalRead(ReedJ);
                    if (etatReedJ == LOW){
                        digitalWrite(LedJ, HIGH);
                            }else{
                                digitalWrite(LedJ, LOW);
                                } 
                              }
        
  //Demande au servo de se déplacer à ... puis attendre ...
        monservo.write(80); // demande au servo de se déplacer à cette position
            delay(100); // attend 1000 ms entre changement de position

  //Allumer la led de fin de cycle
        digitalWrite(LedF, HIGH); //Allumer la Led en fin de cycle
        }
       
          
  {// lire l'état du bouton RAZ
    etatBoutonR = digitalRead(BoutonR);

  //Si le bouton RAZ est HIGH alors éteind les leds
      if (etatBoutonR == HIGH){
        digitalWrite(LedF, LOW);
        digitalWrite(LedV, LOW);
        digitalWrite(LedJ,LOW);
        }
      }
    }
   

Voici le programme mais il fonctionne très bien avec l'ancien servomoteur celui de test

Bonjour nat_bc

Donc tu substitues le nouveau servo (qui fait du bruit) à l'ancien et celui-ci ne fait pas de bruit.
Si, avec le même Arduino, sur pin 13, même alimentation et même modèle de servo, le nouveau fait du bruit, c'est, peut-être qu'il n'est pas de la même qualité que le premier? Des servo "camelote" des fois font du bruit :woozy_face:

Cordialement
jpbbricole

Dans la bibliothèque la fonction ”commande en degré” fait la conversion angle vers microseconde et au final envoie des microsecondes.
Cela ne changera rien le servo reçoit déjà des microsecondes.

A cela j’ajoute que :

  • la conversion part du principe que le servo est un 180° alors qu’il existe aussi des servo 90 et 270 °. Si tu n’as pas un 180° il faudra faire une simple règle de 3.

  • que la bibliothèque répond a ”centaines normes” en terme de tmin et tmax qui ne sont pas les valeurs historiques que l’on trouve dans la littérature.
    Les valeurs ”actuelles pour des S90” peuvent être obtenues en ouvrant les fichiers de la bibliothèque, je ne les connais pas par cœur.

Donc si ton servo est un S90 180° le plus simple est d’utiliser la commande en degré.

Essayez de changer la broche à laquelle les commandes sont envoyées au servomoteur. La broche peut être défectueuse, en plus une LED y est reliée.

Le programme est vraiment mal indenté.
Indentez-le avec le raccourci Ctrl-T et publiez une nouvelle version de votre code s'il a changé.

Un servomoteur est facile à utiliser, même pas besoin de bibliothèque pour ceci, vous pouvez programmer une fonction vous-même, en vous basant sur la datasheet de votre servomoteur.

Je pense que, soit tu demandes à ton servo de dépasser ses limites 0° a 180°, ou bien ton montage mecanique empeche et contraint ton servomoteur. Verifies bien que ton motage mécanique ne bloque pas ton servo tout simplement en deplacant l'axe de ton servo manuellement et ton servo non alimenté.

Ça va le cramer ! Un servomoteur c'est super fragile !

Engrenages qui s'entrechoquent. Y'a peut-être un axe cassé - celui du milieu : C'est le premier qui rend l'âme sur les miens généralement ( c'est aussi des SG90 ) - sur la photo c'en est pas un :

Cordialement
Pandaroux007

P.S : ou @nat_bc force trop sur le servo ( programme ). Mais ça n'a pas l'air d'être le cas.

1 Like

Bonjour
Je connais bien ces machins. Parfois ils marchent, c'est clairement du bas de gamme. J'ai fini par opter pour des engrenages en métal ou acheter du plus sérieux.
J'en ai reçu qui étaient bloqués, c'est-à-dire que même en les commandant via un programme fonctionnel, ils ne voulaient pas bouger.
Ne pas insister, il cramerait.
Débranche-le et essaie de le manipuler doucement à la main en ajoutant l'accessoire qui se visse sur l'axe. Comme mentionné, il se peut qu'il y ait un mauvais alignement des dents. Les SG90 tournent bien à la main normalement. Dès qu'il tourne à la main, refais un essai. Certains ne fonctionnent juste pas.

Salut
Normalement, non. J'ai déjà fait des essais 'pour voir si ça crame', ils restent dans la limite du possible; le potentiomètre qui est à l'intérieur limite leur rotation.
même si tu lui commandes de bouger de -100 à +2000, il reste dans la limite du potard.

Salut @kammo :smiley:
De toutes façon, je ne pense pas que le demandeur repasse pas ici :
image
Et si il repasse : une référence + une photo du servo ( démonté ).

Bonjour,
Je fais une petite mise à jour, le servomoteur a arrêté du jour au lendemain de faire du bruit mais maintenant il se met à tourner dans tous les sens de façon démoniaque :japanese_ogre:.
Je vous redonne mon code :

#include <Servo.h>

    // crée l’objet pour contrôler le servomoteur
      Servo monservo; 

    // constantes ne change pas. Elles sont utilisées pour donner les pins:
      const int BoutonD = 12; //le numéro de la pin du bouton départ
      const int BoutonR = 10; //le numéro de la pin du bouton RAZ
      const int LedF = 2; //le numéro de la pin de la Led fin de cycle
      const int LedV = 6;//le numéro de la pin de la Led verte
      const int LedJ = 7;//le numéro de la pin de la Led jaune
      const int LedR = 3;//le numéro de la pin de la Led rouge
      const int ReedV = 4;//le numéro de la pin du capteur REED vert
      const int ReedJ = 5;//le numéro de la pin du capteur REED jaune
      
    // les variables vont changées :
      int etatBoutonD = 0;//état du bouton de départ
      int etatBoutonR = 0;//état du bouton de RAZ
      int etatReedV = 0;//état du capteur reed vert
      int etatReedJ = 0;//état du capteur reed jaune
      int pos = 0;//variable pour stocker la position du servomoteur
      
      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
  void setup() {

    Serial.begin(9600);
  
    // initiliser les LEDs en tant que sortie :
      pinMode(LedF, OUTPUT);
      pinMode(LedV, OUTPUT);
      pinMode(LedJ, OUTPUT);
      pinMode(LedR, OUTPUT);
    
    //initiliser les boutons en tant que entrer :
      pinMode(BoutonD, INPUT);
      pinMode(BoutonR, INPUT);

      //capteur Reed en tant qu'entrer :
      pinMode(ReedV, INPUT_PULLUP);
      pinMode(ReedJ, INPUT_PULLUP);
      
      
    //initialisation du servomoteur
      monservo.attach(13);  // utilise la broche 13 pour le contrôle du servomoteur
     }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
void loop() {
  
  //Contrôle du reed jaune avant cycle (détection capteur bloqué fermé)
    {etatReedJ = digitalRead(ReedJ);
        if (etatReedJ == LOW){
            digitalWrite(LedR, HIGH);
            }else{
                digitalWrite(LedR, LOW);
            }
        }
  //Contrôle du reed vert avant cycle (détection capteur bloqué fermé)         
    {etatReedV = digitalRead(ReedV);
        if (etatReedV == LOW){
            digitalWrite(LedR, HIGH);    
            }else{
                digitalWrite(LedR, LOW);  
            }
        }
                
  //Lit la broche d'entrée du bouton départ
    etatBoutonD = digitalRead(BoutonD);

  //Si le bouton est HIGH alors...
    if (etatBoutonD == HIGH){

  //Demande au servo de se déplacer à ... puis attendre ...    
        for(pos = 0; pos < 135; pos+= 1);
         {
          monservo.write(pos);
         delay(150);
         } 

  //Contrôle du capteur reed vert, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind
                {etatReedV = digitalRead(ReedV);
                    if (etatReedV == LOW){
                        digitalWrite(LedV, HIGH);
                            }else{
                                digitalWrite(LedV,LOW);      
                                }
                              }
                
  //Demande au servo de se déplacer à ... puis attendre ...
        for(pos = 135; pos >=5; pos -=1)
          {monservo.write(pos);
            delay(10); 
          }
          
  //Contrôle du capteur reed jaune, on lis la broche puis si elle est LOW alors on allume la Led verte sinon on éteind          
                {etatReedJ = digitalRead(ReedJ);
                    if (etatReedJ == LOW){
                        digitalWrite(LedJ, HIGH);
                            }else{
                                digitalWrite(LedJ, LOW);
                                } 
                              }
        
  //Demande au servo de se déplacer à ... puis attendre ...
        monservo.write(80); // demande au servo de se déplacer à cette position
            delay(100); // attend 1000 ms entre changement de position

  //Allumer la led de fin de cycle
        digitalWrite(LedF, HIGH); //Allumer la Led en fin de cycle
        }
       
          
  {// lire l'état du bouton RAZ
    etatBoutonR = digitalRead(BoutonR);

  //Si le bouton RAZ est HIGH alors éteind les leds
      if (etatBoutonR == HIGH){
        digitalWrite(LedF, LOW);
        digitalWrite(LedV, LOW);
        digitalWrite(LedJ,LOW);
        }
      }
    }
   

schéma électronique :
Schematic_banc test_2023-07-24-3.pdf (42,9 Ko)

Bref j'ai soudé ma veroboard à mon Arduino pour finaliser mon projet hors le servomoteur fonctionne pendant 5 minutes puis devient incontrôlable.

Mes boutons et leds fonctionnent toujours mais n'arrivent plus à contrôler le servo.

La board est brancher sur le PC en 5v et le servo est un SG90 trouver sur Amazon.

Merci d'avance

Salut @nat_bc.

J'en ai référencé ici quelques uns :

Vers la fin il y a une petite liste de simulateurs Arduino/électronique, si cela peut t’intéresser...
Au plaisir de pouvoir t'aider :+1:
Amitiés
Pandaroux007

si tu cherches un site pour faire des schémas en ligne : https://easyeda.com/fr

  • Site: chez toi
  • Matériel : papier + crayon + photo ou scan

cela fonctionne très bien aussi.

1 Like

Vidéo du servomoteur