Aller au contenu

Filament ABS

Piloter Nema17 via arduino nano + drv8825


joyeufetar

Messages recommandés

Bonjour à tous,

Dans le cadre d'un projet (trouvé sur thingiverse, mais adapté au matériel que j'avais), j'essaye de piloter un Nema17, via un Arduino nano + stepper DRV8825.
Tout fonctionne bien, mais la rotation du moteur n'est pas douce à petite vitesse (dommage, c'est ce dont j'ai besoin ^^).
Le moteur fait de petite saccade à chaque mouvement.
Le but étant de trouver comment améliorer ça, mais j'ai beau chercher, pour l'instant, je ne vois pas.

J'avais commencé les tests directement avec une carte de prototypage, puis je me suis créer un PCB pour faire plus propre.

Voilà à quoi ressemble le schéma et le pcb :
image.thumb.png.0b11b7bdc05bebf572209856025cefa6.png
image.thumb.png.0a30b5bb170cbe4dc9d5ed350a17a8b5.png


Et donc, voici le code utilisé pour piloter le moteur (il n'est pas de moi, fonctionne, mais apparemment, pas de façon optimale pour le matériel que j'utilise) :

int dir = 3;
int stp = 2;
int enable = 7;
int M0 = 4;
int M1 = 5;
int M2 = 6;
unsigned long stepsPerRevolution = 200;
unsigned long calibratedMicrosecondsPerMinute = 936310;
// Arduino clocks are not very accurate. What's more, they tend to fluctuate 
// based on evironmental factors such as temperature but hopefully the
// clock will be stable enough for our needs. If so, we should be able to 
// compensate in code by calibrating.
// Calibrationg microseconds per minute means that we will never be more accurate than
// +- 0.00144 seconds in a day but I think we can live with that. It's way
// better than the margin of error introduced by internal clock variations.
// To calibrate, start with a set calibration value (the one above worked 
// for me) and time how long it takes the clock to count off some large number
// of minutes. That will give you values for actual_time and expected_time 
// where expected_time is the amount of minutes the clock counted and 
// actual_time is the amount of time that the clock actually took. 
// With those values you can compute the new calibration value using the
// forumula:
//    new_calibration = old_calibration * expected_time / actual_time 

unsigned long microsecondsPerStep = calibratedMicrosecondsPerMinute / stepsPerRevolution;
unsigned long microsecondsRemainder = calibratedMicrosecondsPerMinute % stepsPerRevolution;
unsigned long referenceTime = 0;

void setup() 
{
  Serial.begin(9600);
  pinMode(dir, OUTPUT);
  pinMode(stp, OUTPUT);
  pinMode(enable, OUTPUT);
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);
  // initialize motor
  digitalWrite(enable,LOW); //activate motor
  digitalWrite(dir,HIGH); //direction
  digitalWrite(M0,HIGH); // microstep, regle en 1/32
  digitalWrite(M1,LOW); // microstep, regle en 1/32
  digitalWrite(M2,HIGH); // microstep, regle en 1/32
  // record when we started the loop
  referenceTime = micros();
}

void loop() 
{
  for (unsigned long step = 0; step < stepsPerRevolution; step++)
  {
    // Note that this actually counts 2 steps per iteration so we'll actually do 2 revolutions over the course of the loop
    // first step
    digitalWrite(stp,HIGH);
    // Getting the current time and subtracting the starting time gives us an interval and avoids overflow erros.
    while ((micros() - referenceTime) < microsecondsPerStep){};
    // incrementing rather than calling micros() to get a new reference avoids timing errors
    referenceTime += microsecondsPerStep;
    // second step
    digitalWrite(stp,LOW);
    while ((micros() - referenceTime) < microsecondsPerStep){};
    referenceTime += microsecondsPerStep;
  }
  // ecery 2 revolutions we account for the remainder to avoid the clock drifting since we calibrated to the minute and not to the step
  while ((micros() - referenceTime) < (microsecondsRemainder * 2)){};
  referenceTime += (microsecondsRemainder * 2);
}



Je précise que le stepper est réglé pour le Nema que j'utilise.
C'est un Nema17 donné pour 1.68A/phase, donc j'ai réglé le stepper à 0.5V (calculé 0.6V mais j'ai pris un peu de marge, n'ayant pas besoin du couple maxi).


Je cherche donc à rendre la rotation du moteur la plus fluide possible.

