Moteur Pas à Pas qui se débloque et batteries qui sifflent

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 ?

Le driver ne serait pas brûlant par hasard?

Non, il est à température ambiante.

hello
tu as la chance que dir vaut 3 et que c'est une valeur non nulle.
le compilo doit l'interpreter comme HIGH

c'est un oubli, 300 suffisent. sinon mets 305

Oula oui, sa doit être une faute de frappe...

Pareil, faute de frape très certainement.

Merci !

Pour info, digitalWrite attend un uint_8 et dans le code, on a:

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

Et par conséquence, si on passe autre chose que LOW (qui est défini comme 0), c'est pareil qu'un HIGH. Il n'y a pas d'interprétation par le compilateur.

Pour le delay(300); il je suppose qu'il doit être en dehors de la boucle: on avance lentement (10ms/pas), on attend 0,3s, on recule plus rapidement (6ms/pas), on attend 5s et on recommence.

Dans les données fournies, il y a des informations importantes pour nous:
− c'est le mode pas qui est utilisé ou un des modes micro-pas? Je peux supposer que le mode est pas entiers à cause du 200 qui indiquerait un tour.
− quelle est l'alimentation utilisé pour le A4988?
− éventuellement un réglage du courant a-t-il été fait? Si oui comment?

Le programme ne me semble pas procurer l'arrêt décrit. Je vois éventuellement plusieurs possibilités:

  1. l'alimentation n'est pas assez puissante, chauffe et le 12V se coupe, laissant le moteur non alimenté. C'est pour cela que nous avons besoin de plus d'infos sur l'alimentation du moteur.

  2. Dans la première boucle, les pas sont de 310ms (au lieu de 10ms?) mais dans la deuxième boucle, les pas arrivent toutes les 6ms. Il n'est pas impossible que cela soit trop rapide. On demande alors au moteur de faire 1 pas en 6ms, donc un tour en 1,2s. Ce n'est pas excessif (50tr/mn), mais suivant l'alimentation du moteur cela pourrait coincer. Par contre on devrait observer un tour dans un sens pendant la première minute, un décrochement possible si on demande une vitesse trop grande qui peut passer pour une déconnexion. Mais ensuit on devrait refaire un tour en 1 mn.

Bonjour,

Juste pour information, je n'utilise pas réellement ce code dans mon appareil, il s'agit juste d'un code de test, d'où les quelques imperfection de la programmation.
Mais le problème survient quand même avec ce code...

Oui, exactement.
Pour le moment le driver est régler en pas complet.

Il sagit d'une alimentation de ma fabrication :

  • Deux batteries LiPo de 1500mAh de récupération branché en dérivation
  • Un chargeur HW373 neuf
  • Deux Boost Step-Up Made in China
  • Un interrupteur 2RT de recup'

Le schéma donne ça :

Le tout est monté dans un boitier en impression 3D :


Oui.
D'après ce que j'ai vu sur la datasheet du moteur, il consomme 400mA.
D'après la formule donnée par Pololu : Vref = 8 * Imot * Rcs
Imot vaut 0.4A, Rcs vaut 0.1ohms donc Vref = 8 * 0.4 * 0.1 = 0.32V soit 320mV
J'ai mis mon multimètre entre le potentiomètre du driver moteur et la masse, et j'ai fait mon réglage (le moteur est débranché) pour obtenir 342mV.
Mai des que je branche le moteur, le bloc batterie ce met à siffler affreusement. J'ai donc modifier le réglage du potentiomètre jusqu'à ce que le bloc batterie ne fasse plus de bruit (soit a 460mV environ).

Tres peut probable.
Si j'augmente le délai entre les pas pour le mettre a 300ms partout, le problème survient aussi au bout d'une minute environ.
Si je met se délai a 1 seconde, même constat...

Bonjour

Est-ce que, comme sur l'image ci-dessous, les batteries que tu utilises sont équipées d'un circuit de protection ?

