Dans cet épisode, je vais vous parler de transistor BIPOLAIRE et MOSFET, nous verrons le fonctionnement du pont en H pour contrôler le sens de rotation d’un moteur, je vous parlerais du signal PWM et de sa mise en pratique, nous ferons un petit programme sur une carte Arduino pour piloter le Pont en H, faire varier le sens de rotation du moteur et sa vitesse.

Code signal PWM

#define POT_PIN A0    // PIN POTENTIOMETRE
#define LED_PIN 9     // PIN LED
#define PERIODE 20    // PERIODE EN MILLISECONDES
 
void setup() {
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
  // LECTURE DE LA VALEUR DU POTENTIOMETRE VIA L'ADC
  uint16_t potValue = analogRead(POT_PIN); 
  // Conversion de la valeur de l'ADC de 0 à 100%
  uint8_t rCyclique = map(potValue, 0, 1023, 0, 100); 
  // Calcul du temps à l'état haut
  uint16_t highStateMs = rCyclique * PERIODE / 100;
  
  digitalWrite(LED_PIN, HIGH);
  delay(highStateMs);
  digitalWrite(LED_PIN, LOW);
  delay(PERIODE - highStateMs);
}

Schéma de câblage

Le programme

#define PIN_IN1 4  // IN1 Module L298N
#define PIN_IN2 3  // IN2 Module L298N
#define PIN_ENA 5  // ENA Module L298N
 
#define POT_PIN A0 // A0 ADC Potentiometre
 
unsigned int moveDelay = 2000; // Temps en mouvement avant changement de direction
unsigned long startMoveAt; // Pour stocker la valeur en MS au moment du start
 
enum DIRECTIONS {
  FORWARD = 0,
  BACKWARD
};
 
DIRECTIONS nextDirection = FORWARD;
 
// Marche avant
void forward() {
  digitalWrite(PIN_IN1, HIGH);  // IN1 à l'état HAUT
  digitalWrite(PIN_IN2, LOW);   // IN2 à l'état BAS
}
 
// Marche arrière
void backward() {
  digitalWrite(PIN_IN1, LOW);  // IN1 à l'état BAS
  digitalWrite(PIN_IN2, HIGH); // IN2 à l'état HAUT
}
 
// Roue libre (avec un delay)
void freeWheel(unsigned int delayMs) {
  pinMode(PIN_ENA, OUTPUT); // ENA en sortie (pour déactiver le mode PWM)
  digitalWrite(PIN_IN1, LOW);  // IN1 à l'état BAS
  digitalWrite(PIN_IN2, LOW);  // IN2 à l'état BAS
  digitalWrite(PIN_ENA, LOW);  // ENA à l'état BAS
  delay(delayMs);
}
 
void setup() {
  pinMode(PIN_IN1, OUTPUT); // In1 en sortie
  pinMode(PIN_IN2, OUTPUT); // In2 en sortie
  pinMode(PIN_ENA, OUTPUT); // ENA en sortie
 
  // Moteur en roue libre
  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, LOW);
  digitalWrite(PIN_ENA, LOW);
}
 
void loop() {
  // Récupération de la valeur du potentiometre
  uint16_t potValue = analogRead(POT_PIN);
  // Génération du signal PWM vers la PIN ENA du module L298N
  analogWrite(PIN_ENA, map(potValue, 0, 1023, 0, 255));
 
  if ( (millis() - startMoveAt) >= moveDelay ) {
    switch(nextDirection) {
      case FORWARD:
        freeWheel(500); // en roue libre pendant 500ms
        // Marche avant pendant 2 secondes
        moveDelay = 2000;
        forward();
        startMoveAt = millis();
        nextDirection = BACKWARD;
        break;
      case BACKWARD:
        freeWheel(500); // en roue libre pendant 500ms
        // Marche arrière pendant 5 secondes
        moveDelay = 5000;
        backward();
        startMoveAt = millis();
        nextDirection = FORWARD;
        break;
    }
  }
}
Comments
Harvey Specter
Posted at 14 h 55 min 26 octobre 2021
Vallade
Répondre
Author

Salut. Je ne pratique pas l’arduino fréquement et j’aimerai savoir si il est possible d’ajouter un compte-tour pour le moteur avec un écran digitale ?
Merci.

Harvey Specter
Posted at 15 h 57 min 26 octobre 2021
Alienx
Répondre
Author

Bonjour,

Oui c’est totalement possible il faut utiliser un moteur avec encodeur (ex: https://www.amazon.fr/Moteur-engrenages-dencodeur-r%C3%A9duction-Rotating/dp/B08H29KTMF) et ensuite utiliser cette librairie Arduino par exemple : https://www.arduino.cc/reference/en/libraries/encoder/

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.