Welcome! Log In Create A New Profile

Advanced

Modifica MK Z_QUAD_STEPPER

Posted by Oiram 
Modifica MK Z_QUAD_STEPPER
July 12, 2016 07:17AM
Salve, ho una corexy custom con piano di stampa (circa) 60x50cm fissato ai lati da 4 barre trapezoidali (e due barre liscie per lato con relativi cuscinetti). Ogni barra trapezia è collegata ad un nema17. Ho appena acquistato una ultratronics pro (è ancora in viaggio) proprio per il motivo che (potendo utilizzare 7 drv8825) vorrei controllare i motori dell'asse z in modo indipendente sia per il fatto che il collegamento in serie o parallelo dei motori su un unico driver non mi piace per niente sia perchè vorrei sfruttare questa configurazione per autolivellare il piatto andando a mettere 4 endstop (uno vicino ad ogni barra).

Su MK c'è già di default la possibilità di utilizzare per l'asse z due stepper e due endstop indipendenti, vorrei espandere questa feature a 4 motori e 4 endstop. Cosa dovrei andare a modificare?

Da una prima analisi del source intuisco che alcune modifiche dovrebbero essere :

In Configuration_Feature.h aggiungere:
#define Z_QUAD_STEPPER_DRIVERS
#define Z_QUAD_ENDSTOPS

In Configuration_Pins.h aggiungere:
#if ENABLED(Z_QUAD_STEPPER_DRIVERS)
  #define Z2_STEP_PIN     ORIG_E1_STEP_PIN
  #define Z2_DIR_PIN      ORIG_E1_DIR_PIN
  #define Z2_ENABLE_PIN   ORIG_E1_ENABLE_PIN
  #define Z3_STEP_PIN     ORIG_E2_STEP_PIN
  #define Z3_DIR_PIN      ORIG_E2_DIR_PIN
  #define Z3_ENABLE_PIN   ORIG_E2_ENABLE_PIN
  #define Z4_STEP_PIN     ORIG_E3_STEP_PIN
  #define Z4_DIR_PIN      ORIG_E3_DIR_PIN
  #define Z4_ENABLE_PIN   ORIG_E3_ENABLE_PIN
#endif

#if ENABLED(Z_QUAD_ENDSTOPS)
  #define Z2_MIN_PIN        ORIG_X_MAX_PIN
  #define Z3_MIN_PIN        ORIG_Y_MAX_PIN
  #define Z4_MIN_PIN        ORIG_Z_MAX_PIN
#endif

Andare a modificare alcune parti di stepper.cpp e stepper.h per integrare la logica "QUAD" (praticamente identica a quella "DUAL").

Nota il problema è che se nel fw base vado a decommentare le define per Z_DUAL_STEPPER e Z_DUAL_ENDSTOPS (senza modificare altro) il codice non compila e mi restituisce :

[EDIT] Risolto quel problema! La soluzione era nel commento della sezione relativa alla define, in pratica non erano dichiarate le variabili step,dir,enable per la ultratronics. Dichiarazioni aggiunte e adesso compila. Non resta altro da fare che integrare il QUAD_STEPPER e il QUAD_ENDSTOPS. A parte le modifiche suddette che altro c'è da fare?

Edited 1 time(s). Last edit at 07/12/2016 07:45AM by Oiram.
Re: Modifica MK Z_QUAD_STEPPER
July 12, 2016 10:00AM
Aggiornamento:

Ho scaricato MK da reprapworld dalla pagina di vendita della board ultratronics pro ed ho iniziato a modificarlo :

* Aggiunta le definizioni Z_QUAD_STEPPER_DRIVERS e Z_QUAD_ENDSTOPS in modo da essere indipendenti dal resto del codice
* Modificate le definizioni dei pin per l'ultratronics (board 705) con un #if ENABLED(Z_QUAD..) in modo da non cambiare nulla se le precedenti sono commentate
* Modificati stepper.cpp e stepper.h in modo da poter controllare 4 motori per l'asse z

Resta da modificare solo la parte relativa agli endstop in modo tale che finchè Z2_MIN,Z3_MIN,Z4_MIN non sono triggered i relativi stepper Z2,Z3,Z4 continuano a girare. Purtroppo al momento non riesco a venirne a capo e chiedo il vostro aiuto.

Le modifiche da fare dovrebbero essere:

1) modificare la funzione update_endstops() in stepper.cpp in modo da supportare Z_QUAD_ENDSTOPS

inline void update_endstops() {

  ...

  #if HAS(Z_MIN)
    #if ENABLED(Z_DUAL_ENDSTOPS)
      SET_ENDSTOP_BIT(Z, MIN);
      #if HAS(Z2_MIN)
        SET_ENDSTOP_BIT(Z2, MIN);
      #else
        COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN);
      #endif

      byte z_test = TEST_ENDSTOP(Z_MIN) | (TEST_ENDSTOP(Z2_MIN) << 1); // bit 0 for Z, bit 1 for Z2

      if (z_test && current_block->steps[Z_AXIS] > 0) { // z_test = Z_MIN || Z2_MIN
        endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS];
        SBI(endstop_hit_bits, Z_MIN);
        if (!performing_homing || (z_test == 0x3))  //if not performing home or if both endstops were trigged during homing...
          step_events_completed = current_block->step_event_count;
      }
    #else // !Z_DUAL_ENDSTOPS
    
      UPDATE_ENDSTOP(Z, MIN);

    #endif // !Z_DUAL_ENDSTOPS
  #endif // Z_MIN_PIN

  ...

}

2) Associare gli endstop per z in questo modo :

Z2_MIN -> X_MAX
Z3_MIN -> Y_MAX
Z4_MIN -> Z_MAX

tuttavia non trovo la porzione di codice in cui devo agire
Re: Modifica MK Z_QUAD_STEPPER
July 12, 2016 01:19PM
Aggiornamento:

Dopo diverse ore a guardare e riguardare il codice credo di essere giunto ad una soluzione (che è sicuramente da migliorare). I 4 endstops posti sull'asse z servono ad allineare il piatto durante la fase di homing quindi l'ultima modifica da effettuare riguarda la funzione homeaxis in MK_Main.cpp

