Contrôleur de Moteur Pas à Pas Arduino avec A4988 et Joystick
Composants et fournitures
| Arduino UNO | 1 |
| Driver moteur pas à pas A4988 | 1 |
| Moteur pas à pas NEMA 17 (ex. 17HS4401) | 1 |
| Module joystick analogique (2 axes + bouton) | 1 |
| Alimentation 12V 2A minimum (pour moteur) | 1 |
| Condensateur électrolytique 100 µF 25V (découplage driver) | 1 |
| Résistances 10 kΩ (pull-up bouton joystick) | 2 |
| Plaque d'essai et fils | 1 |
À propos de ce projet
Introduction
Ce projet montre comment piloter un moteur pas à pas NEMA 17 via un driver A4988, contrôlé par un joystick analogique. Le joystick permet :
- Contrôle de la vitesse (axe Y)
- Contrôle du sens de rotation (axe Y : haut/bas)
- Arrêt/redémarrage via le bouton poussoir du joystick
- Réglage du micro-pas (optionnel, via broches MS1/MS2/MS3)
Idéal pour : imprimantes 3D, fraiseuses CNC, scanners, robots, positionneurs précis.
Câblage
Driver A4988 → Arduino
- VMOT → +12V (alimentation moteur)
- GND (puissance) → GND alimentation + GND Arduino
- VDD → 5V Arduino (logique)
- GND (logique) → GND Arduino
- STEP → D3
- DIR → D4
- ENABLE → D5 (actif bas)
- MS1, MS2, MS3 → D6, D7, D8 (optionnel, pour micro-pas)
- RESET + SLEEP → reliés ensemble (ou à VDD pour actif)
Moteur NEMA 17 → A4988
- Bobine 1A / 1B → bornes 1A/1B
- Bobine 2A / 2B → bornes 2A/2B
- Important : identifier les paires de fils par continuité (multimètre) avant connexion.
Joystick → Arduino
- VCC → 5V
- GND → GND
- VRX (axe X) → A0 (non utilisé ici)
- VRY (axe Y) → A1 (vitesse/sens)
- SW (bouton) → D2 (avec pull-up 10 kΩ vers 5V)
Condensateur 100 µF
Entre VMOT et GND (côté puissance), au plus près du driver. Protège contre les pics de tension.
Réglage du courant moteur (VREF)
Avant mise sous tension, réglez le courant max via le potentiomètre du A4988 :
VREF = I_moteur × 8 × Rsense
// Rsense = 0,05 Ω (typique sur modules A4988)
// Ex: pour 1A → VREF = 1 × 8 × 0,05 = 0,4V
// Mesurez VREF entre le potentiomètre et GND (tournez doucement)
Ne dépassez pas le courant nominal du moteur. Commencez bas, augmentez jusqu'à couple suffisant sans surchauffe.
Micro-pas (résolution)
| MS1 | MS2 | MS3 | Résolution |
|---|---|---|---|
| L | L | L | Pas entier (full step) |
| H | L | L | Demi-pas (1/2) |
| L | H | L | Quart de pas (1/4) |
| H | H | L | 1/8 pas |
| H | H | H | 1/16 pas (défaut si non câblé) |
Relier MS1/MS2/MS3 à GND (L) ou 5V (H) selon résolution voulue. Ou les piloter par Arduino pour changement dynamique.
Code Arduino
// Contrôleur moteur pas à pas A4988 + Joystick
// Broches
const int STEP_PIN = 3;
const int DIR_PIN = 4;
const int EN_PIN = 5;
const int MS1_PIN = 6;
const int MS2_PIN = 7;
const int MS3_PIN = 8;
const int JOY_Y = A1;
const int JOY_BTN = 2;
bool motorEnabled = true;
int joyCenter = 512; // Valeur centre joystick (à calibrer)
int deadZone = 30; // Zone morte autour du centre
unsigned long lastStep = 0;
int stepDelay = 1000; // µs entre pas (vitesse)
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
pinMode(MS1_PIN, OUTPUT);
pinMode(MS2_PIN, OUTPUT);
pinMode(MS3_PIN, OUTPUT);
pinMode(JOY_BTN, INPUT_PULLUP);
// Micro-pas 1/16 par défaut
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, HIGH);
digitalWrite(EN_PIN, LOW); // Activer driver (actif bas)
Serial.begin(115200);
Serial.println("Controleur Moteur Pas-a-Pas Pret");
}
void loop() {
// Bouton joystick : toggle activation moteur
static bool btnPrev = HIGH;
bool btnNow = digitalRead(JOY_BTN);
if (btnPrev == HIGH && btnNow == LOW) {
motorEnabled = !motorEnabled;
digitalWrite(EN_PIN, motorEnabled ? LOW : HIGH);
Serial.print("Moteur ");
Serial.println(motorEnabled ? "ACTIVE" : "DESACTIVE");
delay(200); // anti-rebond
}
btnPrev = btnNow;
if (!motorEnabled) return;
// Lecture joystick axe Y
int joyVal = analogRead(JOY_Y);
int diff = joyVal - joyCenter;
if (abs(diff) < deadZone) return; // Zone morte = arrêt
// Direction
digitalWrite(DIR_PIN, diff > 0 ? HIGH : LOW);
// Vitesse proportionnelle à l'écart du centre
// Map : diff max (~512) → stepDelay min (ex: 200 µs = rapide)
// diff min (deadZone) → stepDelay max (ex: 2000 µs = lent)
stepDelay = map(abs(diff), deadZone, 512, 2000, 200);
stepDelay = constrain(stepDelay, 200, 5000);
// Génération impulsion STEP
if (micros() - lastStep >= stepDelay) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(2);
digitalWrite(STEP_PIN, LOW);
lastStep = micros();
}
}
Fonctionnement
- Joystick au centre : moteur arrêté (maintien de position si driver activé)
- Joystick vers le haut : rotation dans un sens, vitesse croissante
- Joystick vers le bas : rotation sens inverse, vitesse croissante
- Appui bouton : active/désactive le driver (moteur libre / maintien)
Dépannage courant
- Moteur vibre mais ne tourne pas : VREF trop bas, fils bobines inversés, micro-pas mal configuré.
- Moteur chauffe excessivement : VREF trop haut, réduire courant.
- Pas de mouvement : vérifier ENABLE (actif bas), alimentation 12V, broches STEP/DIR.
- Perte de pas : accélération trop brutale, charge trop lourde, VREF insuffisant.
Évolutions possibles
- Accélération/décélération rampée (profil trapézoïdal)
- Fin de course (endstops) pour homing
- Contrôle par commande série (G-code simple)
- Affichage position sur LCD
- Driver TMC2208/TMC2209 pour silence et détection de collision
Processus de fabrication
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Moniteur d'énergie Arduino & Data Logger fiable – Guide complet (Dr. Wattson + carte SD)
- Stores intelligents : contrôle automatisé de la lumière avec Arduino et énergie solaire
- Détecteur de fréquence audio Arduino — Mesurer le pic sonore avec module haute sensibilité
- Morpion sur matrice LED MAX7219 avec boîtier en carton
- Construire un minuteur à rebours Arduino fiable avec afficheur 7 segments SparkFun
- Surveillance Niveau Cuve DIY – Arduino Nano, Capteur Pression MPXV5010DP et Écran OLED
- Construisez votre propre voiture RC Porsche avec Arduino : Guide étape par étape
- Gant intelligent geste-vers-texte pour langue des signes