RESOLU: Bien contrôler NEMA17 avec AccelStepper

Salut à tous,

Je comprends pas pourquoi, je n’arrive pas à contrôler de manière rapide le NEMA 17 avec la librairie Accelstepper
Le moteursuit bien la direction du potar, mais lentement et de manière saccadé :astonished:

, alors que j’arrive à le faire tourner très vite, le ralentir, l’accélérer sans libraire avec un potar.

#include <AccelStepper.h>

#define STEP 1 // 1 pas entier

#define motorPin1  9    
#define motorPin3  8   
 

AccelStepper stepper(STEP, motorPin1, motorPin3); 


#define ANALOG_IN A0

int analog_in, positionX;

// the previous reading from the analog input
int previous = 0;

void setup()
{  
  Serial.begin (9600);
  stepper.setMaxSpeed(5000);//  max pas / seconde?
  stepper.setAcceleration(2500); //max pas * sec-2
}

void loop()
{
  // Read new position
 analog_in = analogRead(ANALOG_IN);
   
 positionX= map ( analog_in, 0, 1027, -200, 200); // 5V

 // stepper.setMaxSpeed(500);//  max pas / seconde?
//  stepper.setAcceleration(250); //max pas * sec-2
   stepper.moveTo(positionX);
 stepper.setSpeed(500);
  stepper.runSpeedToPosition();

   // remember the previous value of the sensor
  previous = positionX;
  
  Serial.print ( "A0: " ) , Serial.println ( analog_in );
  Serial.print ( "posX: " ) , Serial.println ( positionX );
  Serial.print ( "previous" ) , Serial.println ( previous );

}

Et si vous enlevez les print qui vont vite saturer les 64 octets du buffer à 9600 bauds et devenir bloquants...

Mettez le stepper.setSpeed(500); dans le setup
Appelez stepper.moveTo(positionX); que si la position cible a changé
Dans le map utilisez 1023 (ou 1024 si vous voulez avoir +200 pas uniquement à 1023) mais pas 1027...

Et passez à 112500 ou plus pour le moniteur série pour tous vos sketch, dans l’échange avec votre mac/pc il n’y a aucune raison d’aller lentement

Super ça fonctionne! Merci beaucoup :wink: :wink:

J’avais aussi fais l’erreur de mettre

stepper.setSpeed(500); après stepper.moveTo(positionX);

alors qu’on gère la vitesse avant la position.

Donc je mets le bon code.

#include <AccelStepper.h>

// Define a stepper and the pins it will use
#define STEP 1. 
#define motorPin1  9  
#define motorPin2  7    
#define motorPin3  8   
#define motorPin4  6    

AccelStepper stepper(STEP, motorPin1, motorPin3); 
//AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

// This defines the analog input pin for reading the control voltage
// Tested with a 10k linear pot between 5v and GND
#define ANALOG_IN A0

int analog_in, positionX;

void setup()
{  
   Serial.begin (115200);
  stepper.setMaxSpeed(500);
  stepper.setAcceleration(50);
}

void loop()
{
  // Read new position
  analog_in = analogRead(ANALOG_IN);
  positionX= map ( analog_in, 0, 1023, 0, 200); // 5V

    stepper.setSpeed(300);
  stepper.moveTo(positionX);

  stepper.runSpeedToPosition();
  /*
    Serial.print ( "A0: " ) , Serial.println ( analog_in );
  Serial.print ( "posX: " ) , Serial.println ( positionX );
  */
}

Oui mais toujours pas besoin de faire stepper.setSpeed(300); dans la loop. Dites le une seule fois dans le setup