Problème Multi-tache avec Arduino Due

Bonjour,

Je suis actuellement en BTS Informatique et mon projet de fin de 2ème année consiste à piloter un Tour a commande numérique grâce à Arduino. J'utilisais auparavant une Arduino Mega 2560 pour piloter le Tour et afficher des informations sur un écran LCD I2C (états des capteurs de fin de course, vitesse des Moteurs pas à pas...), mais la communication entre l'écran et l'Arduino ralentissait le programme : les moteurs du tour tournaient très lentement.
Mon professeur d'informatique m'a alors conseillé d'utiliser un Arduino Due, afin d'utiliser le multi-tâche sur ce dernier.
J'ai donc réaliser plusieurs tests avec le multi-tache (j'utilise la classe Scheduler :Scheduler) et ces tests sont concluant : l'arduino due réalise plusieurs opérations (clignoter une led, afficher des caractères sur l'ecran LCD...)

Malheureusement, lorsque j'essaye d'integrer le multi-tache dans ma classe pilotant le tour, cela ne fonctionne pas : les loops crées grâce a startLoop ne s'executent pas.
J'utilise la classe Stepper afin de piloter les moteurs pas à pas du tour.
J'ai également réalisé une classe de test pour le multi-tache et celle ci fonctionne.
Dans le code qui suit, le problème ne vient aparement pas de mes fonctions, le programme ne rentre pas dans les boucles créés par Scheduler.

Merci pour votre lecture et vos futures réponses.

La classe CTour:
CTour.h :

#ifndef CTOUR_h
#define CTOUR_h

#include <Arduino.h>


class CTour
{
  public:
    CTour();
    ~CTour();
    
    bool acquerirB1();
    bool acquerirB2();
    bool acquerirB3();
    bool acquerirB4();
    bool acquerirBoutonRetourOM();
     
    char obtenirPosition(char x, char z);
    char obtenirPositionPiece(char x, char z);
    void retourOrigineMachine();
    
    void piloterMoteur();

    void initialiserLCD();
    void afficherValeurs();
      
  private:
    int joystickX;
    int joystickZ;
   
    char pinX;
    char pinZ;
    
    int etatB4;
    int etatB3;
    int etatB2;
    int etatB1;
    
    unsigned int vitesseX1;
    unsigned int vitesseX2;
    unsigned int vitesseZ1;
    unsigned int vitesseZ2;

    float positionX;
    float positionZ;

    int pinB4;
    int pinB3;
    int pinB2;
    int pinB1;

    int boutonRetourOM;
    int etatBoutonRetourOM;
  
};
#endif

CTour.cpp : méthodes principales : piloterTour() et afficherValeurs()

