2 servo qui se positionnent de manière étrange.
#1
Posté 04 décembre 2017 - 09:05
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
Posté 04 décembre 2017 - 09:18
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#3
Posté 04 décembre 2017 - 09:28
#4
Posté 04 décembre 2017 - 09:35
#5
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
Posté 05 décembre 2017 - 08:37
Bonne idée !
C'est fait.
#7
Posté 05 décembre 2017 - 11:40
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
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
Posté 12 décembre 2017 - 07:36
#10
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
Posté 16 décembre 2017 - 11:17
#12
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
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
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
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
Posté 28 décembre 2017 - 02:25
Pas certain... Peut-être que ton Arduino n'a pas eu la capacité de déplacer le servo avec l'USB en alim.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 ...
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);
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#17
Posté 02 janvier 2018 - 08:03
la masse est commune entre ton alim et l'arduino ?
#18
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
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
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