Skip to Content

Comment contrôler un moteur DC avec un driver L293D en utilisant Arduino

Comment contrôler un moteur DC avec un driver L293D en utilisant Arduino

Dans ce tutoriel, je vais vous fournir toutes les informations nécessaires pour contrôler la vitesse et la direction d’un moteur DC avec un circuit intégré pilote de moteur L293D en utilisant une carte Arduino UNO.

J’ai inclus un schéma de câblage ainsi que les détails du code Arduino pour contrôler le moteur DC en envoyant des caractères depuis le Moniteur Série de l’IDE Arduino, avec plusieurs exemples.

Fournitures 

Composants matériels

Arduino Uno Rev3  × 1  Amazon
Câble USB type A/B  × 1  Amazon
Moteur DC avec réducteur  × 1  Amazon
Circuit intégré pilote L293D  × 1  Amazon
Plaque d’essai (breadboard)  × 1  Amazon
Fils de connexion (jumper wires)  × 15  Amazon
Alimentation (5V)  × 1  Amazon

Logiciel

Arduino IDE  Arduino_IDE

Makerguides.com participe au programme d’affiliation Amazon Services LLC Associates, un programme publicitaire conçu pour permettre aux sites de percevoir des commissions en faisant la promotion et en créant des liens vers des produits sur Amazon.com.

À propos du circuit intégré pilote de moteur L293D

Le L293D est un circuit intégré pilote de moteur quadruple demi-pont en H à courant élevé, adapté au contrôle de moteurs DC. Il peut fournir un courant de pilotage bidirectionnel jusqu’à 1 A à des tensions de 4,5 V à 36 V. Vous trouverez ci-dessous la fiche technique du composant.

Brochage du circuit intégré L293D

Pinout of L293D

Le L293D est un circuit intégré pilote de moteur à 16 broches, permettant de contrôler deux moteurs DC ou un moteur pas à pas sous un courant de 600 mA.

Broches d’alimentation

La broche 8 (VCC_2) et la broche 16 (VCC_1) servent à alimenter le circuit intégré pilote L293D.

Power Supply Pins

VCC_2 alimente le pont en H interne du circuit intégré, et peut être comprise entre 4,5 V et 36 V. VCC_1 est utilisée pour la logique interne et doit être à 5 V. Les broches 4, 5, 12 et 13 (GND) sont la masse du dispositif et les broches de dissipateur thermique.

Broches de contrôle de direction

Les broches 2 (Input_1), 7 (Input_2), 10 (Input_3) et 15 (Input_4) contrôlent les interrupteurs du circuit en pont en H à l’intérieur du L293D.

Direction Control Pins
Broches de contrôle de direction

Input_1 et Input_2 sont connectées aux deux bornes du moteur DC_1 pour contrôler sa direction. De même, Input_3 et Input_4 contrôlent la direction du moteur_2.

J’utiliserai un Arduino UNO pour générer les signaux de direction sur toutes les broches Input, et selon leur niveau (haut ou bas), le moteur tournera en avant ou en arrière.

Vous pouvez consulter les détails dans le tableau ci-dessous pour le contrôle de la direction du moteur.

Input_1 / Input_3  Input_2 / Input_4  Direction du moteur
Bas  Bas  Frein, moteur arrêté
Bas  Haut  Arrière (sens antihoraire)
Haut  Bas  Avant (sens horaire)
Haut  Haut  Frein, moteur arrêté

Broches de contrôle de vitesse

Les moteurs DC peuvent tourner à une vitesse spécifiée selon la valeur définie par l’Arduino UNO sur la broche 1 (Enable_A) pour le moteur_1 et la broche 9 (Enable_B) pour le moteur_2.

Speed Control Pins

Un signal actif haut sur la broche enable active le canal du pilote du L293D, permettant au moteur de tourner à pleine vitesse.

Un signal actif bas sur la broche enable désactive le canal du pilote du L293D, arrêtant le moteur. Pour contrôler la vitesse du moteur DC, vous devez envoyer des signaux PWM sur la broche enable du L293D. La vitesse du moteur varie selon le cycle de service des signaux PWM.

Les détails sont expliqués dans la section code.

