Question:
Que fait-on couramment pour arrêter un servo après avoir atteint la position souhaitée?
Bajie
2014-09-07 00:18:52 UTC
view on stackexchange narkive permalink

Quand j'ai commencé Arduino, je ne m'attendais pas à ce que tout soit contenu dans une boucle infinie. J'ai pensé que je pourrais écrire quelque chose comme: démarrage du moteur -> arrêt du moteur. Mais en réalité, ce que j'obtiens, c'est le démarrage du moteur -> arrêt du moteur -> démarrage du moteur -> ... pour toujours et à jamais.

Que fait-on couramment pour arrêter un servo après qu'il soit dans une position souhaitée? Dois-je utiliser servo.write (position souhaitée) pour l'empêcher de tourner? Dois-je détacher le fil de sortie?

Quels sont certains des risques encourus?

Sept réponses:
jdr5ca
2014-09-07 01:50:09 UTC
view on stackexchange narkive permalink

Vous n’arrêtez pas un servo.

Un servo est toujours en marche. Dans un sens général, l'asservissement est une boucle de commande qui prend comme entrée une cible de position et applique une force pour maintenir la cible demandée. Si vous souhaitez que la cible soit maintenue, le servo doit être en cours d'exécution.

Un servomoteur contient des composants électroniques qui activent et désactivent en interne un moteur CC si nécessaire pour maintenir la position cible. Si la cible ne correspond pas à la position actuelle, elle allume le moteur pour tourner jusqu'à ce que les deux correspondent. Une fois que l'arbre de sortie atteint ce que vous avez demandé, l'électronique à l'intérieur du servomoteur éteint le moteur. Éteint, ce qui signifie que le moteur CC consomme peu ou pas de courant La boucle d'asservissement fonctionne toujours en comparant la position de l'arbre à une cible.

Si vous éteignez tout le servomoteur, la position n'est pas sous contrôle et pourrait bouger. Pour de nombreuses applications, si vous débranchez les fils, les engrenages et les moteurs appliquent suffisamment de friction pour qu'il ne tourne pas. Mais en général, vous ne comptez pas sur la friction pour faire fonctionner les choses.

  Est-ce que j'utilise ... Servo.Write (position souhaitée) pour l'empêcher de tourner?  

Oui. Pour dire à un servo de rester à une position, vous pouvez simplement continuer à lui envoyer la même cible.

Mais vous n'avez pas à écrire () encore et encore. Si vous le souhaitez, vous pouvez suivre le dernier paramètre et ne l'appliquer que si vous avez une modification. Par exemple, vous pouvez coder comme ceci:

  if (position_target! = Position_last_set) {Servo.Write (position_target); position_last_set = position_target;} 

Quel que soit votre code, sous le capot, Servo transmet constamment la cible de position au servomoteur.

Un servo peut utiliser une quantité considérable de courant pour essayer de maintenir sa position lorsqu'une charge de rotation est appliquée à l'arbre de sortie.
BrettAM
2014-09-07 00:46:59 UTC
view on stackexchange narkive permalink

Un servo normal n'a pas de fonction "go", il n'a qu'un contrôle de position. Autrement dit, que vous exécutiez servo.write (90) pour toujours ou une fois, le servo ira à 90 et continuera à garder activement cette position jusqu'à ce que vous écriviez une autre position. La seule façon de désactiver un servo est:

  servo.detach ();  

Pour un moteur à courant continu normal, vous devrez l'allumer puis désactivez et ensuite ayez une sorte de suivi d'état dans la boucle pour ne plus jamais le réactiver, en utilisant une variable ou millis () etc.

Bien sûr, si vous voulez quelque chose lancez-le une seule fois, mettez-le dans setup () (peut-être dans une boucle dans setup pour des tâches simples).

Vous pouvez également simuler la fin du programme en entrant une boucle infinie avec while (true) {} ou pour (;;) {} .

