<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <title>Modifica MK Z_QUAD_STEPPER</title>
        <description> 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&#039;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&#039;è già di default la possibilità di utilizzare per l&#039;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 &quot;QUAD&quot; (praticamente identica a quella &quot;DUAL&quot;). 

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&#039;è da fare?</description>
        <link>https://reprap.org/forum/read.php?361,686078,686078#msg-686078</link>
        <lastBuildDate>Tue, 14 Apr 2026 05:48:07 -0400</lastBuildDate>
        <generator>Phorum 5.2.23</generator>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,692385#msg-692385</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,692385#msg-692385</link>
            <description><![CDATA[ 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. <br />
<br />
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").]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Thu, 28 Jul 2016 11:34:33 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,692350#msg-692350</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,692350#msg-692350</link>
            <description><![CDATA[ Questo post mi incuriosisce parecchio...<br />
... posso chiederti con che scheda controlli la Z su quattro motori?<br />
Ho un'ideuzza per una stampantina particolare...]]></description>
            <dc:creator>Luca_Benedetto</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Thu, 28 Jul 2016 08:08:46 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,692144#msg-692144</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,692144#msg-692144</link>
            <description><![CDATA[ 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]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 27 Jul 2016 14:20:18 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,692089#msg-692089</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,692089#msg-692089</link>
            <description><![CDATA[ Mettiamola così, io metterei sempre un sistema di scorrimento verticale rigido affiancato da un sistema di moto (barre trapezie, viti a ricircolo, etc. <br />
Se riesci a collegare tra loro i sistemi di movimento, anche se dovesse cedere qualcosa a motori spenti, lo farebbe in modo simmetrico]]></description>
            <dc:creator>enricodare</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 27 Jul 2016 11:08:19 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,692081#msg-692081</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,692081#msg-692081</link>
            <description><![CDATA[ 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. <br />
<br />
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?]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 27 Jul 2016 10:21:50 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,692073#msg-692073</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,692073#msg-692073</link>
            <description><![CDATA[ ciao,<br />
qui te le fanno a misura<br />
<br />
[<a href="http://it.maedler.de/product/1643/1616/955/verschweissen-von-zahnriemen" target="_blank"  rel="nofollow">it.maedler.de</a>]]]></description>
            <dc:creator>enricodare</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 27 Jul 2016 09:44:54 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,691994#msg-691994</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,691994#msg-691994</link>
            <description><![CDATA[ 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?]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 27 Jul 2016 05:36:54 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,691980#msg-691980</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,691980#msg-691980</link>
            <description><![CDATA[ Ciao,<br />
c'è sepre un'altra possibilità:<br />
<br />
[<a href="http://mauk.cc/webshop/image/data/CartesioW1/20140711_114214.jpg" target="_blank"  rel="nofollow">mauk.cc</a>]<br />
<br />
o<br />
<br />
[<a href="http://www.3ders.org/images2014/gigantic-bigrep-one-2-3d-printer-euromold-4.jpg" target="_blank"  rel="nofollow">www.3ders.org</a>]]]></description>
            <dc:creator>enricodare</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 27 Jul 2016 04:17:22 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,691852#msg-691852</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,691852#msg-691852</link>
            <description><![CDATA[ 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 :D) 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 <u>qualsiasi</u> 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. <br />
<br />
Poi comunque volevo dire (come scritto all'inizio del post) che sono stato "obbligato" a mettere le 4 barre trapezie perchè :<br />
1) il piatto è abbastanza grande e mentre stampa vibra parecchio essendo fissato solo per due punti<br />
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)<br />
<br />
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.]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 26 Jul 2016 13:33:40 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,691827#msg-691827</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,691827#msg-691827</link>
            <description><![CDATA[ Ciao,<br />
domanda da avvocato del diavolo:<br />
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ù)<br />
Ma se ti si ferma o perse passi uno dei motori? ti si incarta tutto il piano o sbaglio?]]></description>
            <dc:creator>enricodare</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 26 Jul 2016 11:31:08 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,691804#msg-691804</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,691804#msg-691804</link>
            <description><![CDATA[ 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. <br />
<br />
Per quanto riguarda invece l'homing ho ancora qualche problema e sarei grato se @MagoKimbra mi spiegasse il perchè di quanto sto per dire..<br />
<br />
La modifica effettuata alla sezione relativa al controllo degli endstop è la seguente :<br />
<br />
<pre class="bbcode">
#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 &amp;&amp; z2_end==true &amp;&amp; z3_end==true &amp;&amp; z4_end==true) {
              step_events_completed = current_block-&gt;step_event_count;
			  ECHO_EMT("Stato motori: ", "Tutti bloccati, homing Z completo");
            }</pre>
<br />
inoltre in MKmain.cpp (nella funzione homeaxis) ho inserito qualche echo per vedere quello che succede e la cosa è un tantino strana..<br />
<br />
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).<br />
<br />
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?<br />
<br />
[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. <br />
<br />
Ho caricato il sorgente (originale e modificato) su <a href="http://www.mediafire.com/download/78j79zo2pq4tt59/MK_QUAD.rar" target="_blank"  rel="nofollow">mediafire</a> 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++)]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 26 Jul 2016 09:12:31 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,686386#msg-686386</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,686386#msg-686386</link>
            <description><![CDATA[ Grazie mille della spiegazione (tu) 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..<br />
<br />
Mi sfugge ancora un passaggio fondamentale per poter modificare autonomamente il codice..la routine da eseguire dovrebbe essere :<br />
<br />
1) fai lo step verso la home<br />
2) controlla lo stato degli endstops (Z,Z2,Z3,Z4)<br />
3) se Z_MIN=true { lock_z=true } , se Z2_MIN=true { lock_z2=true } ecc..<br />
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) }<br />
<br />
per poter bloccare i motori che arrivano in posizione di home si dovrebbe modificare stepper.cpp (in modo casereccio) così:<br />
<br />
<pre class="bbcode">
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 &amp;&amp; z2_end==true &amp;&amp; z3_end==true &amp;&amp; z4_end==true) {
              // homing Z completato , procedi allo step successivo
            }

          #elif ENABLED(Z_DUAL_ENDSTOPS)

    ...</pre>
<br />
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]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Wed, 13 Jul 2016 10:03:32 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,686245#msg-686245</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,686245#msg-686245</link>
            <description><![CDATA[ Eccomi quì....<br />
é 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...<br />
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.<br />
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.<br />
Poi lancia la funzione st_synchronize(), la quale aspetta che siano finiti gli step in buffer e fino a quel momento non fa nulla.<br />
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.<br />
Tu hai messo tutto questo in un ciclo che non serve a nulla...<br />
Cosa bisognerebbe fare, esattamente come il dual motor di z e il dual Zendstop..<br />
<br />
<pre class="bbcode">
#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 &gt; 0) {\
        if (!(TEST(old_endstop_bits, Z_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z1_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z1_motor) Z1_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z2_motor) Z2_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z3_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z3_motor) Z3_STEP_WRITE(v); \
      } \
      else { \
        if (!(TEST(old_endstop_bits, Z_MIN) &amp;&amp; (count_direction[Z_AXIS] &lt; 0)) &amp;&amp; !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z1_MIN) &amp;&amp; (count_direction[Z_AXIS] &lt; 0)) &amp;&amp; !locked_z1_motor) Z1_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MIN) &amp;&amp; (count_direction[Z_AXIS] &lt; 0)) &amp;&amp; !locked_z1_motor) Z2_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z3_MIN) &amp;&amp; (count_direction[Z_AXIS] &lt; 0)) &amp;&amp; !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 &gt; 0) {\
        if (!(TEST(old_endstop_bits, Z_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z2_motor) Z2_STEP_WRITE(v); \
      } \
      else { \
        if (!(TEST(old_endstop_bits, Z_MIN) &amp;&amp; (count_direction[Z_AXIS] &lt; 0)) &amp;&amp; !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MIN) &amp;&amp; (count_direction[Z_AXIS] &lt; 0)) &amp;&amp; !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</pre>
<br />
<br />
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<br />
<br />
<pre class="bbcode">
#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</pre>
<br />
<br />
In questo modo solo quando viene fatta la home i motori vengono controllati singolarmente:<br />
<pre class="bbcode">
 if (performing_homing) { \
      if (Z_HOME_DIR &gt; 0) {\
        if (!(TEST(old_endstop_bits, Z_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z_motor) Z_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z1_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z1_motor) Z1_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z2_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z2_motor) Z2_STEP_WRITE(v); \
        if (!(TEST(old_endstop_bits, Z3_MAX) &amp;&amp; (count_direction[Z_AXIS] &gt; 0)) &amp;&amp; !locked_z3_motor) Z3_STEP_WRITE(v); \</pre>
<br />
Altrimenti gli step del movimento vengono applicati a tutti e quattro i driver contemporaneamente:<br />
<br />
<pre class="bbcode">
else { \
      Z_STEP_WRITE(v); \
      Z1_STEP_WRITE(v); \
      Z2_STEP_WRITE(v); \
      Z3_STEP_WRITE(v); \
    }</pre>
<br />
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...<br />
<br />
Cosi velocemente, ma va provato e verificato il tutto...]]></description>
            <dc:creator>MagoKimbra</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 12 Jul 2016 16:23:49 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,686207#msg-686207</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,686207#msg-686207</link>
            <description><![CDATA[ Aggiornamento:<br />
<br />
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 <u>durante la fase di homing</u> quindi l'ultima modifica da effettuare riguarda la funzione homeaxis in MK_Main.cpp<br />
<br />
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 :<br />
<br />
<pre class="bbcode">
 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);
  }</pre>
<br />
Inoltre ho modificato la homeaxis così:<br />
<br />
<pre class="bbcode">
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) &amp;&amp; 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 &gt; 0) {
            adj = -adj;
            lockZ1 = (z_endstop_adj &gt; 0);
          }
          else
            lockZ1 = (z_endstop_adj &lt; 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) &amp;&amp; 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();

     ...</pre>