Broches de sortie moteur

Le circuit intégré pilote L293D fournit un courant de sortie jusqu’à 600 mA au moteur DC via la broche 3 (Output_1), la broche 6 (Output_2) pour le moteur_1, et la broche 11 (Output_3), la broche 14 (Output_4) pour le moteur_2.

Motor Output Pins

Spécifications du moteur DC

Tension

Une variété de moteurs DC est disponible sur le marché, avec des tensions nominales de 3 V à 100 V ; cependant, pour les applications robotiques, les moteurs DC de 6 V, 12 V ou 24 V sont largement utilisés. Dans ce tutoriel, nous considérerons des moteurs DC avec réducteur de 3 V à 6 V.

Courant

Vous devez choisir un moteur DC avec un courant maximal de 600 mA, car au-delà, le circuit pilote L293D chauffera et pourrait brûler.

Couple

Le couple moteur est un facteur important lorsqu’il y a une charge sur le moteur. Si votre application nécessite une charge plus importante, vous devez choisir un moteur avec un couple plus élevé. Une autre façon d’augmenter le couple est d’utiliser un réducteur avec le moteur.

Dans ce tutoriel, j’utilise un moteur DC avec un réducteur ayant un rapport de démultiplication de 1:48.

Câblage du circuit intégré pilote L293D avec Arduino UNO

Dans cette section, vous apprendrez à interfacer les moteurs DC avec le circuit pilote L293D et la carte Arduino UNO.

Étape 1 : Connexions des moteurs au circuit L293D

Commencez par connecter les fils des moteurs aux broches de sortie du circuit L293D.

Connectez les fils du moteur_1 aux broches 3 (Output_1) et 6 (Output_2), et les fils du moteur_2 aux broches 11 (Output_3) et 14 (Output_4).

Motors to L293D IC Connections
Connexions des moteurs au circuit L293D

Étape 2 : Connexions Arduino UNO au circuit L293D

Connectez maintenant la broche numérique 10 et 9 de l’Arduino aux broches 2 (Input_1) et 7 (Input_2) du L293D pour le moteur_1.

De même, connectez les broches numériques 4 et 3 de l’Arduino aux broches 10 (Input_3) et 15 (Input_4) du L293D pour le moteur_2.

Ensuite, vous devez fournir des signaux PWM sur les broches Enable pour contrôler la vitesse des moteurs DC.

Connectez la broche PWM 11 de l’Arduino UNO à la broche 1 (Enable_A) du L293D pour le moteur_1, et la broche PWM 5 de l’Arduino UNO à la broche 9 (Enable_B).

Arduino UNO to L293D IC Connections
Connexions Arduino UNO au circuit L293D

Étape 3 : Connexions d’alimentation au circuit L293D

Vous pouvez maintenant fournir une alimentation 5 V au L293D en connectant la broche 8 (VCC_2) et la broche 16 (VCC_1) au 5 V (borne positive de l’alimentation).

Connectez toutes les masses du circuit intégré à la masse commune sur la breadboard.

Toutes les connexions sont illustrées sur l’image.

Wiring of Arduino with L293D and motors
Câblage de l’Arduino avec le L293D et les moteurs

Code Arduino – Contrôle d’un moteur DC via le terminal série

Si vous souhaitez tester votre moteur DC, vous devez pouvoir le contrôler.

Le code suivant vous permet de contrôler la vitesse et la direction des deux moteurs DC individuellement et simultanément en envoyant des caractères depuis le Moniteur Série de l’IDE Arduino.

Vous pouvez copier le code en cliquant sur le bouton en haut à droite du champ de code et le téléverser sur votre carte Arduino UNO.

Ensuite, je vais expliquer le fonctionnement du code.

// Motor_1 Connection
#define ENABLE_1 11
#define MOTOR_1_A 10
#define MOTOR_1_B 9

// Motor_2 Connection
#define ENABLE_2 5
#define MOTOR_2_A 4
#define MOTOR_2_B 3

// other variables
char serial_data;
int speed_value_m1;
int speed_value_m2;

void setup() {
  Serial.begin(9600);
  Serial.println("Motor Init..");
  motor_1_init();
  motor_2_init();
  speed_value_m1 = 0;
  speed_value_m2 = 0;
}

