Aide AccelStepper - il ne bouge tout simplement pas!
Je devrais commencer par dire que je ne suis pas un programmeur, que je ne connais pas vraiment grand-chose à la programmation et que je programme un Arduino Uno pour la première fois. J'utilise un moteur Nema 23 (23HS22-2804S) avec un pilote micropas (ST-M5045). Dans le code suivant se trouve la description de ce que j'ai besoin que le programme fasse:
#include <AccelStepper.h>
/* Using a stepper motor,
rotate a vibrational model using gears interconnected by springs
in such a way as to induce torsional vibration, which should be visible by comparing
movement of juxtaposed rotating gears with markers painted on. */
AccelStepper stepper(AccelStepper::FULL4WIRE, 2, 6, 4, 8);
int Microstepping = 8; /* Microstepping factor, as set on the ST-M5045 control board.
Multiplies the number of steps per revolution on the stepper motor.
Reference controller manual for adjustments to this number. */
int Steps = 200; /* Number of steps on your stepper motor.*/
int SPS;
int Amp;
int Freq;
// int SC;
int n = 2;
int i;
int totalSteps = Microstepping * Steps;
/* It should be noted that the Microstepping and Steps factors are not necessary, and adjusting the microstepping factor
* on the fly will not break the code. However, be aware that changing the microstepping factor by more than one interval
* at a time can cause the motor to not keep up with the sudden changes, i.e. losing torque or vibrating/stuttering. */
void setup() { // THIS RUNS ONCE //
// read potentiometers; raw inputs from 0 to 1023 //
SPS = analogRead(0)*0.733; // MAX RPM ~28, max speed ~750 steps per sec (speeds above 1000 steps per second are unreliable,
// according to AccelStepper documentation)//
Amp = analogRead(1)/20; // MAX AMP ~51//
Freq = analogRead(2)/170; // MAX FREQ ~6 Hz//
stepper.setMaxSpeed(SPS);
stepper.setAcceleration(SPS/1.5);
int nextStop = totalSteps/Freq;
stepper.moveTo(nextStop);
stepper.run();
}
void loop() {
int nextStop = totalSteps/Freq;
// reaches here, doesn't execute if loop.
if(stepper.distanceToGo()== 0){
SPS = analogRead(0)*0.733;
Amp = analogRead(1)/20;
Freq = analogRead(2)/170;
i = SPS - Amp;
if(i <=0)
i = 1;
stepper.setSpeed(i);
stepper.moveTo(nextStop*n);
stepper.run();
}
n++;
}
Lorsque j'utilise Serial.println () pour vérifier où le programme fonctionne et où il ne fonctionne pas, je vois qu'il complète la boucle d'installation sans jamais bouger, et dans des versions légèrement différentes du même code, il a entré le if ( ) et l'a exécutée (également sans bouger.)
Une version antérieure du programme exécute et exécute toutes les instructions, mais ne déplace qu'un maximum d'environ 20 pas par seconde, sans les fluctuations de vitesse que j'appelle, et ne répond en temps réel à aucune entrée du potentiomètre de vitesse qui met la vitesse supérieure à 20.
Dans l'idéal, le programme exécuterait la démo à pleine vitesse, et fréq fois par seconde, il ralentirait juste assez pour être perceptible comme une vibration de torsion.
J'ai essayé d'exécuter le programme avec et sans les lignes run (), et j'ai essayé d'utiliser runToNewPosition () pour tenter d'arrêter le programme et d'exécuter correctement le mouvement.
J'ai rendu la boucle de configuration aussi proche que possible de la boucle de configuration dans bounce.pde, l'exemple de programme de la documentation AccelStepper qui déplace le moteur pas à pas entre deux points à plusieurs reprises, accélérant et décélérant avant de changer de direction. La raison pour laquelle j'ai fait cela est parce que je sais que la boucle de configuration dans bounce.pde fonctionne , et donc je me sentirais plus confiant que ma boucle de configuration n'est pas le problème racine.
Toute aide que vous pouvez m'offrir est appréciée! Merci pour votre temps.
Réponses
Veuillez lire la documentation de la bibliothèque AccelStepper.
Interrogez le moteur et actionnez-le si une étape est due, en mettant en œuvre des accélérations et des décélérations pour atteindre la position cible. Vous devez l'appeler aussi souvent que possible , mais au moins une fois par intervalle de temps de pas minimum, de préférence dans votre boucle principale. Notez que chaque appel à run () fera au plus une étape, et ensuite seulement lorsqu'une étape est due, en fonction de la vitesse actuelle et du temps écoulé depuis la dernière étape.
la source
Vous n'appelez qu'une seule runfois, après avoir défini une nouvelle position.
Déplacer stepper.run();de la ifdéclaration, la fin de la loopfonction.
...
stepper.moveTo(nextStop*n);
}
stepper.run();
n++;
}