LOCODUINO

Parlons Arduino => Vos projets => Discussion démarrée par: babskwal le février 20, 2022, 05:18:35 pm

Titre: Mes servos chantent même à l'arrêt
Posté par: babskwal le février 20, 2022, 05:18:35 pm
Bonjour,
Je viens de programmer un Arduino Mega pour gérer le mouvement de deux servos utilisés comme moteurs d'aiguillages lents pour les aiguilles 1a et 1b (les moteurs sont des DLY2de DLYmoteur).
Pour le moment, je les commande avec des caractères saisis sur le moniteurs série de l'ordi, à titre d'essai.
Quand le sketch démarre, tt est ok, mais après un premier mouvement, le servo est en position, mais continue le même petit bruit léger que quand il bouge.
Du coup, après avoir utilisé les 2 aiguillages, même sans mouvement, j'entends les servos qui continuent à "chanter" à l'arrêt.
Comment éviter cela ?
Mon code :
#include <Servo.h>

const byte dir_1a = 60;      // Position ("angle") pour aig1a en voie directe
const byte dev_1a = 130;     // Position ("angle") pour aig1a en voie déviée
const byte dir_1b = 60;      // Position ("angle") pour aig1b en voie directe
const byte dev_1b = 130;     // Position ("angle") pour aig1b en voie déviée
Servo moteur_aig_1a;         // crée l’objet pour contrôler le servomoteur "moteur_aig_1a"
Servo moteur_aig_1b;         // crée l’objet pour contrôler le servomoteur "moteur_aig_1b"

void setup()
{
    Serial.begin(9600);
    Serial.println("_________");
    Serial.println("");
    Serial.println("Démarrage (A pour Aig1a en voie déviée | Z pour Aig1a en voie directe | Q pour Aig1b en voie déviée | S pour Aig1a en voie directe)");
    Serial.println("_________");
    moteur_aig_1a.attach(9);
    moteur_aig_1b.attach(10);
}

void loop()
{
    if( Serial.available())
    {
        byte incomingByte = Serial.read();
        if (incomingByte == 65)                      // Si on reçois un A du moniteur série
        {
            bouge_moteur(moteur_aig_1a, dev_1a);     // On met Aig1a en voie déviée
        }
        else if (incomingByte == 90)                 // Si on reçois un Z du moniteur série
        {
            bouge_moteur(moteur_aig_1a, dir_1a);     // On met Aig1a en voie directe
        }
        else if (incomingByte == 81)                 // Si on reçois un Q du moniteur série
        {
            bouge_moteur(moteur_aig_1b, dev_1b);     // On met Aig1b en voie déviée
        }
        else if (incomingByte == 83)                 // Si on reçois un S du moniteur série
        {
            bouge_moteur(moteur_aig_1b, dir_1b);     // On met Aig1b en voie directe
        }
    }
}

void bouge_moteur(Servo moteur, byte position)
{
    if (position>moteur.read())                           // Si l'angle final est supérieur à l'initial
    {
        for (int i = moteur.read() ; i < position ; i++)  // On boucle de la position actuelle à la position demandée en incrémentant de 1
        {
            moteur.write(i);                              // On met le servo dans la position incrémentée
            delay(20);                                    // On attend 20 ms
        }
    }
    else if (position<moteur.read())                      // Si l'angle final est inférieur à l'initial
    {
        for (int i = moteur.read() ; i > position ; i--)  // On boucle de la position actuelle à la position demandée en décrémentant de 1
        {
            moteur.write(i);                              // On met le servo dans la position décrémentée
            delay(20);                                    // On attend 20 ms
        }
    }
}
:
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: msport le février 20, 2022, 07:32:23 pm
Bonjour,

je verrais bien des attach / detach bien placés mais il y a peut-être plus subtil.
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: dmskd le février 20, 2022, 11:35:26 pm
Bonsoir,

Il suffit de couper la tension d'alimentation du servo quand il a atteint sa position.
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: babskwal le février 21, 2022, 07:40:28 am
Merci de vos réponses !