Oui, le problème semble être lié à l'inadaptation du paradigme de la boucle arduino avec l'application plutôt qu'à tout ce qui est spécifique au servo - et la solution pourrait en effet empêcher la boucle principale arduino de boucler en mettant une autre boucle infinie pour intercepter l'exécution avant la fin. Ou, dans un système plus compliqué, en surveillant certaines conditions externes et en effectuant une séquence d'opérations une seule fois en réponse à cela.
Feh, je ne vois pas ce qui ne convient pas. Si vous voulez que cela s'arrête, vous avez les options ci-dessus. Et pourquoi s'embêter avec un microcontrôleur si vous ne faites qu'une chose simple et que vous vous arrêtez? Que fait-il alors? Vous avez épuisé la batterie?
Kendall Bennett
2016-02-15 10:48:30 UTC
view on stackexchange narkive permalink

myservo.detach (); est ce que vous recherchez. Le déplacer vers un emplacement plutôt que le détacher. C'est bien lorsque vous souhaitez l'utiliser pour contrôler un servo et ne pas le laisser continuer à prendre de l'énergie comme lorsque vous utilisez une batterie. Voici un exemple.

  #include <Servo.h>Servo myservo; // crée un objet servo pour contrôler une configuration de servovoïde () {myservo.attach (9); // attache le servo sur la broche 9 à l'objet servo} void loop () {myservo.attach (9); // attache le servo sur la broche 9 au délai d'objet servo (15); myservo.write (1); // définit la position du servo en fonction du délai de valeur mis à l'échelle (1000); // attend qu'il arrive à la position myservo.detach (); retard (1000); myservo.attach (9); // attache le servo sur la broche 9 au délai d'objet servo (15); myservo.write (179); // définit la position du servo en fonction du délai de valeur mis à l'échelle (1000); // attend qu'il arrive à la position myservo.detach (); délai (1000);  
devez-vous attendre avant de vous détacher? Je n'ai pas fait cela et je n'ai jamais eu de problèmes avec le servo atteignant la position. donc im devinant une fois que le signal servo pwm est envoyé, il est envoyé et vous pouvez passer à autre chose.
Dale Mahalko
2016-06-13 06:26:20 UTC
view on stackexchange narkive permalink

Le mot servo a une définition vague et peut englober de nombreux types de sous-composants. Si vous souhaitez un maintien de la position sans alimentation à l'aide d'un moteur électromagnétique, il existe quatre options:

  • Graisse haute viscosité
  • Dash pot
  • Rapport de démultiplication très élevé
  • sabot de frein magnétique / bande de frein

EDIT: Il y a quelques possibilités supplémentaires, mais c'est en quelque sorte un effet de certains moteurs Modèles:

  • Couple de maintien du pôle à aimant permanent ou couple de détente
  • Couple de traînée de l'aimant permanent

