Commande de moteur à courant continu

. Par : Christian. URL : https://www.locoduino.org/spip.php?article213

Les moteurs électriques à courant continu (moteurs CC) sont extrêmement présents sur nos réseaux de trains miniatures, avec par exemple le moteur lent d’aiguillage, les barrières de passage à niveau, la plaque tournante, la roue de moulin à eau, le rotor d’hélicoptère prêt à décoller, l’entraînement du câble de téléférique, la grue ou l’engin de chantier, etc. Nous allons étudier dans ce chapitre comment commander ces moteurs avec Arduino.

Article mis à jour le 19 mars 2024 pour prendre en compte la différence de brochage entre les deux versions de boîtier du circuit L298

Nous savons tous utiliser un moteur CC ; il suffit de relier ses deux pôles à une alimentation en courant continu (une pile électrique par exemple) pour le faire tourner. Si on inverse la polarité de l’alimentation, le moteur tourne dans l’autre sens. Plus la tension de l’alimentation est forte (sans dépasser ce que peut admettre le moteur), plus la vitesse de rotation est élevée, et inversement. C’est sur ce principe que nos trains sont commandés en technologie analogique, le transformateur d’alimentation délivrant une tension réglable et inversable sur les deux rails.

Commander un moteur signifie donc pouvoir régler sa vitesse et son sens de rotation. Parfois, les deux ne sont pas nécessaires : la roue d’un moulin à eau tourne toujours dans le même sens, le câble de téléférique tourne toujours à la même vitesse, mais un coup dans un sens (montée de la cabine) et un coup en sens opposé (descente de la cabine). Arduino peut parfaitement commander un moteur CC et ainsi créer des animations sur le réseau. Néanmoins, le courant qu’il peut délivrer (au maximum 20 mA sur une sortie) est insuffisant et il faut donc lui adjoindre un peu d’électronique. Plusieurs solutions existent et sont extrêmement simples à mettre en œuvre.

Commande de la vitesse du moteur

Pour faire varier la vitesse d’un moteur CC, il faut faire varier la tension d’alimentation aux bornes du moteur. Mais Arduino ne sait délivrer que des tensions de 5 V sur ses broches avec un courant beaucoup trop faible pour alimenter un moteur. La solution est de faire appel à la PWM et d’amplifier le signal par un transistor (voir l’article La PWM : Qu’est-ce que c’est ? (2)) ou un circuit intégré équivalent comme le circuit ULN2803 (voir l’article Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803).

Arduino, grâce à sa fonction analogWrite, crée un signal carré basculant entre niveau bas (LOW = 0 V) et niveau haut (HIGH = + 5 V) de fréquence fixe (sur un Uno, 490 ou 980 Hz approximativement suivant les broches qui délivrent le signal), dont on peut faire varier le rapport cyclique, c’est-à-dire le temps où le signal est au niveau haut sur le temps de la période du signal. Un rapport cyclique de 50% signifie que le signal est au niveau haut 50% du temps. Ceci est résumé sur la figure 1.

Figure 1
Figure 1
Rapport cyclique et PWM

Ce signal est généré sur les broches d’Arduino mentionnées PWM (repérées par un tilde), grâce à la fonction analogWrite qui précise le rapport cyclique à adopter. La valeur est comprise entre 0 (pour un rapport cyclique égal à 0%) et 255 (pour un rapport cyclique égal à 100%), toute valeur intermédiaire pouvant être adoptée (exemple, 127 pour un rapport cyclique de 50%). Le signal est amplifié par un transistor et comme celui-ci travaille en commutation, sa dissipation en puissance est quasi nulle. Le moteur qui reçoit un tel signal est toujours alimenté dans sa tension nominale d’alimentation, ce qui fait que son couple est maximum. Par contre, le moteur perçoit ce signal comme un courant de tension moyenne égale à la tension d’alimentation multipliée par le rapport cyclique ; il tourne donc moins vite. Pour faire varier la vitesse du moteur, il suffit de faire varier le rapport cyclique du signal PWM délivré par Arduino.

Commande du sens de rotation avec un pont en H

Le pont en H va nous permettre de commander le sens de rotation du moteur. La figure 2 en explique le principe grâce à un montage constitué de quatre interrupteurs et du moteur à commander.

Figure 2
Figure 2
Principe du pont en H

