Les servomoteurs sont très utilisés en robotique. Nous leur avons consacré un grand nombre d’articles. Ce sont des modèles courants en modélisme, et ils se pilotent habituellement avec une radio-commande, donc le signal de contrôle est universel et il est possible de le reproduire avec une puce programmable, comme Eric l’a présenté dans un excellent article : Bouge ton servo
Ici nous expliquons comment ne pas recourir à la programmation : on peut utiliser quelques composants électroniques simples et courants pour obtenir la commande en position d’un servomoteur.
L’objectif est le suivant : ne pas implémenter dans un micro-contrôleur le signal particulier nécessaire à un servomoteur mais utiliser une carte auxiliaire prenant en entrée un niveau logique binaire (0 ou 1) pour obtenir un changement de la position du servomoteur.
Les raisons sont les suivantes, au choix :
les ressources de calcul du contrôleur principal sont limitées
pas de contrôleur du tout (le cas des cartes I/O type Phidget ou K8055)
Solution 1 : le NE555
On va commencer par un circuit intégré très connu, le NE555 qui existe depuis plus de 35 ans et rend toujours de très bons services. Vous trouverez un très bon article de présentation ici :
Tutoriel Robotix.fr sur le NE555
Il suffit d’ajouter une résistance et un condensateur et on obtient un signal carré "monostable" qu’on peut déclencher une fois. Le but est de reproduire le signal nécessaire à un servomoteur :
niveau bas pendant environ 20 millisecondes
niveau haut entre 1 et 2 ms selon la position souhaitée
Bien sûr le NE555 devra reproduire ce signal régulièrement, on va donc utiliser le NE555 en "astable" (voir le site de robotix.fr cité au début de cet article).
Pour celà, on va alterner la charge et la décharge en utilisant des valeurs de résistances et de condensateurs bien précises permettant d’obtenir les temps souhaités.
Utilisation d’un montage proposé
Un montage sensé atteindre le but fixé est proposé sur le Wikibot de Planète-Sciences" : NE555 pour contrôler un servo mais trop insuffisant à mon goût, donc on va reprendre point par point.
Voici la liste du matériel utilisé :
1 circuit intégré NE555 (temporisateur monostable ou astable)
1 transistor PNP BC558 (TO92)
1 diode 1N4148
1 résistance 150 kOhms
1 résistance 200 kOhms
1 condensateur 100 nF ou 10 nF
1 condensateur 220 nF
1 potentiomètre / résistance variable ( 20 kOhms)
1 potentiomètre / résistance variable ( 10 kOhms)
Le transistor permet d’avoir deux positions : selon qu’on ouvre ou ferme le circuit grâce à une entrée numérique sur la base, on ajoute la valeur de la résistance, faisant passer la constante de temps de l’autre côté de la valeur médiane (en gros de 1 à 2 ms si on prend les extrêmes).
Pour comprendre le fonctionnement d’un transistor, regardez cette animation sur le site de l’Université du Mans : théorie du transistor
Circuit schématique et implantation des composants
On peut choisir de réaliser le circuit avec un logiciel de CAO électronique comme Eagle ou utiliser un petit outil pour simuler le placement des composants sur une plaque d’essai à bandes ("veroboard" ou "stripboard" en anglais).
Premier test : tel quel
On implante tous les composants selon ce circuit sur une plaque d’essai. C’est assez facile, ce n’est pas encore le montage définitif donc on prend de la place, surtout pour pouvoir laisser passer les différents fils qu’on va ensuite connecter : alimentation 5v, ligne de commande et retour vers le servo, plus toutes les connexions de test, par exemple les grippe-fils pour l’analyseur logique Saleae Logic.
On va d’abord faire des tests juste avec l’alimentation et regarder le signal obtenu en sortie du montage (à la place du servomoteur)
On connecte ensuite l’Arduino et un servomoteur :
Les points rouge et noir sont le 5V et la masse (en provenance de l’Arduino ou de la carte microcontrôleur et à destination du servo)
Le point vert est l’entrée HIGH ou LOW pilotée par le microcontrôleur et le point bleu est la sortie de commande du servomoteur. Tel que le schéma de principe l’indique, c’est ici qu’il faudrait se connecter, ce qu’on fait pour notre premier test.
Et là c’est le drame : le servo se bloque et fait un méchant bruit. On regarde à l’analyseur, le créneau dépasse les 3 millisecondes dès qu’on connecte le servo, alors qu’il reste sagement entre 1 et 2 millisecondes (signal typique souhaité) quand le servo est déconnecté —> le montage proposé est calamiteux, théorique et ne peut pas marcher tel quel. En tout cas c’est ma conclusion et j’aimerais bien que les auteurs m’expliquent comment ils l’ont fait fonctionner (c’est bien les wiki pour l’anonymat).
Second test : un étage supplémentaire
On va donc protéger le circuit pour empêcher le servomoteur de parasiter le signal. Pour cela j’ai pris ce que j’avais sous la main, une diode (et pas une led) et une résistance. Voici le schéma.
Et maintenant ça va mieux : on a bien nos deux créneaux à 1,1 ms et 1,8 ms réglables avec les potentiomètres :
Il y aurait certainement des améliorations à faire : regarder à l’oscilloscope (que je n’ai pas) d’où venait les parasites et mieux choisir le filtre diode/résistance.
Solution 2 : un microcontrôleur
Et oui, on peut décharger la gestion du micro-contrôleur principal en utilisant un µC secondaire qui va écouter sur 1 entrée numérique le choix et gérer le servo comme on le fait habituellement. Il y a donc un programme, mais externe.
Par exemple, avec un simple petit ATtiny13 à 8 pattes ou dans mon cas un ATtiny2313 qui fait tout de même 20 pattes, on va implémenter un programme très simple qui écoute sur une ligne d’entrée la commande et va piloter le servomoteur sur une ligne en sortie. Ok il y a du code à exécuter, mais c’est simplement déporté dans une puce auxiliaire et les ressources du contrôleur principal sont toujours préservées !
Code source
En utilisant WinAVR et la bibliothèque "delay" de AVR-libc pour attendre un nombre de millisecondes précis.
{
// port en sortie (servo)
sbi(DDRB,0);
// port en sortie (led de contrôle)
sbi(DDRD,1);
cbi(PORTD,1);
// port en entrée (commande position 0 ou 1)
cbi(DDRD,0);
cbi(PORTD,0); // pull-down
while (1) {
sbi(PORTB,0);
if (inb(PIND) & 0x01) {
cbi(PORTD,1);
_delay_ms(1.3);
} else {
sbi(PORTD,1);
_delay_ms(1.8);
}
cbi(PORTB,0);
_delay_ms(20);
}
return 0;
}
C’est vrai que ça fait un peu "grosse cavalerie" et je ne regrette pas d’avoir tenté avec le NE555, mais quand même on aurait eu moins de composants sur la carte et une plus grande précision dans la gestion des créneaux.
Avec la version NE555, je n’ai pas réussi à avoir les limites du servo et il ne tournait que de 90° et encore !
PoBot
Commande d’un servomoteur sans programme









