Aller au contenu

GO Print

DiscoEasy200 Detecteur fin de filament


Messages recommandés

Bonjour,

Petite amélioration pour pouvoir installer un détecteur de fin de filament.

La fonction étant déjà implémentée dans le firmware je pensais que ce ne serait qu’une simple formalité ... mais loin de là la fonction M600 modifiée par Dagoma ne fonctionnant pas franchement.

Après quelques déboire et quelques recherche sur le net cela fonctionne à peu près, je dis à peu près car cela est certainement améliorable mais n’étant pas un as du développement je n’ai pas pu aller plus loin.

Donc passons au vif du sujet les modifs ...

D’abord j’ai modifié le pin.h pour pouvoir utiliser le EndStop –Z pour y connecter le détecteur de fin de filament.

Fichier pin.h

Ajout à la fin

#undef FILRUNOUT_PIN

#define FILRUNOUT_PIN 18

Dans Configuratiuon.h

Vers ligne 512

Decommenter la ligne #define FILAMENT_RUNOUT_SENSOR pour activer la fonction FilamentRunOutSensor

Puis application de valeurs fixe pour fonction M600

#define FILAMENT_RUNOUT_SCRIPT "M600 X10 Y10 Z30 E-4 L0"

 

Enfin le plus gros morceau :

Le fichier Marlin_main.cpp

L’ajout de code par Dagoma ne fonctionnant pas j’ai repris la partie du code

Original de la RC6 et l’ai légèrement modifié.

Ci-dessous le code complet à mettre à la place du code existant vers la ligne 6280

#if ENABLED(FILAMENTCHANGEENABLE)

  /**

   * M600: Pause for filament change

   *

   *  E[distance] - Retract the filament this far (negative value)

   *  Z[distance] - Move the Z axis by this distance

   *  X[position] - Move to this X position, with Y

   *  Y[position] - Move to this Y position, with X

   *  L[distance] - Retract distance for removal (manual reload)

   *

   *  Default values are used for omitted arguments.

     *

   */

  inline void gcode_M600() {

    if (degHotend(active_extruder) < extrude_min_temp) {

      SERIAL_ERROR_START;

      SERIAL_ERRORLNPGM(MSG_TOO_COLD_FOR_M600);

      return;

    }

    float lastpos[NUM_AXIS], fr60 = feedrate / 60;

    for (int i = 0; i < NUM_AXIS; i++)

      lastpos = destination = current_position;

    #if ENABLED(DELTA)

      #define RUNPLAN calculate_delta(destination); \

      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], fr60, active_extruder);

    #else

      #define RUNPLAN line_to_destination();

    #endif

    //retract by E

    if (code_seen('E')) destination[E_AXIS] += code_value();

    #ifdef FILAMENTCHANGE_FIRSTRETRACT

    else destination[E_AXIS] += FILAMENTCHANGE_FIRSTRETRACT;

    #endif

    RUNPLAN;

    //lift Z

   if (code_seen('Z')) destination[Z_AXIS] += code_value();

   #ifdef FILAMENTCHANGE_ZADD

    else destination[Z_AXIS] += FILAMENTCHANGE_ZADD;

    #endif

    RUNPLAN;
    //move xy

   if (code_seen('X')) destination[X_AXIS] = code_value();

    #ifdef FILAMENTCHANGE_XPOS

      else destination[X_AXIS] = FILAMENTCHANGE_XPOS;

    #endif

    if (code_seen('Y')) destination[Y_AXIS] = code_value();

    #ifdef FILAMENTCHANGE_YPOS

     else destination[Y_AXIS] = FILAMENTCHANGE_YPOS;

    #endif

     RUNPLAN;

    if (code_seen('L')) destination[E_AXIS] += code_value();

    #ifdef FILAMENTCHANGE_FINALRETRACT

      else destination[E_AXIS] += FILAMENTCHANGE_FINALRETRACT;

    #endif

    RUNPLAN;

    //finish moves

    st_synchronize();