Tous les interrupteurs sont ouverts donc le courant de l’alimentation ne peut pas parvenir au moteur ; celui-ci est arrêté. Numérotons de A à D (dans le sens des aiguilles d’une montre) nos interrupteurs (voir figure 2). Il ne faut surtout pas fermer en même temps les interrupteurs A et D, ou bien B et C, car on créerait un court-circuit avec l’alimentation. Commençons par fermer les interrupteurs A et C, B et D restant ouverts. Le courant électrique parvient au moteur en suivant le cheminement figuré en jaune : le moteur tourne dans un sens. Ouvrons A et C : le moteur s’arrête (cas de départ). Fermons maintenant les interrupteurs B et D, A et C restant ouverts. Le courant électrique parvient au moteur en suivant le cheminement figuré en violet : le moteur tourne dans l’autre sens.

Cela vous paraît sans doute compliqué alors qu’un montage inverseur aurait produit le même résultat, mais le pont en H devient intéressant si on remplace les interrupteurs par des interrupteurs électroniques commandés par des courants ou des tensions, comme des transistors par exemple. Pour mieux comprendre comment un transistor peut devenir un interrupteur électronique, reportez-vous au chapitre 5 du cours d’électronique de l’article Démarrer en électronique.

Pont en H avec des transistors

La figure 3 montre un montage classique en électronique, appelé pont en H (H bridge) ou pont double (dual bridge). Il est constitué de 4 transistors NPN appelés A, B, C et D (comme nos interrupteurs du paragraphe précédent). Pour faire tourner le moteur dans le sens 1, le courant doit suivre le cheminement représenté en jaune. Les transistors A et C doivent être passants alors que les transistors B et D doivent être bloqués. C’est l’inverse pour faire tourner le moteur dans le sens 2, le courant doit suivre le cheminement représenté en violet ; les transistors B et D doivent être passants et les transistors A et C doivent être bloqués.

Figure 3
Figure 3
Pont en H

Dans le cours d’électronique mentionné plus haut, on a appris à utiliser des transistors en commutation en appliquant un signal sur sa base. Si on relie les bases des transistors aux sorties numériques 7, 8, 9 et 10 d’Arduino (par exemple), il suffit alors d’appliquer sur ces sorties des signaux HIGH ou LOW pour que nos transistors soient passants ou bloqués. Le tableau suivant résume la situation.

SensABCD78910
1 Passant Bloqué Passant Bloqué HIGH LOW HIGH LOW
2 Bloqué Passant Bloqué Passant LOW HIGH LOW HIGH

Les sorties 9 et 10 d’Arduino peuvent fournir un signal de type PWM ; le montage sert alors à inverser le sens de rotation d’un moteur tout en pilotant sa vitesse de rotation.

Bien entendu, chaque fois qu’on utilise une charge constituée de bobinages (cas d’un moteur), il faut penser à protéger l’électronique de commande (les transistors ou Arduino) par des diodes de roues libre. Celles-ci n’ont pas été représentées sur la figure 3 (pour ne pas surcharger la figure) mais doivent être montées comme indiqué dans les paragraphes suivants, notamment dans les figures 5 et 6. Pour plus d’informations sur les diodes de roue libre, consultez le cours d’électronique de l’article Démarrer en électronique, au chapitre "Les diodes".

Pont en H à base de circuit intégré

Il existe des circuits intégrés équivalents au schéma que nous venons de monter, comme par exemple le L298 qui permet de commander deux moteurs à courant continu. Il existe en deux versions de boitier : Multiwatt15 et PowerSO20 dont le brochage diffère, comme le montre la figure 4A.

Figure 4A
Figure 4A
Brochage du L298 dans ses deux versions de boîtier (source datasheet)

Si vous regardez la notice du constructeur du L298 (figure 4B), vous y retrouverez des similitudes avec la figure 3 ; il y a deux ponts en H puisque le circuit peut commander deux moteurs CC. Pourtant, le circuit intégré L298 est plus sophistiqué que ce que nous avons réalisé, car il possède une logique de commande intégrée.

Figure 4B
Figure 4B
Le circuit L298

La figure 5 (issue de la datasheet du constructeur) montre comment interfacer la moitié d’un circuit L298 pour commander un moteur ; le montage doit être fait en double à partir du même circuit L298 pour commander deux moteurs. On remarque les quatre diodes de roue libre que nous avons évoquées au paragraphe précédent pour protéger le circuit L298 des courants induits par les bobinages du moteur CC. Le petit tableau de la figure 5 résume le comportement du circuit en fonction des niveaux logiques (H pour HIGH et L pour LOW) sur les broches C et D (numérotées) du circuit. Nous avons un sens marche avant (Forward en anglais), un sens marche arrière (Reverse en anglais) et même la possibilité d’un arrêt rapide (Fast motor stop en anglais) si les niveaux logiques sont identiques sur les entrées C et D du circuit. Il faut pour cela que le niveau logique sur la broche « En » (Enable en anglais) soit H. Si le niveau est L, le moteur tourne en roue libre jusqu’à s’arrêter de lui-même (Free running motor stop) et auquel cas, peu importe (Don’t care) les niveaux sur C et D. C’est justement sur l’entrée « En » qu’on peut appliquer un signal PWM pour réguler la vitesse du moteur.

