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.
int main(void)
{
// 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 !
Vos commentaires
# Le 28 juin 2016 à 12:13, par RAMAUX Emmanuel En réponse à : Commande d’un servomoteur sans programme
Bonjour,
Je désire utiliser le montage sans microcontrôleur.
La commande d’activation du servo va se faire via un relais.
Quel tension dois-je appliquer pour remplacer la commande provenant de votre arduino : du 3,3v, du 5v, ou du 6v ?
Merci d’avance.
Emmanuel
# Le 18 août 2016 à 18:48, par Eric P. En réponse à : Commande d’un servomoteur sans programme
Si vous envisagez de générer le signal de commande via un relais, c’est carrément impossible : la fréquence à respecter pour que le servo considère ce signal comme valide est au environs de 50Hz. Autant dire qu’un relais ne pourra jamais commuter à cette vitesse.
Ce n’est donc pas une affaire de tension à appliquer.
# Le 22 juin 2017 à 06:00, par Mickaël En réponse à : Commande d’un servomoteur sans programme
Bien sur que si on peu, faut que le relais soit placé entre la patte 7 du Ne555 et le positif, donc c’est lui qui fera passant la résistance R1.
Exemple ici en vidéo, super ingénieux :
Répondre à ce message
# Le 28 septembre 2016 à 06:26, par brice jores En réponse à : Commande d’un servomoteur sans programme
bonjour, j ai a ma disposition un servomoteur miniature de 24 vdc que j’aimerai faire commander sans programme. Est-il possible pour moi d’utiliser le NE555 ???
merci d’avance
# Le 16 octobre 2016 à 15:53, par Eric P. En réponse à : Commande d’un servomoteur sans programme
Impossible de répondre sans connaître le type de signal de contrôle de votre servo (au vu de sa tension d’alimentation il ne s’agit pas d’un servo de type radio-modélisme).
Ceci étant s’il utilise un signal cyclique PWM, il est tout à fait possible de le générer à l’aide de NE555.
Répondre à ce message
# Le 19 mars 2016 à 13:09, par Goberville Yvon En réponse à : Commande d’un servomoteur sans programme
Bonjour,
Je voudrai utiliser des servomoteurs Tower ProSD90 pour de dételer les wagons en HO.
J’aimerai connaitre la consommation en courant de l’alimentation 5V (courant consommé par le servo + la platine de commande)
merci pour votre réponse
Amicalement
# Le 31 mars 2016 à 11:45, par Eric P. En réponse à : Commande d’un servomoteur sans programme
Désolé aucune idée. Avez-vous consulté la notice technique des servos en question ?
Répondre à ce message
# Le 30 mai 2015 à 16:25, par DELHOM En réponse à : Commande d’un servomoteur sans programme
Bonjour,
j’ai des servo moteurs d’un prix conséquent. ce sont des servo-winch de voiles, RMG, type moteur 280 voir 380 ; j’ai aussi un graupneur regatte ancienne version ;
Tous ces winch ont l’électronique de commande HS. Le électroniques RMG, hors de prix (140€ plus port), celle graupneur n’étant plus au catalogue, je me demande si vos circuits peuvent faire l’affaire : donner, via le récepteur, le nombre de tours demandés dans un sens ou l’autre, maintenir un couple assez conséquent pour ne pas que ls voiles se ’choquent’ (l’écoute se déroule toute seule) ; Le signal est du PWM, l’alimentation en 4,_ à 7, 2volts, un UBEC est intégré ainsi qu’une sécurité d’inversion de pôles, de température. les treuils RMG peuvent s’auto programmer en mettant un fil su l’émetteur et en écoutant les sons émis ; sinon, une programmation, vitesse, nombre de tours, course et toujours possibl via un émetteur programmable ;
comptant sur votre réponse. B ;DELHOM
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.
# 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.
# 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
# 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.
# 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 ?
# 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).
# 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
# 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
# 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 ?
# 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).
# Le 13 mars 2009 à 15:09, par ? En réponse à : Commande d’un servomoteur sans programme
Merci pour cette mise à jour
# 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 ???????
# 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