Vos commentaires
# Le 21 février 2009 à 08:59, par T-Bot
En réponse à : Commande d’un servomoteur sans programme
auriez vous un schéma pour l’étage supplémentaire ?
Répondre à ce message
# Le 21 février 2009 à 09:37, par Julien H.
En réponse à : Commande d’un servomoteur sans programme
J’ai mis à jour avec le schéma. D’ailleurs il ne s’agissait pas d’une led, mais d’une diode (la même que celle déjà utilisée dans le circuit, j’ai vraiment pris ce que j’avais sous la main, toute proposition d’amélioration est la bienvenue).
Répondre à ce message
# Le 13 mars 2009 à 15:09, par ?
En réponse à : Commande d’un servomoteur sans programme
Merci pour cette mise à jour
Répondre à ce message
# Le 28 février 2012 à 22:17, par mariam
En réponse à : Commande d’un servomoteur sans programme
s’il vous plaît je veux savoir comment connaître le pas à partir des impulsions et quel précision je prends ???????
Répondre à ce message
# Le 4 mars 2012 à 10:09, par Julien H.
En réponse à : Commande d’un servomoteur sans programme
Il s’agit d’un servomoteur, il n’y a pas de pas et les impulsions envoient une consigne fixe, sans certitude sur la rotation du servomoteur.
Vous devriez vous orienter vers les moteurs pas à pas.
Répondre à ce message
# Le 30 août 2009 à 12:56, par Fabrice
En réponse à : Commande d’un servomoteur sans programme
Bonjour,
J’ai réalisé le montage NE555 sans filte et j’obtient sans difficulté sur mon oscillo les créneaux de 1 ms et 2 ms en commutant un interrupteur (au lieu du transistor), en branchant un servo Futaba S3003 j’obtient les mêmes symptomes de bruit.
En triturant les potar, j’obtient mes 2 positions extremes mais avec des créneaux de 6 ms et 26 ms en niveau haut et 18 ms en niveau bas. Bref ça n’a rien à voir avec le standard, j’ai aussi cramé un hitec HS-55 en le branchant sur le circuit, celui-ci oscillé sur une position emettant un sifflement qui modulé suivant le signal en sortie du NE555 avant de rendre l’âme.
Le signal en sortie du NE555 n’était par-contre pas modifié par le branchement ou non des servos.
Pour un non initié à l’electronique, ce petit schéma est quand même bien pratique et facile à réaliser. Avez vous réussi à l’améliorer pour un fonctionnement fiable ?
Cordialement.
Répondre à ce message
# Le 31 août 2009 à 09:34, par Julien H.
En réponse à : Commande d’un servomoteur sans programme
Avec la partie filtre, j’ai réussi à obtenir les deux positions nécessaires.
Le prototype qui utilisait ce servo a fonctionné correctement donc nous sommes satisfaits du résultat.
Ce serait à refaire, j’utiliserais un micro-contrôleur, beaucoup plus pratique pour régler les valeurs min/max.
Répondre à ce message
# Le 23 juillet 2011 à 16:59, par ?
En réponse à : Commande d’un servomoteur sans programme
bonjour, je voudrais savoir ce que représente la fiche male JP2 car je participe aux trophées de robotique.
Merci
Répondre à ce message
# Le 24 juillet 2011 à 11:03, par Julien H.
En réponse à : Commande d’un servomoteur sans programme
C’est l’entrée de l’alimentation et du signal de commande tout ou rien qui demande au servomoteur de passer d’une position à l’autre.
Répondre à ce message
# Le 24 juillet 2011 à 21:49, par ?
En réponse à : Commande d’un servomoteur sans programme
Excuse moi si je n’ai pas compris, mais le signal de commande se connecte a une carte arduino ?
Répondre à ce message
# Le 25 juillet 2011 à 01:04, par Julien H.
En réponse à : Commande d’un servomoteur sans programme
Le signal d’entrée peut se faire avec un simple interrupteur, ou avec un micro-contrôleur (donc oui une Arduino peut le faire).
Répondre à ce message
# Le 21 mars 2012 à 17:45, par rv
En réponse à : Commande d’un servomoteur sans programme
bonjour julien, voilà très limité en électronique, mais aime bricolé des chose qui ne servent à rien,lol. voilà je me suis fabriqué sur ma moto une bulle qui s’oriente avec un servomoteur, problème je pensais pas en la faisant qu’il fallait avoir un signal, s’est bête mais je pensai le gérer avec un simple inverseur, mais non trop simple, surtout que j’ai pas besoin qu’il et des positions intermédiaire, juste en haut et en bas.
donc ma question es que ce genre de carte carte se vend et sinon es que tu serai prêt a m’en fabriquer une que je t’achète évidement. merci d’avance
Répondre à ce message
# Le 22 mars 2012 à 15:19, par Julien H.
En réponse à : Commande d’un servomoteur sans programme
Bonjour, oui dans le modélisme, ça s’achète.
Tout simplement un "testeur de servo", sauf si tu veux quelque chose de différent (avec une vitesse ralentie), auquel cas il faut faire un circuit spécial.
Répondre à ce message