L’un des objectifs principaux de la robotique est d’articuler des objets. Pour se faire, il est très courant d’utiliser des moteurs électriques comme des moteurs à courant continu notamment pour les plateformes mobiles. Dans cet article, nous verrons comment piloter un moteur cc avec une carte Arduino et un pont en H.
prérequis: Programmez avec Arduino
Matériel
- Ordinateur
- Carte Arduino UNO
- Câble USB pour connecter la carte Arduino au PC
- SN754410 x1
- Breadboard x1
- Moteur CC x1
- câbles de connexion
Description du Moteur CC
Les moteurs à courant continu possèdent souvent une boite de réduction afin d’augmenter leur couple pour un encombrement réduit. Le moteur CC est très simple d’utilisation. Pour le faire fonctionner, il suffit d’appliquer une tension électrique à ses bornes. Le signe et le niveau de cette tension vont imposer le sens et la vitesse de rotation.
Pour piloter la tension aux bornes d’un moteur à courant continu, il est possible d’utiliser un relais ou un pont en H.
Description du Pont H
Le pont en H transmet la puissance électrique au moteur et module la tension en fonction des commandes de la carte Arduino. Il peut être représenté par quatre interrupteurs qui vont diriger le courant en fonction des commandes de la carte et moduler la direction et la vitesse de rotation du moteur.
La solution que nous utilisons ici est le composant SN754410NE. Il peut piloter deux moteurs à courant continu et possèdent plusieurs broches ayant une fonction propre.
Nous rappelons leurs fonctions:
- Les broches GND, sont connectées entre elles et doivent être reliées à la masse du projet.
- La broche +5V sert à alimenter la partie logique de la puce et peut être reliée à la borne +5V de la carte Arduino.
- M1 Enable et M2 Enable permettent d’activer les deux ponts correspondants. Elles reçoivent un signal digital HAUT ou BAS de l’Arduino.
- M1/M2 Forward, M1/M2 Reverse permettent d’envoyer une tension au borne du moteur afin de le piloter dans les deux directions. Elles reçoivent un signal PWM afin de moduler la vitesse de rotation.
- La broche +Motor Power IN reçoit la tension d’alimentation des moteurs (5,6, 7V parfois jusqu’à 24V)
- Les broches restantes, Motor 1 et Motor 2, sont reliées aux bornes des moteurs.
Lorsque vous sélectionnez un composants, faites toujours bien attention aux limites de courant et de tension de fonctionnement
N.B.: Il existe des cartes facilitant la connexion comme le module L298N.
Schéma de connexion d’un moteur avec une carte Arduino
La carte Arduino peut être alimentée par l’ordinateur via le port USB.
Programme pour piloter un Moteur CC
Code de base
Pour piloter le moteur, il faut activer le pont en H correspondant et appliquer une commande PWM à la borne Forward ou Reverse qui correspondent au deux sens de rotation du moteur. Nous utilisons la broche 2 pour activer le pont en H avec un état haut ou bas et nous utilisons les broche 3 et 5 qui peuvent générer un signal PWM pour gérer la vitesse et le sens de rotation du moteur.
// Constants const int enableBridge1 = 2; const int MotorForward1 = 3; const int MotorReverse1 = 5; // Variables int Power = 80; //Motor velocity between 0 and 255 void setup(){ pinMode(MotorForward1,OUTPUT); pinMode(MotorReverse1,OUTPUT); pinMode(enableBridge1,OUTPUT); } void loop(){ digitalWrite(enableBridge1,HIGH); // Active pont en H // Tourne dans le sens direct pendant 2 secondes analogWrite(MotorReverse1,0); analogWrite(MotorForward1,Power); delay(2000); // Tourne dans le sens indirect pendant 3 secondes analogWrite(MotorForward1,0); analogWrite(MotorReverse1,Power); delay(3000); //Arrête le moteur pendant 1 seconde analogWrite(MotorForward1,0); analogWrite(MotorReverse1,0); digitalWrite(enableBridge1,LOW); delay(1000); }
Fonctions
Lorsqu’il y a beaucoup de composants sur votre robot, il est souvent intéressant de créer des sous-fonctions afin de rendre le code principal plus lisible.
// Constants const int enableBridge = 2; const int MotorForward = 3; const int MotorReverse = 5; // Variables int Power = 80; //Vitesse du moteur entre 0 et 255 void setup(){ dcBegin(); } void loop(){ dcForward(Power); delay(2000); dcReverse(Power); delay(3000); dcStop(); delay(1000); } void dcBegin(){ // Initialise les pines utilisées pour le moteur pinMode(MotorForward,OUTPUT); pinMode(MotorReverse,OUTPUT); pinMode(enableBridge,OUTPUT); } void dcForward(int P){ digitalWrite(enableBridge,HIGH); // Active pont en H // Tourne dans le sens Forward à la vitesse spécifiée par P analogWrite(MotorReverse,0); analogWrite(MotorForward,P); } void dcReverse(int P){ digitalWrite(enableBridge,HIGH); // Active pont en H // Tourne dans le sens Reverse à la vitesse spécifiée par P analogWrite(MotorForward,0); analogWrite(MotorReverse,P); } void dcStop(){ // Arrête le moteur et désactive le pont en H analogWrite(MotorForward,0); analogWrite(MotorReverse,0); digitalWrite(enableBridge,LOW); }
.Vous pouvez désormais piloter n’importe quel moteur à courant continu avec ce code simple.
Références
- La THE référence https://www.arduino.cc/
- Programmez avec Arduino
- Utilisation du module L298N
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Super explication et convivial en plus. j’ai récupéré un petit moteur cc avec une roue codeuse en bout d’arbre d’une vieille imprimante. Vous serait-il possible d’expliquer l’asservissement avec cette roue codeuse unique?
Merci pour le partage en tout cas.
Merci beaucoup pour votre commentaire.
Le principe pour l’asservissement avec une roue codeuse est, tout d’abord, de récupérer l’information sur la position (en comptant le nombre d’impulsion de la roue codeuse) et d’utiliser cette information dans une commande de type PID afin de moduler la tension appliquée au moteur (donc sa vitesse) pour atteindre la position désirée.
N’hésitez pas si vous avez besoin d’aide.
Bonjour,
J’ai testé votre projet.
Il y a une erreur faut pas prendre la PIN4 car les faits pas PWM . Autrement le moteur tourne que dans un sens
Bonjour,
Merci pour votre commentaire. Effectivement la broche 4 ne génère pas de signal PWM.
C’est corrigé!
bonjour, je suis une débutante. quel est l’utilité des piles?
Bonjour,
Les piles servent a alimenter le moteur. Dans la plupart des cas, le moteur demande un courant plus élevé que la limite admissible d’une carte Arduino (40mA). Il faut donc utiliser une alimentation externe.
Bravo pour votre article. Je possède une borne d’arcade avec un moteur qui tourne dans un sens ou l’autre via un interrupteur pour faire tourner l’écran lcd (mode paysage ou mode portrait). Lors de la rotation en fin de course (une fois l’interrupteur relâché) l’arrêt n’est pas net, et je dois ajuster via l’interrupteur la position. Je pense que votre schéma via le PC plutôt qu’un interrupteur, sera beaucoup plus précis. pensez-vous que les commandes passées via l’arduino seront efficaces dans mon cas de figure ?
Voici une démo de mon installation :
https://youtu.be/3dts-5RrVH0
Bonjour,
Merci beaucoup pour votre commentaire.
Dans votre cas, le mieux serait de coupler un Arduino avec deux capteurs de fin de course (paysage et portrait) afin que le moteur s’arrête lorsqu’il rencontre le capteur.
Bonsoir,
J’ai déjà pensé aux capteurs de fin de course, mais cela m’oblige à bricoler et à devoir ajuster l’emplacement exact derrière l’écran. Votre schéma permet si j’ai bien compris de lancer une commande de marche du moteur exprimée en secondes exemple (delay(3000);)
Il suffit que je trouve le nombre de secondes exact de fonctionnement de la commande pour que l’écran effectue la rotation nécessaire dans un sens comme dans l’autre.
J’ai juste ?
Vous avez tout à fait juste. Le seul problème que je vois avec cette solution, c’est que le moteur ne saura pas dans quelle position il est en cas de coupure de courant. A mon avis, il faut au moins un capteur pour qu’il s’initialise au démarrage.
Bonjour, je suis débutant en code et j’ai un projet a faire de terminal je voulais savoir si ce code serait approprié pour simplement faire tourner un moteur pendant environ 1 a 2 secs et l’arreter pendant 30 a 45 min merci.
Bonjour,
Pour les délais, il est préférable d’utiliser la fonction millis() mais ce code peut fonctionner.
Pour des délais de 45 min, il faut faire attention de bien définir la durée en unsigned long (UL) comme ceci:
delay(2700000UL)
ou
unsigned long forty_five=2700000UL;
delay(forty_five);
Bonjour et merci pour ces explications, très bien détaillées !
Je voulais savoir si quelqu’un connaissait un pont en H pouvant fournir plus d’1 ampère en sortie. Pour mon application (contrôle de moteur de vitre), le SN754410NE est capable de faire tourner parfaitement le moteur à vide mais une fois installée dans la porte, le frottement de la fenêtre bloque tout mouvement.
Si quelqu’un à des propositions, je suis preneur !
Merci d’avance
Merci pour le commentaire!
Le L298n sort du 2A mais ce n’est peut-être pas suffisant. ça dépend des caractéristiques du moteur
bonjour, je voudrais créer un robot qui roule mais je ne trouve pas de moteur cc compatible avec un shield arduino uno, savez vous si cella existe? merci
Bonjour, quel shield arduino souhaites-tu utiliser?
généralement les moteur cc entre 6 et 9V avec un courant max de 1A
Bonjour je suis en Terminale STI2D , j’ai un programme a faire avec un moteur 6V et je dois avoir un relais pour pouvoir faire fonctionner le moteur quelq’un aurait-il un programme complet pour ceci ?
Bonjour je suis en Terminale STI2D , j’ai un programme a faire avec un moteur 6V et je dois avoir un relais pour pouvoir faire fonctionner le moteur quelq’un aurait-il un programme complet pour ceci ?
Si le moteur est actionné par un relais, il suffit de passer la sortie Arduino reliée au relais à HIGH.
digitalWrite(pinMotor, HIGH);
delay(1000);//marche 1sec
digitalWrite(pinMotor, LOW);
delay(2000);//arret 2sec
Bonjour, super article, toutefois il est préférable d’inverser certaines commandes pour éviter le cas du:
loop() {
dcForward(30);
dcReverse(30);
}
Explication:
// Forward
F -> P
R -> 0
// Reverse
F -> 0
R -> P
// Loop
F -> P
R -> 0
Et là on peux constater que pendant un court instant R vaut P et que F vaut P aussi.
Il est donc toujours préférable de positionner à zéro avant de placer une tension.
void dcForward(int P){
digitalWrite(enableBridge,HIGH); // Active pont en H
// Tourne dans le sens Forward à la vitesse spécifiée par P
analogWrite(MotorReverse,0);
analogWrite(MotorForward,P);
}
Amicalement
Butor32
Bonjour,
c’est un point très valide.
Merci beaucoup
salut, comment je peut commander un robot en utilisent l298n pour qu’il peut avancer en avant de 20 cm par exemple
Avec des moteurs CC il faut rajouter un capteur de position ou encodeur rotatif sur chaque moteur pour pouvoir estimer une position.
Sinon, il est possible de mettre une durée d’actionnement correspondant à une avancée de 20cm mais ça ne sera pas précis.