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;
}
}

[maxbutton id= »13″ ]

Obtenir le livre « Codage en C du GRAFCET avec ARDUINO« 

Click to rate this post!
[Total: 1 Average: 5]

Laisser un commentaire

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

Retour en haut

You have successfully subscribed to the newsletter

There was an error while trying to send your request. Please try again.

FPGA | Arduino | Matlab | Cours will use the information you provide on this form to be in touch with you and to provide updates and marketing.