Aller au contenu


Photo
- - - - -

2 servo qui se positionnent de manière étrange.


  • Veuillez vous connecter pour répondre
22 réponses à ce sujet

#1 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 04 décembre 2017 - 09:05

Bonjour,
Tout d'abord je suis un grand débutant, alors merci d'être indulgents dans vos réponses.
J'ai connecté 2 servo de marque différente sur ma carte arduino Duemilanove de manière à articuler une tête en inclinaison et rotation.
J'ai branché une alimentation 12v sur l'arduino.
J'ai utilisé la bibliothèque servo et inscrit dans le loop un changement de position de + ou- 10 ° en fonction de la commande clavier envoyée via le moniteur série.
Bon ça fonctionne :)
Enfin, ça fonctionne bizarrement...
Mo' servo rotation se repositionne à 90 ° à chaque fois que j'arrête le programme. Mon servo inclinaison reste dans la dernière position.rt si dans le setup je fixe une position, mon servo inclinaison ne s'y placé pas, le rebel !!
Pourquoi ont-ils un comportement différent ?
Chose encore plus étrange, mon servo rotation (le docile), ne bouge pas si je lui donne une indication de + 10°, ou plus encore. Il faut que je lui donne une indication de- 20° ( donc 70° en position absolue) pour qu'il se positionne directement à 180°...
Puis, dépassé un certain stade de déplacement en avant, en arrière.. Il finit par se positionner effectivement à l'angle demandé ( je suis l'angle de commande sur le moniteur).
L'autre servo à aussi un comportement anarchique jusqu'à un certain stade, puis il rentre dans le rang, le bougre ! Enfin plus ou moins...
Auriez-vous une idée sur l'origine possible de ce comportement ouvertement anti novice ?

#2 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 769 messages
  • Gender:Male

Posté 04 décembre 2017 - 09:18

Je ne vais pas te répondre, j'en suis incapable, mais si tu veux gagner du temps, tu devrais donner la marque ainsi les caractéristiques de tes servos et le code que tu as utilisé.

#3 Path

Path

    Made By Humans

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

Posté 04 décembre 2017 - 09:28

Le câblage aussi. Il se peut que les servos soient sous alimentés.

#4 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 04 décembre 2017 - 09:35

Merci pour vos réponses. C'est noté. Quand je serai de retour chez moi, en fin de semaine, je compléterai ma question avec des données plus techniques.

#5 Path

Path

    Made By Humans

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

Posté 04 décembre 2017 - 10:34

En attendant, si tu pouvais faire une petite présentation de toi dans le sujet adequat, ce serait sympa de savoir à qui on parle :)

Ça nous aidera à mieux t'aider.



#6 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 05 décembre 2017 - 08:37

Bonjour Path,
Bonne idée !
C'est fait.

#7 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 05 décembre 2017 - 11:40

Peut être un réglage du signal qui les contrôle ?

servo.attach(pin, min, max)

Essai par exemple avec min:1000 et max:2000
Ça ajuste la largeur de l'impulsion qui contrôle ton servomoteur.

#8 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 10 décembre 2017 - 08:59

Merci pour ton idée ashira mais je crois que ce n'est pas la bonne piste, j'avais étalonné les servos au préalable.

 

J'ai finalement résolu le problème concernant mon servo en inclinaison. Il s'agissait en effet, d'un problème d'alimentation. Il avait besoin d'une tension comprise entre 6 et 7,4 V. Du coup, avec l'arduino et les 5V en sortie c'était trop faible pour positionner le servo à une position de départ éloignée de sa position actuelle.

Avec une alimentation 7,4 V ça roule !

Il s'agit d'un QUIMAT DLX-218 180° (tension : 6 à 7,4 V)

 

Par contre j'ai toujours mon souci avec le servo en rotation.

Il s'agit d'un KOOKYE mini digital 180°

Tension : 3 à 7,2 V

0,17s / 60°

Petite précision, le problème ne se produit qu'après déconnexion / reconnexion de l'USB du PC.

En fin de programme, le servo se repositionne à 90° => Ok

J'utilise les touches de mon clavier pour le faire tourner à gauche ou à droite de 5° ou 10°

Mais au départ, mes commandes sont sans effet, jusqu'à ce que j'arrive à une commande >= 65° => Il se positionne alors dans une position réelle de 180°

Ensuite, chaque commande le fait revenir en arrière de 5°, mais il est complètement décalé entre l'indication de position et la position réelle.