Est ce quelqu'un a une idée de ce que je pourrais tester ?
Dois-je revoir tout le code au final ou juste faire des adaptations ?

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Tu ne pourras rien améliorer avec ce matériel 😩 puisque le pilote (ou driver et non stepper 😉) est configuré à son maximum (1/32 de pas). Pour avoir un meilleur comportement, tu peux :

  • ajouter une démultiplication en sortie de moteur pour le faire tourner plus vite
  • et/ou remplacer le DRV8825 par un TMC2208 ou un 09 si tu as besoin du couple maxi du moteur
Modifié (le) par pommeverte
Lien vers le commentaire
Partager sur d’autres sites

Salut,

D'abord, merci pour tes réponses 🙂

Sinon, le but n'est pas de faire tourner le moteur plus vite, mais de "lisser" la rotation.

d'ailleurs, si dans le programme Arduino, j'augmente le nombre de step par révolution, le moteur tourne plus vite et complètement librement, plus d'accoups.

J'ai déjà utilisé plusieurs fois des drv8825, et je n'ai jamais remarqué qu'ils posaient soucis 😞

Quand à passer sur un TMC, j'y avais pensé mais ça me fait modifier le pcb vu que certaines pins ne correspondent pas avec ceux du drv.

Merci pour ton aide en tout cas 🙂

 

PS : j'ai voulu mettre une vidéo montrant ce que ça donne actuellement mais ça dépasse la limite de fichier possible.

je vais voir pour l'heberger ailleurs.

Lien vers le commentaire
Partager sur d’autres sites

il y a 20 minutes, joyeufetar a dit :

Sinon, le but n'est pas de faire tourner le moteur plus vite, mais de "lisser" la rotation

je sais bien, mais lorsqu'un moteur pas à pas tourne vite, on sent moins les changements de pôles. C'est le principe des moteurs pas à pas 😉

il y a 22 minutes, joyeufetar a dit :

Quand à passer sur un TMC, j'y avais pensé mais ça me fait modifier le pcb vu que certaines pins ne correspondent pas avec ceux du drv.

tu devrais revérifier alors 😉.  A part le reset et le sleep, c'est compatible

  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

Hello, 

Alors, je reviens un peu sur le sujet.
J'ai effectivement comparé le drv avec un tmc2208 que j'avais sous la main.
Les pins sont effectivement globalement les mêmes, sauf 2.

Sur le drv, les pins RST et SLP étaient alimentées en 5V pour permettre le bon fonctionnement du stepper.
5V fournis via la pin 5v de l'arduino.
Je mets le schéma du circuit ici pour montrer comment c'est connecté :
image.thumb.png.d5bd4bd7e4d5fa95d790f035885204c8.png

Or, sur le tmc, ces 2 pins sont CLK et PDN.
Après recherche dans la doc, je n'ai pas du tout l'impression d'en avoir besoin, en tout cas pour mon projet.

Si j'ai bien compris la pin CLK ajoute une fonction d'horloge au stepper, c'est bien ça ?
D'ailleurs, je ne vois pas bien comment je pourrais la gérer au final.

Et la pin PDN, si j'ai toujours bien compris permet une gestion automatique de coupure ?
La encore, je n'en ai pas besoin car le stepper devra tourner en continue de toute façon.

Vous confirmez ?


