Skip to Content

Servos positionnels vs servos continus

Servos positionnels vs servos continus

Les servomoteurs sont largement utilisés dans de nombreuses applications. Dans cet article, nous allons explorer les différences entre les servos positionnels et continus afin de vous aider à choisir celui qui conviendra le mieux à votre projet.

Les servos positionnels, comme leur nom l’indique, sont conçus pour se déplacer vers une position précise et y rester jusqu’à ce qu’un nouveau signal soit reçu. Ils sont couramment utilisés dans des applications où la précision et la stabilité sont essentielles. Ces servos ont une plage de mouvement limitée, généralement autour de 180 degrés, et sont idéaux pour les projets nécessitant un contrôle précis de la position du moteur, comme les bras robotiques, la direction de voitures RC ou le contrôle de drones.

Les servos continus, quant à eux, sont conçus pour tourner en continu dans les deux sens. Contrairement aux servos positionnels, ils ne maintiennent pas une position précise. Ils sont utilisés dans des applications nécessitant un mouvement continu, comme les robots à roues ou les systèmes de caméra à rotation panoramique/inclinaison.

Un servo très populaire, disponible en version positionnelle ou continue, est le SG90. Dans la suite, nous allons voir les spécificités des micro-servos SG90, comment les connecter, et les différences de contrôle entre la version positionnelle et la version continue.

Matériel nécessaire

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Pour ce projet, vous aurez besoin du matériel suivant. Notez que les servos positionnels et continus peuvent être identiques extérieurement ! Vérifiez la description ou l’étiquette : « continuous » ou « 360 degrees » pour les servos continus, et « 180 degrees » ou « positional » pour les servos positionnels.

Arduino Uno

Dupont wire set

Jeu de fils Dupont

USB Data Sync cable Arduino

Câble USB pour Arduino UNO

basic servo motor

Servo SG90 positionnel

basic servo motor

Servo SG90 continu

Spécificités des micro-servos SG90

Le micro-servo SG90 est un servomoteur populaire et largement utilisé dans de nombreux projets. Il est apprécié pour sa taille compacte, son prix abordable et sa polyvalence. Voici quelques caractéristiques clés du SG90 :

Taille et poids

Le micro-servo SG90 est un servo de petite taille, mesurant environ 23mm x 12,2mm x 29mm. Il est léger, avec un poids d’environ 9 grammes, ce qui le rend adapté aux projets où l’espace et le poids sont des contraintes.

Tension de fonctionnement

Le micro-servo SG90 fonctionne avec une tension comprise entre 4,8V et 6V. Cela le rend compatible avec la plupart des sources d’alimentation courantes, comme les batteries LiPo ou les alimentations classiques.

Couple et vitesse

Le SG90 offre un couple intéressant pour sa taille. Il fournit généralement un couple d’environ 1,6 kg/cm à 4,8V et 2,2 kg/cm à 6V. Sa vitesse est d’environ 0,12 seconde pour 60 degrés à 4,8V et 0,10 seconde pour 60 degrés à 6V.

Signal de contrôle

Le micro-servo SG90 utilise un signal de contrôle PWM (modulation de largeur d’impulsion) standard pour fonctionner. Il nécessite un signal de 50Hz avec une largeur d’impulsion comprise entre 1ms et 2ms. La largeur d’impulsion détermine la position de l’axe du servo (pour un servo positionnel) ou la vitesse de rotation (pour un servo continu).

Compatibilité

Le micro-servo SG90 est compatible avec la plupart des microcontrôleurs et cartes de développement, comme Arduino, Raspberry Pi et ESP32. Il peut être facilement contrôlé à l’aide de bibliothèques logicielles et de langages de programmation courants dans la communauté maker.

Connexion du micro-servo SG90

Suivez ces étapes pour connecter le micro-servo SG90 :

servo-motor-with-arduino-uno-wiring-diagram-schematic-circuit-tutorial
  1. Commencez par connecter l’alimentation au servo. Le SG90 fonctionne entre 4,8V et 6V. Reliez le fil rouge (positif) du servo à la broche 5V de votre microcontrôleur ou de votre alimentation.
  2. Ensuite, connectez le fil négatif (noir ou marron) du servo à la broche GND.
  3. Puis, connectez le fil de signal de contrôle du servo à la PIN 9 de votre microcontrôleur. Ce fil est généralement jaune, blanc ou orange.

