[[guide:junction_speed:start]]

Questa è una vecchia versione del documento!


Jerk Control vs Junction Deviation

I progetti Marlin ed MK4duo, a partire rispettivamente dalle versioni 1.1.9 e 4.3.6, hanno introdotto una nuova funzionalità nel tentativo di superare l'ormai datata gestione del jerk degli assi. Tale gestione non ha mai convinto del tutto gli sviluppatori di Marlin e ha causato loro molti grattacapi nel corso degli anni. Nel tentativo di superare tale algoritmo si sono ispirati ai codici sorgente di Grbl, un ben noto firmware per la gestione di macchine CNC, copiandone l'algoritmo della Junction Deviation (il tutto nel pieno rispetto delle licenze associate a tale prodotto). Ricordiamo che Marlin stesso è nato nell'agosto del 2011 proprio come fork di Grbl e di Sprinter.

Tali algoritmi (l'uno alternativo all'altro), si rendono necessari nel momento in cui il planner (il modulo software che si occupa dell'ottimizzazione dei movimenti della macchina) si trova a dover scegliere con quale velocità far terminare un blocco e cominciare il successivo, ovvero la velocità di giunzione dei due blocchi.

Per maggiori informazioni sui blocchi e sul loro funzionamento, far riferimento alla guida sul Bezièr Jerk Control

In un mondo ideale stamperemmo tutti alla velocità della luce e otterremmo i pezzi stampati in un istante. Ciò ovviamente non è possibile: le nostre macchine hanno dei motori che possono raggiungere solo determinate velocità massime, hanno dei telai in grado di assorbire solo una certa quantità di vibrazioni e di sopportare carichi di forze/tensioni limitati, hanno delle parti in movimento con massa sicuramente diversa da zero, ecc. Le vibrazioni che si vengono a creare quando stampiamo ad alte velocità impattano sulla qualità dell'oggetto stampato (vedi effetto ghosting). Si rende quindi necessario trovare una strategia efficiente per gestire le accelerazioni di ciascun asse in modo da trovare un buon compromesso tra qualità e tempi di stampa.

Per la Legge Fondamentale della Dinamica ($F=m*a$) le forze esercitate dai motori sul telaio della stampante dipendono contemporaneamente sia dalle masse in movimento sia dalle accelerazioni che esse subiscono. Non è quindi possibile trovare un'accelerazione massima che sia corretta per ogni stampante, perché quest'ultima dipenderà dalla struttura meccanica di ciascuna macchina. In linea generale è corretto assumere che la massima accelerazione possa essere aumentata nel caso in cui si siano alleggerite le parti in movimento (il carrello dell'hotend e/o il piatto di stampa, a seconda della meccanica), e viceversa.

É quindi possibile definire nel firmware le accelerazioni massime per ciascun asse, compresi gli estrusori. Tali accelerazioni definiscono la rapidità con cui l'attuale velocità di un asse può essere aumentata/diminuita per raggiungere una velocità prefissata. I movimenti pianificati dalla macchina vengono quindi modellati rispettando le accelerazioni massime per ogni asse definite dall'utente.

Il planner si occupa inoltre di concatenare gli spostamenti in modo che la velocità con cui termina un blocco sia la stessa di quella con cui comincia il blocco successivo ($v_{finale}^{i}=v_{iniziale}^{i+1}$), con lo scopo di rendere più "fluido" il passaggio da uno spostamento all'altro. La scelta di questa velocità non è così scontata come potrebbe apparire ad una prima analisi ed è un fattore critico in grado di produrre effetti apprezzabili sui tempi di stampa. Seguono le due soluzioni (alternative l'una all'altra) che sono state adottate sia da Marlin che da MK4duo.

Ogni spostamento è sempre associato ad una velocità: per raggiungerla è necessario effettuare una accelerazione[decelerazione], a seconda che la velocità attuale sia minore[maggiore] rispetto al target.

Supponiamo che la macchina abbia pianificato di dover eseguire due blocchi in successione: il blocco $j$ a velocità $v_j$ ed il blocco $k$ a velocità $v_k$. La velocità di giunzione tra i due blocchi (incognita!) è $v_{junction}$. Il blocco $j$ è ora in esecuzione e la testina di stampa si sta muovendo a $v_j$ mm/s: gli rimane un tempo $t_j$ per raggiungere $v_{junction}$, ciò significa che si renderà necessaria una accelerazione $a_j = \frac{\Delta v}{\Delta t} = \frac{v_{junction} - v_j}{t_j}$. A questo punto il blocco $k$ avrà a disposizione un tempo $t_k$ per portarsi alla velocità $v_k$, ciò significa che si renderà necessaria una accelerazione $a_k = \frac{\Delta v}{\Delta t} = \frac{v_k - v_{junction}}{t_k}$. In generale $a_j \neq a_k$: ciò significa che il jerk (derivata dell'accelerazione nel tempo), assumerà un valore maggiore di zero solo nell'intervallo di tempo durante la transizione da un'accelerazione all'altra, mentre sarà uguale a zero per il resto del tempo. Esso infatti è calcolato come $jerk = \frac{\Delta a}{\Delta t} = \frac{a_k - a_j}{t_0}$, laddove $t_0$ è un valore molto piccolo dell'ordine di pochi microsecondi.

Esiste una funzionalità che permette di mantenere il jerk a zero in ogni transizione di velocità. Per informazioni, riferirsi alla guida sul Bezier Jerk Control

Il jerk è una variazione (aumento/diminuzione) di accelerazione che può produrre effetti indesiderati sulle stampe e questo sistema è in grado di mantenerlo a zero per la maggior parte del tempo. Il problema è che le accelerazioni e le decelerazioni richiedono tempo: un tempo relativamente piccolo che, moltiplicato per i milioni di movimenti richiesti per una stampa, può aumentare anche di molto i tempi di stampa.

Si è deciso di evitare il più possibile tali fasi di accelerazione introducendo dei parametri modificabili dall'utente che qui chiameremo "max_jerk". In realtà tali valori si chiamano così perché incidono sul valore del jerk ma non possono essere considerati dei veri e propri jerk. Essi infatti dimensionalmente sono rappresentati da variazioni di velocità e sono quindi misurati in mm/s.

Riprendendo l'esempio di prima e ipotizzando per semplicità che i due spostamenti avvengano lungo un solo asse, avremo una variazione di velocità pari a $\Delta v = v_k - v_j$: se $\Delta v$ supera il "max_jerk" per quell'asse, il firmware realizzerà il passaggio da $v_j$ a $v_k$ tramite accelerazioni (come già spiegato); altrimenti il passaggio da una velocità all'altra sarà istantaneo e non si perderà tempo per le accelerazioni/decelerazioni intermedie. Il "max_jerk" è quindi la minima variazione di velocità che richiede un'accelerazione: se $v_j$ e $v_k$ fossero abbastanza simili tra loro, il passaggio dall'una all'altra sarebbe istantaneo. Questo trucchetto permette di ridurre leggermente i tempi di stampa ma va impostato correttamente: più i valori di "max_jerk" vengono aumentati, maggiori saranno gli spostamenti (statisticamente) che verranno gestiti con il cambio di velocità istantaneo (e maggiori saranno quindi le vibrazioni prodotte).

Riassumendo, i "max_jerk" devono essere impostati tenendo a mente che abbassando tali valori si riducono le vibrazioni e i rumori prodotti dai motori ma si allungano conseguentemente i tempi di stampa, e viceversa.

i due fattori sono la deviation e la acceleration. La più semplice da immaginare è la seconda: trattasi della massima accelerazione centripeta che la meccanica può sostenere. Durante i cambi di direzione il nuovo algoritmo cerca di mantenere costante la velocità: l'accelerazione centripeta è allora uguale a $\dots\frac{(v^2)}{r}$, dove r è il raggio di curvatura. v e soprattutto r possono cambiare durante la stampa, andando ad incidere sul valore di acc. centr. . Newton ci disse che $F=ma$, perciò la forza che è necessario imprimere al carrello di stampa durante un cambio di direzione è proporzionale sia alla ma

test: $$ F_{centripeta} = m * a_{centripeta}$$