void loop() {
  motor_speed_dir_control();
}

void motor_1_init() {
  pinMode(MOTOR_1_A, OUTPUT);
  pinMode(MOTOR_1_B, OUTPUT);
  pinMode(ENABLE_1, OUTPUT);

  digitalWrite(MOTOR_1_A, LOW);
  digitalWrite(MOTOR_1_B, LOW);
  analogWrite(ENABLE_1, LOW);
}

void motor_2_init() {
  pinMode(MOTOR_2_A, OUTPUT);
  pinMode(MOTOR_2_B, OUTPUT);
  pinMode(ENABLE_2, OUTPUT);

  digitalWrite(MOTOR_2_A, LOW);
  digitalWrite(MOTOR_2_B, LOW);
  analogWrite(ENABLE_2, LOW);
}

void motor_speed_dir_control() {
  while (Serial.available()) {
    serial_data = Serial.read();
    switch (serial_data) {
      case 's':
        analogWrite(ENABLE_1, 255);
        Serial.println("Enable Motor_1");
        break;
      case 'S':
        analogWrite(ENABLE_2, 255);
        Serial.println("Enable Motor_2");
        break;

      case 'h':
        analogWrite(ENABLE_1, 0);
        digitalWrite(MOTOR_1_A, LOW);
        digitalWrite(MOTOR_1_B, LOW);
        speed_value_m1 = 0;
        Serial.println("Stop Motor_1");
        break;
      case 'H':
        analogWrite(ENABLE_2, 0);
        digitalWrite(MOTOR_2_A, LOW);
        digitalWrite(MOTOR_2_B, LOW);
        speed_value_m2 = 0;
        Serial.println("Stop Motor_2");
        break;

      case 'f':
        digitalWrite(MOTOR_1_A, HIGH);
        digitalWrite(MOTOR_1_B, LOW);
        Serial.println("Motor_1 Forward Direction");
        break;
      case 'F':
        digitalWrite(MOTOR_2_A, HIGH);
        digitalWrite(MOTOR_2_B, LOW);
        Serial.println("Motor_2 Forward Direction");
        break;

      case 'b':
        digitalWrite(MOTOR_1_A, LOW);
        digitalWrite(MOTOR_1_B, HIGH);
        Serial.println("Motor_1 Backward Direction");
        break;
      case 'B':
        digitalWrite(MOTOR_2_A, LOW);
        digitalWrite(MOTOR_2_B, HIGH);
        Serial.println("Motor_2 Backward Direction");
        break;

      case 'a':
        for (int i = 0; i < 256; i++) {
          analogWrite(ENABLE_1, i);
        }
        Serial.println("Motor_1 acceleration");
        break;
      case 'A':
        for (int i = 0; i < 256; i++) {
          analogWrite(ENABLE_2, i);
        }
        Serial.println("Motor_2 acceleration");
        break;
      case 'd':
        for (int i = 255; i > 1; i--) {
          analogWrite(ENABLE_1, i);
          delay(5);
        }
        Serial.println("Motor_1 deceleration");
        break;
      case 'D':
        for (int i = 255; i > 1; i--) {
          analogWrite(ENABLE_2, i);
          delay(5);
        }
        Serial.println("Motor_2 deceleration");
        break;
      case 'i':
        if (speed_value_m1 <= 245) {
          speed_value_m1 += 10;
          analogWrite(ENABLE_1, speed_value_m1);
          Serial.println("Motor_1 increased Speed value: ");
          Serial.print(speed_value_m1);
        } else {
          Serial.println("Maximum Speed Limit Reached for Motor_1: ");
          Serial.print(speed_value_m1);
        }
        break;
      case 'I':
        if (speed_value_m2 <= 245) {
          speed_value_m2 += 10;
          analogWrite(ENABLE_2, speed_value_m2);
          Serial.println("Motor_2 increased Speed value: ");
          Serial.print(speed_value_m2);
        } else {
          Serial.println("Maximum Speed Limit Reached for Motor_2: ");
          Serial.print(speed_value_m2);
        }
        break;
      case 'r':
        if (speed_value_m1 >= 10) {
          speed_value_m1 -= 10;
          analogWrite(ENABLE_1, speed_value_m1);
          Serial.println("Motor_1 reduced Speed value: ");
          Serial.print(speed_value_m1);
        } else {
          Serial.println("Minimum Speed Limit Reached for Motor_1: ");
          Serial.print(speed_value_m1);
        }
        break;
      case 'R':
        if (speed_value_m2 >= 10) {
          speed_value_m2 -= 10;
          analogWrite(ENABLE_2, speed_value_m2);
          Serial.println("Motor_2 reduced Speed value: ");
          Serial.print(speed_value_m2);
        } else {
          Serial.println("Minimum Speed Limit Reached for Motor_2: ");
          Serial.print(speed_value_m2);
        }
        break;
      case 'X':
        digitalWrite(MOTOR_1_A, HIGH);
        digitalWrite(MOTOR_1_B, LOW);
        digitalWrite(MOTOR_2_A, HIGH);
        digitalWrite(MOTOR_2_B, LOW);
        analogWrite(ENABLE_1, 255);
        analogWrite(ENABLE_2, 255);
        Serial.println("Motor_1 and Motor_2 Forward Direction");
        break;
      case 'Y':
        digitalWrite(MOTOR_1_A, LOW);
        digitalWrite(MOTOR_1_B, HIGH);
        digitalWrite(MOTOR_2_A, LOW);
        digitalWrite(MOTOR_2_B, HIGH);
        analogWrite(ENABLE_1, 255);
        analogWrite(ENABLE_2, 255);
        Serial.println("Motor_1 and Motor_2 Backward Direction");
        break;
      case 'Z':
        digitalWrite(MOTOR_1_A, LOW);
        digitalWrite(MOTOR_1_B, LOW);
        digitalWrite(MOTOR_2_A, LOW);
        digitalWrite(MOTOR_2_B, LOW);
        analogWrite(ENABLE_1, 0);
        analogWrite(ENABLE_2, 0);
        Serial.println("Motor_1 and Motor_2 Stop");
        break;
      default:
        break;
    }
  }
}