Notez que si vous connectez plusieurs servos à un Arduino, surtout lorsqu’ils sont sollicités, l’Arduino risque de ne pas fournir assez de puissance à tous les servos en même temps. Cela peut entraîner des mouvements erratiques, une baisse de performance, ou même provoquer un redémarrage ou un blocage de l’Arduino ! Dans ce cas, il vous faudra une alimentation supplémentaire pour les servos.

Maintenant que vous savez comment connecter le micro-servo SG90, découvrons les principales caractéristiques des servos positionnels dans la section suivante.

Caractéristiques principales des servos positionnels

Les servos positionnels, aussi appelés servos standards, sont très utilisés grâce à leur contrôle précis de la position angulaire. Voici leurs principales caractéristiques :

Contrôle angulaire : Les servos positionnels permettent un contrôle précis de l’angle de l’axe du servo. Ils peuvent tourner jusqu’à un angle spécifique dans une plage définie, généralement entre 0 et 180 degrés.

Retour de position : Ces servos sont équipés de mécanismes de retour de position, comme des potentiomètres ou des encodeurs, qui fournissent des informations sur la position actuelle de l’axe du servo. Ce retour permet un positionnement précis.

Couple : Les servos positionnels sont conçus pour fournir un couple élevé, ce qui leur permet de déplacer ou manipuler des objets avec résistance.

Stabilité : Les servos positionnels sont réputés pour leur stabilité et leur capacité à maintenir une position une fois atteinte. Ils intègrent des circuits qui aident à conserver la position désirée, même en cas de forces extérieures ou de variations de charge.

En résumé, les servos positionnels sont idéaux pour les applications nécessitant un contrôle angulaire précis, de la stabilité et un couple élevé. On les retrouve souvent en robotique, dans les véhicules RC, l’automatisation industrielle et d’autres projets où le positionnement précis est crucial.

Code pour contrôler les servos positionnels

En général, on ne génère pas soi-même les signaux PWM nécessaires pour contrôler un servo, mais on utilise une bibliothèque. La bibliothèque la plus populaire pour cela est la Servo. Dans sa documentation, vous trouverez l’exemple code suivant :

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Ce code est censé déplacer le servo de la position 0 degré à 180 degrés, puis revenir.

Cependant, si vous essayez cela avec certaines marques de servos SG90, cela ne fonctionnera pas toujours ! Par exemple, dans mon cas, le servo ne s’arrête pas à 0 degré mais effectue une rotation complète dans le mauvais sens pour atteindre la position suivante. La raison est que certains fabricants ne respectent pas strictement les standards de temporisation du signal PWM (link).

Ajustement fin des angles

Nous allons donc devoir faire quelques ajustements pour que cela fonctionne. Voici un exemple de code amélioré :

#include <Servo.h>

const int range = 780;
const int mid = 1600;  // 90 degrees
Servo servo;

void setup() {
  servo.attach(9);  // PIN 9
}

void rotate(int angle, int wait) {
  angle = map(angle, 0, 180, mid - range, mid + range);
  servo.writeMicroseconds(angle);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(90, 1000);
  rotate(180, 1000);
  rotate(90, 1000);
}

Notez que le comportement est un peu différent. Au lieu de changer la position progressivement, on passe directement de 0 degré à 90 degrés, puis à 180 degrés, et enfin retour à 90 degrés, avec un temps d’attente de 1000ms entre chaque. C’est juste pour simplifier. Vous pouvez modifier le code pour faire comme dans l’exemple précédent en changeant la loop fonction en :

void loop() {  
  for (int angle = 0; angle <= 180; angle += 1) {
    rotate(angle, 15);
  }	
  for (int  angle = 180; angle >= 0; angle -= 1) {
    rotate(angle, 15);
  }
}

La partie importante ici est la rotate() fonction, qui prend un angle (et un temps d’attente) et maps convertit cet angle en durée d’impulsion. En théorie, une impulsion de 1000ms correspond à la position la plus à gauche (0 degré), 2000ms à la position la plus à droite (180 degrés), et 1500ms au centre (90 degrés). Ceci est valable pour la plupart des servos positionnels ayant une plage de 0 à 180 degrés.

Ajustement du point milieu

