Skip to main content

Projet d'Automatisation et régulation de la viscosité

UE MU5CI823-Optimisation, contrôcontrôle et digitalisation des procédéprocédés

 

Groupe 2

Noms et PréPrénoms:

DE LA TAILLE LOLAINVILLE Gregoire (gregoire.de_la_taille_lolainville@etu.sorbonne-universitéuniversité.fr) 21103148

PALAIN Ilies (ilies.palain@etu.sobonne-universitéuniversité.fr) 21400210

HOU Charles (charles.hou@etu.sorbonne-universitéuniversité.fr) 21400213

JIANG Alexandre (alexandre.jiang@etu.sorbonne-universitéuniversité.fr) 21113611

Cursus scolaire : Master 2 de Chimie - Parcours IngéIngénierie Chimique

Date de commencement du projet : Septembre 2023

 
Date de fin du projet : 

Introduction :

L'objectif de notre projet est de contrôcontrôler la concentration d'une solution aqueuse àà partir de sa viscositéviscosité. Pour cela, nous utiliserons un agent visqueux afin de directement associer la viscositéviscosité du lange àà sa concentration en agent visqueux

MatéMatériel utiliséutilisés:

actifs :

  • Eau
  • GlycéGlycérine

Composants:

  • 1 carte Arduino (Carte Arduino UNO Rev 3)
  • 3 pompes (LEX-WATER-PUMP2 Pompe miniature àà eau 1,1 L/min)
  • 1 moteur agitateur pour langer (MotoréMotoréducteur 37025GM-12130)
  • 2 éélectrovannes (Electrovanne 12 V FDP360L)
  • 4 Relais (Module de relais 5 V SRD-05VDC-SL-C)
  • 1 capteur ultrason (Capteur de tection ultrasons HC-SR04)
  • 1 capteur de tempétempérature (Capteur de tempétempérature DS18B20 éétanche DFR0198) : TT (Temperature Transmitter)
  • 1 capteur de bit (Capteur de bit YFS401) : FT (Flow Transmitter)
  • 1 BreadBoard
  • 4 cipients

Avancement du projet:

16/10/2025: Lors de la semaine blanche, nous avons entaméentamé une premièpremière ance de brainstorming qui nous servait de base prépréliminaire pour choisir le sujet de notre projet. Nous nous sommes ainsi portéporté sur un sujet portant sur la gulation du procédéprocédé d'une éélaboration de biodiesel avec une analyse de sa puretépureté.

17/10/2025 : AprèAprès concertation avec notre tuteur de projet, M. JérôJérôme PULPYTEL, nous avons cider de modifier notre sujet, tout en gardant l'une des idéidée de base de l'ancien sujet qui est en rapport avec la viscositéviscosité. C'est pour cela que nous sommes donc partis sur l'automatisation de la gulation de la viscositéviscosité par une thode in-situ. 

17/10/2025 jusqu'au 28/10/2025 : alisation du schéschéma de notre projet et la prépréparation de la liste de matématériel cessaire àà notre projet.Cuve de mélange.pngCuve de mélange.png

Figure 1 : P&ID de part

17/11/2025 : Nous allons chercher les matématériaux de la liste pour pouvoir ainsi commencer le projet.

19/11/2025: Sciure pour crécréer les supports pour les deux servoir des actifs de part.

dc3f600f-7195-47d5-a06b-d23c394d57b1.jpeg

Figure 2 : Support en bois aprèaprès modification

24/11/2025 : Nous butons le montage. Pour cela, on perce des trous dans la plaque en bois pour permettre le maintien des ééquipements. De plus, nous perçperçons les cipients pour permettre l'insertion des tuyaux. Nous installons ensuite les premiers élééléments qui sont les cipients, une pompe, une éélectrovanne et un capteur.

IMG_6749.jpeg

Figure 3 : Assemblage des premiers élééléments du projet

IMG_6746.jpeg

IMG_6751.jpeg

Figure 4 : Placement des élééléments sous diffédifférents angles

26/11/2025 : 1er essai de modémodélisation du montage éélectrique sur TinkerCad. ModéModélisation 3D de l'lice et de la tige àà rattacher au moteur pour nous permettre de langer nos liquide. CréCréation d'un support pour le moteur.

Screenshot 2025-11-26 15.55.22.png

Figure 5 : 1er essai de modémodélisation sur TinkerCad