La graisse à haute viscosité et le bac à tirets ont des fonctions similaires; fournissant un frottement statique élevé pour résister au mouvement, qui se détache ensuite en mouvement. (Un pot de tableau de bord est essentiellement un engrenage denté à l'intérieur d'un conteneur à paroi dentée, et qui est rempli en permanence d'un fluide à haute viscosité.)

Cependant, ces deux éléments ajouteront à la charge du moteur, et lorsqu'ils deviennent chauds ils ont tendance à devenir fins et liquides et à perdre leur capacité de maintien.

Un rapport de démultiplication élevé augmente le couple nécessaire pour faire tourner le moteur en arrière. Cependant, notez que si une boîte de vitesses pouvait contenir un lubrifiant parfaitement sans friction, aucune réduction de vitesse ne pourrait arrêter le retour de rotation.

Donc, cela ressemble vraiment à la graisse épaisse et au pot de tableau de bord, mais la réduction de vitesse permet juste le lubrification fine normale pour avoir suffisamment de frottement statique de rupture, pour arrêter le retour de rotation.

Un frein magnétique vous donne un contrôle actif sur le frottement de rupture statique, et peut permettre une tenue très élevée capacité vs pics de charge intermittents sur l'arbre de sortie. En général, lorsque l'alimentation est coupée, un ressort engage le frein pour maintenir la position sans puissance.

Notez qu'il existe deux types de freinage: le maintien de la position statique et la décélération d'un mécanisme en mouvement.

Le deuxième type rejette à la fois la chaleur dans les plaquettes de frein et la plaque de friction, et use les plaquettes et la plaque de friction. Si le frein surchauffe, les plaquettes se désintègrent généralement et le frein ne maintient plus sa position.

À moins que nous ne parlions de grosses machines, les servo-freins sont généralement des conceptions simples sans pièces remplaçables. Lorsque le frein tombe en panne, vous retirez le tout et le remplacez ... y compris éventuellement l'ensemble du servomoteur et de la boîte de vitesses.

Pour une longue durée de vie avec un freinage magnétique, vous devez décélérer activement la charge à l'aide du servo, puis une fois qu'il s'est arrêté de bouger, engagez le frein pour simplement faire le travail de maintien de la position.

En utilisant un frein magnétique pour le maintien de la charge statique sans puissance uniquement, ressemblera à ceci:

  • Allumez le moteur, obtenez la position actuelle et commencez à maintenir activement la position.
  • Activez le frein pour le relâcher
  • Accélérez et passer à une nouvelle position
  • Décélérer le moteur et maintenir la position finale
  • Couper l'alimentation du frein pour le serrer
  • Mettre le moteur hors tension

Le moteur est mis sous tension et se met d'abord en position de maintien, de sorte que la charge ne glisse pas brusquement dans un sens ou dans l'autre, à l'instant entre le relâchement du frein et l'activation du servomoteur.

EDIT # 1 : pour certaines permanentes anent les moteurs à aimants, même hors tension, il y a une résistance à la rotation car dans certaines positions, les aimants et les pièces polaires s'attirent plus étroitement les uns aux autres, appelé couple de détente .

Ce positionnement des pôles est comme une vallée à basse énergie et il faut un peu de force pour surmonter l'attraction magnétique et déplacer le rotor dans les deux sens à l'aide d'un couple externe.

Vous pouvez ressentir cela dans certains ventilateurs sans balais et moteurs pas à pas, où si vous faites tourner l'arbre sans alimentation, il résiste à un mouvement continu et il semble y avoir des points de résistance élevés que le rotor ne veut pas traverser. Lorsqu'il est tourné, le rotor ralentit rapidement et peut tomber dans une oscillation de va-et-vient lorsqu'il s'installe dans l'un des puits magnétiques attractifs.

Cela peut être utilisé pour résister à des couples externes sans frein, mais en utilisant si cela nécessite l'arrêt du rotor dans l'un des puits magnétiques plutôt que dans une position spécifique que vous voudrez peut-être. Mais si elle est combinée avec une boîte de vitesses, la position d'arrêt spécifique exacte peut ne pas avoir une importance trop critique, et il peut y avoir un certain nombre de puits les uns à côté des autres où le rotor peut s'arrêter qui fournissent un alignement acceptable des effecteurs terminaux.

EDIT # 2 : Le couple de traînée de l'aimant permanent est un effet de court-circuit de tous les fils d'alimentation ensemble. Lorsque cela est fait, il faut beaucoup plus de force pour faire tourner l'arbre qu'avec les fils de la bobine pas à pas déconnectés les uns des autres.

En effet, avec les fils de la bobine tous connectés ensemble, lorsque le rotor tourne, il agit comme un générateur et le courant circule dans les bobines. Ce flux de courant crée ce que l'on appelle la force contre-électromotrice (CEMF), qui contre le champ magnétique de l'aimant permanent.

Ce CEMF peut fournir une résistance supplémentaire contre la rotation lorsque le servo n'est pas alimenté. Bien que CEMF n'empêche pas le mouvement, il peut aider à résister à un mouvement continu et à fournir une décélération instantanée lorsque des pointes de charge intermittentes sont appliquées qui tentent de déplacer le servo non alimenté.

Tout ce qui précède est également généralement vrai pour les servos à moteur linéaire. Ceux-ci n'ont pas de réduction de vitesse, mais le chariot de mouvement peut être lubrifié avec de la graisse épaisse, être équipé d'un pot de tableau de bord et avoir des freins magnétiques de maintien de position.

kale
2014-12-23 10:49:34 UTC
view on stackexchange narkive permalink

J'ai eu le même problème.

J'ai trouvé cela simplement en ajoutant myservo.write (90); delay (4000); aide à arrêter le moteur.

  #include <Servo.h> Servo myservo; // créer un objet servo pour contrôler un servo // douze objets servo peuvent être créés sur la plupart des cartesint pos = 0; // variable pour stocker la position du servo void setup () {myservo.attach (9); // attache le servo sur la broche 9 à l'objet servo} void loop () {myservo.write (180); retard (8000); //// arrête le moteur pendant 8 secondes pendant (pos = 180; pos> = 90; pos- = 1) // passe de 180 degrés à 0 degrés {myservo.write (pos); // dit au servo d'aller en position dans la variable retard 'pos' (15); // attend 15ms que le servo atteigne la position} myservo.write (90); retard (4000); // arrête le moteur pendant 4 secondes pour (pos = 90; pos < = 180; pos + = 1) // passe de 0 degrés à 180 degrés {// par pas de 1 degré myservo.write (pos); // dit au servo d'aller en position dans la variable retard 'pos' (15); // attend 15ms que le servo atteigne la position}}  
j'ai eu le même problème que j'ai compris que simplement en ajoutant myservo.write (90); retard (4000); // arrête le moteur pendant 4 secondes, cela aide à arrêter le moteur
JRobert
2014-12-23 20:25:22 UTC
view on stackexchange narkive permalink

Un servo, par nature, est utilisé pour maintenir une position en présence de perturbations essayant de perturber cette position. Si vous avez juste besoin de déplacer un mécanisme qui n'essaye pas (ou ne peut pas) de faire reculer le moteur, votre application sera mieux servie par un motoréducteur avec un encodeur d'arbre ou des interrupteurs de position.

Les servos de loisir sont principalement utilisés parce qu'ils sont * bon marché * et résument le problème * et ne sont pas dérangés par les charges typiques *. Les applications avec des forces qui peuvent faire reculer la variété normale peuvent être sur le point de les surcharger de toute façon (certains des servos hautes performances ont des composants internes qui sont plus facilement rétrogradés lorsqu'ils sont désactivés - même par le poids des surfaces de contrôle sur les grands modèles).
@ChrisStratton: Je sais que le servo hobby peut offrir une solution block-box dans de nombreux cas, mais mon point est qu'un servo est toujours actif, et si cela n'est pas souhaitable, comme l'implique la question, une autre technique peut avoir un avantage.
Non, un servo amateur n'est pas toujours actif - s'il n'est pas passivement assis dans sa zone morte (comparateur satisfait donc moteur éteint) ou ne se déplace pas vers une nouvelle position distincte, il a probablement été mal appliqué. Une action audible continue signifie que le servo est défectueux (courant dans la classe $ 3), la liaison de liaison ou la charge excessive.
john
2015-12-07 16:34:12 UTC
view on stackexchange narkive permalink

Ceci est une très brève explication concernant les servos.

Le type de système servo que vous proposez est un système en boucle ouverte sans position et est généralement utilisé pour une vitesse de mouvement précise (vitesse contrôlée). La boucle dans ce cas est généralement un générateur tachymétrique qui envoie une tension (qui est proportionnelle à la vitesse du moteur) à un comparateur qui compare la tension du générateur tachymétrique à la tension réglable requise, la sortie du comparateur régule alors la vitesse du moteur, d'où le besoin la vitesse . ce type de système d'asservissement continuera à fonctionner à vitesse constante jusqu'à ce que A le signal du comparateur soit mis à zéro ou B la puissance motrice soit retirée du moteur (éteinte) ---- Commande d'asservissement point à point, d'autre part ,, utilise généralement une commande de position qui est vérifiée avec un signal d'un codeur à quel point le servo s'arrêtera jusqu'à ce qu'une autre commande soit émise de la pile (par exemple, un autre emplacement de position ou une commande de temporisation (attente) ou autre) la plus courante Pour ce faire, utilisez gcode qui a la capacité de donner le contrôle total de votre système d'asservissement. S'il n'y a pas de dispositif d'encodage, un contrôle précis de la position des servos est très difficile, voire impossible.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...