Bonjour !
Je suis actuellement sur un projet qui fait intervenir un moteur pas à pas. Il tourne, or quelque chose m'échappe : il ne tourne pas toujours dans le même sens alors que c'est l'instruction que je lui donne ; il n'effectue presque jamais la même rotation deux fois de suite alors que je lui dit d'effectuer le même nombre de pas...
Il est alimenté en 12V 2A, et utilise une Arduino Uno pour communiquer avec son driver, un A4988.
J'ai essayé de changer la tension du driver via le potentiomètre integré, une amélioration mais le problème persiste.
Si quelqu'un connaît l'origine du problème, je suis preneur...
Ci-joint le code de mon projet :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int counter;
// Affichage, potards et valeurs
const int POT1 = A0;
const int POT2 = A1;
const int POT3 = A3;
int pot1def = 0;
int pot2def = 0;
int pot3def = 0;
int HSujet = 0;
float EPhotos = 0;
int DPhotos = 0;
int PRestantes;
// Bouton poussoir Marche/Arrêt et LEDs
const int LED_VERTE = 13;
const int LED_ROUGE = 12;
const int BP_MA = 2;
boolean ETAT_BP_MA = 1;
boolean BOUTONAPPUYER_MA = 0;
// Bouton poussoir fin de course
const int BP_FDC
boolean ETAT_BP_FDC = 1;
boolean BOUTONAPPUYER_FDC = 0;
// Moteur pas a pas
int PPP = 0; // nb de Pas Par Photo
int tempo = 1; // tempo=1 moteur rapide, tempo = 100 moteur lent
const int DIR = 3; // HIGH = descendre, LOW = monter
const int STP = 4; // pin pour la commande des steps
// Relay
const int RELAY = 8;
// Définition LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup()
{
// Potards
pinMode(POT1, INPUT);
pinMode(POT2, INPUT);
pinMode(A2, INPUT);
// LCD
lcd.init();
// Bouton poussoir marche/arrêt et LEDs
pinMode(BP_MA, INPUT_PULLUP);
pinMode(LED_ROUGE, OUTPUT);
pinMode(LED_VERTE, OUTPUT);
digitalWrite(LED_ROUGE, HIGH);
// Bouton Poussoir Fin de Course
pinMode(BP_FDC, INPUT_PULLUP);
// Moteur pas a pas
pinMode(DIR, OUTPUT);
pinMode(STP, OUTPUT);
// Relay
pinMode(RELAY, OUTPUT);
// INITIALISATION DES LEDS ET DU BP_FDC
boolean ETAT_BP_FDC = digitalRead(BP_FDC) ; // Récupère l’état du bouton
if(ETAT_BP_FDC == 0 and BOUTONAPPUYER_FDC == 0) { // On appuie sur le bouton
BOUTONAPPUYER_FDC = 1;
if(ETAT_BP_FDC == 0) { // Si le système est à l'arret, on le lance SYSTEME EN MARCHE
// actualisation du pas à pas
for (int i=0; i <= 50; i++) {
tempo = 2;
digitalWrite(DIR, LOW);
digitalWrite(STP, LOW);
delay(tempo);
digitalWrite(STP, HIGH);
delay(tempo);
}
ETAT_BP_FDC = 1;
}
else { // Si le systeme fonctionne, on l'arrete SYSTEME A L'ARRET
// actualisation des LEDs
ETAT_BP_FDC = 0;
}
}
if(ETAT_BP_FDC == 1 and BOUTONAPPUYER_FDC == 1) { // On arrête d’appuyer sur le bouton
BOUTONAPPUYER_FDC = 0;
}
}
void loop()
{
lcd.backlight();
// INITIALISATION DES LEDS ET DU BP_MA
boolean ETAT_BP_MA = digitalRead(BP_MA) ; // Récupère l’état du bouton
if(ETAT_BP_MA == 0 and BOUTONAPPUYER_MA == 0) { // On appuie sur le bouton
BOUTONAPPUYER_MA = 1;
if(ETAT_BP_MA == 0) { // Si le système est à l'arret, on le lance SYSTEME EN MARCHE
// actualisation des LEDs
digitalWrite(LED_ROUGE, LOW);
digitalWrite(LED_VERTE, HIGH);
ETAT_BP_MA = 1;
}
else { // Si le systeme fonctionne, on l'arrete SYSTEME A L'ARRET
// actualisation des LEDs
digitalWrite(LED_ROUGE, HIGH);
digitalWrite(LED_VERTE, LOW);
ETAT_BP_MA = 0;
}
}
if(ETAT_BP_MA == 1 and BOUTONAPPUYER_MA == 1) { // On arrête d’appuyer sur le bouton
BOUTONAPPUYER_MA = 0;
}
if(digitalRead(13) == 0) { // Si le système est à l'arrêt
digitalWrite(DIR, LOW);
for (int i=0; i < 0; i++) {
tempo = 1;
digitalWrite(STP, LOW);
delay(tempo);
digitalWrite(STP, HIGH);
delay(tempo);
}
// DEFINITION DES VALEURS
// Définition des valeurs de Hauteur du Sujet sur la valeur de Pot1
analogRead(POT1);
if (analogRead(POT1)<90) HSujet = 00;
else { if (analogRead(POT1)<120) HSujet = 01;
else { if (analogRead(POT1)<150) HSujet = 02;
else { if (analogRead(POT1)<180) HSujet = 03;
else { if (analogRead(POT1)<210) HSujet = 04;
else { if (analogRead(POT1)<240) HSujet = 05;
else { if (analogRead(POT1)<270) HSujet = 06;
else { if (analogRead(POT1)<300) HSujet = 07;
else { if (analogRead(POT1)<330) HSujet = 8;
else { if (analogRead(POT1)<360) HSujet = 9;
else { if (analogRead(POT1)<390) HSujet = 10;
else { if (analogRead(POT1)<420) HSujet = 11;
else { if (analogRead(POT1)<450) HSujet = 12;
else { if (analogRead(POT1)<480) HSujet = 13;
else { if (analogRead(POT1)<510) HSujet = 14;
else { if (analogRead(POT1)<540) HSujet = 15;
else { if (analogRead(POT1)<570) HSujet = 16;
else { if (analogRead(POT1)<600) HSujet = 17;
else { if (analogRead(POT1)<630) HSujet = 18;
else { if (analogRead(POT1)<660) HSujet = 19;
else { if (analogRead(POT1)<690) HSujet = 20;
else { if (analogRead(POT1)<720) HSujet = 21;
else { if (analogRead(POT1)<750) HSujet = 22;
else { if (analogRead(POT1)<780) HSujet = 23;
else { if (analogRead(POT1)<810) HSujet = 24;
else { if (analogRead(POT1)<840) HSujet = 25;
else { if (analogRead(POT1)<870) HSujet = 26;
else { if (analogRead(POT1)<900) HSujet = 27;
else { if (analogRead(POT1)<930) HSujet = 28;
else { if (analogRead(POT1)<960) HSujet = 29;
else { HSujet = 30;
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
// Définition des valeurs d'Ecartement des Photos sur la valeur de Pot2
analogRead(POT2);
if (analogRead(POT2)<98) {PPP = 10; EPhotos = 0.4;}
else { if (analogRead(POT2)<136) {PPP = 20; EPhotos = 0.8;}
else { if (analogRead(POT2)<174) {PPP = 30; EPhotos = 1.2;}
else { if (analogRead(POT2)<212) {PPP = 40; EPhotos = 1.6;}
else { if (analogRead(POT2)<250) {PPP = 50; EPhotos = 2.0;}
else { if (analogRead(POT2)<288) {PPP = 60; EPhotos = 2.4;}
else { if (analogRead(POT2)<326) {PPP = 70; EPhotos = 2.8;}
else { if (analogRead(POT2)<364) {PPP = 80; EPhotos = 3.2;}
else { if (analogRead(POT2)<402) {PPP = 90; EPhotos = 3.6;}
else { if (analogRead(POT2)<440) {PPP = 100; EPhotos = 4.0;}
else { if (analogRead(POT2)<478) {PPP = 110; EPhotos = 4.4;}
else { if (analogRead(POT2)<516) {PPP = 120; EPhotos = 4.8;}
else { if (analogRead(POT2)<554) {PPP = 130; EPhotos = 5.2;}
else { if (analogRead(POT2)<592) {PPP = 140; EPhotos = 5.6;}
else { if (analogRead(POT2)<630) {PPP = 150; EPhotos = 6.0;}
else { if (analogRead(POT2)<668) {PPP = 160; EPhotos = 6.4;}
else { if (analogRead(POT2)<706) {PPP = 170; EPhotos = 6.8;}
else { if (analogRead(POT2)<744) {PPP = 180; EPhotos = 7.2;}
else { if (analogRead(POT2)<782) {PPP = 190; EPhotos = 7.6;}
else { if (analogRead(POT2)<820) {PPP = 200; EPhotos = 8.0;}
else { if (analogRead(POT2)<858) {PPP = 210; EPhotos = 8.4;}
else { if (analogRead(POT2)<896) {PPP = 220; EPhotos = 8.8;}
else { if (analogRead(POT2)<934) {PPP = 230; EPhotos = 9.2;}
else { if (analogRead(POT2)<960) {PPP = 240; EPhotos = 9.6;}
else { if (analogRead(POT2)>=960) {PPP = 250; EPhotos = 10;}
}}}}}}}}}}}}}}}}}}}}}}}}
// Définition des valeurs d'Intervalle des Photos sur la valeur de Pot3
analogRead(POT3);
if (analogRead(POT3)<96) DPhotos = 00;
else { if (analogRead(POT3)<192) DPhotos = 01;
else { if (analogRead(POT3)<288) DPhotos = 02;
else { if (analogRead(POT3)<384) DPhotos = 03;
else { if (analogRead(POT3)<480) DPhotos = 04;
else { if (analogRead(POT3)<576) DPhotos = 05;
else { if (analogRead(POT3)<672) DPhotos = 06;
else { if (analogRead(POT3)<768) DPhotos = 07;
else { if (analogRead(POT3)<864) DPhotos = 8;
else { if (analogRead(POT3)<920) DPhotos = 9;
else { if (analogRead(POT3)>=920) DPhotos = 10;
}}}}}}}}}}
// Affichage menu et données sur le LCD
lcd.setCursor(0, 0);
lcd.print("Hauteur sujet cm");
lcd.setCursor(16, 0);
lcd.print(HSujet);
lcd.setCursor(0, 1);
lcd.print("Ecart photos mm");
lcd.setCursor(15, 1);
lcd.print(EPhotos);
lcd.setCursor(0, 2);
lcd.print("Duree photos s");
lcd.setCursor(18, 2);
lcd.print(DPhotos);
lcd.setCursor(0, 3);
lcd.print("Prises rest. : ");
PRestantes = ((HSujet*10)/EPhotos); // def de PRestantes
lcd.setCursor(17, 3);
lcd.print(PRestantes);
delay(100);
}
else { // Si le système est en marche
// Tant qu'il reste des photos
for (int i = PRestantes; i > -1; --i) {
// A ffichage menu et données sur le LCD
lcd.setCursor(0, 0);
lcd.print("Hauteur sujet cm");
lcd.setCursor(16, 0);
lcd.print(HSujet);
lcd.setCursor(0, 1);
lcd.print("Ecart photos mm");
lcd.setCursor(16, 1);
lcd.print(EPhotos);
lcd.setCursor(0, 2);
lcd.print("Duree photos s");
lcd.setCursor(18, 2);
lcd.print(DPhotos);
lcd.setCursor(0, 3);
lcd.print("Prises rest. : ");
// PRestantes = ((HSujet*10)/EPhotos); // def de PRestantes
lcd.setCursor(17, 3);
lcd.print(PRestantes);
PRestantes = PRestantes-1;
// Mouvement et déclenchement de l'appareil photo
// Mouvement du pas à pas
for (int i=0; i <= PPP; i++) {
tempo = 1;
digitalWrite(DIR, HIGH);
digitalWrite(STP, LOW);
delay(tempo);
digitalWrite(STP, HIGH);
delay(tempo);
}
// Déclenchement du relay
digitalWrite(RELAY, HIGH);
delay(200);
digitalWrite(RELAY, LOW);
// Intervalle photos
delay(DPhotos*1000-200);
// Changement d'état des LEDs quand la séquence est terminée
if(PRestantes == 0) {
if (ETAT_BP_MA == 0) {
digitalWrite(LED_VERTE, HIGH);
delay(500);
digitalWrite(LED_VERTE, LOW);
delay(500);
}
}
}
}
}
Le passage qui concerne le pilotage du moteur :
// Mouvement du pas à pas
for (int i=0; i <= PPP; i++) {
tempo = 1;
digitalWrite(DIR, HIGH);
digitalWrite(STP, LOW);
delay(tempo);
digitalWrite(STP, HIGH);
delay(tempo);
}
Merci beaucoup,
Léo