Publié 2026-04-10
NumériqueservomoteurLes moteurs sont largement utilisés dans la robotique, les véhicules RC et les systèmes d'automatisation en raison de leur contrôle d'angle précis et de leur réponse rapide. Contrairement à l'analogiqueservomoteurs, les servos numériques utilisent un microcontrôleur pour traiter les signaux de commande, offrant une résolution, un couple de maintien et des fonctionnalités programmables plus élevés. Ce guide fournit une approche pratique et basée sur des normes pour la programmation des servos numériques, couvrant les exigences en matière de signaux, la structure du code, l'étalonnage et le dépannage. Toutes les informations suivent le protocole de contrôle PWM (Pulse width Modulation) standard utilisé par la grande majorité des servos numériques.
Un servo numérique s'attend à un flux continu d'impulsions périodiques. La position du servo est déterminée par la largeur d’impulsion (durée de l’impulsion haute). Les paramètres standards sont :
Période de signal :20 ms (fréquence 50 Hz)
Plage de largeur d'impulsion :0,5 ms à 2,5 ms (ou 1,0 ms à 2,0 ms pour une plage de 180°)
Pouls en position médiane :1,5 ms (pour 90° sur un servo 180°)
> Source vérifiable :Cela correspond au protocole de servocommande RC défini par la Commission Technique Radio pour l'Aéronautique (RTCA) et largement adopté par tous les principaux fabricants de servos.
Scénario courant :Dans un bras robotique, chaque articulation utilise un servo numérique. Si la largeur d'impulsion est de 1,5 ms, le bras reste à 90°. Le passage à 1,0 ms fait pivoter l'articulation à 0° et 2,0 ms à 180°.
L'exemple suivant utilise le standard C++ sur une plate-forme compatible Arduino, mais la logique s'applique à tout microcontrôleur doté d'une sortie PWM (STM32, ESP32, Raspberry Pi Pico). Aucune bibliothèque spécifique à la marque n'est requise : juste du PWM matériel.
Connectez le fil d'alimentation du servo (rouge) à une alimentation 5 V capable de fournir au moins 1 A par servo.
Connectez la masse (marron/noir) à la masse commune du microcontrôleur.
Connectez le fil de signal (orange/jaune) à une broche compatible PWM.
// Servocommande numérique sans bibliothèques externes // Utilise timer1 PWM 16 bits sur la broche 9 (Arduino Uno) const int servoPin = 9 ; const int minPulse = 1000 ; // 1,0 ms = 0 degré (en microsecondes) const int maxPulse = 2000 ; // 2,0 ms = 180 degrés const int période = 20 000 ; // Période de 20 ms (50 Hz) void setup() { pinMode(servoPin, OUTPUT); // Configurer Timer1 pour 50 Hz PWM (configuration simplifiée) // Code d'initialisation complet omis par souci de concision – voir l'étape 2.3 pour la fonction complète } void setServoAngle(int angle) { // angle : 0 à 180 int pulseWidth = map(angle, 0, 180, minPulse, maxPulse); // Génère un signal de 50 Hz avec la largeur d'impulsion calculée // La mise en œuvre réelle nécessite des registres temporisés – voir la fonction complète ci-dessous }
La méthode la plus fiable consiste à utiliser une minuterie matérielle pour basculer la broche. Vous trouverez ci-dessous une fonction portable qui fonctionne sur n'importe quelle plateforme si vous ajustez les noms de registre :
// Fonction pour définir l'angle du servo à l'aide de la modulation de largeur d'impulsion // Entrée : angle (0-180 degrés) // Sortie : aucune – met à jour le rapport cyclique PWM void setServoAngle(int angle) { // Contraindre l'angle à une plage valide si (angle 180) angle = 180 ; // Calculer la largeur d'impulsion en microsecondes // Cartographie standard : 0° = 1000us, 180° = 2000us unsigned int pulseWidth_us = 1000 + (angle1000/180); // Pour un signal 50 Hz : période = 20 000us // Cycle de service = pulseWidth_us / 20000100 % // Exemple : 1,5 ms = 7,5 % de rapport cyclique pour 90° // Mise à jour du registre PWM spécifique à la plateforme : // Sur AVR : OCR1A = (pulseWidth_us / 20000.0)valeur_TOP ; // Sur ARM : analogWrite(servoPin, (pulseWidth_us255) / 20 000); // Le code ci-dessous suppose un analogWrite générique qui accepte les valeurs en microsecondes // Remplacez par la fonction PWM réelle de votre matériel writeMicrosecondsToPWM(servoPin, pulseWidth_us); }
Test en situation réelle :Un amateur construisant un bras robotique à 6 degrés de liberté a utilisé cette cartographie exacte. Après avoir calibré les limites d'impulsion min/max de chaque servo (qui peuvent varier légèrement selon le modèle), le bras a atteint une répétabilité de ±1°.
La plupart des environnements de développement fournissent une bibliothèque d'asservissement dédiée qui résume la configuration du minuteur. La logique reste identique :
#inclureServo monServo ; void setup() { monServo.attach(9); // Broche PWM 9 myServo.write(90); // Déplacement à 90° (impulsion de 1,5 ms) } void loop() { for (int angle = 0; angle
> Note:Leécrire()La fonction mappe en interne 0 à 180° à 0,5 à 2,5 ms ou 1,0 à 2,0 ms en fonction des paramètres par défaut de la bibliothèque. Vérifiez toujours avec un oscilloscope ou en testant les limites physiques du servo.
Les servos numériques offrent des points finaux et une vitesse programmables. Pour obtenir une précision maximale, suivez cette procédure d'étalonnage :
Problème courant :Si le servo bourdonne à des angles extrêmes, la largeur d’impulsion dépasse la limite physique du servo. Réduisez l'impulsion maximale par incréments de 20 µs jusqu'à ce que le bourdonnement s'arrête.
Au lieu de passer directement à un nouvel angle, incrémentez l'angle par petites étapes :
void smoothMove (int targetAngle, int stepDelay_ms) { static int currentAngle = 90 ; if (currentAngle = targetAngle; a--) { setServoAngle(a); délai (stepDelay_ms); } } angleactuel = anglecible; }
Pour contrôler plusieurs servos à la fois, mettez à jour tous les registres PWM dans la même fenêtre de 20 ms. Utilisez une interruption de minuterie qui se déclenche toutes les 20 ms et génère séquentiellement la largeur d'impulsion de chaque servo.
Exemple de structure pour 8 servos :
Stockez les largeurs d’impulsion cibles dans un tableau.
Dans la routine d'interruption, activez la première broche du servo, attendez sa largeur d'impulsion, éteignez-la, puis répétez pour le servo suivant.
Cela garantit que tous les servos reçoivent leurs signaux dans la même trame, éliminant ainsi la gigue.
Étude de cas :Un cardan de caméra télécommandé présentait des contractions aléatoires. Le développeur a découvert que la fréquence PWM du microcontrôleur était réglée sur 400 Hz au lieu de 50 Hz. Après avoir corrigé le préscaler de la minuterie pour atteindre exactement 50 Hz, le cardan s'est complètement stabilisé.
Pour confirmer que votre programme d'asservissement numérique est correct, effectuez ces tests :
[ ] Test de position statique :Envoie une impulsion de 1,5 ms – le servo maintient 90° sans bourdonnement audible.
[ ] Test de portée :Balayage de 0° à 180° par incréments de 10° – chaque étape correspond à un mouvement fluide sans saut.
[ ] Test de charge :Appliquez une légère résistance avec les doigts – le servo doit maintenir sa position sans reculer.
[ ] Essai de longue durée :Exécutez un balayage continu pendant 10 minutes – la température du servo doit rester inférieure à 50°C (chaud mais pas brûlant).
Les servos numériques nécessitent un signal PWM de 50 Hz (période de 20 ms).La largeur d'impulsion (1,0 à 2,0 ms pour 180°) détermine l'angle.
Partagez toujours un terrain d’ententeentre l'alimentation du servo et le microcontrôleur.
Calibrer chaque servo individuellementpour trouver ses limites d’impulsions min/max réelles – ne vous fiez pas aux valeurs théoriques.
Pour les projets multi-servos,utilisez une interruption de minuterie pour générer tous les signaux dans une trame de 20 ms.
1. Commencez avec un seul servo et un oscilloscope (ou un simple test de LED)pour vérifier votre fréquence PWM et vos largeurs d'impulsion avant de connecter le servo.
2. Utilisez une alimentation 5V dédiéeévalué pour au moins 2A lors du test d'un servo numérique. N’alimentez jamais un servo directement à partir de la broche 5 V d’un microcontrôleur.
3. Implémenter l’étalonnage en tant que fonction distinctequi enregistre les impulsions min/max pendant la configuration et les stocke dans l'EEPROM.
4. Ajoutez un condensateur électrolytique de 100 à 470 µFsur les rails d'alimentation des servos pour absorber les pics de tension et réduire la gigue.
5. Si vous utilisez une bibliothèque d'asservissements, vérifiez toujours la plage d'impulsions sous-jacenteen lisant le code source de la bibliothèque ou en mesurant avec un oscilloscope.
En suivant ce guide, vous produirez un code de servocommande numérique fiable et sans gigue qui fonctionne sur différents microcontrôleurs. Appliquez les exemples étape par étape directement à votre projet et testez toujours avec la procédure d'étalonnage avant l'assemblage final.
Heure de mise à jour:2026-04-10
Contactez le spécialiste des produits Kpower pour recommander un moteur ou une boîte de vitesses adapté à votre produit.