setSpeed et setMaxSpeed avec AccelStepper

Bonjour,

Quelle est l'utilité d'avoir setMaxSpeed() si on a aussi setSpeed() avec AccelStepper?
Pour être cohérent,_maxSpeed doit être supérieur ou égal à _speed. Dans ce cas _maxSpeed ne sert plus à rien.

setMaxSpeed() C’est pour définir la limite quand on accélère. run() va accélérer jusqu’à cette limite.

setSpeed() C’est quand on veut une vitesse constante, à utiliser avec runSpeed()

C'est ce que je lis aussi dans la documentation, mais si je fais:

#include <AccelStepper.h>

AccelStepper Stepper(4,2,4,3,5);

void setup()
{
  Stepper.setMaxSpeed(204.8); 
  Stepper.setSpeed(204.8);
}

void loop()
{
  Stepper.runSpeed();
}

Mon moteur fait un tour en 10s.
Que je mette Stepper.setMaxSpeed(20.48); ou Stepper.setSpeed(20.48); (ou les deux d'ailleurs), mon moteur fait un tour en 100s.


Si je fais:

#include <AccelStepper.h>

AccelStepper Stepper(4,2,4,3,5);

void setup()
{
  Stepper.setAcceleration(1000);
  Stepper.setMaxSpeed(204.8); 
  Stepper.setSpeed(204.8);
  Stepper.move(20480);
}

void loop()
{
  Stepper.run();
}

La valeur passée par setSpeed n'a pas d'importance. La valeur est bien donnée par setMaxSpeed comme le dit la doc.


Dans les deux cas la vitesse est limitée par setMaxSpeed. Quel est alors l'intérêt de setSpeed dont on peut se passer.


Autre chose amusante, si je fais:

#include <AccelStepper.h>

AccelStepper Stepper(4,2,4,3,5);

void setup()
{
  Stepper.setAcceleration(100);
  Stepper.setMaxSpeed(10.0); 
  Stepper.move(20480);
}

void loop()
{
  Stepper.run();
}

mon moteur tourne lentement.
si je mets Stepper.setMaxSpeed(100.0); il tourne 10 fois plus vite
si je mets Stepper.setMaxSpeed(1.0); je pensais qu'il tournerait 10 fois moins vite, mais chez moi il tourne tellement vite que je n'ai que le début de l'accélération ainsi que la fin de la décélération

J'utilise la version 1.61 qui semble être la dernière.

SetSpeed vous permet donc de régler une vitesse (par exemple calculée) tout en n’ayant pas à vous soucier de la comparer au max de votre hardware

ça sent le bug :wink:

Je ne suis pas convaincu de l'utilité de setSpeed(), autant régler la vitesse par setMaxSpeed(). Si il faut régler deux fois la vitesse, c'est pas génial. D'autant plus que cela ne fonctionne que pour un cas mais qu'il faut noter lequel.

J'utilise 1pas/s pour voir si j'ai les bons enchainements (à cette vitesse, je vois les leds du ULN2003). Je pense effectivement au bug, c'est en fait la seule valeur qui coince, Stepper.setMaxSpeed(1.0001); fonctionne parfaitement. C'est uniquement la valeur 1.0 qui ne marche pas. Après analyse du code, cela vient de

void AccelStepper::setMaxSpeed(float speed)
{
    if (speed < 0.0)
       speed = -speed;
    if (_maxSpeed != speed)
...

A l'initialisation _maxSpeed vaut 1, et il faut faire absolument la suite. En mettant setMaxSpeed(1.0); la suite n'est pas faite.

Question d’appréciation
Ca vous oblige dans votre code à chaque fois que vous calculez une vitesse de vérifier qu’elle est acceptable pour votre matériel. Personnellement je préfère le dire une fois pour toute dans le setup et faire confiance à la bibliothèque pour ne pas dépasser cette borne sup.

Pour le bug c’est un fonctionnement aux limites mal traité mais c’est pas trop réaliste de vouloir une accélération de 100 pas par seconde par seconde et d’avoir une vitesse max a 1 pas par seconde. On règle généralement l’accélération et la vitesse max de manière cohérente pour son hardware (reste que c’est un bug quand même)

Si j'ai mis 100 pour l'accélération, c'est pour ne pas en avoir. Pour moi 100 c'est l'infini. Je ne sais pas dire sans accélération. De toutes façons, la vitesse finale ne dépend pas de l'accélération (si on a assez de pas pour y arriver).

je pense que vous ne prenez pas la bibliothèque dans le bon sens

si vous ne voulez pas d'accélération, vous utilisez juste setSpeed() et runSpeed()

mais bon le "accel" de accelStepper c'est pour accélération. Si on ne veut pas cette fonction ce n'est peut être pas la bonne bibliothèque à prendre.

Bonjour vileroi

En mettant une valeur énorme
mpap.setAcceleration(10000.0);
par exemple de telle façon qu'elle passe "inaperçue"

Cordialement
jpbbricole

Oui, mais je ne suis pas doué. Je ne sais pas compter les pas avec runSpeed().

Je ne l'utilise pas, je regarde comment elle est faite. C'est toujours intéressant de voir le code des autres... et de chercher le bug!
Si j'ai besoin de gérer un pas à pas, j'utilise une de mes bibliothèques.

C'est ce que j'ai fait en mettant la valeur 100.0

Pas doué on ne peut pas dire ça :slight_smile:

Compter les pas ?

Vous définissez un objectif avec move ou moveTo vous définissez la vitesse (ensuite pas avant) et vous faites tourner runSpeed() sinon vous pouvez utiliser aussi runSpeedToPosition()

En asynchrone vous pouvez utiliser distanceToGo() pour savoir combien de pas il reste à faire

C'était effectivement un bug, corrigé dans la version actuelle.

Cela montre deux choses:
− La personne qui s'occupe d'AccelStepper est très réactive
− On peut avoir un bug pendant des années sans qu'on s'en aperçoive. Corolaire, on ne peut pas tester complètement une bibliothèque.

Ça montre aussi que la relecture de code sert à quelque chose !!

La relecture de son propre code ne donne pas grand chose, sinon il n'y aurait pas d'erreur de compilation. Et relire un code de quelqu'un d'autre n'est pas simple non plus. Ce bug et celui de Stepper.h ont bien été vus en lisant le code, mais c'est plus du hasard.

Cela m'arrive d'inverser deux lettres ou d'en oublier une. J'ai beau relire plusieurs fois, c'est au final le correcteur orthographique, le compilateur ou ma compagne qui trouve l'erreur.

Et quand on voit le nombre de correctifs qui suit la sortie d'un produit, même payant, je deviens dubitatif quand à l'absence de bug après des relectures.

oui la relecture c'est par quelqu'un d'autre généralement

Mais le code est souvent trop complexe pour trouver quelqu'un. Ou alors il faut mettre plus de commentaires que de code, et encore!
Il y a des tas d'articulations. En écrivant le code j'ai plein de variables qui dépendent les unes des autres. Celui qui relit n'a pas cette vue d'ensemble. Et quand on lit un code d'un autre, on doit souvent se dire "j'aurais pas fait comme ça"...

je parlais en général, de la technique de relecture de code qui est une technique classique en développement logiciel en entreprise.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.