Fonctionnement du code

D’abord, j’ai défini les variables pour les broches Arduino UNO selon les connexions, ainsi que d’autres variables pour stocker les données série et la valeur de vitesse.

//Motor_1 Connection 
#define ENABLE_1 11 
#define MOTOR_1_A 10 
#define MOTOR_1_B 9 

//Motor_2 Connection 
#define ENABLE_2 5 
#define MOTOR_2_A 4 
#define MOTOR_2_B 3 

//other variables 
char serial_data; 
int speed_value_m1; 
int speed_value_m2;

Comme je vais tester les moteurs DC avec des commandes depuis le Moniteur Série, je dois initialiser la connexion série de la carte Arduino UNO. J’ai fixé le débit en bauds à 9600.

Serial.begin(9600);

Ensuite, j’ai configuré les broches Arduino UNO en sortie pour fournir les signaux au circuit pilote L293D, et initialement, toutes les broches sont mises à l’état bas.

void motor_1_init() {
  pinMode(MOTOR_1_A, OUTPUT);
  pinMode(MOTOR_1_B, OUTPUT);
  pinMode(ENABLE_1, OUTPUT);
  digitalWrite(MOTOR_1_A, LOW);
  digitalWrite(MOTOR_1_B, LOW);
  analogWrite(ENABLE_1, LOW);
}

void motor_2_init() {
  pinMode(MOTOR_2_A, OUTPUT);
  pinMode(MOTOR_2_B, OUTPUT);
  pinMode(ENABLE_2, OUTPUT);
  digitalWrite(MOTOR_2_A, LOW);
  digitalWrite(MOTOR_2_B, LOW);
  analogWrite(ENABLE_2, LOW);
}

Enfin, dans void loop(), qui est une boucle infinie, j’appelle la fonction motor_speed_dir_control() pour effectuer différentes opérations sur les moteurs DC selon le caractère reçu du Moniteur Série.

J’ai utilisé la fonction Serial.read() pour lire la broche Rx de l’Arduino UNO, et ce caractère reçu est stocké dans serial_data.