Dato che non sono riuscito a trovare una funzione che mi restituisce lo stato attuale di un certo endstop (triggered o open) ho scritto questa semplice funzione :

 void get_z_quad_endstops_status(bool *buf) {
	  buf[0] = ((READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING)?true:false);
	  buf[1] = ((READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING)?true:false);
	  buf[2] = ((READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING)?true:false);
	  buf[3] = ((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?true:false);
  }

Inoltre ho modificato la homeaxis così:

static void homeaxis(AxisEnum axis) {
     
        ...

      // Set a flag for Z motor locking
      #if ENABLED(Z_DUAL_ENDSTOPS) || ENABLED(Z_QUAD_ENDSTOPS)
        if (axis == Z_AXIS) In_Homing_Process(true);
      #endif

      #if ENABLED(Z_QUAD_STEPPER_DRIVERS) && ENABLED(Z_QUAD_ENDSTOPS)
	    if (axis == Z_AXIS) {
			
			bool lockZ_MOTOR[3] = {0};
			
			do {
				
				destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
				feedrate = homing_feedrate[axis];
				line_to_destination();
				st_synchronize();
				
				get_z_quad_endstops_status(lockZ_MOTOR);
				
				if (lockZ_MOTOR[0]) Lock_z_motor(true);
				if (lockZ_MOTOR[1]) Lock_z2_motor(true);
				if (lockZ_MOTOR[2]) Lock_z3_motor(true);
				if (lockZ_MOTOR[3]) Lock_z4_motor(true);
				sync_plan_position();
			
			} while (lockZ_MOTOR[0]==false || lockZ_MOTOR[1]==false || lockZ_MOTOR[2]==false || lockZ_MOTOR[3]==false);
	  }
	  #else
	  
		// Move towards the endstop until an endstop is triggered
                destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
                feedrate = homing_feedrate[axis];
                line_to_destination();
                st_synchronize();
		
	  #endif
	  
      // Set the axis position as setup for the move
      current_position[axis] = 0;
      sync_plan_position();

      ...

      #if ENABLED(Z_DUAL_ENDSTOPS)
        if (axis == Z_AXIS) {
          float adj = fabs(z_endstop_adj);
          bool lockZ1;
          if (axis_home_dir > 0) {
            adj = -adj;
            lockZ1 = (z_endstop_adj > 0);
          }
          else
            lockZ1 = (z_endstop_adj < 0);

          if (lockZ1) Lock_z_motor(true); else Lock_z2_motor(true);
          sync_plan_position();

          // Move to the adjusted endstop height
          feedrate = homing_feedrate[axis];
          destination[Z_AXIS] = adj;
          line_to_destination();
          st_synchronize();

          if (lockZ1) Lock_z_motor(false); else Lock_z2_motor(false);
          In_Homing_Process(false);
        } // Z_AXIS
      #endif
	  
	  #if ENABLED(Z_QUAD_STEPPER_DRIVERS) && ENABLED(Z_QUAD_ENDSTOPS)
	    if (axis == Z_AXIS) {
			Lock_z_motor(false);
			Lock_z2_motor(false);
			Lock_z3_motor(false);
			Lock_z4_motor(false);
			In_Homing_Process(false);
		}
	  #endif
	  
      // Set the axis position to its home position (plus home offsets)
      set_axis_is_at_home(axis);
      sync_plan_position();

     ...

Però non mi convince molto il fatto di usare il do { } while() anche perchè nel codice del mago non sono presenti cose del genere..avete qualche consiglio a riguardo? Mi piacerebbe sentire anche qualcosa da @MagoKimbra

Edited 1 time(s). Last edit at 07/12/2016 01:23PM by Oiram.
Re: Modifica MK Z_QUAD_STEPPER
July 12, 2016 04:23PM
Eccomi quì....
é un bel casino quello che vuoi fare, è la soluzione da te trovata non è per niente valida, ma non per il ciclo do while, ma per il fatto che gli endstop li devi leggere a ogni step altrimenti rompi tutto...
Ti spiego, il sistema funziona cosi in homeaxis manda in home l'asse, ma il controllo viene fatto in stepper a ogni step che manda al motore. Non vengono usati interrupt quindi la pressione dell'endstop non blocca nessun ciclo.
Ipotizzando che la home di Z sia in basso, home axis manda in basso a una destinazione 1.5 * max_length(axis) * axis_home_dir, cioè 1 volta e mezza la massima altezza verso la direzione della home, cosi anche se stai alla massima altezza dovrebbe andare oltre lo zero.
Poi lancia la funzione st_synchronize(), la quale aspetta che siano finiti gli step in buffer e fino a quel momento non fa nulla.
In stepper.cpp invece fa uno step lungo la direzione della home e controlla i finecorsa, se sono aperti va avanti altrimenti si ferma resetta gli step mancanti e quindi la funzione st_synchronize() finisce mandando avanti la homeaxis.
Tu hai messo tutto questo in un ciclo che non serve a nulla...
Cosa bisognerebbe fare, esattamente come il dual motor di z e il dual Zendstop..

#if ENABLED(Z_QUAD_STEPPER_DRIVERS)
  #define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z1_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); }
  #if ENABLED(Z_QUAD_ENDSTOPS)
    #define Z_APPLY_STEP(v,Q) \
    if (performing_homing) { \
      if (Z_HOME_DIR > 0) {\
        if (!(TEST(old_endstop_bits, Z_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z1_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z1_motor) Z1_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z3_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z3_motor) Z3_STEP_WRITE(v); \
      } \
      else { \
        if (!(TEST(old_endstop_bits, Z_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z1_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z1_motor) Z1_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z1_motor) Z2_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z3_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z1_motor) Z3_STEP_WRITE(v); \
      } \
    } \
    else { \
      Z_STEP_WRITE(v); \
      Z1_STEP_WRITE(v); \
      Z2_STEP_WRITE(v); \
      Z3_STEP_WRITE(v); \
    }
  #else
    #define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z1_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }
  #endif
#elif ENABLED(Z_DUAL_STEPPER_DRIVERS)
  #define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }
  #if ENABLED(Z_DUAL_ENDSTOPS)
    #define Z_APPLY_STEP(v,Q) \
    if (performing_homing) { \
      if (Z_HOME_DIR > 0) {\
        if (!(TEST(old_endstop_bits, Z_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
      } \
      else { \
        if (!(TEST(old_endstop_bits, Z_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
      } \
    } \
    else { \
      Z_STEP_WRITE(v); \
      Z2_STEP_WRITE(v); \
    }
  #else
    #define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }
  #endif
#else
  #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
  #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
#endif


Naturalmente vanno settate tutte le variabili Z1 Z2 Z3 step etc etc... Quindi non basta solo questa parte.. Poi bisogna cambiare il controllo in endstop controllando i singoli endstop e definendo i bit

#if ENABLED(Z_QUAD_ENDSTOPS)
            UPDATE_ENDSTOP_BIT(Z, MIN);
            UPDATE_ENDSTOP_BIT(Z1, MIN);
            UPDATE_ENDSTOP_BIT(Z2, MIN);
            UPDATE_ENDSTOP_BIT(Z3, MIN);

          #elif ENABLED(Z_DUAL_ENDSTOPS)
            UPDATE_ENDSTOP_BIT(Z, MIN);
            #if HAS_Z2_MIN
              UPDATE_ENDSTOP_BIT(Z2, MIN);
            #else
              COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN);
            #endif

            test_dual_z_endstops(Z_MIN, Z2_MIN);

          #else // !Z_DUAL_ENDSTOPS


In questo modo solo quando viene fatta la home i motori vengono controllati singolarmente:
 if (performing_homing) { \
      if (Z_HOME_DIR > 0) {\
        if (!(TEST(old_endstop_bits, Z_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z1_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z1_motor) Z1_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z3_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z3_motor) Z3_STEP_WRITE(v); \

Altrimenti gli step del movimento vengono applicati a tutti e quattro i driver contemporaneamente:

else { \
      Z_STEP_WRITE(v); \
      Z1_STEP_WRITE(v); \
      Z2_STEP_WRITE(v); \
      Z3_STEP_WRITE(v); \
    }

Se un un bit endstop viene settato quel motore durante la home non viene più mosso, ma solo gli altri fino a che tutti e 4 gli endstop non sono posti a 1...

Cosi velocemente, ma va provato e verificato il tutto...


COMPRA ITALIANO - sostieni le nostre aziende - sostieni la nostra gente - sostieni il tuo popolo - sosterrai te stesso.
Alberto C. felice possessore di una Kossel K2
My Blog - My Thingiverse
Re: Modifica MK Z_QUAD_STEPPER
July 13, 2016 10:03AM
Grazie mille della spiegazione thumbs up premetto che sto lavorando sulla versione 4.2.8_dev (sull'ultima versione ottengo errori strani se decommento le features "dual") e utilizzo l'ide 1.6.8 di arduino per compilare. Detto questo, ho modificato tutto ciò che riguarda il controllo dei 4 motori Z (e compila senza errori), ciò che mi manca è la parte relativa agli endstops..

Mi sfugge ancora un passaggio fondamentale per poter modificare autonomamente il codice..la routine da eseguire dovrebbe essere :

1) fai lo step verso la home
2) controlla lo stato degli endstops (Z,Z2,Z3,Z4)
3) se Z_MIN=true { lock_z=true } , se Z2_MIN=true { lock_z2=true } ecc..
4) se Z_MIN=Z2_MIN=Z3_MIN=Z4_MIN=true { homing Z completato, sblocca tutti i motori e prosegui con le altre istruzioni } altrimenti { riparti da 1) }

per poter bloccare i motori che arrivano in posizione di home si dovrebbe modificare stepper.cpp (in modo casereccio) così:

inline bool get_x_min_trigger() { return ((READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING)?true:false); }
inline bool get_x_max_trigger() { return ((READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING)?true:false); }
inline bool get_y_min_trigger() { return ((READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING)?true:false); }
inline bool get_y_max_trigger() { return ((READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING)?true:false); }
inline bool get_z_min_trigger() { return ((READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING)?true:false); }
inline bool get_z_max_trigger() { return ((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?true:false); }

... 

#if ENABLED(Z_QUAD_ENDSTOPS)
            UPDATE_ENDSTOP(Z,MIN);
            UPDATE_ENDSTOP(X,MAX);
            UPDATE_ENDSTOP(Y,MAX);
            UPDATE_ENDSTOP(Z,MAX);
            
            bool z1_end = get_z_min_trigger();
            bool z2_end = get_z_max_trigger();
            bool z3_end = get_x_max_trigger();
            bool z4_end = get_y_max_trigger();

            if (z1_end==true) { Lock_z_motor(true);  }
            if (z2_end==true) { Lock_z2_motor(true); }
            if (z3_end==true) { Lock_z3_motor(true); }
            if (z4_end==true) { Lock_z4_motor(true); }

            if (z1_end==true && z2_end==true && z3_end==true && z4_end==true) {
              // homing Z completato , procedi allo step successivo
            }

          #elif ENABLED(Z_DUAL_ENDSTOPS)

    ...

potrebbe funzionare? inoltre come faccio a realizzare quello che è scritto nel commetto alla fine della routine? Scusa se ti sto togliendo del tempo, sto provando a fare da solo ma il fw è veramente complesso..tra l'altro per me la programmazione è soltanto un hobby da autodidatta

Edited 2 time(s). Last edit at 07/13/2016 01:03PM by Oiram.
Re: Modifica MK Z_QUAD_STEPPER
July 26, 2016 09:12AM
Dunque, ho ricevuto la Ultratronics ed ho iniziato a fare qualche test (ovviamente non ho montato i motori sulla struttura). Per quanto riguarda il movimento dei motori è tutto ok, cioè se do il comando per far muovere l'asse z di tot mm tutti e 4 i motori partono in sincrono (e si fermano quando devono farlo). Ho abilitato anche gli endstop max e con il comando m119 restituiscono correttamente lo stato triggered/not triggered.

Per quanto riguarda invece l'homing ho ancora qualche problema e sarei grato se @MagoKimbra mi spiegasse il perchè di quanto sto per dire..

La modifica effettuata alla sezione relativa al controllo degli endstop è la seguente :

#if HAS(Z_MIN)

          #if ENABLED(Z_QUAD_ENDSTOPS)
		    UPDATE_ENDSTOP(Z,MIN);
            UPDATE_ENDSTOP(X,MAX);
            UPDATE_ENDSTOP(Y,MAX);
            UPDATE_ENDSTOP(Z,MAX);
		
		    if (!z1_end) { 
				z1_end = get_z_min_trigger(); 
				if (z1_end) { 
					Lock_z_motor(true);
					ECHO_EMT("Motore 1: ", "Bloccato");
				}
			}
			
			if (!z2_end) { 
				z2_end = get_x_max_trigger(); 
				if (z2_end) { 
					Lock_z2_motor(true);
					ECHO_EMT("Motore 2: ", "Bloccato");
				}
			}
			
			if (!z3_end) { 
				z3_end = get_y_max_trigger(); 
				if (z3_end) { 
					Lock_z3_motor(true);
					ECHO_EMT("Motore 3: ", "Bloccato");
				}
			}
			
			if (!z4_end) { 
				z4_end = get_z_max_trigger(); 
				if (z4_end) { 
					Lock_z4_motor(true);
					ECHO_EMT("Motore 4: ", "Bloccato");
				}
			}
            
            if (z1_end==true && z2_end==true && z3_end==true && z4_end==true) {
              step_events_completed = current_block->step_event_count;
			  ECHO_EMT("Stato motori: ", "Tutti bloccati, homing Z completo");
            }

inoltre in MKmain.cpp (nella funzione homeaxis) ho inserito qualche echo per vedere quello che succede e la cosa è un tantino strana..

Quando faccio partire l'homing dell'asse z (da pronterface) i motori iniziano a girare, a questo punto se chiudo l'endstop X_MAX il motore 2 (correttamente) si blocca (e gli altri girano), chiudendo Y_MAX si blocca il motore 3 (e gli altri non bloccati continuano a girare) infine se chiudo uno tra Z_MIN e Z_MAX si bloccano contemporaneamente tutti i motori restanti e vedo sul monitor seriale che parte la st_synchronize() (non dovrebbe accadere perchè ancora c'è un motore che deve raggiungere la posizione di home).

Inoltre, se chiudo per primo Z_MIN o Z_MAX si bloccano tutti i motori già all'inizio. Da questo fatto penso che ci sia qualche riga nel codice che cancella il buffer una volta che uno dei due endstop viene chiuso, però non riesco a trovarla, qualcuno ha idea di dove possa trovarsi?

[EDIT] Trovato e sistemato! Finora ho provato con solo due motori (mi devono arrivare gli altri a giorni) però da monitor seriale sembra tutto corretto! il ciclo prosegue finchè non vengono triggerati tutti gli endstops, dopodichè i motori (in sincrono) tornano indietro e si riportano in home (tutto in regola). Inoltre se dopo aver fatto la home invio il comando di salire ancora, i motori (ovviamente) non lo fanno. Scendendo invece di 1mm e poi dando il comando di salire di 10mm, i motori fanno soltanto 1mm e basta (quindi deduco che la posizione di home viene rilevata correttamente). Quando arrivano gli altri motori faccio un ultimo test per verificare che sia tutto corretto e poi procederò a montarli sulla struttura per un ulteriore test di stampa.

Ho caricato il sorgente (originale e modificato) su mediafire nel caso possa servire a qualcuno. Se @MagoKimbra volesse implementarlo (magari sistemando un tantino il codice perchè probabilmente non è dei migliori nonostante sembri funzionare) sarebbe il top. Ho caricato apposta sia l'originale che la versione modificata così utilizzando un programma che confronta i file si può vedere dove e cosa ho modificato (ad esempio notepad++)

Edited 1 time(s). Last edit at 07/26/2016 10:38AM by Oiram.
Re: Modifica MK Z_QUAD_STEPPER
July 26, 2016 11:31AM
Ciao,
domanda da avvocato del diavolo:
il sistema sulla carta è perfetto e puoi fare anche la calibrazione del piano sui 4 angoli come se fosse una delta, per capirci (più o meno e con qualche amenicolo in più)
Ma se ti si ferma o perse passi uno dei motori? ti si incarta tutto il piano o sbaglio?


Enrico

[www.dapa3dservice.it] [www.studiodapa.it]
repstrap dApA, Ramps 1.4, MarlinKimbra / scanner 3D Cubify Sense / Formlabs Form 2
Re: Modifica MK Z_QUAD_STEPPER
July 26, 2016 01:33PM
mmm si in effetti a questo non ci avete pensato. Finora sull'asse z non ho mai avuto problemi di perdita di passi (e facendo corna spero mai grinning smiley) però se mai dovesse accadere hai ragione tu, il piatto non sarebbe più livellato. Però se ci ragioniamo un pò non vedo quale altra soluzione esista per una meccanica con piatto mobile (lasciando stare quelle con piatto fisso per le quali non avrebbe assolutamente alcun senso fare una cosa del genere). La stessa cosa potrebbe benissimo accadere anche con solo due barre filettate, se si pianta un motore si spacca tutto. Inoltre se ci fai caso qualsiasi stampante se perde passi fa sfasare ogni calibrazione fatta in precedenza (e non mi riferisco unicamente all'asse z, potrebbe anche perdere passi il motore sull'asse x con conseguente sfasamento nella stampa) quindi è si importante porsi il problema ma non vedo come si possa prevenire una cosa del genere se non adottando componenti di qualità e soprattutto progettando bene la meccanica della stampante in modo che tutto scorra bene.

Poi comunque volevo dire (come scritto all'inizio del post) che sono stato "obbligato" a mettere le 4 barre trapezie perchè :
1) il piatto è abbastanza grande e mentre stampa vibra parecchio essendo fissato solo per due punti
2) il peso del piatto fa si che quando disabilito i motori si "svita" da sola la madrevite (a volte anche da un solo lato) e di conseguenza rischio di sollecitare troppo le barre (che potrebbero incurvarsi)

Quindi, dovendo usare un sistema del genere, ho voluto prendere due piccioni con una fava restando in condizioni ideali senza pensare (come mi fai notare tu) a possibili fattori di errore.
Re: Modifica MK Z_QUAD_STEPPER
July 27, 2016 04:17AM
Ciao,
c'è sepre un'altra possibilità:

[mauk.cc]

o

[www.3ders.org]


Enrico

[www.dapa3dservice.it] [www.studiodapa.it]
repstrap dApA, Ramps 1.4, MarlinKimbra / scanner 3D Cubify Sense / Formlabs Form 2
Re: Modifica MK Z_QUAD_STEPPER
July 27, 2016 05:36AM
Innanzitutto grazie per la risposta. Il sistema che hai proposto lo conoscevo e volevo implementarlo (in particolare in vista del fatto che in questo modo era sufficiente un motore su z piuttosto che 4) però non riuscivo a trovare un cinghia chiusa con le dimensioni giuste (solidowrks mi indica che servirebbero intorno ai 2500mm) e di conseguenza ho ripiegato sui 4 motori. Non è che magari sai dove posso trovarla o se conosci qualche sito che le fa su misura?

Edited 2 time(s). Last edit at 07/27/2016 05:38AM by Oiram.
Re: Modifica MK Z_QUAD_STEPPER
July 27, 2016 09:44AM
ciao,
qui te le fanno a misura

[it.maedler.de]


Enrico

[www.dapa3dservice.it] [www.studiodapa.it]
repstrap dApA, Ramps 1.4, MarlinKimbra / scanner 3D Cubify Sense / Formlabs Form 2
Re: Modifica MK Z_QUAD_STEPPER
July 27, 2016 10:21AM
Grazie per il link, mi stai facendo rivalutare la questione del movimento tramite cinghia e sto valutando se farmi fare una cinghia unica su misura (non ho idea di quanto potrebbe costare) o utilizzare un sistema con doppie puleggie dentate e cinghie chiuse in modo da adattarmi alle lunghezze già esistenti sul mercato. Adesso richiedo un preventivo ed in base a quello decido.

Però ho ancora un dubbio..utilizzando 4 barre filettate poste agli angoli credo che riuscirei a risolvere il problema (1) delle vibrazioni ma per quanto riguarda il problema (2) ? Secondo te il peso (distribuito sulle 4 barre piuttosto che su 2) del piatto mi darà ancora problemi? Non hai la sfera di cristallo, questo lo capisco, però avendo esperienza forse in linea di massima, che dici?
Re: Modifica MK Z_QUAD_STEPPER
July 27, 2016 11:08AM
Mettiamola così, io metterei sempre un sistema di scorrimento verticale rigido affiancato da un sistema di moto (barre trapezie, viti a ricircolo, etc.
Se riesci a collegare tra loro i sistemi di movimento, anche se dovesse cedere qualcosa a motori spenti, lo farebbe in modo simmetrico


Enrico

[www.dapa3dservice.it] [www.studiodapa.it]
repstrap dApA, Ramps 1.4, MarlinKimbra / scanner 3D Cubify Sense / Formlabs Form 2
Re: Modifica MK Z_QUAD_STEPPER
July 27, 2016 02:20PM
Grazie mille per tutti i consigli, appena elaboro meglio il sistema inizio le modifiche e vi tengo aggiornati. Probabilmente (almeno finchè non definisco per bene come applicare i tuoi consigli) appena arrivano i motori applico il sistema ipotizzato all'inizio del post e vediamo come procede, ma credo di passare poi al sistema che dicevi prima
Re: Modifica MK Z_QUAD_STEPPER
July 28, 2016 08:08AM
Questo post mi incuriosisce parecchio...
... posso chiederti con che scheda controlli la Z su quattro motori?
Ho un'ideuzza per una stampantina particolare...


Qualcosetta più che un neofina oramai, anche se non si finisce mai d'imparare!
DUE Stampati GEEETech i3B, GT2560+, Marlin GEEETech originale con un paio di modifichine personali (Pin dedicato per la Z Probe e stampa dell'ETE da SD), Barre Trapezie, Estrusore da 0.3 con filo da 1.75, una con estrusore metallico ed una con estrusore ridisegnato e stampato da me, Software AutoCAD/Slic3r/Repetier

My Thingiverse
My Linkedin
Re: Modifica MK Z_QUAD_STEPPER
July 28, 2016 11:34AM
Ciao, ho preso la ultratronics pro (ma anche la versione lite è sufficiente). Prevede già di default 7 slot per i driver che sono sufficienti per pilotare i 4 motori su z, 2 per x e y e l'ultimo slot per l'estrusore. Al momento non ho l'esigenza di un doppio estrusore (anche se in futuro prevedo di aggiungerne un altro da utilizzare unicamente per i supporti usando il filamento che si scioglie in acqua, che al momento non ricordo come si chiama nello specifico) però mi sembra di aver capito che utilizzando dei relè è possibile pilotare anche 4 estrusori quindi le possibilità di espansione sono veramente tante.

Finora ho effettuato pochi test quindi non posso sbilanciarmi troppo nel consigliartela (me l'ha consigliata @ManuHC) però posso dirti che le prime impressioni sembrano buone, il pcb mi sembra di ottima fattura e l'isolamento delle piste ben fatto (anche se devo ancora eseguire test sull'isolamento termico e su quello elettromagnetico quindi per ora sono soltanto giudizi "ad occhio").
Sorry, only registered users may post in this forum.

Click here to login