Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e) (modifié)

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
Posté(e)

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.

Posté(e)
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
Posté(e)

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 🙂 

Posté(e)

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
Posté(e)

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 ?

Posté(e) (modifié)
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
Posté(e)
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
Posté(e) (modifié)
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
Posté(e) (modifié)
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
Posté(e)

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
Posté(e)

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
Posté(e) (modifié)

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
Posté(e)

Tiens, voila la vidĂ©o qui rĂ©sume tout le principe 🙂 
C'est celle que projet initial, mais malgrĂ© les modifs que j'ai pu faire de mon cĂŽtĂ©, le principe est exactement le mĂȘme 😉 

Clock

  • J'aime 1
  • Merci ! 1
  • 1 month later...
Posté(e)
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 😉

Posté(e)

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

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...