<br />
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]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 12 Jul 2016 13:19:32 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,686136#msg-686136</guid>
            <title>Re: Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,686136#msg-686136</link>
            <description><![CDATA[ Aggiornamento:<br />
<br />
Ho scaricato MK da reprapworld dalla pagina di vendita della board ultratronics pro ed ho iniziato a modificarlo :<br />
<br />
* Aggiunta le definizioni Z_QUAD_STEPPER_DRIVERS e Z_QUAD_ENDSTOPS in modo da essere indipendenti dal resto del codice<br />
* 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<br />
* Modificati stepper.cpp e stepper.h in modo da poter controllare 4 motori per l'asse z<br />
<br />
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.<br />
<br />
Le modifiche da fare dovrebbero essere:<br />
<br />
1) modificare la funzione update_endstops() in stepper.cpp in modo da supportare Z_QUAD_ENDSTOPS<br />
<br />
<pre class="bbcode">
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) &lt;&lt; 1); // bit 0 for Z, bit 1 for Z2

      if (z_test &amp;&amp; current_block-&gt;steps[Z_AXIS] &gt; 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-&gt;step_event_count;
      }
    #else // !Z_DUAL_ENDSTOPS
    
      UPDATE_ENDSTOP(Z, MIN);

    #endif // !Z_DUAL_ENDSTOPS
  #endif // Z_MIN_PIN

  ...

}</pre>
<br />
2) Associare gli endstop per z in questo modo :<br />
<br />
<pre class="bbcode">
Z2_MIN -&gt; X_MAX
Z3_MIN -&gt; Y_MAX
Z4_MIN -&gt; Z_MAX</pre>
<br />
tuttavia non trovo la porzione di codice in cui devo agire]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 12 Jul 2016 10:00:44 -0400</pubDate>
        </item>
        <item>
            <guid>https://reprap.org/forum/read.php?361,686078,686078#msg-686078</guid>
            <title>Modifica MK Z_QUAD_STEPPER</title>
            <link>https://reprap.org/forum/read.php?361,686078,686078#msg-686078</link>
            <description><![CDATA[ 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). <br />
<br />
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?<br />
<br />
Da una prima analisi del source intuisco che alcune modifiche dovrebbero essere :<br />
<br />
In Configuration_Feature.h aggiungere:<br />
<pre class="bbcode">
#define Z_QUAD_STEPPER_DRIVERS
#define Z_QUAD_ENDSTOPS</pre>
<br />
In Configuration_Pins.h aggiungere:<br />
<pre class="bbcode">
#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</pre>
<br />
Andare a modificare alcune parti di stepper.cpp e stepper.h per integrare la logica "QUAD" (praticamente identica a quella "DUAL"). <br />
<br />
<b>Nota</b> 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 :<br />
<br />
[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?]]></description>
            <dc:creator>Oiram</dc:creator>
            <category>GCODE, Software e Firmware</category>
            <pubDate>Tue, 12 Jul 2016 07:17:18 -0400</pubDate>
        </item>
    </channel>
</rss>
