Académique Documents
Professionnel Documents
Culture Documents
Objectifs
Savoir le principe de fonctionnement d’un système de pompage automatique
Savoir faire le chronogramme des taches d’un système automatique (Grafcet)
Se familiariser avec l’implémentation d’un GRAFCET
Savoir comment implémenter un Grafcet avec Arduino
Savoir comment simuler le fonctionnement d’un système Avec Arduino
Etc.
Vidéo démonstration
Fonctionnement
Le mini projet est un système automatique de pompage. Il sert à contrôler le remplissage
d’un réservoir d’eau (ou fluide) d’une manière automatique en utilisant une pompe
électrique. Le montage est constitué des éléments suivants :
Pompe (P) : Elle permet de remplir le réservoir avec de l’eau lorsque le niveau d’eau est
faible. La pompe est mise en marche lorsque le niveau d’eau est atteint de niveau bas (B).
Elle s’arrête lorsque le niveau d’eau arrive au niveau haut (H).
Détecteurs de niveaux : Le réservoir dispose de deux détecteur TOR de niveaux Haut (H)
et Bas (B). Les deux détecteurs fournissent un signal logique de la façon suivante :
LEDs indicatrices : On dispose de trois voyants lumineux (LEDs) indiquent l’état des
détecteurs et celui de la pompe :
LED (P) : Illustre l’état de la pompe. Elle s’allume lorsque la pompe est mise en route
LED (H) : Illustre l’état du détecteur (H). Elle s’allume lorsque le fluide attient le niveau
haut
LED (B): Illustre l’état du détecteur (B). Elle s’allume lorsque le fluide attient le niveau
bas
Carte Arduino : Il sert à contrôler l’ensemble du système (lecture des détecteurs et envoie
des consignes aux LEDs et à la pompe)
Chronogramme du système
On considère la variable HB sur deux bits : Bit du poids fort H indique l’état du détecteur, B
pour celui du bas. Exemples : HB=00 : Les deux détecteurs sont inactifs, HB=01 : Détecteur
Phase de remplissage
État « 1 » : Il est la position initiale du système. Il faut assurer que le réservoir est vide
avant de lancer le programme. En effet, lorsque le réservoir est vide HB=00. Durant cet
état, le programme mis en route la pompe (P=1) tant que HB=00. Lorsque HB=01, le
programme transit à l’état suivant
État « 2 » : Le programme mis en route la pompe (P=1) tant que HB=01. Autrement
dit, le pompe continue de remplir le réservoir tant le détecteur H n’est pas attient. Une
fois HB=11, le programme passe à l’état suivant
Phase de vidange
État « 3 » : Le programme met en arrêt la pompe tant le réservoir est plient (HB=11)
ou défaut du détecteur bas (HB=10). En effet, l’état 10 n’est pas envisageable dans cas
pratique car il ‘est pas possible que le fluide atteigne le niveau haut (H=1) sans que le
niveau bas soit actif (B=1). Par conséquent, la présence de l’état HB=10 est
certainement un défaut du détecteur bas. Le programme transit à l’état suivant le fluide
quitte le détecteur haut (HB=01)
État « 4 » : La pompe reste en état d’arrêt (P=0) tant que le détecteur B est actif
(HB=01) (fluide entre H et B). Lorsque le fluide arrive au dessous du détecteur B
(HB=00) on relance le cycle de fonctionnent. Ci-dessous le chronogramme du système.
Chronogramme
Programme principal
if(digitalRead(H_Pin)==1)
HB=HB+2;
return HB;
…
// Etat '1'
while(1)
{
// Lectures H & B
HB_val=GetHB(H, B);
Problème de démarrage
Nous constatons que la mise en marche de la pompe durant l’état « 1 » exige l’inactivation
des deux détecteurs (HB=0) ou le vidange du réservoir. Il est intéressant d’intégrer le mode
vidage (ou nettoyage) du réservoir d’une façon manuelle en utilisant par exemple un
interrupteur (« 1 » : Mode normal, « 0 » : Mode manuel). Durant ce mode on désactive la
pompe (P=0) puis on affiche les états des LEDs. On met en marche par la suite le système
lorsque les deux LED (H et B) sont éteintes.
void loop()
{
if(Mode_Sel=1)
{
Mode Normal;
}
else
{
Mode vidange;
}
}
Programme principal
// Entrées détecteur de niveaux
const int B = 2; // Bas
const int H = 3; // Haut
// Sortie pompe
const int P_LED = 9;
const int P = 10;
void setup()
{
Serial.begin(9600);
//Init
pinMode(B,INPUT);
pinMode(H,INPUT);
pinMode(Flag_B,OUTPUT);
pinMode(Flag_H,OUTPUT);
pinMode(P,OUTPUT);
pinMode(P_LED,OUTPUT);
digitalWrite(Flag_B, LOW);
digitalWrite(Flag_H, LOW);
digitalWrite(P_LED, LOW);
digitalWrite(P, HIGH);
}
void loop()
{
/*Serial.println(GetHB(H, B));
delay(1000); */
// Etat '1'
while(1)
{
// Lectures H & B
HB_val=GetHB(H, B);
delay(200);
}
// Etat '3'
while(1)
{
HB_val=GetHB(H, B);
if((HB_val==3)||(HB_val==2))
{
SetPompe(0, P,P_LED);
SetLED(HB_val,Flag_B, Flag_H);
}
if(HB_val==1)
break;
delay(200);
}
// Etat '4'
while(1)
{
HB_val=GetHB(H, B);
if(HB_val==1)
{
SetPompe(0, P,P_LED);
SetLED(HB_val,Flag_B, Flag_H);
}
if(HB_val==0)
break;
delay(200);
}
}
if(digitalRead(H_Pin)==1)
HB=HB+2;
return HB;
}
digitalWrite(Flag_HH, LOW);
break;
case 2:
digitalWrite(Flag_BB, LOW);
digitalWrite(Flag_HH, HIGH);
break;
case 3:
digitalWrite(Flag_BB, HIGH);
digitalWrite(Flag_HH, HIGH);
break;
}
}
Téléchargement
Arduino: Système automatique de pompage avec Arduino
Photos du projet