Automatisation d'une machine de dressage et de façonnage de fil métallique

fj-theknight

عضو مميز
إنضم
21 أكتوبر 2009
المشاركات
654
مستوى التفاعل
921
Salèm.

Dans le cadre du PFE de mon cousin, nous avons réalisé un automate (partie du PFE) pour une machine de dressage et de façonnage de fil métallique (corps du PFE).

La machine comprends essentiellement un moteur qui tirera le fil de la bobine, un vérin portant le poinçon qui donnera sa forme au fil, et des capteurs de fins de course qui indiqueront la fin de chaque étape du cycle de la machine qui sont au nombre de 3:
  • Alimentation en fil métallique
  • Descente du vérin
  • Monté du vérin

Un lame cisaille coupera le fil lorsque le vérin descend pour former le fil.
8SozQ6R.jpg

Pour automatiser le travail de la machine nous avons pensé à utiliser le concept d'une machine à états finis avec une carte arduino.
Le programme aura donc 4 états:
  • Attente: état de repos de la machine (état de base). Etat 0
  • Alimentation en fil métalique: Première étape après l'état de repos. Etat 1
  • Descente vérin: Etat 2
  • Monté vérin: Etat 3

La transition entre les différentes étapes se fait suite à l'activation des capteurs de fin de course liés à chaque étape (donc état 1 -> état 2 -> état 3 -> état 1 ->...), ou par le bouton marche/arrêt responsable de mettre la machine en état d'attente en cas d'urgence ou de la rendre à sa dernière étape avant sa mise en état d'attente.

Pour cela, nous avons simulé ce système avec des boutons poussoirs remplaçants les capteurs de fin de course, et nous avons ajouté:
  • un codeur rotatif pour que l'utilisateur puisse déterminer le nombre de cycles de travail maximum voulu
  • un écran lcd 16*2 pour afficher le temps écoulé, l'étape à laquelle se trouve la machine, le nombre de cycles voulus et le nombre de cycles effectués
  • des LED indicateurs de l'étape du cycle
tC8Ue1p.jpg


eZ05gBY.png

Enfin voici une vidéo du système en marche:
 
التعديل الأخير:
Pour effectuer la transition entre les différentes étapes du cycle, nous avons conçu une fonction basée sur l'instruction Switch () ... case : ...
Cette instruction permet d'effectuer d'autres instructions selon la valeur que prend une variable bien déterminée.

Donc pour notre application, et selon la valeur de la variable "etat", si par exemple cette variable prend la valeur "descente_verin", l'automate va mettre à l'état bas les éléments responsables de la monté du vérin et de l'avancée du fil métallique (moteur) et mettre à l'état haut l'élément responsable de la descente du vérin. Il va aussi vérifier à chaque cycle si le capteur de fin de course de la lame cisaille est activé: dans ce cas, il changera la valeur de la variable "etat" en "monte_verin" et donc de nouvelles conditions s'appliqueront au nouvel état de la machine.​

كود:
void machine_a_etats_finis() {// fonction de détermination d'état de la machine

  // en foction de la valeur de la variable état, les actions à effectuer par la machine vont différer:
  switch (etat) {
    case attente :// en cas d' "attente"
      digitalWrite(moteur, LOW); //désactivation du moteur d'alimentation en fil métallique
      digitalWrite(verinHaut, LOW);//désactivation de la monté du vérin
      digitalWrite(verinBas, LOW);//désactivation de la déscente du vérin
      etape = "Attente";//changement de la valeur de la variable d'affichage
      affichage_MAJ( 0, 1, etape);
      nombre_d_unite();
      break;

    // ceci se répète pour les différents états de la machine

    case alimentation_en_fil :
      digitalWrite(moteur, HIGH);
      digitalWrite(verinHaut, LOW);
      digitalWrite(verinBas, LOW);
      affichage_MAJ( 0, 1, etape);
      etape = "Alm.FIL";
      if (etatCapteurFil == HIGH) {
        dernier_etat = etat;
        etat = descente_verin;
      }
      break;

    case descente_verin :
      digitalWrite(moteur, LOW);
      digitalWrite(verinHaut, LOW);
      digitalWrite(verinBas, HIGH);
      affichage_MAJ( 0, 1, etape);
      etape = "Dsc.VER";
      if (etatCapteurLame == HIGH) {
        compteur += 1;//incrémentation du compteur d'unités produites
        affichage_MAJ(12, 0, String(compteur));
        dernier_etat = etat;
        etat = monte_verin;
      }
      break;

    case monte_verin :
      digitalWrite(moteur, LOW);
      digitalWrite(verinHaut, HIGH);
      digitalWrite(verinBas, LOW);
      etape = "Mnt.VER";
      affichage_MAJ( 0, 1, etape);
      if (etatCapteurVerin == HIGH) {
        dernier_etat = etat;
        if (compteur < compteurVoulu) {
          etat = alimentation_en_fil;
        } else {
          compteurVoulu = 0;
          compteur = 0;
          affichage_MAJ(12, 0, String(compteur));
          affichage_MAJ(12, 1, String(compteurVoulu));
          etat = attente;
        }
      }
      break;
  }
}
 
أعلى