// suppression de la désactivation des moteurs extrudeur

    //disable extruder steppers so filament can be removed

    //disable_e0();

    //disable_e1();

    //disable_e2();

    //disable_e3();

    delay(100);

      LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE);

    millis_t next_tick = 0;

    KEEPALIVE_STATE(PAUSED_FOR_USER);

    while (!lcd_clicked()) {

      #if DISABLED(AUTO_FILAMENT_CHANGE)

        millis_t ms = millis();

        if (ms >= next_tick) {

          //lcd_quick_feedback();

          next_tick = ms + 2500; // feedback every 2.5s while waiting

          // ajout buzzer

          buzz(1000,500);

          buzz(600,300);

          //fin ajout buzzer

        }

        idle(true);

      #else

   current_position[E_AXIS] += AUTO_FILAMENT_CHANGE_LENGTH;    

        destination[E_AXIS] = current_position[E_AXIS];

        line_to_destination(AUTO_FILAMENT_CHANGE_FEEDRATE);

        st_synchronize();

      #endif

    } // while(!lcd_clicked)

       KEEPALIVE_STATE(IN_HANDLER);

    //lcd_quick_feedback(); // click sound feedback

    #if ENABLED(AUTO_FILAMENT_CHANGE)

      current_position[E_AXIS] = 0;

      st_synchronize();

    #endif

      //return to normal

    if (code_seen('L')) destination[E_AXIS] -= code_value();

    #ifdef FILAMENTCHANGE_FINALRETRACT

      else destination[E_AXIS] -= FILAMENTCHANGE_FINALRETRACT;

    #endif

    current_position[E_AXIS] = destination[E_AXIS]; //the long retract of L is compensated by manual filament feeding

   plan_set_e_position(current_position[E_AXIS]);

    RUNPLAN; //should do nothing

    lcd_reset_alert_level();

    #if ENABLED(DELTA)

      // Move XYZ to starting position, then E

      calculate_delta(lastpos);

      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], fr60, active_extruder);

      plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], lastpos[E_AXIS], fr60, active_extruder);

    #else

      // Move XY to starting position, then Z, then E

      destination[X_AXIS] = lastpos[X_AXIS];

      destination[Y_AXIS] = lastpos[Y_AXIS];

      line_to_destination();

      destination[Z_AXIS] = lastpos[Z_AXIS];

      line_to_destination();

      destination[E_AXIS] = lastpos[E_AXIS];

      line_to_destination();

    #endif

    #if ENABLED(FILAMENT_RUNOUT_SENSOR)

      //filrunoutEnqueued = false;

      filament_ran_out = false;

      LCD_ALERTMESSAGEPGM(MSG_LCD_OK);

    #endif

  }

#endif // FILAMENTCHANGEENABLE

 

Sauvegarder puis flasher la MKS

Lorsque le détecteur s’ouvre en l’absence de filament la tête remonte et viens se placer en X10,Y10 un signal sonore retenti et attend le changement de filament lorsque que cela est effectué un appuie sur le bouton de l’écran permet le reprendre l’impression.

 

Effet secondaire de ces modifications l’option changement de filament de l’écran

de la Dogoma fonctionne à peu près correctement.

 Voila ... si vous avez des idées de modification n’hésitez pas.

 

Bon Weekend

 

 

Modifié (le) par Zarrt
  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

A priori (je n'ai pas le code sous les yeux) mais lors d'une impression par USB, il y aurai une modification à faire dans configuration.h pour le code fonctionne : 

Remplacer :
  #if HAS_FILRUNOUT
    if (IS_SD_PRINTING && !(READ(FILRUNOUT_PIN) ^ FIL_RUNOUT_INVERTING))
      filrunout();
  #endif

Par : 
  #if HAS_FILRUNOUT
//    if (IS_SD_PRINTING && !(READ(FILRUNOUT_PIN) ^ FIL_RUNOUT_INVERTING))
    if (!(READ(FILRUNOUT_PIN) ^ FIL_RUNOUT_INVERTING))
      filrunout();
  #endif

  • J'aime 1
Lien vers le commentaire
Partager sur d’autres sites

Bien cool ta mod et ton idée ! J'avais vu certain laisse passer le câble au travers d'un capteur capteur fin de course optique, vu ici >>>

capteur-optique.jpg

Et donc aucun frottement sur le filament (bien qu'il n'y en ai quasi pas avec un petit switch :) ) et que ça ne le gène en rien après l'extrudeur.

Modifié (le) par Riako
Lien vers le commentaire
Partager sur d’autres sites

  • 4 months later...

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...