27/11/2025 : AprèAprès un premier envoi de notre essai de modémodélisation, notre tuteur nous explique qu'il manque des composants sur notre modèmodèle TinkerCad et le code est incomplet. Suite àà cela, nous nous cidons de modifier notre envoi de modémodélisation. En parallèparallèle àà cela, nous imprimons en 3D les pales de notre agitateur. Puis nous avons fait des trous dans nos planches pour pouvoir installer les derniers pièpièces manquantes sur le support.

IMG_6837.jpeg

Figure 6 : Pales impriméimprimées en 3D pour l'agitation

IMG_6838.jpeg

Figure 7 : Support comportant tout les emplacements finaux

28/11/2025 : Nous commençcommençons les branchement des modules relais àà l'Arduino. Tous les ééquipements ont d'abord étéété testétesté avec le code correspond afin de rifier leur bon fonctionnement. Ils ont ensuite étéété placéplacés sur le support avec les diffédifférents cipients et les branchements associéassociés.

projet 823 avant.jpeg

Figure 8a : Support comportant les ééquipements, cipients et branchements (face avant)

projet 823 arriere.jpeg

Figure 8b : Support comportant les ééquipements, cipients et branchements (face avant)

Du fait d'un bit de sortie de l'eau beaucoup trop faible àà cause de la vanne associéassociée, il a étéété décidédécidé de la remplacer par une pompe. Voici le nouveau P&ID du projet : 

Cuve de mélange (1).pngCuve de mélange (1).png

Figure 9 : Nouveau P&ID de l'installation

26/01/2025 : Il n'a pas étéété possible d'obtenir de la glycéglycérine pour le projet. Ainsi, la glycéglycérine est remplacéremplacée par un autre liquide visqueux, la grenadine, car disponible àà bas coûcoût et en grande quantitéquantité, la viscositéviscosité a étéété estiméestimé àà environ 1500 CP.

On obtient la courbe d'éétalonnage suivante, grâgrâce àà des diffédifférentes mesures d'eau pure, de grenadine pure, et de lange 50/50, :

 

Figure 10 : Graphique montrant l'éévolution du bit en fonction de la viscositéviscosité

Vidéo

de

fonctionnement

de

notre

machine:

 https://drive.google.com/file/d/1BzHH6KNIaNU-V8PfrfB-I7nHwKs--mJp/view?usp=sharing

Nous avons également fait leLe code Arduino a été fait en s'aidant de l'IA claude.ai :

// MACHINE DE REGULATION DE VISCOSITE 
#include "Ultrasonic.h" // BibliothèBibliothèque pour le capteur de niveau

// Valeur de viscositéviscosité cible en centipoise
const float VISCOSITE_CIBLE = 500.0;  // Entre 1 et 1500 cP

// pin occupéoccupés
const int pumpWaterPin = 2;      // Pompe eau
const int pumpGrenadinePin = 3;  // Pompe grenadine
const int pumpCircuitPin = 4;    // Pompe circuit de mesure
const int transferPumpPin = 5;   // Pompe de transfert
const int transferValvePin = 6;  // Vanne de transfert
const int flowSensorPin = 7;     // Capteur de bit
const int ultrasonicPin = 8;     // Capteur niveau ultrason

// ParamèParamètres
const float TOLERANCE_DEBIT = 0.10;    // 10% de tolétolérance sur le bit
const unsigned long minPulseInterval = 50; // Filtre anti-bruit
const int NIVEAU_MIN = 6;  // Niveau minimum en cm (bordement si < 6cm)

// Variable mesurémesurées
volatile int pulseCount = 0;
int lastState = HIGH;
unsigned long lastPulseTime = 0;
float flowReadings[10];
Ultrasonic ultrasonic(ultrasonicPin);
unsigned long lastLevelCheck = 0;

void setup() {
  Serial.begin(115200);
  
  // Configuration des pins
  pinMode(pumpWaterPin, OUTPUT);
  pinMode(pumpGrenadinePin, OUTPUT);
  pinMode(pumpCircuitPin, OUTPUT);
  pinMode(transferPumpPin, OUTPUT);
  pinMode(transferValvePin, OUTPUT);
  pinMode(flowSensorPin, INPUT_PULLUP);
  
  // Tout ééteint au part
  digitalWrite(pumpWaterPin, LOW);
  digitalWrite(pumpGrenadinePin, LOW);
  digitalWrite(pumpCircuitPin, LOW);
  digitalWrite(transferPumpPin, LOW);
  digitalWrite(transferValvePin, LOW);
  
  
  // Attente de 3 secondes avant de marrer
  Serial.println("marrage dans 3 secondes...");
  delay(3000);
  
  // ETAPE 1: Injection initiale d'eau
  Serial.println("INJECTION INITIALE D'EAU");
  digitalWrite(pumpWaterPin, HIGH);
  delay(5000);
  digitalWrite(pumpWaterPin, LOW);
  
  delay(2000); // Pause pour stabilisation
  
  // Boucle de gulation
  regulateViscosity();
}

