Contrôleur de moteur JGB37-520 Monitoring en temps réel via encodeur
Description :
Ce projet consiste à concevoir un système de contrôle et de mesure de vitesse pour un moteur à courant continu (CC) en utilisant une carte Arduino. Il combine à la fois l’asservissement manuel de la puissance et le retour d’information précis grâce à un capteur de rotation
Le but est de pouvoir piloter la vitesse d’un moteur à l’aide d’un potentiomètre tout en affichant, en temps réel sur un moniteur série, la vitesse de rotation exacte en tours par minute (tr/min) et la distance parcourue (nombre de tours).
Prérequis :
- 1 x Carte Arduino Nano
- 1 x Potentiomètre 10KΩ
- 1 x JGB37-520 (12V 530 tr/min)
- 1 x DRV8871
- 1 x Breadboard
Version IDE :
- Arduino IDE 2.3.5
Vidéo de démonstration :
Schéma de câblage :


Code :
// --- Configuration des broches (Pins) ---
const int IN1 = 9; // Commande PWM pour le moteur
const int IN2 = 10; // Sens de rotation du moteur
const int pinPot = A0; // Lecture du potentiomètre
const int encoderA = 2; // Signal A de l'encodeur (interruption)
const int encoderB = 3; // Signal B de l'encodeur (direction)
// --- Constantes et variables de mesure ---
const float ticksParTour = 209.0; // Nombre d'impulsions par tour moteur
volatile long positionMoteur = 0; // Compteur de ticks (volatile car modifié dans l'interruption)
long anciennePosition = 0; // Stockage pour calculer la différence de position
unsigned long precedentTemps = 0; // Stockage du temps pour le calcul de vitesse
float rpm = 0; // Vitesse en tours par minute
void setup() {
Serial.begin(115200);
// Configuration des sorties moteur
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
// Configuration des entrées encodeur avec résistance de tirage interne
pinMode(encoderA, INPUT_PULLUP);
pinMode(encoderB, INPUT_PULLUP);
// Attache une interruption sur le front montant du signal A
attachInterrupt(digitalPinToInterrupt(encoderA), lireEncodeur, RISING);
}
void loop() {
// --- Contrôle du moteur via le potentiomètre ---
int valeurPot = analogRead(pinPot); // Lecture 0-1023
int vitessePWM = map(valeurPot, 0, 1023, 0, 255); // Conversion vers 0-255
analogWrite(IN1, vitessePWM); // Envoi de la vitesse
digitalWrite(IN2, LOW); // Définit le sens de rotation
// --- Calcul de la vitesse toutes les 100ms ---
unsigned long tempsActuel = millis();
if (tempsActuel - precedentTemps >= 100) {
// Calcul de la variation de position
long deltaTicks = positionMoteur - anciennePosition;
// Conversion : (ticks/ms) * (1000ms/1s) / (ticks/tour) * (60s/1min)
rpm = (deltaTicks / (float)(tempsActuel - precedentTemps)) * (1000.0 / ticksParTour) * 60.0;
// Mise à jour des variables pour le prochain cycle
anciennePosition = positionMoteur;
precedentTemps = tempsActuel;
// Calcul du nombre total de tours effectués
float nombreDeTours = positionMoteur / ticksParTour;
// Affichage des données sur le moniteur série
Serial.print(" | PWM : ");
Serial.print(vitessePWM);
Serial.print(" | Vitesse : ");
Serial.print(rpm, 1);
Serial.print(" tr/min");
Serial.print(" | Nb Tours : ");
Serial.println(nombreDeTours, 2);
}
}
// --- Fonction d'interruption (ISR) ---
// Appelée à chaque fois que le signal A passe de LOW à HIGH
void lireEncodeur() {
// Si le signal B est haut, on avance, sinon on recule (déphasage quadrature)
if (digitalRead(encoderB) == HIGH) {
positionMoteur++;
} else {
positionMoteur--;
}
}