Sur l'image, on peut voir en transparence, les deux circuits intégrés (DW01P et 8205A) qui servent à protéger la batterie.

Datasheet DW01.PDF (620,3 Ko)

Belle construction!

Peux-tu vérifier que le 12V est présent quand survient le problème? Bien qu'à priori si le 12V disparaissait, le 5V disparaitrait aussi.

Non, justement, ce sont 2 step up différents ce n'est peut-être pas la batterie qui se met en protection mais le convertisseur qui fait le 12V.

Sur le site du vendeur donné par @guillaume_lrt il n'y a pas beaucoup d'info mais sur un autre site qui vend la même carte on lit ceci:

Tension de sortie : peut être réglée sur 5 V/8 V/9 V/12 V, la valeur par défaut est 12 V.
Plage de tension d'entrée : 2,5 V ~ 5 V, la tension d'entrée doit être inférieure à la tension de sortie définie
Capacité de sortie : 5 V 1 A, 8 V 0,5 A, 9 V 0,45 A, 12 V 0,3 A lors de l'utilisation d'une entrée de batterie au lithium 3,7 V.

1 Like

Je n'en ai aucune idée...
Il me semble me souvenir qu'il y en avais quand j'ai assembler la batterie, mais je ne peut pas l'affirmer...
Et j'ai pas trop envie de démonter toute la batterie pour vérifier...

J'ai fait une petite vidéo...

Analyse d'après la vidéo :


(2V/div 50ms/div)
Quand tout se passe bien, on a juste une petite variation de 1.8V environ après chaque pas du moteur.
C'est pas top, mais je peut faire avec...

Je viens de me souvenir qu'il y a un condensateur 24V de 100uf entre le 12V et la masse.


Quand le moteur se débloque, on voit apparaitre une grosse chute de tension (6V !) qui correspond au moment ou le moteur est débloqué.

Visiblement, le problème vient de la….

J'ai aussi remarqué que plus la batterie est chargée, plus le problème intervient tard (il aura fallu près de 2 minutes avec la batterie chargée a 100%)

EDIT :
J'ai aussi un bruit parasite sur le 5V qui correspond au pas du moteur.
Il a une amplitude de 20mV environ.

Et le step up serait pas au bout de sa vie à ce moment là?
Il n'est pas sensé supporter plus de 300mA lorsqu'il délivre 12V.
Ne pas oublier que la courant tiré sur l'entrée est environ 3 à 4 fois plus important que celui consommé sur la sortie suivant l'état de la batterie.

Il a moins de 100h de fonctionnement.

Donc si le moteur consomme 400mA, il y aurait environ 1A en entrée du Step-Up ce qui est bien trop...

J'imagine que le problème est du à cette négligence de ma part...

Je suppose qu'il n'y a pas de solution miracle et qu'il ne me reste plus qu'a acheter un Step-Up de 1A ?

Si je met deux Step-Up en dérivation, sa va fonctionner ou s'est une mauvaise idée ?

Et un condensateur céramique de 100nF peut aider a filtrer nom 5V ?

Je veux dire au bout d'une minute en surcharge, est-ce qu'il ne se mettrait pas en protection parce qu'il surchauffe?

Je dirais plutôt entre 1.2 et 1.5A.

Peut être, mais vu qu'il est dans un boitier et que je ne peut pas faire fonctionner l'appareil si le boitier est ouvert, impossible de vérifier...

OK.

En générant le 12V depuis mon alimentation de laboratoire, j'ai relevé une consommation moyenne de 687mA, donc beaucoup trop pour le Step-Up...

Le problème est régler !

Il suffisait de mettre deux Step-Up en parallèle.


(Au premier plan, le Step-Up pour le 5V, et juste derrière celui pour le 12V)
Je suis venu souder un deuxième Step-Up sur le premier et j'ai rajouter deux condensateur de 47nF pour diminuer le bruit en sortie des Step-Up.
C'est pas très clean mais sa fait le job...

J'ai tester sur 5 minutes sans avoir de souci.

Merci de votre aide !