Il faut que je le repositionne une seconde fois à >= 65° pour qu'il se place cette fois en position réelle 0°

A partir de là je peux le positionner directement à 90° à l'aide du touche dédiée, et il se positionne effectivement à 90°

Ensuite son comportement est tout à fait normal, même si j'arrête et que je relance le moniteur.

La galère revient quand je débranche puis rebranche le cable USB.

 

 

Le code :

#include <Servo.h>

// Les servomoteurs de la tête ////////////////////////
int tete_inclinaison;
int tete_rotation;
const int CENTRE = 90;
const int DECAL = 5;
Servo servo_tete_inclinaison;
Servo servo_tete_rotation;
char commande;
///////////////////////////////////////////////////////

void setup()
{
// Servomoteurs ////////////////////////////////////
    servo_tete_inclinaison.attach(9,600,2400);
    servo_tete_rotation.attach(10,600,2400);
    //on commence par positionner les servos au centre
    servo_tete_inclinaison.write(CENTRE);
    servo_tete_rotation.write(CENTRE);
    
    Serial.begin(9600);
    Serial.println("Go");
    tete_inclinaison = servo_tete_inclinaison.read();
    tete_rotation = servo_tete_rotation.read();   
    Serial.print("Position départ inclinaison : " );
    Serial.println(tete_inclinaison, DEC);
    Serial.print("Position départ rotation : " );
    Serial.println(tete_rotation, DEC);
////////////////////////////////////////////////
}

void loop()
{
    //réception d'une commande moteur sur la liaison série ?
    if(Serial.available())
    {
        commande = '0';
        commande = Serial.read(); //on lit
        
        //on modifie la consigne si c'est un caractère qui nous intéresse
        if(commande == '5')
        {
            tete_inclinaison = CENTRE;
            tete_rotation = CENTRE;
        }
        else if(commande == '2')
        {
            tete_inclinaison += DECAL;  //ajout de 10° au servo 1
        }
        else if(commande == '8')
        {
            tete_inclinaison -= DECAL;  //retrait de 10° au servo 1
        }
        else if(commande == '6')
        {
            tete_rotation += DECAL;       
        }
        else if(commande == '4')
        {
            tete_rotation -= DECAL;
        }
        else if(commande == '3')
        {
            tete_inclinaison += DECAL;
            tete_rotation += DECAL;
        }
        else if(commande == '1')
        {
            tete_inclinaison += DECAL;
            tete_rotation -= DECAL;
        }
        else if(commande == '9')
        {
            tete_inclinaison -= DECAL;
            tete_rotation += DECAL;
        }
        else if(commande == '7')
        {
            tete_inclinaison -= DECAL;
            tete_rotation -= DECAL;
        }     
        else commande = '0';

        if (commande != '0')
         {
        //si une commande a été précisée on modifie le ou les angles    
        servo_tete_inclinaison.write(tete_inclinaison);
        servo_tete_rotation.write(tete_rotation);        

        //et on fait un retour sur la console pour savoir où on est rendu
        Serial.print("Inclinaison : " );
        Serial.println(tete_inclinaison, DEC);
        Serial.print("Rotation : " );
        Serial.println(tete_rotation, DEC);      
        }
   }
}

Si quelqu'un a une idée ...



#9 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 12 décembre 2017 - 07:36

Tu initialise ta variable comme ça : tete_rotation = servo_tete_rotation.read() . As tu vérifier quelle valeur tu as ? Car je pense que ta variable est mal initialisée et que du coup ça ne fait pas ce que tu veux jusqu'à ce que tout les valeurs correspondent.

#10 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 16 décembre 2017 - 10:49

Merci pour ton idée arobasseb,

J'ai essayé d'initialiser ma variable comme tu le préconises, malheureusement ça n'a pas marché.



#11 BrunoS

BrunoS

    Membre

  • Membres
  • 20 messages
  • Gender:Male

Posté 16 décembre 2017 - 11:17

Je ne vois pas de pb dans ton code, toujours un pb elec? Pour etre certains fais du diag : Dans ton moniteur tu affiches toujours la valeur theorique, pas la réelle. Pour debug tu devrais ajouter sur ton dernier println la valeur de servo_tete_rotation.read().

#12 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 17 décembre 2017 - 10:42

Merci pour ton idée arobasseb,