Différents cas sont maintenant écrits pour contrôler les moteurs DC dans des instructions switch.

Vous pouvez utiliser les commandes série mentionnées ci-dessous pour le contrôle de la vitesse et de la direction des moteurs DC :

Moteur_1 Moteur_2 Sortie
s S Activer le moteur DC
h H Arrêter le moteur DC
f F Définir la direction avant pour le moteur DC
b B Définir la direction arrière pour le moteur DC
a A Accélérer le moteur DC de zéro à la vitesse maximale
d D Décélérer le moteur DC de la vitesse maximale à zéro
i I Augmenter la vitesse du moteur DC de 10
r R Réduire la vitesse du moteur DC de 10
X Faire tourner les deux moteurs DC en direction avant
Y Faire tourner les deux moteurs DC en direction arrière
Z Arrêter les deux moteurs DC

Comment contrôler la position d’un moteur DC avec Arduino ?

Pour contrôler la position dans une direction particulière, vous devez d’abord définir la direction du moteur DC, puis appliquer le signal PWM sur les broches enable.

Prenons l’exemple de faire avancer le moteur_1 à pleine vitesse. Vous devez d’abord définir la direction avant dans le code Arduino.

digitalWrite(MOTOR_1_A, HIGH); 

digitalWrite(MOTOR_1_B, LOW);

Ensuite, mettez la broche enable à l’état haut pour faire avancer le moteur_1.

analogWrite(ENABLE_1, 255);

De même, vous pouvez définir une direction différente pour chaque moteur et changer leur position comme je l’ai fait dans les différents cas.

Comment contrôler la vitesse d’un moteur DC avec Arduino ?

Pour contrôler la vitesse du moteur DC, vous devez fournir une modulation de largeur d’impulsion (PWM) sur la broche enable.

Enable_A / Enable_B  Vitesse du moteur
Bas  Zéro (arrêt)
Haut  Vitesse maximale
PWM  Contrôle de la vitesse selon la valeur du signal PWM

analogWrite(pin, value) est utilisé pour définir le PWM sur les broches Enable du L293D. Avec Arduino UNO, vous pouvez régler la vitesse de zéro (0) à maximum (255). Reportez-vous aux cas ‘a’, ‘A’, ‘d’, ‘D’, ‘i’, ‘I’, ‘r’ et ‘R’ dans le code.

Test des moteurs DC

Testing of DC Motors

Une fois le code téléversé sur la carte Arduino UNO, dans l’IDE Arduino, allez dans “Tools” et cliquez sur “Serial Monitor” ou utilisez le raccourci “Ctrl+Shift+M”.

Serial Monitor

Assurez-vous d’abord d’avoir sélectionné le bon débit en bauds, c’est-à-dire 9600. Maintenant, dans le Moniteur Série, vous pouvez tester votre code avec les moteurs DC que vous avez connectés à l’IDE Arduino en envoyant des commandes depuis le Moniteur Série.

Exemple 1 : Faire tourner le moteur_1 en avant, puis décélérer, accélérer, augmenter, réduire la vitesse, inverser la direction et enfin arrêter le moteur.

Envoyez les caractères suivants un par un en minuscules depuis le Moniteur Série :

f, s, d, a, i, i, i, i, i, i, i, i, i, i, i, i, r, r, r, r, r, r, r, r, r, r, r, r, b, s, h

Run Motor_1
Motor_2

De même, vous pouvez contrôler le moteur_2 en envoyant les caractères ci-dessus en majuscules. Notez que vous pouvez faire fonctionner les deux moteurs en envoyant les caractères selon vos besoins.

Exemple 2 : Faire tourner simultanément le moteur_1 et le moteur_2 en avant, puis en arrière, et arrêter les deux moteurs.

Envoyez les caractères suivants : 

X, Y, Z

Conclusion

Après ce tutoriel, vous pourrez appliquer la logique utilisée pour contrôler la vitesse et la direction des moteurs DC afin de réaliser des projets électroniques innovants et créatifs avec des moteurs DC et une carte Arduino.

Si vous avez des questions, des suggestions, ou si vous pensez que certains points manquent dans ce tutoriel, n’hésitez pas à laisser un commentaire ci-dessous.