Du coup, à la base, le pcb fournissait du 5v sur ces 2 pins (vu qu'il était prévu pour un drv et non pour un tmc).
Quel est le risque d'alimenter en 5v les deux pins du tmc, sachant que du coup, ces 2 pins sont reliées ensemble...
Est ce que ça ne risque pas de foutre le bordel ?

Est ce qu'il ne vaudrait mieux pas que je supprime directement les pins du tmc ? histoire d'être tranquille.

Voila, 
Merci d'avance 🙂 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

La broche PDN/UART sert:

  • soit à réduire le courant de maintien lorsque le moteur ne tourne pas
  • soit à communiquer en UART (com série) avec le TMC2208.

Le mieux est de laisser cette broche non connectée, tu seras dans le 1er cas (réduction du courant de maintien)

La broche CLK est effectivement une entrée horloge. Le module gère lui-même l'horloge, pas la peine de s'embêter à en ajouter une externe. Comme la broche PDN, tu la laisses non connectée.

Il y a 2 heures, joyeufetar a dit :

Est ce qu'il ne vaudrait mieux pas que je supprime directement les pins du tmc ? histoire d'être tranquille

J'imagine que tu sous-entends dessouder...🤨, la réponse est "oui"

Il y a une autre différence, c'est la sortie Fault qui devient une broche d'alimentation logique +5V . Il faut donc relier cette broche au 5V.
Tu trouveras des infos à la fin de cette page

Coté programme, tu pourras sélectionner le mode 1/16 pas en inversant l'état de MS1, c'est à dire en remplaçant cette ligne:
digitalWrite(M1,LOW); // microstep, regle en 1/32
par
digitalWrite(M1,HIGH); // microstep, regle en 1/16


Remarque:

  1. M2 n'est pas utilisée mais tu peux laisser le routage en l'état
  2. il est possible que tu soit obligé d'inverser le sens de rotation:

digitalWrite(dir,HIGH); //direction

  • Merci ! 1
Lien vers le commentaire
Partager sur d’autres sites

Salut,

Merci pour tes réponses.
Oui, quand je disais supprimer les pins, c'était soit dessouder, soit couper les pins au ras.
Mais oui, l'idée était de les virer.

Au niveau du programme, c'est pas un soucis, j'ai déjà adapté les steps, réglé les microsteps au 1/16, et j'ai commenté la ligne M2 (qui du coup, ne me sert plus à rien).
Concernant la direction de rotation, pas besoin de changer dans le programme, avec le pcb, j'ai juste à retourner la fiche du moteur 😉 

Par contre, je ne comprends pas à quoi sert la pin "Fault" (VIO pour le tmc2208).
Pourquoi faut il la relier au 5v ?
Que gère-t-elle en faite ?
Si jamais elle n'est pas reliée, qu'est ce que cela implique ?

Lien vers le commentaire
Partager sur d’autres sites

il y a 7 minutes, joyeufetar a dit :

j'ai juste à retourner la fiche du moteur

😲 sur un NEMA???? habituellement, il y a un détrompeur sur les connecteurs... mais peu importe, c'est pas vraiment une difficulté

il y a 7 minutes, joyeufetar a dit :

Par contre, je ne comprends pas à quoi sert la pin "Fault" (VIO pour le tmc2208)

sur un TMC22xx, tu as 1 broche d'alimentation pour le moteur Vmot, et 1 pour la logique Vio, les calculs si tu préfères.

il y a 7 minutes, joyeufetar a dit :

Si jamais elle n'est pas reliée, qu'est ce que cela implique ?

je pense que le moteur ne tournera pas car les signaux de sortie ne devrait pas être pilotés.

Modifié (le) par pommeverte
  • Merci ! 1
Lien vers le commentaire
Partager sur d’autres sites

il y a 6 minutes, pommeverte a dit :

 sur un NEMA???? habituellement, il y a un détrompeur sur les connecteurs... mais peu importe, c'est pas vraiment une difficulté

Côté moteur, je suis d'accord qu'on a pas le choix 😉 
Mais côté pcb, c'est juste un connecteur dupont, donc je peux le mettre dans le sens que je veux.

 

il y a 6 minutes, pommeverte a dit :

sur un TMC22xx, tu as 1 broche d'alimentation pour le moteur Vmot, et 1 pour la logique Vio, les calculs si tu préfères.

je pense que le moteur ne tournera pas car les signaux de sortie ne devrait pas être pilotés.

Les calculs d'interpolation je suppose ?
J'avais testé comme ça, juste pour voir et le moteur fonctionnait parfaitement, d'ou la question.
Mais ok, pas de soucis pour le relier au 5v, c'est pas ce que ça coute 😉 

Merci pour ton aide en tout cas 🙂 

  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

il y a 3 minutes, joyeufetar a dit :

je peux le mettre dans le sens que je veux

Peut-être mais j'ai un sérieux doute: tu vas alimenter les bobines de la même manière au final 🤔

il y a 3 minutes, joyeufetar a dit :

J'avais testé comme ça, juste pour voir et le moteur fonctionnait parfaitement, d'où la question

d'accord, intéressant 😁

Modifié (le) par pommeverte
Lien vers le commentaire
Partager sur d’autres sites

il y a 42 minutes, pommeverte a dit :

Peut-être mais j'ai un sérieux doute: tu vas alimenter les bobines de la même manière au final 🤔

Tant que les deux coils sont reliés correctement, y'a aucun soucis 🙂 
Disons que dans mon cas, j'ai plusieurs façons de faire la même chose 😉 

Modifié (le) par joyeufetar
Lien vers le commentaire
Partager sur d’autres sites

Salut 🙂 

Alors, voila, les modifs sont faites (retrait propre des pins non nécessaires et adaptation du tmc pour l'alimenter en 5v sur la pin VIO).
Voila ce que ça donne avec alimentation en 5v :
image.thumb.jpeg.8eba146578a45584ced68fbf0fb444f9.jpeg

J'ai souder une pin à l'opposé de l'autre sur la pin VIO, pour pouvoir faire des tests rapidement d'alimentation ou non de la dite pin.
Et bien, franchement, avec ou sans alimentation, je ne vois aucune différence.

Donc pas sur que ce soit nécessaire.
Après, c'est peut être juste pour mon besoin que je n'ai pas besoin d'elle, je ne sais pas.

Merci @pommevertepour ton aide en tout cas 🙂 

  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

Héhé, c'est le principe.
Mais c'est pas ce modèle la ^^
Sans compter que le tiens a l'air quand même sacrément complexe.

C'est celui la que je fais : Marble clock

Sauf que j'ai tout adapté pour faire avec les moyens du bord (je ne voulais utiliser que du matériel de récup) :
 - upscale du modèle initial de 150% pour coller aux billes que j'avais à dispo (avec découpe de certaines pièces vu que ça ne rentrait plus sur l'imprimante ^^)
 - Nema17 à la place du Nema8 (donc il a fallu revoir tout le boitier électronique)
 - Et du coup, maintenant, tmc2208 à  la place du drv8825

Le projet est maintenant terminé, voila le rendu :
IMG_20221028_082856_1.thumb.jpg.a9d7f765037807313aded95f26c6642b.jpgIMG_20221028_082846_1.thumb.jpg.dc68e06808e4b3545935fc9d2a6293a4.jpgIMG_20221028_082841.thumb.jpg.cee83f3df9d510ee2b7c18ae85fa6128.jpg
 

Une chose que j'avais oublié aussi, c'est qu'avec un drv8825, ça fait pas mal de bruit parasite...
Je me souviens maintenant pourquoi j'étais passé aux tmc un peu partout sur les imprimantes 🤣

A plus ou moins court terme, je pense quand même lui faire un caisson transparent autour, histoire d'atténuer le bruit des billes.
Parce que la, à chaque dizaine, ça fout un bordel ^^

  • J'aime 2
  • Wow 1
Lien vers le commentaire
Partager sur d’autres sites

Salut,

Il y a 11 heures, joyeufetar a dit :

histoire d'atténuer le bruit des billes

Ça c'est toi qui l'dit, parce que sans vidéo, c'est pas sûr qu'on te croie 😏. Bien sûr, c'est un argument bidon pour te demander une p'tite vidéo du système en action 😋

Modifié (le) par pommeverte
  • Haha 1
Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...
Le 21/10/2022 at 10:45, joyeufetar a dit :

Je cherche donc à rendre la rotation du moteur la plus fluide possible.

Salut,

Idem que toi, à la recherche d'un mouvement fluide; J'ai connecté les M0 M1 et M2 au 5V et le résultat est correct...

Rotation unidirectionnelle et vitesse gérée par un potentiomètre :

const int stepPin = 3;
const int dirPin = 4;
const int potPin = 1;
int potval = 0;
int vitesse=0;
void setup() {
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  digitalWrite(dirPin,HIGH);
}
void loop() {
   potval = analogRead(potPin);
   vitesse= map(potval,0 , 1023, 800, 100);  
 
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(vitesse);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(vitesse);
}

Vous en pensez quoi ?

Merci 😉

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Ta façon de faire est différente de la mienne.
De mon côté, je ne pouvais pas jouer sur la vitesse de rotation, elle était calculée automatiquement.
Du coup, ça me posait soucis, car à basse vitesse, avec un drv8825, ça crée des saccades...

Toi, si tu peux gérer la vitesse de rotation, tu n'as plus ce soucis. En augmentant la vitesse, tu vas finir par lisser les saccades.

Enfin, c'est ce que je pense après tous les tests que j'ai pu effectuer.

++

  • Merci ! 1
Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...