Système automatique de pompage avec Arduino

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).

Carte relais : Mise en marche/arrêt de la pompe. La carte relais contient un relais de puissance (AC/DC) qui assure la mise sous tension de la pompe. Les caractéristiques du relais doivent être adéquates avec celle de la pompe (tension, puissance). Nous utiliserons dans ce projet un relais (250V/10A) menu avec un étage de puissance (isolation optique, transistor, diode de retour, etc.). En effet une tension TOR 5V à faible courant permet de déclencher le relais. Le relais ne nécessite pas un transistor de puissance, tout est intègre dans la carte relais !

Pont H de puissance à base de DEUX relais commandés – Commande du sens de rotation d’un moteur à CC module relais 1

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 :

  • « 0 » : Lorsque le fluide n’attient pas le détecteur, ce dernier fournit un niveau logique bas  ou une tension égale à 0V
  • « 1 » : Lorsque le fluide attient le détecteur, ce dernier fournit un niveau logique haut  ou une tension égale à 5V

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)

Comment fabriquer facilement un détecteur du niveau ?

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 bas actif, etc. Le programme principal contient 4 états :

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

Chronogramme du système-min

Câblage des composants

  • Détecteur B: Pin 2
  • Détecteur H: 3
  • LED (B): 5
  • LED (H): 6
  • LED (P): 9
  • Pompe (P): 10

Programme principal

Lecture des détecteurs : GetHB()

La fonction GetHB() permet de lire les états des détecteurs H et B et renvoie une valeur comprise entre 0 et 3. En effet la valeur de retour est notre variable HB !

  • HB=0 lorsque H=0 & B=0
  • HB=1 lorsque H=0 & B=1
  • HB=2 lorsque H=1 & B=0
  • HB=3 lorsque H=1 & B=1
int GetHB(int H_Pin, int B_Pin)
{
  int HB=0; 
  if(digitalRead(B_Pin)==1) 
    HB=HB+1; 
  
  if(digitalRead(H_Pin)==1) 
    HB=HB+2; 
  
  return HB;
}

Mise en marche de la pompe et son indicateur SetPompe()

La LED (P) reflète l’état de la pompe P en revanche le relais est activé niveau bas. Autrement dit, le relais est actif lorsque la sortie numérique 10 de la carte Arduino est égale à « 0 » (inactif à « 1 »). Par conséquent, les états des sorties 9 et 10 doivent être complémentaires et déclenchés en parallèle. La fonction SetPompe() permet d’activer les deux sorties en respectant l’état de chacune.

void SetPompe(byte P_val, int PP, int P_LEDD )
{
  if(P_val==0)
  {
    digitalWrite(P_LEDD, LOW);
    digitalWrite(PP, HIGH);
  }
  else
  {
    digitalWrite(P_LEDD, HIGH);
    digitalWrite(PP, LOW);
  }
}

Activation des voyants H et B SetLED()

La fonction SetLED() active les LED H et B en fonction de l’état de la variable HB

  • HB=0 : Deux LED éteintes
  • HB=1 : LED B allumée
  • HB=2: LED H allumée
  • HB=3 : Deux LED allumées
void SetLED(byte HB_val, int Flag_BB, int Flag_HH )
{
  switch (HB_val) 
  {
    case 0:
      digitalWrite(Flag_BB, LOW);
      digitalWrite(Flag_HH, LOW);
      break;
    case 1:
      digitalWrite(Flag_BB, HIGH);
      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;
  }
}

Comment programmer un état ?

On peut considérer un état comme une boucle infinie. On active une ou plusieurs sorties à l’intérieur de la boucle. La sortie de boucle est assurée par la validation de la transition vers l’état suivant. Dans notre cas, durant l’état « 1 », on active la pompe et son indicateur lorsque HB=0 en boucle. Puis, on passe à l’état « 2 » lorsque HB=1. Ci-dessous la programmation de l’état « 1 » :

    …
    // Etat '1'    
    while(1)
    {
      // Lectures H & B
      HB_val=GetHB(H, B);

      // Condition de l'activation des sorties 
      if(HB_val==0)
      {
        SetPompe(1, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      
      // Condition de passage à l'état suivant 
      if(HB_val==1)
        break; 

      // Délais (pas nécessaire) 
      delay(200);  
    }
    …

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 

// Sorties indicateurs (LEDs)   
const int Flag_B = 5;
const int Flag_H = 6;
int HB_val=0; 

// 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);

      // Condition de l'activation des sorties 
      if(HB_val==0)
      {
        SetPompe(1, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      
      // Condition de passage à l'état suivant 
      if(HB_val==1)
        break; 

      // Délais (pas nécessaire) 
      delay(200);  
    }
    // Etat '2'  
    while(1)
    {
      HB_val=GetHB(H, B);
      if(HB_val==1)
      {
        SetPompe(1, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      if(HB_val==3)
        break; 
        
      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);
    }
}

int GetHB(int H_Pin, int B_Pin)
{
  int HB=0; 
  if(digitalRead(B_Pin)==1) 
    HB=HB+1; 
  
  if(digitalRead(H_Pin)==1) 
    HB=HB+2; 
  
  return HB;
}

void SetLED(byte HB_val, int Flag_BB, int Flag_HH )
{
  switch (HB_val) 
  {
    case 0:
      digitalWrite(Flag_BB, LOW);
      digitalWrite(Flag_HH, LOW);
      break;
    case 1:
      digitalWrite(Flag_BB, HIGH);
      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;
  }
}

void SetPompe(byte P_val, int PP, int P_LEDD )
{
  if(P_val==0)
  {
    digitalWrite(P_LEDD, LOW);
    digitalWrite(PP, HIGH);
  }
  else
  {
    digitalWrite(P_LEDD, HIGH);
    digitalWrite(PP, LOW);
  }
}

Téléchargement

Photos du projet

Projet Système automatique de pompage avec Arduino (3)

Projet Système automatique de pompage avec Arduino (2)

Projet Système automatique de pompage avec Arduino (1)

Tout les projets microcontrôleur