Projet ordonnancement des tâches avec Arduino

[Total : 1   Moyenne : 5/5]

Projet ordonnancement des tâches avec Arduino (19)

Projet ordonnancement des tâches avec Arduino (17)

Objectifs

  1. Savoir ordonnancer les taches avec Arduino
  2. Savoir définir les conditions de départs et arrêts des taches
  3. Savoir initialiser l’ordonnanceur
  4. Etc.

Initialisation: Durée & temps de départ

void setup()

{

  // Init écheances des taches (en ms) 

  Tache_duree[0]=5000;

  Tache_duree[1]=5000;

  Tache_duree[2]=5000;




  // Init temps de début des tâches (en ms)

  Tache_start[0]=10000;

  Tache_start[1]=20000;

  Tache_start[2]=30000;




  // Init affichage de la tache active

  Serial.begin(9600);







  // Init des sorties

  pinMode(PinLED1,OUTPUT);

  pinMode(PinLED2,OUTPUT);

  pinMode(PinLED3,OUTPUT); 

}

Lecture de l’ordonnanceur

Master_time=millis();

Initialisation de l’ordonnanceur avec la période de répétition

  Master_time=(Master_time % DureeRep_ms);

Génération des conditions de début des taches

  for (i=0;i<NumTache;i++)

  {

    Tache_on[i]=(Master_time>Tache_start[i]);

  }

Génération des conditions d’arrêts

  for (i=0;i<NumTache;i++)

  {

    Tache_off[i]=Tache_on[i]& (Master_time<(Tache_start[i]+Tache_duree[i]));

  }

Exécution des tâches

  // Tâche 1

  if(Tache_off[0])

  {

    analogWrite(PinLED1,255);

    analogWrite(PinLED2,0);

    analogWrite(PinLED3,0);

    Tache_Active=1;

  }




  // Tâche 2

  else if(Tache_off[1])

  {

    analogWrite(PinLED1,0);

    analogWrite(PinLED2,255);

    analogWrite(PinLED3,0);

    Tache_Active=2;

  }




  // Tâche 3

  else if(Tache_off[2])

  {

    analogWrite(PinLED1,0);

    analogWrite(PinLED2,0);

    analogWrite(PinLED3,255);

    Tache_Active=3;

  }

  // Autres: Désactivation des sorties

  else

  {

    analogWrite(PinLED1,0);

    analogWrite(PinLED2,0);

    analogWrite(PinLED3,0);

    Tache_Active=0;

  }

  

  // Affichage de la tache active

  Serial.print(Master_time/1000);

  Serial.print(":");

  Serial.println(Master_time%1000);

}

Exemple de 3 tâches



#define   NumTache      3
#define   DureeRep_ms   40000
#define   PinLED1       2
#define   PinLED2       3
#define   PinLED3       4
   
unsigned char Tache_on[NumTache],Tache_off[NumTache];
unsigned long Tache_start[NumTache],i;
unsigned long Master_time=0, Tache_duree[NumTache];
unsigned char Tache_Active=0; 

void setup()
{
  // Init écheances des taches (en ms)  
  Tache_duree[0]=5000; 
  Tache_duree[1]=5000;
  Tache_duree[2]=5000;

  // Init temps de début des tâches (en ms) 
  Tache_start[0]=10000;
  Tache_start[1]=20000;
  Tache_start[2]=30000;
  
  // Init affichage de la tache active 
  Serial.begin(9600); 
  

  // Init des sorties 
  pinMode(PinLED1,OUTPUT); 
  pinMode(PinLED2,OUTPUT); 
  pinMode(PinLED3,OUTPUT);  
}

void loop()
{
  // Lecture de l'ordonnanceur 
  Master_time=millis(); 

  // Init de l'ordonnanceur avec la période de répétition 
  Master_time=(Master_time % DureeRep_ms);
  
  // Génération des conditions de début des taches  
  for (i=0;i<NumTache;i++)
  {
    Tache_on[i]=(Master_time>Tache_start[i]);
  }

  // Génération des conditions d'arrêts   
  for (i=0;i<NumTache;i++)
  {
    Tache_off[i]=Tache_on[i]& (Master_time<(Tache_start[i]+Tache_duree[i]));
  }

  // Exécution des tâches 
  // Tâche 1 
  if(Tache_off[0])
  {
    analogWrite(PinLED1,255); 
    analogWrite(PinLED2,0); 
    analogWrite(PinLED3,0); 
    Tache_Active=1;
  }

  // Tâche 2
  else if(Tache_off[1])
  {
    analogWrite(PinLED1,0); 
    analogWrite(PinLED2,255); 
    analogWrite(PinLED3,0); 
    Tache_Active=2;
  }

  // Tâche 3 
  else if(Tache_off[2])
  {
    analogWrite(PinLED1,0); 
    analogWrite(PinLED2,0); 
    analogWrite(PinLED3,255); 
    Tache_Active=3;
  }
  // Autres: Désactivation des sorties 
  else 
  {
    analogWrite(PinLED1,0); 
    analogWrite(PinLED2,0); 
    analogWrite(PinLED3,0); 
    Tache_Active=0;
  }
   
  // Affichage de la tache active 
  Serial.print(Master_time/1000);
  Serial.print(":");
  Serial.println(Master_time%1000);
}

Sujets connexes

  • arduino boucles simultanées
  • arduino actions simultanées
  • plusieurs loop arduino
  • arduino plusieurs capteurs
  • arduino temporisation non bloquante
  • arduino multitâche avec timer
  • arduino astuces
  • programme arduino complexe
  • arduino multitâche
  • machine d’état arduino

Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *