[Arduino] Contrôler des moteurs DC avec le composant L293D
Cela fait maintenant plusieurs semaines que je suis à fond sur le monde Arduino et j’ai pour projet la réalisation d’un petit robot (rassurez-vous quand tout fonctionnera vous aurez droit à un beau tutoriel ? ).
Les robots utilisent un certain nombre de composants: microcontrôleur (arduino dans mon cas), de servos et de moteurs. Dans cet article, nous allons voir comment faire pour piloter des moteurs DC (à courant continu) via un arduino.
Fonctionnement d’un moteur DC
Il existe des dizaines de moteurs DC différents: taille, voltage, ampérage, …
Un moteur DC est un convertisseur électromécanique permettant la conversion bidirectionnelle d’énergie entre une installation électrique parcourue par un courant continu et un dispositif mécanique ; selon la source d’énergie (merci Wiki :p). Pour faire simple, cela signifie qu’un moteur à courant continu va pouvoir convertir de l’électricité en énergie mécanique. Les moteurs DC ont ainsi la particularité de pouvoir fonctionner dans les 2 sens, suivant la manière dont le courant lui est soumis.
Le schéma suivant explique le fonctionnement d’un moteur à courant continu:
Les moteurs à courant continu se trouve relativement facilement et sont peu chers. J’ai réussi à m’en procurer plusieurs pour à peine 10$ sur ebay. Vous verrez on prend vite goût à les utiliser et cela vous donnera probablement des idées de projets ?
Un premier test pour vous faire comprendre le fonctionnement d’un moteur DC est de connecter la borne +du moteur à la borne + d’une pile 9V et la borne – du moteur à la borne – de la pile. Le moteur se mettra alors à tourner dans le sens horaire.
Maintenant,vous pouvez inverser les branchements et vous verrez que le moteur se mettra à tourner dans le sens anti-horaire. Si vous utiliser une pile plus ancienne vous verrez également que le moteur tourne moins vite: nous allons donc pouvoir régler la vitesse de fonctionnement du moteur DC.
Nous allons chercher à faire tourner un moteur DC dans les 2 sens grâce à un Arduino. Pour nous aider, nous allons utiliser un composant pas cher et simple à utiliser: le composant L293D.
Comprendre le composant L293D
Le composant L293D est un pont de puissance composé de plusieurs transistors et relais qui permet d’activer la rotation d’un moteur. Ce composant se trouve facilement sur Ebay et ne coûte pas très cher.
Le L293D est un double pont-H, ce qui signifie qu’il est possible de l’utiliser pour commander quatre moteurs distincts (dans un seul sens) grâce à ses 4 canaux.
Il est également possible de constituer deux pont-h afin de piloter deux moteurs distincts, dans les deux sens et indépendamment l’un de l’autre.
Il est important de noter que le L293D peut délivrer au maximum 600mA, veuillez donc choisir vos moteurs en conséquence.
Si vous avez besoin de plus d’informations, n’hésitez pas à consulter la documentation technique du composant L293D disponible ici.
Caractéristiques techniques du L293D
Voici les caractéristiques techniques du composant L293D:
- Nbre de pont-H: 2
- Courant Max Régime continu: 600mA (x2)
- Courant de pointeMax < 2ms: 1200mA
- VS Max Alim moteur: 36v
- VSS Max Alim logique: 7v
- Nbre de Broches: 16 DIP
- Perte de tension: 1.3v
Branchement du L293D
Le schéma suivant détaille les différentes broches du composant L293D:
- Enable1: permet d’envoyer (ou pas) la tension sur les sorties du moteur via OUTPUT1 et OUTPUT2 et commande l’activation/désactivation du premier Pont-H. Si ENABLE1 = GND, le pont-H est déconnecté et le moteur ne fonctionne pas. Si ENABLE1 = VSS, le pont-H est connecté aux sorties et le moteur fonctionne dans un sens ou l’autre ou pas en fonction des tensions appliquée sur INPUT1 & INPUT2.
- Input1: avec Input 2, sont les broches de commande du Pont-H Output1/Output2. Il sera directement brancher à votre Arduino pour commander le sens du courant entre Output 1 et Output 2.
- Ouput1: avec Output 2, sera branché directement sur le moteur.
- GND: qui doit être raccorder à la masse de la source d’alimentation de puissance VS et à la masse de la source d’alimentation de la logique “VSS” (donc GND Arduino).
- Ouput2: avec Output 1, sera branché directement sur le moteur.
- Input2: avec Input 1, sont les broches de commande du Pont-H Output1/Output2. Il sera directement brancher à votre Arduino pour commander le sens du courant entre Output 1 et Output 2.
- VS: Alimentation de puissance des moteurs.
- Enable2: commande l’activation du second pont-H constitué de Output3/Output4
- Input3: avec Input 4, sont les broches de commande du Pont-H Output3/Output4. Il sera directement brancher à votre Arduino pour commander le sens du courant entre Output 3 et Output 4.
- Ouput3: avec Output 4, sera branché directement sur le moteur.
- GND
- GND
- Ouput4: avec Output 3, sera branché directement sur le moteur.
- Input4: avec Input 3, sont les broches de commande du Pont-H Output3/Output4. Il sera directement brancher à votre Arduino pour commander le sens du courant entre Output 3 et Output 4.
- VSS: Alimentation de la logique de commande (5V). A raccorder à la borne +5V de votre Arduino.
Veuillez noter que les pins Enable1 et Enable2 permettent moduler la vitesse du moteur en utilisant des broches PWM de votre Arduino. Si vous ne souhaitez pas moduler la vitesse du moteur DC, ilvous suffit de brancher Enable1 sur la broche VSS de votre Arduino.
Fonctionnement du L293D
Le tableau suivant vous permettra de faire fonctionner votre moteur DC en utilisant le composant L293D:
Utilisation du L293D avec Arduino et 2 moteurs DC
Avec un seul pont L293D et un arduino on va être capable de piloter 2 moteurs à courant continu indépendamment l’un de l’autre. Si la puissance de vos moteurs est faible vous pourrez même utiliser le 5V en sortie de votre arduino pour alimenter vos moteurs DC.
Brochage du L293D avec 2 moteurs sous Arduino
L293D arduino motor
Schéma pour brancher 2 moteurs à un arduino
Code Arduino pour contrôler 2 moteurs
int motor1_enablePin = 11; //pwm
int motor1_in1Pin = 13;
int motor1_in2Pin = 12;
int motor2_enablePin = 10; //pwm
int motor2_in1Pin = 8;
int motor2_in2Pin = 7;
void setup()
{
//on initialise les pins du moteur 1
pinMode(motor1_in1Pin, OUTPUT);
pinMode(motor1_in2Pin, OUTPUT);
pinMode(motor1_enablePin, OUTPUT);
//on initialise les pins du moteur 2
pinMode(motor2_in1Pin, OUTPUT);
pinMode(motor2_in2Pin, OUTPUT);
pinMode(motor2_enablePin, OUTPUT);
}
void loop()
{
SetMotor2(175, true);
SetMotor1(255, false);
}
//Fonction qui set le moteur1
void SetMotor1(int speed, boolean reverse)
{
analogWrite(motor1_enablePin, speed);
digitalWrite(motor1_in1Pin, ! reverse);
digitalWrite(motor1_in2Pin, reverse);
}
//Fonction qui set le moteur2
void SetMotor2(int speed, boolean reverse)
{
analogWrite(motor2_enablePin, speed);
digitalWrite(motor2_in1Pin, ! reverse);
digitalWrite(motor2_in2Pin, reverse);
}
Voila bon amusement avec les moteurs à courant continu et Arduino ? Vous verrez c’est marrant à utiliser.
Merci! Très bon tutoriel! 🙂
est ce que c’est normale que le L293D chauffe??
Oui c’est normal. Je conseille de mettre un ventilateur dessus ou un dissipateur alu
Bonjour
Ce tutoriel est très bien expliqué, j’ai malgré tout une petite question.
Comment faut-il faire pour relier 4 moteurs au L293D ?
Merci d’avance
Il suffit d’utiliser 2 L293D pour utiliser 4 moteurs
Non, tu peu
Merci beaucoup sur ce tuto qui m’a beaucoup aidé ! Néanmoins il y a quelque chose qui reste flou pour moi car dans la partie “void loop”:
-Que veut dire “boolean reverse” ?
-Pourquoi faire comprendre à Arduino que “Setmotor1” est vrai alors que “Setmotor2” est faux ? Que signifie 175 et 255 ?
Enfait j’ai l’impression de n’avoir pas compris grand chose de la 2eme partie du code…
SetMotor est une fonction et 175 ou 255 est un exemple de vitesse. Tu peux faire varier la vitesse entre 0 et 255
Salut merci beaucoup pour ce tuto mais je ne comprend pas un truck tu dis qu’il faut brancher la broche 16 (Vss) du L293D sur 5v mais tu l’as branche sur la pile de 9v et tu n’as pas expliqué pourquoi tu as relier Vin à ta breadboard, je n’ai encore jamais utiliser ce pin Vin ..
Vin sert a alimenter la carte
slt. merci beaucoup pour ce tutoriel. j’ai fait un montage de moteur + L293D+ potentiomètre + arduino et j’ai alimenter le moteur avec 6V qui a été insuffisant pour déplacer un mécanisme de translation est ce que je peut alimenter avec 12V et est ce que la puissance de l’allimentation endomage la carte. je serai très agréable s vous me repondre
Il faut utiliser 2 sources d’alimentation:
* une de 5v pour la carte Arduino
* une de 12v pour vos besoins
Il suffit de relier les masses des 2 alimentations et tout fonctionnera 🙂
Il ne faut jamais alimenter en 12v un arduino car c est trop
merci.je cherche de changer la vitesse en entrant des valeurs sur pc donc ne plus changer la vitesse manuellement avec un potentiomètre.
bnj
quelle est la méthodes pour faire tourner 5 moteur dans des defferents sens? .
il est possible d’utiliser le circuit L293D?
le L293D convient parfaitement. Il peut se chainer facilement et gère 2 moteurs
merci pour se tuto , savez vous comment brancher un joystick pour controler les deux moteur ?
Il faudrait récupérer les evenement émis par le pad pour pouvoir ensuite ordonner les moteurs
Bonjour,
Merci pour ce tuto, en fait, j’ai un petit robot avec 3 moteurs (2 à 5v et l’autre à 24 v ), j’aimerai le commander par une carte arduino uno qu’elle est la solution que vous voyez pratique.
Merci d’avance
je verrai un projet avec 2 batteries reliées ensemble par leur masse. La premiere batterie (entre 6 et 9V) alimente uniquement la carte arduino alors que la seconde batterie (24v) servirait à l’alimentation des moteurs
Bonjour,
je voulais savoir s’il est possible d’utiliser à la place de la pile le 5V de l’Arduino. Voila, autrement excellent tutoriel.
Cordialement,
TonyCraft Anthony
Il est possible d utiliser la pile de 12v ou de 24 a condition de reduire la tension
Bonjour,
je me suis mal exprimé, je voulais dire d’utiliser le 5V de l’Arduino pour alimenter les moteurs et ne pas utiliser de piles ou d’autre sources d’alimentation que l’Arduino.
Cordialement,
TonyCraft Anthony
le VC out de l arduino risque de ne pas etre assez puissant :/ Desormais j’alimente toujours mes equipements (leds, moteurs, etc…) via une source d’alimentation tierce
Ok, merci pour le conseil.
Bonjour,
Quand les cables sont coudés, ils ne sont pas “plentés” dans la table pour les connectiques ?
Je ne comprends pas trop la question en fait lol
Il demande si on peut souder les cables à la place de les mettre dans la BreadBoard
Bien sur sans aucun souci. Mais pour du prototypage je prefere l’utilisation de breadboards car cela rend les tests plus flexibles
Merci pour le tuto.. J ai besoin d aide a propos d un robot a 4 moteurs de 6v 200 mA et 3 infrarouges. Je me demande l alimentation nécessaire pour faire tourner le robot ainsi pour que les 3 infrarouges marchent bien ?
Tout depend de la durée de fonctionnement souhaitée
je me demande si on veut orienter 4 moteurs CC en utilisons des boutons poussoir selon leurs vitesses(si w1>W2 le robot va tourner à gauche sinn il va tourner à droite) sachant que w3=W4 tjrs .
combien de CI L293D faut -il utiliser? et comment faire le brochage!quel sont les changement que je vais faire au niveau du code!merci d’avance.
Oui c’est le principe que j’utilise dans mes robots. Avec un l293D vous pouvez piloter 2 dc
bonjour; j’espère que vous allez b1, pouvez vous m’aider a mon projet fin d’étude, je veux tout simplement faire tourner un seul moteur dans les deux sens: (je fais la commande par une app via un module bleutooth); je veut dire si la carte arduino reçoit un code par exemple “A” LE moteur tourne dans un sens, et si j’envoie par exemple “B” le moteur tourne dans l’autre sens; c posible; mais je trouve des difficultés a faire mon programme: povez vous m’aider s’il vos plait??
Bonjour,
Je vois que l’on peut faire varier la vitesse du moteur jusque 255. Mais à quoi correspond ce nombre ? A-t-il une unité (possibilité d’en déduire une vitesse en tr/min…) ?
C’est a valeur maximale possible qui peut etre envoyée
Mais du coup ça correspond à des tours/minutes?
mais du coup c’est en tour/min ou pas?
tes deux derniers shéma ne concordent pas dans les branchements L293D / Arduino : les sorties 7/8 et 12/13 sont inversées par rapport au schéma que tu indique au dessus
bonjour
avant tout merci pour ce tutor
j’ai une petite question , je veux commander deux moteurs cc avec un arduino et un joystick , donc quand je veux tourné a droite ou a gauche les moteurs auront deux sens de rotations différents (comme sur un tank) de plus la vitesse doit être variable en fonction de la tension délivrée par le joystick
merci d’avance
C’est tout a fait possible de piloter 2 moteurs avec un joystick en se basant sur mon code.
Quelle est la référence de votre joystick ?
bonjour merci pour le tutoriel au fait je voulais savoir si c’était possible d’utiliser le L293D pour commander le moteur à corant continu et le moteur pas à pas
Le L293D ne convient pas pour les moteurs PAP
merci pour le tuto au fait je voulais savoir si c’était possible de brancher sur le 293D deux moteurs de nature différente pas à pas et le moteur à courant continu
Je déconseille car cela risque de faire chauffer le L293D. De plus pour le moteur pas a pas il faut utiliser des steppers
merci!!!!
Bonjour,
J’utilise deux L293D pour piloter 4 moteur à courant continu.
Cependant lorsque je lance le programme, trois fois sur quatre le moteur ne fonctionne pas et le moteur émet un son aigu.
Lorsque je branche le moteur directement sur mon alimentation il fonctionne bien.
Savez-vous d’ou cela peut venir ?
Ce bug apparait sur les quatres moteurs
Merci
la masse est bien branché ? sinon survoltage peut etre ?
Bonjour,
J’aurais besoin d’aide pour programmer un moteur à CC. Mon projet est le suivant:
Je travaille sur un store automatique, des lamelles s’ouvrent ou se ferment pour que la lumière passe. Pour cela, je dois contrôler si les lamelles sont déjà fermées ou ouvertes (avec un capteur angulaire) et si la lumière de dehors est inférieur ou égale à 10 lux (avec un capteur de lumière).
Les caractéristiques de mon moteur sont : (si vous voulez plus d’informations, le moteur est le ModelCraft RB 35 1:600)
– 12V
– 10 rpm
– 1:600
De plus, j’utilise un carte arduino Uno avec un Motor Shield L298P).
Merci à vous,
Antoine.
Bonjour,
j’avais besoin d’une interface me permettant de piloter un moteur via une arduino, et visiblement le L293D fait parfaitement l’affaire, mais je me pose quand même une question : n’y a-t-il pas plus simple qu’utiliser un composant prévu pour 4 moteurs ? (sans aller jusqu’au simple Mosfet, étant donné qu’il s’agit d’un projet de cours et que mon prof veut absolument que j’utilise une interface …) ?
Petites questions :
je vois que le L293D peut commander 4 moteurs en sens unique. Mais comment faut-il brancher les moteurs ? Une borne sur une broche Out du L293D et l’autre sur la masse ?
De plus, les broches Enable sont-elles réellement utiles ? En gros, est-il possible de simplement les brancher sur le 5V si je veux que les ponts en H soient toujours activés (et garder les Ponts en H toujours activés, mais sans forcément les utiliser, pose-t-il un problème ?) ?
Bonsoir ,j’ai comme projet une realisation d’un rebot mobile et pour ça je vais utiliser 2 moteurs dc ,et je voudrais les controller a dictance (la direction et la vitesse) surtout la vitesse ,et je voudrais savoir comment arriver si vous pouvez m’aider
Bonjour,
Je dois exactement faire la même chose. Avez-vous réussi ? Je dois commander en Bluetooth 4 moteur DC de 12V dans les deux sens de rotation et contrôler la vitesse. Merci d’avance
bonjour et merci pour le tuto, mais à quoi correspond “speed” et “boolean reverse” dans le programme?
Merci d’avance.
speed correspond a la vitesse du moteur et boolean reverse permet de definir le sens dans lequel il tournera
Comment je peux controler un moteur sur matlab ?
je ne connais pas assez matlab desolé
bonjours j’ai comme projet un robot éviteur d’obstacles et je doit le programmer sous matlab puis l’implimenter sur un robot à carte d’arduino mais j’ai pas une idée comment je peut ecrire ce code,pouvez vous m’aider pour ça svp?
Desole mais je ne fais quasiment plus de matlab
Bonjour, merci pour ce tuto, pourriez vous m’aiguiller, (je débute totalement) j’ai réaliser ce tuto avec deux moteurs donc mais je voudrais y inclure un joystick mais je ne sais ou le brancher 🙁
D’avance merci
Pourriez vous me donner la reference de votre joystick.
Bonjour, merci d’avoir pris le temps de ma répondre, mon joystick actuelle (je peux en acheter un autre au besoin) et celui-ci
http://boutique.semageek.com/fr/281-thumb-joystick-grove.html
désolé mais je ne connais pas ce genre de modele. As tu une doc fournie avec
merci trésbon tuto parcontre j’ai vu sur d’autre tuto des histoire de protectyion ? le pont h joue ce role directement ?
Bonjour je ne sais pas si le pont H protège le circuit.
Salut! J’avais une question : Avec un inverseur SN74LS14 il est possible de n’utiliser que 4 branchements pour controler les deux moteurs dans les deux sens. Mais cela ne suffit pas a mon prof qui nous demande un code pour piloter les deux moteurs dans les deux sens avec un seul pin PWM. Aurais tu une idée?
Merci
qu’elle modification faut t’il faire sur le programme pour faire reculer le robot ( moteur a sens inverse ) ? merci
Bonjour est ce que cela marche aussi pour des servo? Super tuto
Jamais essayé pour des servos mais cela devrait le faire sans souci
Bonjour, excuser moi de me déranger mais j’aurais besoin de votre aide.
A quoi sert la fonction [[void Setmotor1(int speed, boolean reverse)]]
Et que veut dire
analogWrite(PinPMoteur1, speed);
digitalWrite(Pin1Moteur1, ! reverse);
digitalWrite(Pin2Moteur1, reverse);
Je ne comprend pas vraiment cette partie.
J’ai un question ,comment arrêter le moteur définitivement après un démarrage et merci
Peut etre en lui affectant une vitesse a 0
Bonjour
je voudrai commander une grue tournant sur 180 °
Quand la grue s’arrête, un moteur fait descendre une charge et remonte
puis la grue repart a son point d’origine, s’arrête un temps et le système redémarre
Comment je fait
je ne sais pas écrire de programme, en partant de ce programme est-ce possible ?
Comment programmer la vitesse
merci
https://www.dailymotion.com/video/k3iIutmg9ieLJkp1AoJ (cette grue fonctionne avec une commande numérique manuel, je voudrai quelle fonctionne toute seul)
j’ai u circuit integre SN74HC595 , et je voudrais savoir si je peux l’utiliser pour controler les moteurs,,, merci d’avance
Vous pouvez mais ils risquent de chauffer dur par rapport à un composant dédié tel que le L293D. Les registers SN74HC595 servent principalement à effectuer du multiplexage
Hello
Jai deux motor dc et je veux controller la vitesse de chacun via pwd1 et pwd2
Le motor ne tourne que avec une vitesse superieur a 100
Si je met une vitesse INFerieur a 100 Le motor ne tourne pas et la carte signal un peep sonore
Quelle est Le problem et merci
Et Jai
jai un probleme lorsque je lance le programme sur le logiciel puis que je veut le mettre sur ma carte il m’indique plein de messsage d’erreur
Bonjour,
J’ai deux questions qui me sont très importantes.
Tout d’abord, à quelle borne GND dois-je relier la deuxième borne (la négative) de mon moteur sachant que sa première borne serait reliée à un OUTPUT pour que je puisse ainsi brancher 4 moteurs sur un seul L293d qui fonctionneraient indépendamment et dans un seul sens?
Deuxièmement, est-il obligé de relier les bornes Enable 1 et Enable 2 à mon Arduino car je n’ai plus de pins dispo sur cette dernière. Ainsi, puis-je relier les bornes Enable 1 et 2 à la borne Vss (comme nous l’explique la description détaillée des bornes)?
Je sais que je fais ch**r avec mon long texte mais si quelqu’un pourrait répondre (phd par exemple 🙂 ) cela m’aiderait énormément.
Merci
hi, can you launched sensor fluxgate flc100 magnetometr with ardunio and conected to pc wiht bleuthos? thack you very much
I think it s possible yes