Problème moteur pas a pas + lcd

bonjour j’essaye de contrôler des moteurs pas a pas avec un joystick en utilisant la librairie accelstepper .
jusque la pas de problème
.je veut afficher aussi la valeur du potentiomètre de vitesse sur un écran lcd grâce a la librairie liquidcrystal_i2c .
mon problème est que quoi que j’affiche sur l’écran cela ralenti et fait saccader mon moteur .

j’ai besoin d’aide je me casse la tête depuis des jours mais je n’arrive pas a comprendre !!
merci

voici le code


////////////////////////////////////////////////////////////////////////////////////////////////////



#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
/////////////////////////////////////////////////////////////////////////////////////////////////////

#include <AccelStepper.h> 
AccelStepper stepper(1, 9, 8); // direction 9, step 8


//Pins
const byte Analog_X_pin = A7; //x-axis readings


//Variables
int Analog_X = 0; //x-axis value
//int Analog_Y = 0; //y-axis value
int enablepin = 7 ;
int vitesse ;
int MAX_SPEED;
int potspeed;
long StartTime=0;
void setup()
{

  //SERIAL
  Serial.begin(250000);
  //Serial.println("Test");
  lcd.init(); //initialise l'afficheur

  lcd.backlight(); //Active le rétroéclairage
  //----------------------------------------------------------------------------    
  //PINS
  pinMode(Analog_X_pin, INPUT);
  pinMode(enablepin, OUTPUT);
   
  //----------------------------------------------------------------------------  

  stepper.setMaxSpeed(3000); //SPEED = Steps / second  
  stepper.setAcceleration(500); //ACCELERATION = Steps /(second)^2    
  stepper.setSpeed(3000);


 
}

void loop()

{

  
int vit =map (potspeed,0,1023,0,100);

 

   
   if(vit < 10) {
    lcd.setCursor(10, 1);
   lcd.print(" ");
   }
   if(vit < 100) {
    lcd.setCursor(11, 1);
    lcd.print(" ");
   }
   

 lcd.setCursor(9, 1);
lcd.print(vit);




  
   
  ReadAnalog(); 
   stepper.run(); 
 
}

void ReadAnalog()
{
  
  Analog_X = analogRead(Analog_X_pin);
   potspeed = analogRead(A6);
  int setspeed = map (potspeed,0,1023,0,550);
   int Analog_X1 =map (Analog_X,0,1023,-setspeed,setspeed);
  // Serial.println(setspeed);

  lcd.setCursor(2, 1);
 lcd.print("SPEED:");
 lcd.setCursor(8, 1);
 lcd.print(setspeed);
//lcd.clear();
  

  if(Analog_X>518) 
  {
    digitalWrite(enablepin, LOW);
  stepper.setSpeed(Analog_X1);  

   
  }
  
  else if (Analog_X<508) 
  {
    digitalWrite(enablepin, LOW);
    stepper.setSpeed(Analog_X1); 
    
  }
  else 
  {
    stepper.setSpeed(0);

   if((millis()-StartTime) >= 300000) {
    StartTime = millis();  
    digitalWrite(enablepin, HIGH);
    }
  }
 
 
}

Pour qu’accelstepper fonctionne correctement, il faut que l’appel à la fonction stepper.run() soit au moins plus fréquent que l’avance d’un pas. Autrement dit, il ne faut pas que le code de loop() soit bloquant.
Les appels à lcd le sont et surtout ReadAnalog.

Accelsteppe ne peut travailler qu’à 1000 pas /s. Voir la doc de setSpeed():

Utilise quickStep qui permet d’avoir du code bloquant et qui peut aller au dela de 1000 pas/s

merci beaucoup je viens de lire la description cette librairie a l’air super
je testerais ca ce soir
encore merci :wink:

N’hésite pas à poser des questions pour transposer le programme. QuickStep n’est pas prévue pour faire tourner un moteur en continu, les pas à pas étant idéaux pour un positionnement. Pour faire tourner un moteur en continu, il faut par exemple envoyer des ordres de rotation régulièrement. Pour changer la vitesse, il faut arrêter le moteur et le relancer avec un autre ordre. Sinon en allant chercher directement dans la bibliothèque, il est possible de changer la vitesse en cours.

alors j’ai fait quelque tests et c’est un peut compliqué car j’ai beaucoup de fonctions différentes et je n’arrive pas a avoir l’équivalant de accelstepper . mon code pour ce qui est des moteurs est déjà au point (pour info le projet est une table qui va commander 6 têtes motorisée donc 12 moteurs avec plusieurs modes de fonctionnement) du coup le lcd étant secondaire n’y a il pas un moyen plutôt de rendre non bloquant l’affichage ?

Si il y a 12 moteurs QuickStep n’est pas encore possible. Pour commander autant de moteurs que je veux nécessite une modification et j’ai un bug que je ne sais pas résoudre pour l’instant.

Si accelStepper est limité à 1000 pas / s, c’est pour un seul moteur. Avec 12 moteurs, ce doit être beaucoup moins je suppose.

Pour rendre ReadAnalog non bloquant, ce n’est pas facile, mais si c’est lcd.print ce sera encore plus compliqué. Il faudrait en premier lieu savoir à quelle vitesse tu veux travailler, et quel est le temps mis par les différentes fonctions. J’ai presque l’impressions que c’est plus facide de réécrire complètement AccelStepper, ce que j’ai fait, (mais je n’avais besoin que de 4 moteurs).

En général, quand on a 12 moteurs pas à pas, on ne les commande pas tous en même temps. On fait de la trajectoire sur trois ou quatre moteurs à la fois. Donc on peut réduire le problème à commander trois ou quatre moteurs simultanément, quitte à changer les moteurs cibles suivant l’état de la machine dans une séquence logique.

Bonjour,

L’affichage prendra toujours du temps, mais ce que tu pourrais faire c’est afficher seulement quand la valeur varie.

Pas faisable avec QuickStep.

Voir afficher caractère par caractère

ok donc pour la vitesse j’ai simplement changer les engrenage des têtes du coup je retourne dans des valeurs “maxspeed” acceptables
pour ce qui est de l’affichage j’ai essayé un truc comme ca :

if (potnew != potold); {
lcd.setCursor(9, 1);
lcd.print(pot);

}
potold=potnew;

else {
standby ();

ca semble marcher .maintenant a voir si je pourrais me débrouiller avec ca pour tout les menus