Algoritmo "Junction Deviation"

Autore: Simone Persiani

Strategia

L'algoritmo Jerk Limiting opera su ciascun asse separatamente, senza cioè tener in considerazione l'effettiva traiettoria seguita dagli spostamenti che si succedono nel corso di una stampa. La Junction Speed in questo modo non viene influenzata da un fattore fondamentale: l'angolo \Theta tra uno spostamento ed il successivo, ovvero la "curvatura" della traiettoria. Si può facilmente intuire l'importanza di tale angolo: più l'angolo è grande meno sarà necessario rallentare, e viceversa. Il modello fisico implementato dal Jerk Limiting è quindi inaccurato e porta, generalmente, ad eccessivi rallentamenti (che aumentano inutilmente i tempi di stampa).

L'algoritmo Junction Deviation si propone invece di scegliere \vec{v}_{junction} tenendo conto anche dell'angolo \Theta. Il risultato è un algoritmo più semplice ed efficace, in grado di velocizzare la percorrenza di tratti curvilinei. Questo nuovo modello fisico permette di ottenere le \vec{v}_{junction} corrette in ogni occasione, adattandosi alle più diverse situazioni.

L'algoritmo

NOTA DELL'AUTORE: Attualmente la migliore spiegazione dell'algoritmo si trova qui: Improving Grbl cornering algorithm. È disponibile solo in lingua inglese. Per questo motivo, se dovesse servire, potrei dedicarmi alla sua riscrittura in lingua italiana. Nel frattempo, se ne consiglia fortemente la lettura.

Configurazione dei parametri

Per attivare questa funzionalità è necessario assicurarsi di aver abilitato l'opzione JUNCTION_DEVIATION. Il parametro dell'algoritmo è il seguente:

#define JUNCTION_DEVIATION
#define JUNCTION_DEVIATION_MM 0.05 // valore decimale compreso tra 0.01 e 0.3 (estremi inclusi)

JUNCTION_DEVIATION_MM

Per comprendere l'opzione JUNCTION_DEVIATION_MM è strettamente necessario aver capito a fondo il funzionamento dell'algoritmo. Si faccia riferimento alla guida di cui sopra è stato fornito il link. Si sappia che è un valore espresso in mm e che un range sicuro di possibili valori va da 0.01mm a 0,3mm. Ovviamente questi valori vanno testati sulla propria macchina procedendo per tentativi. Si tenga presente che questo parametro rappresenta l'errore di approssimazione del modello fisico utilizzato dall'algoritmo. Porlo a 0.01mm significa utilizzare un modello accurato quasi al 100%, con l'inconveniente che in questo modo le v_{junction} saranno molto limitate. Nella pratica conviene cercare di aumentare progressivamente questo valore in modo da aumentare la velocità nei cambi di direzione, facendo attenzione a scegliere una quantità che non porti la stampante a produrre troppo rumore o troppe vibrazioni. Aumentare questo valore significa infatti fornire più flessibilità all'algoritmo, che potrà così decidere di percorrere i cambi di direzione con "accelerazioni centripete" più alte.

JUNCTION_DEVIATION_MM è un parametro salvato in EEPROM e può essere modificato anche senza ricompilare il firmware: basta utilizzare il comando M205 J<?>. Al termine delle modifiche, se si è soddisfatti del valore impostato è possibile salvarlo permanentemente tramite comando M500 (richiede l'attivazione del supporto alla EEPROM).

DEFAULT_MAX_ACCELERATION

Attenzione! Prima ancora di cominciare a sperimentare con i valori di JUNCTION_DEVIATION_MM, è assolutamente consigliabile ricontrollare i seguenti parametri:

#define DEFAULT_MAX_ACCELERATION {3000,3000,100,3000,3000,3000,3000,3000,3000}
// Nell'ordine: max. accel. dell'asse X, Y, Z, E0, E1, E2, E3, E4 ed E5

Il Junction Deviation, infatti, si preoccupa di limitare le accelerazioni su ciascun asse in base ai limiti qui impostati. Si rivela fondamentale, quindi, aver impostato questi valori nel modo corretto. Essi devono rispecchiare l'inerzia di ciascun asse.

DEFAULT_MAX_ACCELERATION è un parametro salvato in EEPROM e può essere modificato anche senza ricompilare il firmware: basta utilizzare il comando M201 X<?> Y<?> Z<?>. Al termine delle modifiche, se si è soddisfatti del valore impostato è possibile salvarlo permanentemente tramite comando M500 (richiede l'attivazione del supporto alla EEPROM).

L'analogia dell'automobile da corsa

Se volessimo utilizzare un'analogia per far comprendere meglio il significato dei primi due parametri, faremmo sicuramente riferimento ad un'auto da Formula 1 che si appresta ad affrontare una curva.

In questa analogia, liberamente ispirata dalla guida sopra citata, JUNCTION_DEVIATION_MM rappresenta la larghezza della pista rispetto a quella dell'auto: impostarlo a zero significa imporre che la pista sia della stessa larghezza della vettura, la quale sarà costretta (come se fosse su di un binario) a rallentare moltissimo per affrontare la curva correttamente. Viceversa, aumentare tale valore renderà la strada più larga e permetterà al bolide di scegliere una traiettoria più veloce (con la sola differenza che nel caso della stampante la traiettoria rimarrà ovviamente la stessa ma sarà percorsa a velocità maggiore).

Questo parametro va quindi impostato tenendo conto del suo significato fisico/geometrico. L'utente è libero di sperimentare per trovare i valori limite della propria stampante ma il consiglio è quello di non allontanarsi troppo dai quelli di default, a meno che non si sappia esattamente cosa si stia facendo.

Autore: Simone Persiani