Moteurs capricieux avec CNC Shield - A4988

Bonjour,

J'ai connecté un cnc shield sur mon arduino UNO pour commander plusieurs moteurs pas à pas bipolaire nema17.
J'ai configuré la carte pour du micro-stepping sur chaque axe (x16)
J'ai configuré pour répliquer l'axe Y sur l'axe A => deux moteurs pour l'axe Y
J'ai paramétré le vref pour chaque driver A4988 pour un courant de limite de 1,5 A
J'ai téléversé GRBL 1.1h sur la carte et j'utilise CNCjs 1.9 pour piloter mes moteurs.
Mon problème est dés que je branche mon moteur X sur le driver mon moteur Y ne tourne plus bien (saccade, bruit).
J'ai déjà changé le driver sur le X sans rien arranger.
J'ai essayer de changer le réglage du vref du moteur Y et X sans rien arranger
Avez-vous une idée ? Merci

Merci

Tu n'a pas parlé de l'alimentation. Combien peut-elle délivrer?

J'ai commencé par utiliser le 12v d'une alim ATX 300w mais après mesure elle ne délivrait que du 10v.
J'ai basculé sur une alim 19V 6,7A. mais cela ne change rien.
Les moteurs sont donnés pour 2A/phase. Est-ce suffisant pour le coup ?

Au lieu de formuler pleins d’hypothèses (par exemple "je ne pense pas que cela vienne de l'alim"), il faut que tu donnes les toutes les infos que tu as:

  • combien y a-t-il de moteurs en tout?
  • concernant les moteurs: quel est la référence des moteurs, il doit y avoir dessus un numéro qui peut être par exemple 17HS1234, à défaut une photo de l'étiquette, la doc si tu l'as (si c'est un lien internet, un lien cliquable sur l'adresse avec le petit symbole "insert a link"au dessus des smiles quand on écrit le message), à défaut le lien cliquable sur l'endroit ou tu l'as acheté... Si tu dis que c'est un moteur 2A, cela sort bien de quelque part.
  • concernant la carte CNC, il en existe plusieurs. Pour moi le mieux est la photo avec les A4988 en place (pour savoir lesquels sont branchés) et la photo sans les A4988 (pour savoir si il y a des cavaliers et ou)
  • au cas ou, je ne pense pas que cela nous soit utile, mais on ne sait jamais, comment a été réglé le courant du A4988, et quelle est la valeur de la résistance du shunt sur le circuit.
  • concernant la programmation,le programme de test, le code, le mieux un code qui marche pour chacun des moteur, le nom des broches qui permet de commander les moteurs
    Enfin bref toute la doc technique que tu as et celle que tu n'as pas.

Je ne connais pas le GRBL , mais si cela vient de cette bibliothèque un programma test qui fonctionne avec un autre programme nous le dira.

Côté composants :
Alors il y a 4 moteurs 17HS19-2004S1 (1X, 2Y, 1Z).
Depuis la datasheet le courant donné est de 2A/phase.
Les résistances des drivers (A4988) sont des RS100. Ce qui m"a permi de calculer un vref de
vref=280,1*0,7 = 1,12 V
que j'ai ensuite rabaissé pour rester sur 1,5 A=> 0,85 V (pour que cela chauffe moins => Pas de changement notable quelque soit la valeur du vref au delà de 0,4V)
Pour chaque driver j'ai positionné les cavaliers pour avoir le micro-stepping max (x16)
J'ai ajouté un cavalier pour relier le EN de la shield avec le GRND. Pas d'autre cavalier.
L'Arduino est alimenté par le port USB de mon ordi portable
La shield est alimenté par une alim d'ordi portable de 19,5V 5,6A
Mapping de la carte que j'ai trouvé

ma carte et ma carte 2

Côté code j'ai simplement téléchargé dans la UNO l'exemple GRBL Upload (sans modification). Ensuite j'utilise CNC.js pour envoyer des instructions GRBL de déplacement.
Les valeurs que j'ai modifiées de la config GRBL :
$1=255 (pour que les axes des moteurs restent sous tension)
$100, $101 et $102 = 400 nombre de pas /mm
$110, $111, $112 = 5000 mm/min en vitesse de déplacement
$120, $121, $122 = 10 mm/sec2 pour l'accélération

Le comportement constaté est qu'individuellement et isolés les moteurs tournent bien sur des instructions de déplacement.
Dés que j'ai tous les moteurs branchés sur la carte, le moteur sur le Y saccade et se bloque
Sur des déplacements X+Y , le X fait qq pas puis s'arrête et seuls les Y tournent (mais sur 3 pattes)

