Aller au contenu


Photo
- - - - -

[Arduino]Lire la position d'un servo.


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

#1 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 07 juin 2010 - 07:38

Bonjour !

Je suis en train de chipoter avec un servomoteur -décidément, j'ai jamais été autant productif que pendant mes examens...- et j'ai un petit problème.

En gros, j'ai juste branché le servomoteur et un potentiomètre pour le faire tourner "manuellement".

Le problème que je rencontre est le suivant : Quand je ne touche plus au potentiomètre, le servomoteur ne se stabilise pas. Il continue de bouger et il "oscille" au niveau du point de consigne.

Et donc comment lire la position du servomoteur ? Parce que si j'ai sa position je peux lui dire qu'une fois que la valeur demandée est proche de sa position il peut arrêter.. (jusqu'à la prochaine modification de la valeur).

#2 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 07 juin 2010 - 10:46

Ah moins d'avoir un servo moteur numérique, tu ne peux pas (et encore même avec un numérique je suis pas sur qu'on puisse...)

L'oscillation provient peut-être de la conversion analogique/numérique, qui est ptet pas tout as fait fiable et donc aurait tendance à varier et donc fait une consigne qui varie aussi... ??

Autre idée,
Je ne sais pas comment est fait ton code, mais si jamais ta conversion "rajoute du temps" au niveau de la commande du servomoteur (autrement dit si tu dépasse les 20 millisecondes de MLI et les 1 à 2 ms d'état haut) alors c'est normal d'avoir des comportements étranges...
=> Vérifie les durées du signal de ton servo avec un oscillo...

#3 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 08 juin 2010 - 07:34

J'ai pas compris l'utilité de couplé un pot au servo moteur...
Il y en a déjà un dedans qui s'occupe de faire la régulation et tu commande le servo en position, donc tu sait exactement ou il est !!

Pour tes problèmes d'oscillations, ton pas entre deux positions est peut êtres trop grand! Des oscillations tu en aura toujours dans un système de régulation comme celui-la, soit tu les limites en ayant une commande en position précise se qui fera des petites oscillations, soit tu filtre l'entrée du retour de positon (le pot) afin que les variations de positions soient lentes.

#4 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 08 juin 2010 - 11:07

Ah mon avis l'idée de ce système est d'avoir une entrée utilisateur (le potentiomètre) et une sortie mécanique (le servo moteur) asservi à l'entrée utilisateur...

Par exemple il tourne le potentiomètre qui se trouve sur sa table de chevet et ça oriente la webcam fixé sur le servo dans la direction souhaité... (pour regarder les étoiles par exemple.... ou la voisine...)

#5 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 08 juin 2010 - 12:53

Coupler le servomoteur avec un potentiomètre, c'est effectivement juste pour le faire tourner manuellement. (Et pas avec un programme et des commandes toutes faites).

(Comme expliqué ici, par exemple)



C'est surtout pour tester le servo et m'amuser un peu.



J'ai toujours ce problème d'a-coups mais avec le poid, ça va déjà mieux. (J'ai fixé une vieille tête de poupée sur le servo, pour que ça soit un peu plus drôle...)

J'ai mis la vidéo sur youtube, que vous voyiez ça ! (C'est pas du grand art, c'est juste du chipotage..)



HGOMLXANcF8

#6 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 08 juin 2010 - 03:51

Ok, c'est le terme couplage qui m'a induit en erreur, je voyait le servo faisant bouger le potentiomètre...

Le retour de position n'est pas utile et donc personne ne l'implémente, même pour les servos numérique, vu que c'est toi qui donne le consigne de position. Tu sait ou il doit être et ou il est avec un petit retard.
C'est l'électronique du servo qui gère, et si la consigne de position est constante le servo ne doit pas bouger, au pire ils "chantent". Surtout pour les servos numériques, comme ils sont précis ils cherchent toujours leurs position et vibre avec de petites amplitudes.

Donc si ta consigne est fixe pas raison d'avoir des oscillations, comme l'a dit Eskimon regarde au niveau de ta conversion AD, prend seulement des MSB (8 MSB dans le cas du conversion 10bits, ce qui est courant).

#7 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 08 juin 2010 - 08:33

J'ai réglé le problème en mettant un
avant chaque lecture de la valeur du potentiomètre. Apparemment, ça suffit pour qu'il n'oscille plus.

Par contre, ce n'est pas très fluide quand ça tourne...
Il va falloir que je chipote pour régler ça.

J'ai aussi hâte de rajouter les leds. Le seul problème étant que pour les mettre dedans, je vais pas avoir d'autre choix que de les souder au fil.
Et du coup, je prends le temps de bien réfléchir avant de sortir le fer à souder. :tare:

#8 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 08 juin 2010 - 09:27

Bof au pire ca peut toujours se déssouder plus tard...
Sinon il y a la solution (dégeulasse oui) du domino... :|

#9 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 08 juin 2010 - 10:25

Ouais, mais bonjour le chipotage... Si je dois souder j'aime autant pas devoir déssouder l'heure qui suit parce qu'un truc ne va pas...

Le domino peut être effectivement une solution temporaire, faudrait que je regarde ce que j'ai en stock. :)


Je verrai ça demain.

#10 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 09 juin 2010 - 11:20

On est demain... alors ?? j'attend la poupée psychédélique...

#11 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 09 juin 2010 - 12:14

Je suis en examens quand même !
Même si je n'étudie pas beaucoup, je dois quand même aller jusqu'à l'école répondre à leurs questions. Laisse-moi le temps de rentrer... ^^

Je me pose une question pour le fait de mettre des leds d'ailleurs.
Plutôt d'ordre mécanique... Les fils pour les leds, comment je les fais passer dans la poupée ? Sachant que ça va bouger...
Je dois les faire passer le plus proche possible de l'axe du servo pour que ça bouge le moins possible ?

#12 Glius

Glius

    Habitué

  • Membres
  • PipPip
  • 157 messages

Posté 09 juin 2010 - 01:35

Hello,



Si je peux me permettre une idée par rapport à tes premiers messages...



Regardons si j'ai bien compris



De ce que je comprends :

- Tu lis une valeur grâce au potentiomètre ;

- Tu convertis en une valeur ;

- Tu fais bouger ton Servomoteur.

==> Problème, ça vibre !



Comme ça a été proposé, je pense aussi que ça vient de la conversion qui ne donne pas les mêmes valeurs pour une même position. En effet, sans bouger le potentiomètre, tu peux avoir (par exemple):

- une valeur de 3,250 à la première lecture

- à la lecture suivant 3,252

- à la lecture suivant 3,248

- ...

Les causes sont multiples et avec certaines complètements stochastiques comme les parasites ! Ta mesure est bonne, mais les parasites sont tels que tes valeurs mesurées oscillent aléatoirement autour de ta bonne valeur. Il s'agit d'un bruit blanc je pense :http://fr.wikipedia.org/wiki/Bruit_blanc (la courbe mesurant I est assez claire car on voit bien qu'on a la bonne mesure mais qu'on oscille autour).



Tu te proposes de mettre des délais entre les mesures... ce qui ne fera qu'augmenter le temps entre chaque mesure. Résultat, tu vas tout de même avoir des lectures différentes et donc des oscillations... simplement la fréquence sera beaucoup plus faibles et les vibrations ressembleront plutôt à de petits mouvements. Le problème n'est pas supprimé mais "caché". :o



Si j'ai bien tout compris, voici la solution que je propose :

Il s'agit d'ajouter du code pour faire des espaces de tolérances. L'idée est de comparer chaque mesure à la suivante et de voir selon une tolérance. Si tu es dans ton espace de tolérance, cela signifie que tu n'as pas touché le potentiomètre.



Exemple :

Mettons une tolérance de 10 % (ce qui me parait énorme, mais est bien pour l'exemple) et reprenons les valeurs précédentes.

- première mesure : 3,250 avec la tolérance de 10 % on a un minimum de : 3,250 - 3,250 * 10% = 2,925 et un maximum de 3,575



- Ta deuxième mesure est de 3,252. Or : min = 2,925 < lecture = 3,252 < 3,575 . Tu es dans l'intervalle de tolérance, donc ça signifie que tu as juste une erreur de lecture... résultat : ne pas bouger le servo !



- Ta troisième mesure est de 3,248. De la même manière, tu es dans l'intervalle dpar rapport à la mesure précédente (min = 3,252 -10% et max = 3,252 + 10%)... résultat : ne pas bouger le servo !



- Ta quatrième mesure est de 10. La tu n'es clairement plus dans ton intervalle ! Résultat : il faut bouger le servo car tu as sûrement du bouger le potentiomètre ! :D



Par contre, il y a deux stratégies :

1 / prendre une valeur de référence : tu prends une mesure, tu calcules ton maximum et ton minimum et tu ne changes ces valeurs que lorsque tu es sorti de l'intervalle. (dans l'exemple ci-dessus, tu garderais tes valeurs min = 2,925 et max = 3,575 jusqu'à ce que tu les dépasses.

Caractéristiques : peu gourmand en calcul car à chaque itération, tu n'as pas à recalculer ton intervalle.



2 / Tu mets à jour à chaque fois : pour chaque mesure, tu regarde ton écart par rapport à la valeur précédente. Cet exemple a été utilisé précédemment.

Caractéristiques : gourmand en calcul et si tu tournes en continue, mais très très doucement ton potentiomètre, tu pourras faire un tour sans que le servo est bougé (si la tolérance est trop grande)



En première idée (mais à discuter), la première stratégie est la plus intéressante.[/color]



De manière générale : ne pas mettre une tolérance trop grande car sinon, si tu fais varier un tout petit peu ton potentiomètre, ton système pensera que c'est un parasite !



J'espère avoir été clair :heu: Sinon je peux essayer de ré-expliquer.

En pratique, je pense que ta tolérance est à déterminer avec des essais...



Merci de me faire un petit retour sur ce que je viens d'exposer : est ce que je n'ai rien compris au problème :( ? est ce que tu vas essayer :D ? Les résultats ? ;) ? etc.



Bien à vous,

Glius.



#13 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 09 juin 2010 - 06:37

Tes observations et ton raisonnement sont fort intéressants.. Je pense que je vais réfléchir à une programmation de ce genre. :)

Quand j'aurai officiellement un peu plus de temps...



Sinon, j'ai trouvé quelque chose d'intéressant : On peut bien lire la position d'un servomoteur "classique".

(Voir le site de joffrey kriegel, il (JBot) en parle aussi sur le forum de l'association calliban.)



Il faut faire un peu de soudure mais ça a l'air faisable.

#14 Polo753

Polo753

    Nouveau membre

  • Membres
  • 7 messages

Posté 01 juillet 2010 - 01:14

Bonjour Esprit

Voila moi j'ai fait le meme montage avec un vieux servo qui avais pas tournée depuis des années et le résultat est plutôt correct...

xdvvbo_arduino-servo-potentiometre_tech

Jte passe le code qui va avec :

// --- Programme Arduino ---
// par X. HINAULT - 02/2010
// www.mon-club-elec.fr

// --- Que fait ce programme ? ---
/* Positionne un servomoteur à l'aide d'une résistance variable (potentiomètre) 10K*/

// --- Fonctionnalités utilisées ---
// Utilise la conversion analogique numérique 10bits sur les voies analogiques analog 0,
// Utilise les servomoteurs

// --- Circuit à réaliser ---

// Connecter sur la broche 2 (configurée en sortie) la broche de commande d'un servomoteur.
// Broche Analog 0 (=broche 14) en entrée Analogique :
// connecter la sortie d'une résistance variable connectée entre 0V et 5V.

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include // librairie pour servomoteur

// --- Déclaration des constantes ---
const int POS_MIN=550; // largeur impulsion pour position 0° servomoteur
// POS_MIN=550 pour futaba S3003
const int POS_MAX=2330; // largeur impulsion pour position 180° servomoteur
// POS_MAS=2330 pour futaba s3003

int angle_servo=0; // variable pour angle du servomoteur

// --- constantes des broches ---

const int broche_servo=2; //declaration constante de broche
const int Voie_0=0; //declaration constante de broche analogique

// --- Déclaration des variables globales ---
int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique


// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
Servo mon_servo; // crée un objet servo pour contrôler le servomoteur


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup() { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage ---

mon_servo.attach(broche_servo, POS_MIN, POS_MAX);
// attache l'objet servo à la broche de commande du servomoteur

// ------- Broches en sortie -------

pinMode(broche_servo, OUTPUT); //met la broche en sortie

// ------- Broches en entrée -------


// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------


} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal ---

// acquisition conversion analogique numérique (100µs env.)
//sur broche analogique indiquée - résultat 10bits (0-1023)
mesure_brute=analogRead(Voie_0);

angle_servo=map(mesure_brute,0,1023,0,180);
// convertit la valeur mesurée comprise entre 0 et 1023 en un angle entre 0 et 180

// map(value, fromLow, fromHigh, toLow, toHigh); // permet changement d'échelle simplifié

mon_servo.write(angle_servo); // positionne le servo à l'angle voulu

delay (100); // pause entre 2 mesures et modif position servomoteur

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---


#15 alex93

alex93

    Habitué

  • Membres
  • PipPip
  • 283 messages

Posté 26 août 2010 - 05:14

Plus tard tu deviendra un moustachu sans humour Attention ;)

#16 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 28 août 2010 - 08:32

Un amateur de reggae ! ;)

À partir de lundi, j'ai deux semaines où je comptes bien développer un paquet de petites choses sur l'arduino.
Des choses simples : servo, boutons poussoirs, leds, capteur ultrason, ...

Tester un peu toute sorte de petites choses.

Je vous tiendrai au courant !




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

0 members, 0 guests, 0 anonymous users