Figure 5
Figure 5
Interfaçage d’une moitié de circuit L298

Remarquez sur la figure 5 comment sont montées les diodes de roue libre D1 à D4.

Cette logique de commande peut bien évidemment être reliée aux sorties d’Arduino et la figure 6 nous montre comment relier le circuit L298 aux sorties d’Arduino. Encore une fois, on remarque les quatre diodes de roue libre aux bornes du moteur.

Figure 6
Figure 6
L298 et Arduino
Les numéros de broches du circuit, inscrites en vert, font référence à la version boîtier Multiwatt15. Si vous utilisez la version en boîtier PowerSO20, reportez-vous à la figure 4A pour obtenir la correspondance en considérant le nom des entrées ou sorties (exemple In1, Out2, etc.).

Les signaux appliqués aux entrées In1 (5) et In2 (7) détermine le sens de rotation du moteur (ou son arrêt rapide). Le signal appliqué à l’entrée EnA (6) commande la vitesse de rotation s’il est du type PWM. Une fois de plus, si on veut commander deux moteurs CC, le montage doit être réalisé en double.

Il existe d’autres circuits intégrés réalisant la même chose que le L298, avec des performances supérieures, comme le circuit LMD18200 qui a la préférence du staff d’Arduino, mais d’autres circuits sont également possibles en fonction des caractéristiques des moteurs à commander.

Carte shield pour commander des moteurs

Pour en revenir au circuit L298, il est d’ailleurs utilisé, dans sa version CMS PowerSO20, par la carte Arduino Motor Shield décrite sur le site d’Arduino, à cette adresse : https://www.arduino.cc/en/Main/Ardu....

Il est parfois plus simple et meilleur marché de faire appel à ce genre de cartes quand on doit commander plusieurs moteurs, mais c’est aussi la solution idéale pour ceux que l’électronique effraie. Il suffit d’enficher la carte shield sur le module Uno ou Mega, de connecter le ou les moteurs ainsi que leur alimentation sur le connecteur prévu à cet effet puis de développer un petit programme ou d’en trouver un tout fait sur les nombreux forums et de l’adapter en fonction de ses besoins.

Figure 7
Figure 7
Carte Arduino Motor Shield

Chaque canal utilise 4 broches du module Arduino : 3 (ou 11) pour la PWM, 12 (ou 13) pour déterminer le sens de rotation, 9 (ou 8) pour la fonction frein (Brake en anglais) et les entrées analogiques A0 (ou A1) pour lire ce que chaque moteur consomme (fonction Current sensing). Si vous n’avez pas besoin des fonctions Brake et Current Sensing, vous pouvez récupérer les broches pour autre chose en coupant un jumper au dos de la carte.

D’autres constructeurs proposent leur carte shield pour commander des moteurs ; quel que soit votre choix, lisez toujours attentivement les précautions d’emploi et regardez s’il existe des forums pour vous venir en aide ; c’est généralement le cas pour les cartes les plus courantes.

Commander la voie

Dans les montages étudiés précédemment, on peut, à la place de relier les deux pôles du moteur, relier les deux rails d’une voie, et ainsi commander l’engin moteur qui se trouve dessus, aussi bien en direction qu’en vitesse. Ce mode d’exploitation qui consiste à commander la voie pour commander la locomotive qui se trouve dessus, est qualifié d’analogique.

Les modélistes qui pratiquent l’exploitation numérique de leur réseau selon la norme DCC prendront certainement beaucoup de plaisir à lire la série d’articles Réalisation de centrales DCC avec le logiciel libre DCC++ (1), et notamment l’article Réalisation de centrales DCC avec le logiciel libre DCC++ (3) qui explique comment choisir et utiliser une carte Motor Shield avec le logiciel DCC++ pour développer sa propre centrale numérique.

Conclusion

Je sais très bien qu’il n’est pas possible de faire le tour de la question dans un article de longueur raisonnable. J’espère simplement vous avoir permis de découvrir quelques techniques simples pour utiliser des moteurs avec Arduino, et surtout vous avoir montré que vous pouvez toujours aller plus loin dans l’utilisation de vos modules Arduino pour agrémenter votre réseau de trains miniatures.