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;
}
}
}
Vallade
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.
Alienx
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/