Bonjour,
Pour un projet de LiDAR j'utilise un moteur pas a pas NEMA 17 17HS13 commandé pas un driver Pololu A4988 qui entraine un télémètre laser.
Je dispose d'un interrupteur à deux position qui fait office de remise à 0 interupt_A
et interupt_B
.
Normalement, le moteur pas à pas doit avancer d'un pas toutes les 300ms (environ) pour faire 200 pas, puis repartir dans le sens inverse plus rapidement pour revenir à sa position de départ.
Au début, tout fonctionne normalement : le moteur avance bien d'un pas toutes les 300ms.
Mais au bout d'un moment (1 minutes environ), le moteur avance d'un pas et se débloque (l'axe n'est plus bloqué ce qui lui permet de tourner librement, comme si la broche EN était à HIGH
) avant de réavancer d'un pas.
Résultat, pendant le court moment ou le moteur n'est plus bloqué, il bouge librement ce qui fausse le LiDAR.
Il semblerait que le problème ne soit pas liée au nombre de pas réalisés par le moteur car si j'augmente le délai entre deux pas, le problème survient quand même au bout d'une minute environ.
J'ai essayer de modifier le réglage de Vref
sur le driver Pololu (le petit potentiomètre), et je constate que si la valeur est trop faible (moins de 450mV), le bloc batterie de mon montage se met à siffler affreusement.
J'ai essayé avec deux drivers Pololu différent, et le problème persiste toujours...
Voici le code utilisé :
int DIR = 3;
int STEP = 2;
int EN = 4;
int interupt_A = 12;
int interupt_B = 11;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(DIR,OUTPUT);
pinMode(STEP,OUTPUT);
pinMode(EN,OUTPUT);
digitalWrite(EN,LOW);
pinMode(interupt_A, INPUT);
pinMode(interupt_B,INPUT);
remise_a_0();
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(DIR,LOW);
for(int i=0;i<200;i++) {
digitalWrite(STEP,HIGH);
delay(5);
digitalWrite(STEP,LOW);
delay(5);
delay(300);
}
digitalWrite(DIR,DIR);
for(int i=0;i<200;i++) {
digitalWrite(STEP,HIGH);
delay(3);
digitalWrite(STEP,LOW);
delay(3);
}
delay(5000);
//Serial.println(digitalRead(interupt_A));
//Serial.println(digitalRead(interupt_B));
}
void remise_a_0(){
digitalWrite(EN, LOW);
if( digitalRead(interupt_A) == 1 ){
Serial.println("reprise en sens inverse");
digitalWrite(DIR, LOW);
for( int i=0; i<50; i++){
digitalWrite(STEP, HIGH);
delay(2);
digitalWrite(STEP, LOW);
delay(2);
if( digitalRead(interupt_B) == 1 ){
i = 60;
}
}
}
while( digitalRead(interupt_A) == 0){
digitalWrite(DIR, HIGH);
digitalWrite(STEP, HIGH);
delay(2);
digitalWrite(STEP, LOW);
delay(2);
}
}
Une petite photo du système :
Est ce que quelqu'un saurait comment résoudre ce problème ?