Citer
attach / detach bien placés
oui, pourquoi pas.

Citer
couper la tension d'alimentation du servo quand il a atteint sa position
on peut le faire en code Arduino ?
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: dmskd le février 21, 2022, 11:11:57 am
Bonjour babskwal,
Oui on peut le faire en code Arduino en alimentant le servo via un circuit ULN2803.
En basculant une entrée de l'ULN on autorise ou on bloque la sortie correspondante (voir schéma joint).
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: babskwal le février 21, 2022, 11:30:24 am
Oui, OK, c'est possible comme ça. N'est-ce pas un peu l'artillerie lourde par rapport à la solution attach/detach ?
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: Tony04 le février 21, 2022, 12:59:33 pm
Bonjour,

avez-vous essayé la librairie SlowMotion de Locoduino: https://www.locoduino.org/spip.php?article159

Une vrai petite pépite et vous avez aussi l'option detach avec un préréglage du temps avant la coupure. 

Cordialement
Antoine
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: babskwal le février 21, 2022, 05:05:45 pm
IL faudrait que j'essaye ! C'est pas immédiat  ;)
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: dmskd le février 21, 2022, 05:40:08 pm
Citer
Oui, OK, c'est possible comme ça. N'est-ce pas un peu l'artillerie lourde par rapport à la solution attach/detach ?
Je ne sais pas ce que fait attach/detach, je n'ai jamais essayé.
Est-ce que le moteur reste alimenté ? Est-ce qu'il continue à consommer du courant ?

Le montage que j'ai présenté a été motivé par le fait qu'il pouvait y avoir des mouvements incontrôlés du servo lors de la mise sous tension du décodeur.
Le fait de démarrer le signal PWM avant de mettre le moteur sous tension a résolu ce problème,  d'où ce schéma qui permet de contrôler l'alimentation.

Cordialement,
Dominique
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: babskwal le février 22, 2022, 01:44:10 pm
J'ai essayé le système attach/detach ; il semble satisfaisant sur le sujet initial du bruit. J'imagine donc qu'il ne doivent plus consommer.
En revanche, comme je passe par une fonction "mouvement_moteur" qui prenait pour arguments :
- la position à atteindre (un byte, prédéfini dans les déclarations avec la bonne valeur pour la position en voie directe et en voie déviée pour chaque appareil de voie)
- un servo (donc un moteur)
J'ai été obligé d'ajouter un troisième argument à ma fonction, à savoir la pin à laquelle attacher et détacher le servo. Je crois que je vais créer des objets "moteurs" comprenant un servo et sa pin...
Titre: Re : Re : Mes servos chantent même à l'arrêt
Posté par: Jean-Luc le février 23, 2022, 09:29:00 am
Bonjour,

Le montage que j'ai présenté a été motivé par le fait qu'il pouvait y avoir des mouvements incontrôlés du servo lors de la mise sous tension du décodeur.
Le fait de démarrer le signal PWM avant de mettre le moteur sous tension a résolu ce problème,  d'où ce schéma qui permet de contrôler l'alimentation.

J'ai également rencontré ce problème qui se règle est tirant le signal de contrôle du servo au 5V via une résistance de 10k par exemple.

Il semble que ce mouvement incontrôlé soit dû à l'électronique du servo qui pense voir un créneau sur le signal quand la tension monte à l'allumage.

Cordialement.
Titre: Re : Re : Mes servos chantent même à l'arrêt
Posté par: Jean-Luc le février 23, 2022, 09:32:55 am
Je ne sais pas ce que fait attach/detach, je n'ai jamais essayé.
Est-ce que le moteur reste alimenté ? Est-ce qu'il continue à consommer du courant ?

detach coupe le pulse de commande. Le servo n'est plus asservi mais reste alimenté.
Titre: Re : Mes servos chantent même à l'arrêt
Posté par: dmskd le février 23, 2022, 05:44:31 pm
Merci Jean-Luc pour ces précisions.