Très simplement, je contrôle les servos (9g Micro Servos) sur la base de certaines données lues d'ailleurs. Tout fonctionne bien sauf que les servos "tremblent" constamment. Autrement dit, ils vibrent en arrière avec des mouvements très subtils (avec des mouvements intermittents de 1/2 -> 1 cm environ).
J'ai essayé de corriger ce problème dans le logiciel en faisant quelque chose comme:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("X position: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Y position: ");
lcd.print(yRead);
}while( readChange() ); //while there has been change
Lorsque le do-while est nécessaire, initialisez les variables qui stockent la valeur d'asservissement mappée (à l'aide de la bibliothèque d'asservissements Arduino).
La fonction readChange () est définie comme:
int readChange(){
int x_Temp, y_Temp;
x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);
if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change
else return 1; //change
}
Où xRead est la valeur qui a été initialisée (la première sortie d'asservissement mappée).
Bien que ce ne soit vraiment pas une bonne approche. Cela nécessite que les DEUX valeurs ne soient pas modifiées par un facteur DEG (~ 10 degrés, ou ~ 0,28 V dans mon cas). Si j'écris la fonction de telle sorte que OU soit inférieur à DEG, que se passe-t-il si je ne change qu'un seul servo à la fois? Il y a donc un délimitation ..
Est-ce simplement une propriété des servos (peut-être bon marché?) Ou existe-t-il une solution?
Il serait beaucoup plus simple d'inclure un lien pastie. Voici le code complet: http://pastie.org/8191459
J'ai attaché deux servos avec un pointeur laser pour permettre deux degrés de liberté (X, Y). Il existe des options, basées sur l'état de plusieurs boutons, pour contrôler les servos de différentes manières. Le premier est "Motion" où j'ai deux photorésistances qui, en fonction de la quantité d'exposition à la lumière, affectent la position des servos. Je n'ai pas encore implémenté le code pour contrôler les servos par un contrôleur Xbox. Et la troisième option est juste un mouvement aléatoire.
Réponses:
Lorsque vous utilisez la bibliothèque de servomoteurs sur un Arduino, une source courante de buzz de servomoteurs est que les routines de servomoteurs déclenchées par interruption ne donnent pas réellement une impulsion de sortie très stable. Parce que l'AVR prend des interruptions pour l'entretien de l'horloge millis () et d'autres choses dans l'exécution Arduino, la gigue dans la bibliothèque Servo est de l'ordre de plusieurs microsecondes, ce qui se traduit par beaucoup de mouvement dans le servo.
La solution est d'écrire votre propre pouls. Quelque chose comme ça:
Cela désactivera les autres interruptions et générera une impulsion PWM beaucoup plus propre. Cependant, cela fera manquer au chronomètre "millis () quelques tics d'horloge. (La fonction" micros () "peut être appelée quelque chose d'autre - j'oublie exactement quoi.)
En général, pour chronométrer du code critique, vous voulez vous débarrasser entièrement du runtime Arduino et écrire le vôtre en utilisant le compilateur avr-gcc et la bibliothèque avr-libc qui alimentent l'environnement Arduino. Ensuite, vous pouvez configurer une minuterie pour cocher 4 fois par microseconde, voire 16 fois par microseconde, et obtenir une bien meilleure résolution dans votre PWM.
Une autre cause de bourdonnement dans les servos est les servos bon marché avec des capteurs bon marché, où les capteurs sont bruyants, ou lorsque la position exacte demandée avec l'impulsion ne peut pas réellement être codée par le capteur. Le servo verra "passer à la position 1822" et essaiera de le faire, mais se retrouvera avec le capteur lisant 1823. Le servo dira alors "reculer un peu" et il finit avec le capteur lisant 1821. Répétez! La solution est d'utiliser des servos de haute qualité. Idéalement, pas de servos de loisirs, mais de vrais servos avec encodeurs absolus optiques ou magnétiques.
Enfin, si les servos ne reçoivent pas assez de puissance, ou si vous essayez de les alimenter à partir du rail 5V sur l'Arduino, cela générera un bourdonnement induit par la tension dans les servos, comme suggéré ci-dessus. Vous pouvez peut-être le réparer avec de grands condensateurs électrolytiques (qui sont de toute façon une bonne idée pour le filtrage général), mais vous voudrez probablement vous assurer que votre source d'alimentation servo peut réellement fournir plusieurs ampères de courant à la tension servo.
la source
C'est ce qu'on appelle "buzz".
Il y a deux ou trois choses qui vont le provoquer. L'instabilité de l'alimentation du servo est une cause courante. Les servos R / C peuvent dessiner de GRANDES pointes lorsqu'ils mettent le moteur en mouvement pour la première fois.
Il y a de nombreuses années, j'ai joué avec un servo Tower Hobbies Royal Titan Standard, le contrôlant à partir d'un 555 et d'un onduleur à un transistor. Circuit de commande très simple. J'ai appris que le servomoteur tirait 250 mA de l'alimentation 5 V en mouvement continu. Bourdonnant, il dessinait facilement des pointes de demi-ampli. (Peut-être plus: je surveillais simplement le compteur de courant sur mon alimentation de banc, pas la portée d'un shunt de détection de courant.)
Il a fallu 220 uF directement sur mon servo pour l'apprivoiser.
Essayez de mettre un condensateur électrolytique, au moins 100 uF, directement à travers l'alimentation du servo, aussi près que possible du servo électriquement, et voyez si cela aide.
Sur la base de ces expériences, je n'envisagerais jamais d'utiliser des servos R / C pour quoi que ce soit sans ajouter de condensateurs. Cela inclut les modèles radiocommandés.
Cela peut également être causé par la saleté dans le pot du servo à l'intérieur du servo. Essayez d'abord le condensateur.
la source
Votre bourdonnement / tremblement se produit-il uniquement lorsqu'il se trouve aux limites du servo ou à proximité (0 degré ou 180 degrés)? Si c'est le cas, il peut y avoir une solution simple pour vous. J'ai trouvé que les servos bon marché ne savent pas très bien rester aux limites de leurs mouvements, ce qui peut provoquer le bourdonnement / tremblement dont vous parlez. Cependant, si vous limitez simplement leur plage à 10 ~ 170 degrés, le problème sera résolu.
Si cela ne vous convient pas, vous pouvez suivre les correctifs les plus complexes mentionnés dans les autres réponses, comme une meilleure puissance, de meilleurs capteurs d'asservissement, etc.
la source
J'ai résolu mon problème en "éteignant le servo" après l'avoir déplacé. Exemple:
PIN
est la broche PWM connectée à votre servo. en le commutant en mode d'entrée, j'ai pu arrêter la vibration. Ce n'est pas une solution optimale et je suggère d'essayer d'abord les autres solutions.la source
J'ai eu le même problème avec les servos MG90S (tremblement), mes lignes de signal sont relativement longues (60 ~ 70cm), plaçant un condensateur 103 (10nF) sur le signal et les lignes de masse ont résolu le problème pour moi (j'ai placé le condensateur quelque part dans le milieu, au point où le câble servo d'origine se connecte à mon câble interne).
De plus, je ne pouvais pas utiliser la bibliothèque de servomoteurs standard car le premier minuteur qu'il saisit sur l'Arduino Mega est le Timer-5 et j'en ai besoin pour la mesure de fréquence. Comme j'utilise seulement 10 servos, j'ai extrait le code clé de la bibliothèque Servo et l'ai changé en utilisant Timer-1 (chaque minuterie prend en charge un maximum de 12 servos sur le Mega).
Le code autonome est ci-dessous pour référence, si vous souhaitez l'inclure dans votre propre projet, vous pouvez utiliser uniquement la partie supérieure, la partie inférieure est pour tester la partie supérieure (il écoute sur le port série, vous pouvez donner sX et les commandes vX, où sX sélectionne un servo, s0 sélectionnerait le premier servo, vX définit la position du servo en nous, donc v1500 mettrait servo0 en position médiane, en supposant que vous avez donné une commande s0 en premier).
la source
Ma meilleure option dans ce cas était d'attacher et de détacher les servos à chaque opération.
PS. ce n'est vraiment pas une qualité du tout, juste une solution de contournement.
la source
Alors que d'autres ont suggéré diverses solutions à ce problème de buzz, dans ce fil et dans d'autres forums Arduino, à savoir:
Dans mon cas, j'ai constaté que le bourdonnement s'arrêtait lorsqu'une alimentation 9V / 2A était branchée sur la carte Arduino. Mais la solution ultime la plus simple était simplement de déplacer lentement le servo:
YMMV.
la source
la source
Pour moi, cela ressemble à des erreurs ou à un mauvais réglage de la boucle de rétroaction. Les systèmes de servocommande haut de gamme ont une certaine connaissance des caractéristiques du moteur (inductance, couple, courant de crête, nombre de pôles), de la charge (moment d'inertie) et des conditions instantanées (position, tr / min, back-emf, courant). Avec ces informations, le programme de contrôle du moteur peut faire des prédictions sur ce que le servo fera en réponse à une entrée donnée du contrôleur (c'est-à-dire une entrée courant / tension) et sur cette base, générer l'entrée optimale pour atteindre la sortie souhaitée.
Comme vous pouvez l'imaginer, c'est quelque chose de quelque peu compliqué, mais une recherche sur Internet sur les commentaires des servos vous aidera à démarrer.
la source