En pratique, les durées d’impulsion réellement nécessaires sont différentes et donc le servo ne se déplace pas comme prévu. On commence par régler le point milieu, soit l’angle de 90 degrés, qui devrait correspondre à une impulsion de 1500ms. Pour cela, fixez le bras (horn) sur le servo, réglez la constante mid à 1500 et modifiez la loop fonction comme suit :

void loop() {
  rotate(90, 1000);
}

Selon le crantage, le bras peut ne pas être parfaitement à l’angle souhaité. Par exemple, si vous voulez que 90 degrés ressemble à la photo ci-dessous, mais que le bras est légèrement décalé.

On peut corriger cela en ajustant la mid constante jusqu’à obtenir l’alignement parfait. Dans l’exemple de code ci-dessus, j’ai dû régler mid=1600 pour y parvenir.

Ajustement des extrémités

Ensuite, on ajuste les positions 0 et 180 degrés en modifiant la range constante. Pour cela, on modifie le code dans la boucle comme suit

void loop() {
  rotate(0, 1000);
  rotate(180, 1000);
}

On laisse ensuite le servo tourner, on observe les positions extrêmes et on ajuste la range constante, en commençant par une valeur de 500, jusqu’à obtenir les angles souhaités.

Par exemple, dans l’exemple de code ci-dessus, j’ai dû régler la range=780, pour obtenir ce résultat avec mes servos. Notez que ces valeurs ajustées pour la durée d’impulsion s’écartent assez fortement des valeurs standards. Il faut donc pas mal d’ajustements pour que les servos se comportent comme vous le souhaitez.

Pour plus de détails, consultez notre tutoriel sur How to control servo motors with Arduino.

Voyons maintenant les principales caractéristiques des servos continus.

Caractéristiques principales des servos continus

Les servos continus, aussi appelés servos à rotation continue ou servos 360 degrés, tournent sans arrêt dans les deux sens. Contrairement aux servos positionnels, qui ont une plage de mouvement limitée à 180 degrés, les servos continus n’ont pas de butées physiques. Voici leurs principales caractéristiques :

Contrôle de la vitesse : Les servos continus permettent un contrôle précis de la vitesse. En ajustant le signal PWM envoyé au servo, vous pouvez contrôler la vitesse de rotation. Cela les rend idéaux pour les applications nécessitant une vitesse variable, comme les robots à roues.

Rotation bidirectionnelle : Les servos continus peuvent tourner dans les deux sens, horaire et antihoraire.

Pas de retour de position : Contrairement aux servos positionnels, les servos continus ne fournissent pas de retour de position. Vous ne pouvez donc pas contrôler précisément la position ou l’angle de l’axe du servo. Vous ne pouvez contrôler que la vitesse et le sens de rotation.

Les servos continus offrent des avantages uniques par rapport aux servos positionnels, notamment pour les applications nécessitant un mouvement continu et un contrôle de la vitesse. Cependant, ils ne permettent pas de contrôler précisément la position de l’axe du servo.

Code pour contrôler les servos continus

Le code de contrôle pour un servo continu est pratiquement identique à celui d’un servo positionnel. On change simplement les noms des variables et des constantes pour clarifier l’intention du code :

#include <Servo.h>

const int maxspeed = 700;
const int stop = 1500;
Servo servo;

void setup() {
  servo.attach(9); // PIN 9
}

void rotate(int speed, int wait) {
  speed = map(speed, -100, +100, stop - maxspeed, stop + maxspeed);
  servo.writeMicroseconds(speed);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(-100, 1000);
  rotate(+100, 1000);
}

Une différence importante réside cependant dans le mappage. Ici, on map mappe des vitesses de -100% à +100% (au lieu d’angles) vers les durées d’impulsion nécessaires au contrôle du servo.

Comme précédemment, en théorie, une impulsion de 1000ms correspond à la vitesse maximale en sens antihoraire, 2000ms à la vitesse maximale en sens horaire, et 1500ms devrait arrêter le servo.

Pour mes servos, une impulsion de 1500ms arrêtait effectivement le servo. Les vitesses maximales étaient cependant atteintes à 1500ms-700ms = 800ms et 1500ms+700ms = 2200ms, ce qui est au-dessus des valeurs standards de 1000ms et 2000ms.

Comme pour l’ajustement d’un servo continu, commencez par trouver le point milieu, c’est-à-dire la valeur de la stop constante où le servo ne bouge pas. Ensuite, augmentez la maxspeed constante (en partant de 500ms) jusqu’à ce que vous n’observiez plus d’amélioration de la vitesse de rotation.