Merci pour votre aide

Net et précis, c'est un bon point. Des fois j'ai envie de me barrer quand on ne sait pas ou on va.

Je tique un peu sur

vref=280,1*0,7 = 1,12 V

Sur le 0,7 j'aurais conseillé un 1,4. Il sort d'où. D'un autre côté ce n'est pas très important car

que j'ai ensuite rabaissé pour rester sur 1,5 A=> 0,85 V (pour que cela chauffe moins

Ce qui à mon avis est bon car 10°C en moins c'est une durée de vie double.

Pas de changement notable quelque soit la valeur du vref au delà de 0,4V)

La valeur du courant joue sur le couple. A vide et aux basses vitesses, cela ne change strictement rien. En charge, il se peut que tu perdes des pas pour 0,4V et pas pour 0,8V. Je dirais qu'une fois terminé, l'idée est de baisser le courant au maximum pour avoir un fonctionnement et de le remonter pour avoir une marge. Cela ne sert à rien de faire chauffer la carte bleue le moteur.

La shield est alimenté par une alim d'ordi portable de 19,5V 5,6A

Si le moteur est utilisé au maximum de sa capacité soit 2A dans chaque phase, à l'arrêt, il va dissiper RI2 soit environ 5W. Compte tenu de sa commande, je m'attends à avoir 40% en plus (on perd de l'énergie dans les décroissance de courant). ce qui fait 7W. Avec 4 moteurs, il faut une alimentation de 7x4=28W, 40 ou 50W suffisent. Tu en as 100W, il y a de la marge. Je ne vois pas de problèmes de ce côté.


Je ne connais pas du tout grbl, et vu des renseignements que tu donnes, je ne mets pas en cause (pour l'instant) le matériel. Je te conseille d'essayer de faire tourner les 4 moteurs avec avec autre chose. Si cela fonctionne avec un autre logiciel, c'est soit de la faute du logiciel, soit de la faute de son utilisation. Dans ces deux cas il faut refaire un post "problème avec GRBL" en précisant que cela fonctionne avec par ailleurs.

Je fais un programme de test et je le poste dès que j'ai fiini

Voici un programme de test pour 3 moteurs

#define stepX 2
#define dirX 5 
#define stepY 3
#define dirY 6 
#define stepZ 4
#define dirZ 7 
#define EN 8 


void setup()
{
  pinMode(stepX, OUTPUT); // Axe stepX
  pinMode(stepY, OUTPUT); // Axe stepY
  pinMode(stepZ, OUTPUT); // Axe stepZ
  pinMode(EN, OUTPUT); // Enable, à priori laisse la broche en entrée est rois comme un LOW. Mais sait-on jamais
  digitalWrite(EN, LOW); // A4988 actifs
}

void loop()
{
  // Choix du sens
  if (millis() & 2048)
  { // sens 1
    digitalWrite(dirX, LOW); 
    digitalWrite(dirY, LOW); 
    digitalWrite(dirZ, LOW); 
  }
  else
  { // sens 2
    digitalWrite(dirX, HIGH); 
    digitalWrite(dirY, HIGH); 
    digitalWrite(dirZ, HIGH); 
  }
  
  // Moteur stepX
  digitalWrite(stepX, HIGH); // impulsion sur stepX
  digitalWrite(stepX, LOW);

  // moteur stepY
  digitalWrite(stepY, HIGH); // impulsion sur stepY
  digitalWrite(stepY, LOW);

  // Moteur stepZ
  digitalWrite(stepZ, HIGH); // impulsion sur stepZ
  digitalWrite(stepZ, LOW);

  // Vitesse de 1tr/s
  delayMicroseconds(300); // 1 micro-pas toutes les 312µs = 1 pas toutes les 5ms = 1 tour/seconde
  // Mais je n'ai pas tenu compte du temps de la boucle... Ici on n'a pas besoin de précision
}

Les moteurs devraient tourner à 1tr/s et leur sens s'inverser toutes les 2 secondes environ. Pour ne faire tourner qu'un seul moteur çà la fois, il faut mettre // devant les lignes digitalWrite(step?,... du moteur considéré

Merci pour le code !
Avec les quatre moteurs tournent ensemble mais de façon très saccadé.
En les faisant tourner individuellement, X et Z tournent de façon à peu près convenable alors que les deux Y restent très saccadés.

Une vidéo c'est possible?

Si les moteurs tournent de manière saccadée cela peut venir du branchement entre l'A4988 et le moteur (inversion de fils). Quelles couleurs vont sur quels pins et quelle est la résistance mesurée entre les fils du moteur débranché?

La résistance mesurée est 1,5 ohms entre les pins bleue/rouge (Phase A) et noir/vert (phase B). Conforme aux spécifications du moteur.
Le fait de les inverser ne semble pas changer grand chose.
Video ici

Tous les fils sur les a4988 sont dans l'ordre bleu-roue-vert-noir?

Su la vidéo, deux moteurs semblent tourner correctement, et deux font des bêtises. Individuellement ca fonctionne?
Quand tu échanges deux moteurs c'est le même qui ne tourne pas bien ou c'est celui qui est toujours sur le même driver?

Le programme qui tourne c'est celui de grbl ou le mien? A priori le mien devrait inverser la rotation toutes les 2s pas 4.

Si tu as un condensateur de 25V et d'au moins 470µF sous la main , en le mettant an parallèle sur l'alim cela changerait-il? A condition d'avoir ça sous la main.

Sur la vidéo c’est ton programme qui tourne auquel j’avais modifié les paramètres pour faire différents tests. En les branchant individuellement ils tournent sans saccade. J’ai échangé les drivers de place ainsi que les moteurs mais cela ne change rien.c’est toujours le y qui a le plus de mal.
Les moteurs sont tous branchés via le même câblage. J’ai un condensateur 25v 1000uf j’essaierai demain en le branchant sur le bornier
Merci encore

Testé avec le condensateur mais pas d’améliorations détectée.
Par contre j’ai branché la carte arduino sur une allim 9v (au lieu de l’usb de mon ordi) et c’est bcp mieux !

Quand tu échanges deux moteurs c'est le même qui ne tourne pas bien ou c'est celui qui est toujours sur le même driver?

Quelque soit le driver ou le moteur c’est toujours l’axe Y qui a le plus de mal.
En changeant de PC j’ai noté une amélioration selon le port USB utilisé. D’où l’idée d’alimenter la carte avec une alim 9v et de constater que cela semble résoudre le problème.
Je vais réinstaller Grbl pour voir s’il y a du mieux

Si cela ne vient pas du driver, si cela ne vient pas du moteur, il doit y avoir un mauvais contact entre le micro et le driver. Il y a des connecteurs en pagaille.

Si le problème était entre le PC et l'Arduino, le transfert ne se ferait pas, et si c'est le 5V, le moteur le plus faible poserait problème.

Je ne vois que la possibilité d'un mauvais contact particulièrement entre la broche 3et le step du A4988 Y.

J’ai vérifié les connexions des broches step, dir, 5v et Gnd avec la carte contrôleur et je n’ai rien détecté d’anormal. Les contacts sont bons et pas de court circuit

Il ne s'agit pas de court-circuit, si c'était le cas, le moteur ne tournerait pas. En plus il y a deux moteurs sur l"axe Y qui reçoivent la même commande. Si ils ne tournent pas ensemble, c'est que le problème n'est pas logiciel.

Le faux contact pourrait provenir aussi des broches MS1 à MS3 qui devraient être au 5Vpour être en 1/16 pas. Si il y a un faux contact sur le 5V et MS1 à MS3 se retrouvent en l'air, le moteur va passer en pas entier donc 16 fois moins vite. Cela est compatible avec la vidéo.

Si il y a un faux contact, il est possible qu'il n'ait lieu que dans certaines conditions qui ne sont pas forcément celles de la recherche.

Je te propose de se remettre dans la condition de la vidéo avec l'X qui déglingue. Puis avec par exemple un cordon terminé de chaque côté par une pointe de touche ou simplement avec in fil rigide monobrin, et pendant que le moteur tourne de faire les liaisons qui sont normalement déjà réalisées entre la carte micro et la carte A4988. Ainsi si une piste fonctionne quand elle veut, le pontage se passera d'elle. Voir alors si cela change quelque chose. Je pense à (je cois voir que c'est X qui est malade)

  • broche 2 de l'arduino et broche step de X
  • broches MS1, MS2, MS3 et le 5V
  • éventuellement broche 5 de l'arduino et broche dir de X
    Avant de faire ces test, un petit coup d'ohmmètre pour bien vérifier qu'il y a bien 0ohms entre les deux poins à ponter.

J'avoue franchement que je ne vois pas trop la cause.