void CTour::piloterMoteur()
{
  
  //Moteur de 200 pas par tour et brancher sur les pins 4, 5, 6, 7
  Stepper moteurZ(200, 4, 5, 6, 7);
  //Moteur de 200 pas par tour et brancher sur les pins 8, 9, 10, 11
  Stepper moteurX(200, 8, 9, 10, 11);

  joystickX = analogRead(pinX); //lecture de la tension du joystick sur l'axe X
  joystickZ = analogRead(pinZ); //lecture de la tension du joystick sur l'axe Z

  //On lis les valeurs des capteurs
  etatB4 = acquerirB4();
  etatB1 = acquerirB1();
  etatB3 = acquerirB3();
  etatB2 = acquerirB2();
  
  if(etatB1 == false) //Si le capteur de butée gauche trainard n'est pas activé...
  {
    if((joystickZ >= 0) && (joystickZ <= 400)) //On regarde si le joystick est déplacé
    {     
      vitesseZ1 = map(joystickZ, 500,0, 0, 100); //On fait correspondre la position du joystick a la vitesse que l'on va attribuer au moteur
      moteurZ.setSpeed(vitesseZ1); //On attribue la vitesse au moteur de l'axe Z
      moteurZ.step(-5); //Déplace l'axe Z vers la droite (1 pas)  
      //Serial.println("Droite"); 
    }
  }
  else //Si le capteur est activé..
  {
    vitesseZ1 = 0; //La vitesse est nulle -> le moteur n'avance plus vers le capteur
  }
  
  if(etatB2 == false) //Si le capteur de butée droite trainard n'est pas activé...
  {
    if((joystickZ >= 600) && (joystickZ <= 1023)) //On regarde si le joystick est déplacé
    {      
      vitesseZ2 = map(joystickZ, 510, 1023, 0, 100); //On fait correspondre la position du joystick a la vitesse que l'on va attribuer au moteur
      moteurZ.setSpeed(vitesseZ2); //On attribue la vitesse au moteur de l'axe Z
      moteurZ.step(5); //Déplace l'axe Z vers la gauche (1 pas)   
      //Serial.println("Gauche"); 
    }
  }
  else //Si le capteur est activé..
  {
    vitesseZ2 = 0; //La vitesse est nulle -> le moteur n'avance plus vers le capteur
  }


  
  if(etatB3 == false) //Si le capteur avant du chariot n'est pas activé
  {
    if((joystickX >= 0) && (joystickX <= 400)) //On regarde si le joystick est déplacé
    {     
      vitesseX1 = map(joystickX, 500,0, 0, 100); //On fait correspondre la position du joystick a la vitesse que l'on va attribuer au moteur
      moteurX.setSpeed(vitesseX1); //On attribue la vitesse au moteur de l'axe X
      moteurX.step(5); //Déplace l'axe X vers le haut
      //Serial.println("Haut");     
    }
  }
  else //Si le capteur est activé..
  {
     vitesseX1 = 0; //La vitesse est nulle -> le moteur n'avance plus vers le capteur

  }
  if(etatB4 == false) //Si le capteur arriere du chariot n'est pas activé
  {  
    if((joystickX >= 600) && (joystickX <= 1023)) //On regarde si le joystick est déplacé
    {
      vitesseX2 = map(joystickX, 510, 1023, 0, 100); //On fait correspondre la position du joystick a la vitesse que l'on va attribuer au moteur
      moteurX.setSpeed(vitesseX2); //On attribue la vitesse au moteur de l'axe X
      moteurX.step(-5); //Déplace l'axe X vers le bas
      //Serial.println("Bas"); 
    }
  }
  else //Si le capteur est activé..
  {
    vitesseX2 = 0; //La vitesse est nulle -> le moteur n'avance plus vers le capteur
  }
  
}
void CTour::afficherValeurs()
{
  LiquidCrystal_I2C lcd(0x27, 20, 4);
  lcd.backlight();
  //Affichage de l'etat des capteurs 
  if(acquerirB4() == true)
  { 
    lcd.setCursor(18, 3);
    lcd.print("*");
  }
  else
  {
    lcd.setCursor(18, 3);
    lcd.print(" ");
  }
  if(acquerirB3() == true)
  {
    lcd.setCursor(13, 3);
    lcd.print("*");
  }
  else
  {
    lcd.setCursor(13, 3);
    lcd.print(" ");
  }
  if(acquerirB2() == true)
  {
    lcd.setCursor(8, 3);
    lcd.print("*");
  }
  else
  {
    lcd.setCursor(8, 3);
    lcd.print(" ");
  }
  if(acquerirB1() == true)
  {
    lcd.setCursor(3, 3);
    lcd.print("*");
  }
  else
  {
    lcd.setCursor(3, 3);
    lcd.print(" ");
  }
  lcd.setCursor(10, 2);
  
  //Affichage de la vitesse 
  if((joystickZ >= 0) && (joystickZ <= 400)) //On regarde si le joystick est déplacé
  {
      lcd.print(vitesseZ1);
  }
  if((joystickZ >= 600) && (joystickZ <= 1023)) //On regarde si le joystick est déplacé
  {
      lcd.print(vitesseZ2);
  }
  if((joystickX >= 0) && (joystickX <= 400)) //On regarde si le joystick est déplacé
  {
      lcd.print(vitesseX1);
  }
  if((joystickX >= 600) && (joystickZ <= 1023)) //On regarde si le joystick est déplacé
  {
      lcd.print(vitesseX2);
  }
  else
  {
    lcd.print("      ");
  }
  
  //Affichage de la position
  lcd.setCursor(11, 1);
  lcd.print(positionX);
  lcd.print(" ");
  lcd.print(positionZ);
  yield();
}

Le programme :

#include "CTour.h"
#include <LiquidCrystal_I2C.h>
#include <Scheduler.h>

CTour tourcn; //objet de la classe CTour

int etatBtnRetourOMMemorise = 0;

int etatCapteurB4 = 0;
int etatCapteurB3 = 0;
int etatCapteurB2 = 0;
int etatCapteurB1 = 0;

int etatBtnRetourOM = 0;

int interrupteurMode = 0;
int etatInterrupteurMode = 0;

void setup() 
{ 
  tourcn.initialiserLCD();
  Scheduler.startLoop(affichageLCD);
 
}

void loop() 
{
  //-----LOOP POUR LE PILOTAGE TOUR-----
  //Récupération état bouton
  /*
  etatBtnRetourOM = tourcn.acquerirBoutonRetourOM();
  
  if(etatBtnRetourOM == HIGH)
  {
    etatBtnRetourOMMemorise = 1; 
  }

  if(etatBtnRetourOMMemorise == HIGH)
  {
    tourcn.retourOrigineMachine();
  }
  */
  //Methode principale 
  tourcn.piloterMoteur();
}  

void affichageLCD() 
{
  //-----LOOP POUR L'AFFICHAGE SUR L'ECRAN LCD-----
  //Affichage des valeurs sur le LCD
  tourcn.afficherValeurs();  
  
}

Il me semble que les fonctions de la librairie "Stepper" ne rendent la main que lorsque la commande est terminée. Ce qui n'est pas la cas avec, je crois, la librairie "AccelStepper".

Cordialement.

Pierre

Merci pour votre réponse,

La librairie AccelStepper semble plus complète que Stepper, je vais essayer de piloter le tour avec.

J'avais déjà constaté que les fonctions de Stepper étaient bloquantes, notamment la fonction "step" lorsque l'on passe en paramètre un grand nombre de pas, mais dans mon programme, je ne fais que des "steps" de 1 pas, et lorsque le joystick est de retour à la position repos, le programme ne rentre pas dans la structure ou les fonctions de commande des moteurs de Stepper sont utilisés.
Toutefois je pense que le problème vient effectivement de Stepper...