void loop() {
  // Programme terminéterminé, ne fait rien
}

void regulateViscosity() {
  int iteration = 1;
  
  while (true) {
    // rification du niveau toutes les 5 secondes
    if (millis() - lastLevelCheck >= 5000) {
      checkLevel();
      lastLevelCheck = millis();
    }
    
    // Mesure du bit
    float avgFlow = measureFlow();
    
    // Calcul de la viscositéviscosité mesurémesurée par interpolation
    // Points d'éétalonnage : (1, 0.815), (750, 0.772), (1500, 0.688)
    float viscositeMesuree;
    
    if (avgFlow >= 0.772) {
      // Entre eau et lange : interpolation linélinéaire
      // De 0.815 L/min (1 cP) àà 0.772 L/min (750 cP)
      viscositeMesuree = 1 + (0.815 - avgFlow) / (0.815 - 0.772) * (750 - 1);
    } else {
      // Entre lange et grenadine : interpolation linélinéaire
      // De 0.772 L/min (750 cP) àà 0.688 L/min (1500 cP)
      viscositeMesuree = 750 + (0.772 - avgFlow) / (0.772 - 0.688) * (1500 - 750);
    }
    
    // Calcul du bit cible par interpolation inverse
    float debitCible;
    
    if (VISCOSITE_CIBLE <= 750) {
      // Entre eau et lange
      debitCible = 0.815 - (VISCOSITE_CIBLE - 1) / (750 - 1) * (0.815 - 0.772);
    } else {
      // Entre lange et grenadine
      debitCible = 0.772 - (VISCOSITE_CIBLE - 750) / (1500 - 750) * (0.772 - 0.688);
    }
    
    Serial.print(">>> bit cible: ");
    Serial.print(debitCible, 2);
    Serial.print(" L/min  |  bit mesurémesuré: ");
    Serial.print(avgFlow, 2);
    Serial.println(" L/min");
    
    // Calcul de l'éécart sur le bit
    float ecartDebit = abs(avgFlow - debitCible) / debitCible;
    Serial.print(">>> ÉÉcart bit: ");
    Serial.print(ecartDebit * 100, 1);
    Serial.println("%");
    
    // PREMIERE ITERATION : on ignore et on passe àà la suivante puisque l'on a remarquéremarqué que l'on a souvent des valeurs incohéincohérentes lors de la premièpremière itéitération
    if (iteration == 1) {
      Serial.println("\n--> PremièPremière itéitération: aucun ajustement");
      Serial.println("Pause de stabilisation (2 sec)...\n");
      delay(2000);
      iteration++;
      continue;
    }
    
    // rification si dans la tolétolérance (àà partir de l'itéitération 2)
    if (ecartDebit <= TOLERANCE_DEBIT) {
      Serial.println("\n*** DEBIT CIBLE ATTEINT! ***\n");
      transferMixture();
      Serial.println("\n========================================");
      Serial.println("  PROCESSUS TERMINE AVEC SUCCES");
      Serial.println("========================================\n");
      break;
    }
    
    // Ajustement cessaire
    if (avgFlow > debitCible) {
      // bit trop élevéélevé (trop fluide) => Ajouter grenadine
      Serial.println("\n--> bit trop élevéélevé: Ajout de GRENADINE (3 sec)");
      digitalWrite(pumpGrenadinePin, HIGH);
      delay(3000);
      digitalWrite(pumpGrenadinePin, LOW);
    } else {
      // bit trop faible (trop visqueux) => Ajouter eau
      Serial.println("\n--> bit trop faible: Ajout d'EAU (3 sec)");
      digitalWrite(pumpWaterPin, HIGH);
      delay(3000);
      digitalWrite(pumpWaterPin, LOW);
    }
    
    Serial.println("Pause de stabilisation (2 sec)...\n");
    delay(2000);
    
    iteration++;
  }
}

