GRAFCET | Arduino #22: Commande de l’allumage des lampes avec Arduino

Abonnez-vous à notre Chaîne YouTube "Devenir Ingénieur"  pour bénéficier de nouveaux projets et suivre l'actualité du blog

GRAFCET Commande de l'allumage des lampes avec Arduino

Objectif

Le cahier des charges indique qu’une seule lampe est susceptible d’être allumée à la fois. Lorsque l’un des interrupteurs [I1, I2] est actionné (I1=1, I2=0 ou bien I1=0, I2=1), alors on allume la lampe qui lui correspond avec une priorité égale. Un GRAFCET à séquences multiples semble le plus adapté à notre automatisme. La Figure  illustre un GRAFCET de la commande des lampes.

Le Programme Arduino

#define NumEtapes   3
#define NumIn       2
#define NumOut      2
#define NumTrans    4

bool Etapes[NumEtapes]; 
word Inputs[NumIn]; 
word Outputs[NumOut]; 
bool Trans[NumTrans]; 


void setup() 
{
  // Initialisation du port série - Affichage des états des étapes 
  Serial.begin(9600); 
  
  // Initialisation des étapes & les E/S
  InitStateIO(Etapes, NumEtapes, Inputs, NumIn,  Outputs, NumOut);
}

void loop() 
{  
  // 1. Activation des sorties 
  SetOutputs(Etapes,  Outputs); 

  // 2. Lecture des entrées   
  GetInputs(Inputs);

  // 3. Calcul des transitions 
  ComputeTrans(Etapes,  Trans);
  
  // 4. Mise à jour des étapes 
  SetupStates(Etapes,  Trans); 

  // Observation des états des lampes  
  Serial.print("Lampe_1= ");Serial.print(Outputs[0]);  
  Serial.print(", Lampe_2= ");Serial.println(Outputs[1]);
  //delay(100); 
}


void InitStateIO(bool *Etapes, word numEtapes, word *Inputs,word numIn,  word *Outputs, word numOut)
{
    // Désactivation des étapes 
    for(word i=0;i<numEtapes;i++)
      Etapes[i]=false; 

    // Activation d'une ou plusieurs étapes par défaut 
    Etapes[0]=true; 

    // Initialisation des entrées 
    for(word i=0;i<numIn;i++)
      Inputs[i]=false; 

    // Initialisation des sorties 
    for(word i=0;i<numOut;i++)
      Outputs[i]=false;   

    // Init des pins des entrées  
    pinMode(2, INPUT);
    pinMode(3, INPUT);

    // Init des pins des sorties  
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
}


void SetOutputs(bool *Etapes,  word *Outputs)
{
  // Étape 0 
  if(Etapes[0])
  {
    Outputs[0]=0;
    Outputs[1]=0;  
  }

  // Étape 1 
  if(Etapes[1])
  {
    Outputs[0]=1;
    Outputs[1]=0; 
  }

  // Étape 2 
  if(Etapes[2])
  {
    Outputs[0]=0;
    Outputs[1]=1;
  }
  
  // Mise à jour des sorties Arduino 
  digitalWrite(4,Outputs[0]); // Logique négative:!Outputs[0] 
  digitalWrite(5,Outputs[1]); // Logique négative:!Outputs[1] 
}


void GetInputs(word *Inputss)
{
  // Entrées digitales 
  Inputss[0]=digitalRead(2); 
  Inputss[1]=digitalRead(3); 
}


void ComputeTrans(bool *Etapes,  bool *Trans)
{
  Trans[0]=Etapes[0] && Inputs[0]&& !Inputs[1];
  Trans[1]=Etapes[1] && !Inputs[0]; 
  Trans[2]=Etapes[0] && !Inputs[0]&& Inputs[1];
  Trans[3]=Etapes[2] && !Inputs[1];
}

void SetupStates(bool *Etapes,  bool *Trans)
{
  // Transition 0 
  if(Trans[0])
  {
    // Activation des étapes suivantes  
    Etapes[1]=true; 

    // Désactivation des étapes précédentes
    Etapes[0]=false; 
  }  

  // Transition 1 
  if(Trans[1])
  {
    // Activation des étapes suivantes  
    Etapes[0]=true; 

    // Désactivation des étapes précédentes
    Etapes[1]=false; 
  }

  // Transition 2 
  if(Trans[2])
  {
    // Activation des étapes suivantes  
    Etapes[2]=true; 

    // Désactivation des étapes précédentes
    Etapes[0]=false; 
  }  

  // Transition 3 
  if(Trans[3])
  {
    // Activation des étapes suivantes  
    Etapes[0]=true; 

    // Désactivation des étapes précédentes
    Etapes[2]=false; 
  }   
}

Accueil GRAFCET AUTOMATISME

 

[Total : 1   Moyenne : 5/5]

Laisser un commentaire

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

Anti-Robot *