Pour plus de détails, consultez notre tutoriel sur How to Control a 360 Degree Servo Motor with Arduino.

Choisir entre servos positionnels et servos continus

Voici un résumé des critères à prendre en compte pour choisir entre un servo positionnel et un servo continu.

Servos positionnels

Les servos positionnels sont conçus pour tourner jusqu’à un angle précis et maintenir cette position. Ils sont donc idéaux pour déplacer des objets à des emplacements ou des angles spécifiques.

Caractéristiques principales des servos positionnels :

  • Contrôle de position : Les servos positionnels vous permettent de définir l’angle de rotation souhaité, et ils maintiendront cette position jusqu’à nouvel ordre.
  • Mécanisme de retour : Ces servos intègrent généralement un potentiomètre ou un encodeur qui fournit un retour sur la position actuelle du servo.
  • Couple : Les servos positionnels sont connus pour leur couple élevé, ce qui les rend adaptés aux applications nécessitant le déplacement de charges lourdes.

Servos continus

Les servos continus, quant à eux, sont conçus pour tourner en continu dans les deux sens. Ils sont donc parfaits pour faire tourner des roues, des hélices ou d’autres éléments rotatifs.

Caractéristiques principales des servos continus :

  • Rotation continue : Contrairement aux servos positionnels, les servos continus peuvent tourner sans fin dans les deux sens.
  • Contrôle de la vitesse : Ces servos intègrent généralement un mécanisme de contrôle de la vitesse, ce qui permet d’ajuster la vitesse de rotation.
  • Pas de contrôle de position : Les servos continus n’offrent pas de contrôle de position comme les servos positionnels. Ils ne maintiennent pas un angle précis.

Choisir le bon servo

Si vous avez besoin d’un contrôle précis de la position et d’un couple élevé, un servo positionnel sera le meilleur choix. Si vous avez besoin d’un mouvement continu et d’un contrôle de la vitesse, un servo continu sera plus adapté.

Conclusion

Dans cet article, nous avons vu les différences entre les servos positionnels et continus, leurs principales caractéristiques et comment les contrôler.

Les servos positionnels sont conçus pour tourner dans une plage d’angles définie, ce qui les rend idéaux pour les applications nécessitant un positionnement précis. Les servos continus, eux, offrent une rotation continue dans les deux sens, ce qui les rend parfaits pour les applications nécessitant un mouvement continu, comme les moteurs de roues pour petits robots ou véhicules.

Pour choisir entre un servo positionnel et un servo continu, tenez compte des besoins spécifiques de votre projet. Si vous avez besoin d’un contrôle précis de la position, optez pour un servo positionnel. Si vous souhaitez un mouvement continu ou la possibilité de modifier le servo pour des applications particulières, choisissez un servo continu.

Dans cet article, nous nous sommes concentrés sur les micro-servos SG90, très utilisés dans les projets de loisirs grâce à leur petite taille et leur prix abordable. Cependant, les concepts abordés s’appliquent aussi à d’autres servomoteurs.

En résumé, comprendre les principales caractéristiques et différences entre les servos positionnels et continus est essentiel pour choisir le bon servomoteur pour votre projet. Analysez les besoins et applications spécifiques, et faites votre choix en conséquence. Bonnes expérimentations avec les servomoteurs !

Note

Nous avons mis en place une fonction rotate() spéciale qui effectue une correspondance entre les angles ou vitesses et les durées d’impulsion. La fonction attach() de la Servo library possède deux paramètres supplémentaires (min et max) qui permettent d’obtenir un effet similaire.

attach(pin, min, max)

Cependant, cela ne permet pas d’ajuster le point milieu et, pour des vitesses allant de -100% à +100%, il faudrait de toute façon une correspondance séparée. Nous avons donc opté pour la solution plus générique présentée ci-dessus.

Conclusions

Dans ce tutoriel, vous avez découvert les différences entre les servos positionnels et continus.

Pour plus d’informations sur les servos continus, consultez notre tutoriel sur How to Control a 360 Degree Servo Motor with Arduino. Pour les servos positionnels, voyez le tutoriel How to control servo motors with Arduino et si vous souhaitez contrôler un servo avec une télécommande IR, lisez le tutoriel How to Control a Servo with an IR Remote.

Si vous avez des questions, n’hésitez pas à les poser dans les commentaires.

Bon bricolage ; )