float measureFlow() {
  Serial.println("=== MESURE DU DEBIT ===");
  Serial.println("Pompe circuit: ON");
  digitalWrite(pumpCircuitPin, HIGH);
  
  // 10 mesures de 1 seconde chacune
  for (int i = 0; i < 10; i++) {
    pulseCount = 0;
    unsigned long startTime = millis();
    
    // Mesure pendant 1 seconde
    while (millis() - startTime < 1000) {
      int currentState = digitalRead(flowSensorPin);
      
      if (lastState == HIGH && currentState == LOW) {
        unsigned long currentTime = millis();
        if (currentTime - lastPulseTime > minPulseInterval) {
          pulseCount++;
          lastPulseTime = currentTime;
        }
      }
      lastState = currentState;
    }
    
    // Calcul du bit
    float flowRate = (pulseCount / 450.0) * 60.0;
    flowReadings[i] = flowRate;
    
    Serial.print("Mesure ");
    Serial.print(i + 1);
    Serial.print("/10: ");
    Serial.print(flowRate, 2);
    Serial.println(" L/min");
  }
  
  // ArrêArrêt de la pompe
  digitalWrite(pumpCircuitPin, LOW);
  Serial.println("Pompe circuit: OFF");
  
  // Calcul de la moyenne
  float sum = 0;
  for (int i = 0; i < 10; i++) {
    sum += flowReadings[i];
  }
  float avgFlow = sum / 10.0;
  
  Serial.print("\nDénDébit moyen: ");
  Serial.print(avgFlow, 2);
  Serial.println(" L/min");
  
  return avgFlow;
}

void transferMixture() {
  Serial.println("\n=== TRANSFERT DU MELANGE ===");
  Serial.println("Pompe transfert + Vanne: ON (30 sec)");
  
  digitalWrite(transferPumpPin, HIGH);
  digitalWrite(transferValvePin, HIGH);
  
  delay(30000);
  
  digitalWrite(transferPumpPin, LOW);
  digitalWrite(transferValvePin, LOW);
  
  Serial.println("Pompe transfert + Vanne: OFF");
  Serial.println("Transfert terminéterminé!");
}

// Mesure de la hauteur du lange, arrêarrêt si < 6 cm

void checkLevel() {
  long distance = ultrasonic.MeasureInCentimeters();
  
  Serial.print("[NIVEAU] Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  if (distance < NIVEAU_MIN) {
    Serial.println("\n!!! ALERTE: RISQUE DE DEBORDEMENT !!!");
    Serial.print("Distance mesurémesurée: ");
    Serial.print(distance);
    Serial.print(" cm < ");
    Serial.print(NIVEAU_MIN);
    Serial.println(" cm");
    
    // ArrêArrêt de toutes les pompes
    digitalWrite(pumpWaterPin, LOW);
    digitalWrite(pumpGrenadinePin, LOW);
    digitalWrite(pumpCircuitPin, LOW);
    
    Serial.println("\n=== VIDANGE D'URGENCE ===");
    
    // Vidange
    digitalWrite(transferPumpPin, HIGH);
    digitalWrite(transferValvePin, HIGH);
    
    delay(30000);
    
    digitalWrite(transferPumpPin, LOW);
    digitalWrite(transferValvePin, LOW);
    
    Serial.println("\n========================================");
    Serial.println("  ERREUR: NIVEAU CRITIQUE ATTEINT");
    Serial.println("  Vidange effectuéeffectuée - Programme arrêtéarrêté");
    Serial.println("========================================\n");
    
    // ArrêArrêt du programme
    while(1) {
      delay(1000);
    }
  }
}

 

 

Ce programme Arduino contrôcontrôle une machine automatique capable de guler la viscositéviscosité d'un lange liquide entre 1 et 1500 centipoise (cP). Le systèsystème lange de l'eau et de la grenadine pour atteindre une viscositéviscosité cible finie par l'utilisateur.

Fonctionnement du code

1. ÉÉtalonnage

Le systèsystème s'appuie sur un éétalonnage réaliséréalisé avec trois points de mesure :

  • Eau pure : 1 cP bit de 0.815 L/min

  • lange 50/50 : 750 cP bit de 0.772 L/min

  • Grenadine pure : 1500 cP bit de 0.688 L/min

Ces mesures éétablissent une relation entre le bit mesurémesuré et la viscositéviscosité du liquide : plus le liquide est visqueux, plus le bit est faible.

2. Processus de gulation

ÉÉtape 1: Initialisation

  • Injection initiale de 5 secondes d'eau pour crécréer une base de travail

  • Pause de 2 secondes pour stabilisation

