mardi 8 septembre 2020

[Hardware] Pont en 'H' (L298N)

  • Description

Ce circuit, bon marché (moins de 3€), offre un bon moyen de piloter jusqu’à deux moteurs à courant continu, ou bien un moteur pas à pas.

  • Il peut délivrer jusqu’à 2A en pointe et 20W en continu.
  • Il possède son propre circuit d’alimentation logique (permettant d’alimenter l’Arduino)

  • Commande

Les ports ENA et ENB permettent de gérer l’amplitude de la tension délivrée au moteur, grâce à un signal PWM (MLI en Français).

Les ports In1In2 pour le moteur A et In3In4 pour le moteur B, permettent de contrôler le pont en H et par conséquent le sens de rotation des moteurs.

  • Principe de commande

  • Câblage

Le schéma de câblage utilisant les deux ponts.


  • Programmation

Le programme suivant permet de mettre en mouvement le moteur connecté au pont B en passant par le port série.

Par l’intermédiaire du moniteur série, on envoie un entier entre -255 et 255 pour actionner le moteur, la valeur 0 signifiant « arrêt du moteur ».

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Pont en H L298N
 
//Ports de commande du moteur B
int motorPin1 = 8;
int motorPin2 = 9;
int enablePin = 5;
// Vitesse du moteur
int state = 0;
 
void setup() {
    // Configuration des ports en mode "sortie"
    pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(enablePin, OUTPUT);
    
    // Initialisation du port série
    Serial.begin(9600);
}
void loop() {
    if (Serial.available() > 0)
    {
      // Lecture de l'entier passé au port série
      state = Serial.parseInt();
 
      //
      // Sens du mouvement
      //
      if (state > 0) // avant
      {
        digitalWrite(motorPin1, HIGH);
        digitalWrite(motorPin2, LOW);
        Serial.print("Avant ");
        Serial.println(state);
      }
      else if (state < 0) // arrière
      {
        digitalWrite(motorPin1, LOW);
        digitalWrite(motorPin2, HIGH);
        Serial.print("Arriere ");
        Serial.println(state);
      }
      else // Stop (freinage)
      {
        digitalWrite(motorPin1, HIGH);
        digitalWrite(motorPin2, HIGH);
        Serial.println("Stop");
      }
 
      //
      // Vitesse du mouvement
      //
      analogWrite(enablePin, abs(state));
    }
    delay(100);
}

Aucun commentaire:

Enregistrer un commentaire