J'ai essayé d'initialiser ma variable comme tu le préconises, malheureusement ça n'a pas marché.

Quelle valeur s'affiche au lancement du programme pour la valeur tete_rotation ?



#13 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 28 décembre 2017 - 11:22

En initialisant la variable comme tu l'indiques arobasseb j'obtiens au départ une valeur de 93 deg sur le moniteur. 

 

BrunoS, j'ai modifié mon affichage série pour avoir la valeur théorique et la valeur réelle (avec  servo_tete_rotation.read() ). Les deux valeurs affichées sont identiques.



#14 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 28 décembre 2017 - 11:35

Par ailleurs j'ai branché mon servo rotation sur une alim externe et j'ai changé la pin de connexion pour la 11 => Toujours le même comportement

 

J'ai également essayé avec un autre servo de la même marque, identique => pareil ...



#15 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 28 décembre 2017 - 11:52

Et pour être plus précis j'ai modifié la consigne pour un changement d'angle de 1 degré à chaque fois.

 

A partir d'une position de départ de 93 deg, il faut que je descende à 71 deg pour qu'il se déplace d'un seul coup sur une position de l'ordre de 180 deg

 

Par contre j'ai remarqué que le problème ne se pose pas si je branche l'alimentation externe des servo après avoir branché le cable USB relié au PC. Peut-être une piste ...



#16 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 769 messages
  • Gender:Male

Posté 28 décembre 2017 - 02:25

Par contre j'ai remarqué que le problème ne se pose pas si je branche l'alimentation externe des servo après avoir branché le cable USB relié au PC. Peut-être une piste ...

Pas certain... Peut-être que ton Arduino n'a pas eu la capacité de déplacer le servo avec l'USB en alim.
A ta place, je brancherai l'alim avant l'USB.
Jusqu'à là, tu as eu peut-être de la chance.
Dans le peu de programme que j'ai fait pour Arduino, j'ai toujours démarrer le programme avec cette simple ligne dans fonction setup() qui attend l'appui sur un bouton en pin 13, avant d'executer la fonction loop() ou tout autre chose:
while((switchState = digitalRead(13))==0);

#17 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 382 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 02 janvier 2018 - 08:03

la masse est commune entre ton alim et l'arduino ?



#18 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 04 janvier 2018 - 08:40

Merci pour votre aide.

 

Oui Forthman, je te confirme que la masse est commune. D'ailleurs au début j'avais testé sans alim externe et j'avais déjà le problème.

 

Oracid, ta proposition est intéressante, mais je n'ai pas de bouton à connecter sur la pin 13 (et de toute façon pas la moindre idée de comment le connecter LOL)

 

Au final je pense que ça doit venir de mon servo qui doit être un peu pourri ...

 

Je vais poursuivre mon programme en lui lançant au départ deux consignes de passage à 71 deg pour le calibrer avant de le replacer à 90 deg, et je vais changer de marque pour les prochains servo que je vais acheter ...

 

Il faut avancer un peu !

 

Merci pour vos contributions. :)



#19 Forthman

Forthman

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 382 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 04 janvier 2018 - 09:50

Un servo qui fait un peu n'importe quoi, ça peut venir soit d'un manque de jus (tension et/ou intensité de l'alimentation trop faible)

ou alors d'un problème dans la régularité du signal PWM

 

Les servo ont aussi des fréquences maxi et mini pour traiter le signal, à voir si tu n'es pas en dessous ou au dessus.

 

Désolé, je n'y connais pas grand chose en arduino, alors je ne vais pas pouvoir t'aider beaucoup plus,

mais si tu as un oscillo, tu devrais commencer par regarder ces signaux pwm



#20 kekliard

kekliard

    Membre

  • Membres
  • 13 messages

Posté 04 janvier 2018 - 10:15

Je n'ai pas d'oscillo, mais je pense que le signal est correct vu que ça fonctionne correctement avec l'autre servo de marque différente.

 

Par ailleurs j'ai testé les amplitudes en mode pas à pas avec des instructions en millisecondes plutôt qu'en valeur d'angle.

 

Pour ce qui est du jus, je pense qu'avec une alim externe en 7,4 V et 1300 mah je suis largement dans les clous.

 

Je vais mettre ce sujet de côté et passer sur d'autres problèmes à régler histoire d'avancer un peu dans mon projet.

 

Merci encore Forthman.






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

0 members, 0 guests, 0 anonymous users