ÉÉtape 2: Cycle de mesure et ajustement

  1. Mesure du bit : La pompe de circuit (pin 4) fait circuler le liquide pendant 10 secondes àà travers le débitmèdébitmètre (pin 7). Le systèsystème prend 10 mesures d'une seconde chacune et calcule la moyenne.

  2. Calcul de la viscositéviscosité : En utilisant l'interpolation linélinéaire sur les points d'éétalonnage, le programme convertit le bit mesurémesuré en valeur de viscositéviscosité.

  3. Comparaison avec la cible : Le systèsystème calcule l'éécart entre le bit mesurémesuré et le bit cible (correspondant àà la viscositéviscosité désirédésirée).

  4. Ajustement :

    • Si le bit est trop élevéélevé (liquide trop fluide) ajout de grenadine pendant 3 secondes (pin 3)

    • Si le bit est trop faible (liquide trop visqueux) ajout d'eau pendant 3 secondes (pin 2)

  5. RépéRépétition : Le cycle se répèrépète jusqu'àà ce que l'éécart soit inféinférieur àà 10% du bit cible.

  6. La premièpremière itéitération sert uniquement àà mesurer l'éétat initial, aucun ajustement n'est effectuéeffectué.

ÉÉtape 3: Transfert Une fois la viscositéviscosité cible atteinte, le lange est transférétransféré en activant simultanésimultanément la pompe de transfert (pin 5) et la vanne (pin 6) pendant 30 secondes.

SécuritéSécurité: tection de bordement

Un capteur ultrason (pin 8) surveille le niveau du liquide toutes les 5 secondes. Si la distance mesurémesurée est inféinférieure àà 6 cm (risque de bordement), le systèsystème :

  1. ArrêArrête imméimmédiatement toutes les pompes

  2. Effectue une vidange d'urgence (30 secondes)

  3. Affiche un message d'erreur

  4. Stoppe finitivement le programme

Configuration matématérielle

Pins utiliséutilisées

  • Pin 2 : Pompe d'injection d'eau

  • Pin 3 : Pompe d'injection de grenadine

  • Pin 4 : Pompe du boucle de mesure

  • Pin 5 : Pompe de vidange

  • Pin 6 : Vanne de vidange

  • Pin 7 : Capteur de bit (débitmèdébitmètre SEN0217)

  • Pin 8 : Capteur de niveau ultrason

Limites et recommandations

Zone de préprécision duite (> 750 cP) Au-delàdelà de 750 cP, la variation de bit devient trètrès faible (seulement 0.084 L/min entre 750 et 1500 cP). Le systèsystème devient donc plus sensible aux fluctuations et moins préprécis. Pour ces viscositéviscosités élevéélevées, il est recommandérecommandé d'augmenter la tolétolérance àà 15-20%.

BibliothèBibliothèque requise: Le programme cessite la bibliothèbibliothèque Ultrasonic.h pour le capteur de niveau.

Conclusion : 

Ce projet portant sur la conception et la mise en place d’d’un systèsystème d''automatisation et de gulation de la viscositéviscosité. Le projet nous a permis de mettre en pratique la théthéorie acquise acadéacadémiquement àà une alisation concrèconcrète, en intéintégrant des élééléments caniques, hydrauliques et éélectroniques contrôlécontrôlées par Arduino.

Avec plus de temps, nous aurions pu améaméliorer la robustesse du montage, de meilleurs attaches, aliser un ble management  ainsi que l’l’optimisation du code pour rendre l'automatisation plus stable et plus préprécise surtout àà haute viscositéviscosité. Une meilleure droite d'éétalonnage et un meilleur débitmèdébitmètre aurait éégalement permis d’d’augmenter la fiabilitéfiabilité des mesures.
 
Ce projet nous a surtout appris àà travailler en ééquipe, àà soudre des problèproblèmes techniques impréimprévus (fuites, erreurs de blage, difficultédifficultés de programmation) et àà adapter notre conception en cours de route. Nous avons retenu l’l’importance des tests progressifs, de la communication entre les membres du groupe et du lien entre théthéorie et pratique dans la alisation d’d’un procédéprocédé expéexpérimental.

Cela nous a permis de velopper des compécompétences cléclés, comme le travail d’éd’équipe, la solution de problèproblèmes techniques (fuites, blage, programmation) et l’adaptabilitél’adaptabilité face aux impréimprévus. Il a aussi soulignésouligné l’l’importance des tests guliers, d’d’une communication efficace et de l’él’équilibre entre théthéorie et pratique pour mener àà bien une expéexpérience.