MarlinKimbra & MK4duo

New Version 4.3.6

4 votes, average: 3,75 out of 54 votes, average: 3,75 out of 54 votes, average: 3,75 out of 54 votes, average: 3,75 out of 54 votes, average: 3,75 out of 5 (4 votes, average: 3,75 out of 5)
You need to be a registered member to rate this post.
Loading...

### Version 4.3.6
* Make class Mechanics to static
* Add Junction Deviation instead of traditional Jerk limiting
* Add Adaptive multiaxis step smoothing
* Add M205 J – Set Junction Deviation mm
* Add Bézier Jerk Control
* Add Safety Timer, after 30 minutes if not printing (SD or M530 S1) the heaters switch off.
* Rewrite SD Restart for auto restart when power loss and return.
* Add command gcode M569 for Stepper driver control: Dir, minimum pulse and maximum rate.
* Add Hysteresis in EEPROM
* Fix and clear code

Junction Speed

0 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 5 (0 votes, average: 0,00 out of 5)
You need to be a registered member to rate this post.
Loading...

Junction Speed

Autore: Simone Persiani

Introduzione

I progetti Marlin ed MK4duo, a partire rispettivamente dalle versioni 1.1.9 e 4.3.6, hanno introdotto un nuovo algoritmo nel tentativo di superare l’ormai datato Jerk Limiting. 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, ottenendo e migliorando il 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 Junction Speed (velocità di giunzione tra spostamenti successivi).

Premessa

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 (\vec{F}=m*\vec{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à dalle caratteristiche meccaniche di ciascuna macchina. In linea generale è corretto assumere che si possa aumentare la massima accelerazione di un asse nel caso in cui se ne siano alleggerite le parti in movimento, e viceversa.

È quindi possibile definire nel firmware le accelerazioni massime per ciascun asse (compresi gli estrusori!) in base alla loro inerzia (nel linguaggio comune diremmo lentezza e/o pesantezza). Tali accelerazioni definiscono la rapidità con cui l’attuale velocità di un asse possa essere variata per raggiungere una velocità target. In questo modo gli spostamenti pianificati dalla macchina possono essere modellati tenendo correttamente in considerazione anche le masse in movimento.

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 (\vec{v^{i}}_{finale}=\vec{v^{i+1}}_{iniziale}), con lo scopo di rendere più “fluido” il passaggio da uno spostamento all’altro. La scelta della Junction Speed non è così scontata come potrebbe apparire ad una prima analisi ed è un fattore critico in grado di produrre effetti apprezzabili sui tempi di stampa.

Il jerk

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à \vec{v}_j ed il blocco k a velocità \vec{v}_k. La velocità di giunzione tra i due blocchi (incognita!) è \vec{v}_{junction}. Il blocco j è ora in esecuzione con velocità \vec{v}_j: gli rimane un tempo t_j per raggiungere \vec{v}_{junction}, ciò significa che si renderà necessaria una accelerazione \vec{a}_j = {\Delta \vec{v}}/{\Delta t} = {\vec{v}_{junction} - \vec{v}_j}/{t_j}. A questo punto il blocco k avrà a disposizione un tempo t_k per portarsi alla velocità \vec{v}_k, ciò significa che si renderà necessaria una accelerazione \vec{a}_k = {\Delta \vec{v}}/{\Delta t} = {\vec{v}_k - \vec{v}_{junction}}/{t_k}. In generale \vec{a}_j <> \vec{a}_k: ciò significa che il jerk (derivata dell’accelerazione nel tempo), assumerà un valore diverso da 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 \vec{jerk} = {\Delta \vec{a}} / {\Delta t} = {\vec{a}_k - \vec{a}_j}/{t_0}, laddove t_0 è un valore molto piccolo dell’ordine di pochi microsecondi. 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.

Se i motori stepper incaricati di eseguire movimenti con jerk non nullo hanno abbastanza coppia (torque in inglese), allora saranno in grado di effettuare tali transizioni senza perdita di step (ovvero senza ridurre la precisione e la qualità di stampa). In caso contrario sarà necessario ridurre la massima accelerazione per gli assi che presentano problemi. Esiste però una funzionalità che permette di mantenere sempre il jerk a zero. Per informazioni, riferirsi alla guida S-Curve Acceleration

Algoritmi implementati

La guida sugli algoritmi attualmente implementati prosegue nelle rispettive pagine dedicate:

Autore: Simone Persiani

Encoder DAV per controllo filamento

0 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 5 (0 votes, average: 0,00 out of 5)
You need to be a registered member to rate this post.
Loading...

Encoder DAV per controllo filamento

Il sistema DAV (realizzato da D’Angella Vincenzo) permette di controllare con grande precisione i movimenti compiuti dal filamento durante la stampa. Tali movimenti vengono letti tramite un encoder che notifica la scheda elettronica inviando dei segnali di interrupt. MK4duo si occupa poi di confrontare i movimenti impartiti via software con quelli che effettivamente vengono rilevati dal DAV: in questo modo è possibile rilevare errori causati dalla fine del filamento o da un blocco avvenuto all’interno dell’estrusore.

Installazione

Trovare una sistemazione in cui l’encoder sia ben stabile e posizionato tra la bobina e l’estrusore in modo che il filo si inserisca e scorra agevolmente senza nessun impedimento o forzatura. L’encoder deve essere fissato ad un supporto che rimanga fermo durante la stampa. L’uscita del filamento dall’encoder deve essere posizionata in prossimità dell’estrusore o collegata ad esso con un tubo bowden di modo che il filamento non fletta durante le retrazioni, che così possono essere lette correttamente dall’encoder.

Collegamenti elettrici

Per questa sezione, a puro titolo di esempio, si è scelto di utilizzare la scheda RAMPS 1.4. I collegamenti elettrici devono essere adattati alla scheda della propria macchina.

L’encoder ha bisogno di alimentazione a 5V e di un terzo pin per inviare il segnale:

Nella RAMPS 1.4 per comodità conviene utilizzare un pin dei servo, in modo da avere i 5V, il GND ed il segnale vicini tra loro. Nella guida viene utilizzato il pin 4 ma è possibile utilizzare qualsiasi altro pin.

Configurazione di MK4duo

Per attivare l’encoder nel firmware, aprire il sito ufficiale di MK4duo e, nel menu a tendina dal titolo Firmware configurator, scegliere una versione >= MK4duo V4.3.3.

Se si sta già usando MK4duo sulla propria macchina, è necessario caricare la più recente versione del file Configuration_Overall.h e cliccare su Next step. Altrimenti, seguire preventivamente la guida del configuratore online.

Per configurare l’encoder DAV si deve accedere alla sezione Estrusori e scegliere il pin a cui è stato collegato (in questo caso il pin 4):

Ora si deve aprire la tab Funzioni e attivare Extruder encoder control. Di seguito sono da impostare due parametri per il corretto funzionamento dell’encoder, ovvero l'Encoder step for error detect ed il Min extruder step for check:

  • Encoder step for error detect: questo parametro indica ogni quanti millimetri di filo il firmware confronta la quantità teoricamente estrusa con quella effettivamente misurata dall’encoder.
  • Min extruder step for check: questo secondo parametro è una sorta di tolleranza o errore accettabile. Se la differenza tra il filo teoricamente estruso e quello misurato è inferiore a tale tolleranza il firmware continua la stampa, viceversa se l’errore è maggiore il firmware bloccherà la stampa mettendo la macchina in pausa.

Per un corretto funzionamento del sistema bisogna impostare il primo parametro per passaggi successivi. Si può iniziare eseguendo un controllo ogni 5mm di filamento estruso, diminuendo poi progressivamente il valore di Encoder step for error detect fino ad quando il firmware riuscirà a riconoscere gli errori “veri” e non metterà erroneamente la stampante in pausa.

Nell’esempio qui sotto è stato inserito 5 volte il valore degli step/mm dell’estrusione (450×5=2250), quindi l’encoder effettuerà un controllo ogni 5mm. Min extruder step for check è impostato a 50 step, circa il 10% di mm di errore tollerato

Configurazione fine di Encoder step for error detect

Per impostare correttamente gli step in base alla lettura seguita dal DAV encoder conviene misurare quanti step intercorrono tra due accensioni consecutive del led dell’encoder. Per avere una stima media degli step tra due accensioni conviene, ad hot end in temperatura, posizionare il filamento fino al punto in cui il led si accende. A questo punto estrudere un quantitativo noto di filamento (es. 100mm) e contare quante accensioni si hanno tra l’inizio e la fine dell’estrusione. Se ad esempio estrudendo 100mm di filamento si contano 97 accensioni, avremo 100/97=1,031mm medi tra due accensioni consecutive. A 450step/mm impostati nel firmware per l’estruder, questo equivale a 464 step medi tra due accensioni dell’encoder.

Nella pagina Funzioni alla voce Encoder step for error detect si dovranno impostare multipli degli steps calcolati con la procedura qui descritta. Se ad esempio misuriamo 464 step medi tra due accensioni e vogliamo eseguire un controllo ogni due secondi in Encoder step for error detect dovremo inserire 928 steps (circa 930).

Messa in pausa della stampante

Infine, nella sezione LCD, è necessario attivare la funzione Advanced Pause Feature:

Una volta impostati tutti i parametri adatti alla propria stampante, deve essere attivato il comando Park Head on Pause:

Compilazione e caricamento

Se sono già stati eseguiti tutti i passaggi descritti sopra, è finalmente possibile scaricare il firmware dalla tab Scarica. Si deve poi decomprimere l’archivio zip appena scaricato (facendo attenzione che tutti i file siano all’interno della cartella MK4Duo).

Aprire il file MK4duo.ino e andare nella scheda Configuration_Overall.h. Premere ctrl+F e cercare la parola “encoder“:

Scorrendo verso il basso è possibile trovare questa riga:

//#define INVERTED_ENCODER_PINS

Tale riga deve essere decommentata togliendo le doppie barre, in questo modo:

#define INVERTED_ENCODER_PINS

Ora non resta che verificare e caricare il firmware sulla propria stampante. Prima di cominciare a stampare, però, bisogna aggiungere il comando M530 S1 nello “Start gcode” e M530 S0 nell'”End gcode” tramite il proprio programma di slicing per attivare il controllo del filamento durante la stampa.

EEPROM

0 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 5 (0 votes, average: 0,00 out of 5)
You need to be a registered member to rate this post.
Loading...

Vedo se riesco a fare un po di chiarezza sulla funzione della eeprom.
Capisco che è una situazione a metà, a me piacerebbe che fosse totalmente gestibile via firmware la configurazione della stampante, vedi firmware tipo RRF o altri come quello della GH. Ma per fare questo c’è bisogno di memoria per le variabili, il DUE non ha problemi tutti e 512k sono utilizzabili per il software o per le variabili, purtroppo il mega ha solo 8 Kb di RAM per le variabili. Nel firmware stesso ci sono variabili cioè locazioni dove sono contenuti dati che variano nel tempo, per esempio la temperatura attuale di un riscaldatore o quella impostata come target dall’utente, la posizione degli assi (compreso E), la destinazione, e tante altre.
L’approccio dei firmware nati con il mega o inferiori è stato quello di definire costanti inizialmente alla compilazione del firmware per non occupare, la già poca, memoria del processore. Quindi valori come Z_MAX_POS o il pin del sensore o ancora i pin di una fan o le direzioni dei motori o le home sono costanti e definiti all’inizio nella configurazione. Le costanti non occupano spazio in RAM perché appunto costanti quindi occupano spazio come il software, questo lascia liberi quei pochi Kb di RAM per variabili di lavoro. Questo è perfetto per un funzionamento con il mega, ma costringe l’utente a dover compilare e scaricare il firmware per cambiare queste costanti. Per carità è nulla da dire su questa scelta, anzi la trovo perfetta per quello che serviva…
Alcune variabili però sono rimaste come gli step per mm, le velocità e le accelerazioni, variabili, che con gcode o con il display, è possibile modificare senza scaricare il firmware ricompilato. Ora questi valori però se modificati essendo in ram allo spegnimento della stampante tornano a essere quelli che erano inizialmente cioè quelli dettati dalle configurazioni, per esempio se si varia la velocità da 100 a 110 per un asse, durante tutto il funzionamento della stampante quel valore sarà 110, ma alla nuova accensione tornerà a essere 100 costringendo l’utente a inserire gocde negli start gocde per rimettere a 110 quel valore. Ecco che ci arriva in aiuto la EEPROM, cioè una memoria scrivibile dal software stesso permanente finche non sovra scritta.Quindi se io modifico il valore della velocità con il display o con il gcode e lo porto a 110 e poi lo memorizzo in EEPROM (se attiva), alla nuova accensione verrà letta la EEPROM e invece di mettere a 100 (come settato nella configurazione) la velocità il firmware la mette a 110. Ora se modifico il firmware mettendo come velocità 90 e lo scarico di nuovo nella scheda, quello che accade è la stessa cosa dell’accensione il firmware trova il valore 110 in EEPROM e quindi la velocità sarà 110 e non 90 come messo nella configurazione… In questo caso bisognerà portare il valore a 90 o con il gcode o con il display e poi memorizzarlo in eeprom per sovrascrivere solo questo e non perdere gli altri eventualmente salvati, l’alternativa è resettare la EEPROM con M502 portando tutti i valori di default (cioè quelli scritti nei file di configurazione) per poi di nuovo scriverli in eeprom con M500.
Detto ciò arriviamo al dunque, oltre ai consueti valori ho piano piano portato a variabili e non più costanti altri valori che normalmente erano solo definiti, appunto come i riscaldatori, le fan e altre cosuccie. Facciamo un esempio pratico: Configuro il firmware in modo che la fan 0 è sul pin 10, salvo in EEPROM, dopo di che vado nella configurazione e modifico il pin della fan 0 in 11, scarico il firmware senza fare altro il pin 11 non sarà mai usato perché in memoria EEPROM ho ancora il pin 10 e di conseguenza il firmware continuerà a usare il pin 10 per la fan 0.
Cosa bisognerà fare in questo caso?
Semplicemente due cose: O si cambia con il relativo comando il pin della fan0 e poi si salva in EEPROM oppure si resetta la EEPROM per riportare TUTTI i valori come scritti nella configurazione.
Ed è qui che viene la domanda, perché modificarli da configurazione invece di modificarli direttamente dal firmware con il gcode in modo più rapido senza dover compilare e scaricare ogni volta?
Altrimenti la eeprom non ha senso averla attiva, si cambia tutto da configurazione e basta cosi è tutto più facile.
Però volete mettere che io posso con un comando gcode far diventare il bed con i pid o bangbang senza dover riscaricare tutto??
Oppure modificare i pid al volo per abs o pla o tpu, o ancora cambiare tipo di sensore che monto se cambio al volo un hotend con un altro?
Per me queste sono un plus, ma forse non sono riuscito a farmi e farle capire queste cose. Questo però vuol dire che quando si configura e si modificano certi parametri bisogna fare un po di attenzione se sono valori salvati in eeprom oppure no. Come ho detto all’inizio sarebbe bello che tutti lo fossero, ma per rimanere ancora compatibile con le 8 bit, tutti è impossibile…
Spero che un po si sia capito come discorso. Intanto con RRF si modifica tutto via web browser e noi si compila ancora togliendo le // o mettendole per attivare o disattivare le funzioni…

Comando M530 cosa fa e come si usa.

0 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 50 votes, average: 0,00 out of 5 (0 votes, average: 0,00 out of 5)
You need to be a registered member to rate this post.
Loading...

M530: S<printing> L<layer> – Enables explicit printing mode (S1) or disables it (S0). L can set layer count

Il comando è molto semplice, ma è importantissimo, ha due sotto comandi S e L. Questo comando viene normalmente dato direttamente dagli host quando si stampa da USB, ma non tutti gli host lo fanno. Repetier lo manda solo quando riconosce repetier firmware a bordo della scheda, altri non lo fanno proprio.

M530 S1 mette nello stato di printing la vostra stampante, da questo momento in poi, fino al comando M530 S0, vengono attivate funzioni speciali. La più importante è il timer di inattività sui riscaldatori. Il timer di 30 minuti parte non appena si accende un riscaldatore e viene interrotto solo se la stampante è in printing mode, altrimenti esauriti i 30 minuti vengono spenti tutti i riscaldatori. Le funzioni di filamento usato, di tempo di vita della stampante, di quante stampe ha effettuato vengono fatte partire solo quando si è in printing mode. Altre funzioni, come il check di fine filo o porta aperta vengono controllati solo in printing mode…

Se si stampa da SD, è automatico il passaggio in printing mode, ma da USB è necessario inserire questo comando.

Oltre al sotto comando S, c’è il sotto comando L che dice alla stampante di quanti layer è formato il pezzo stampato, per ora non utilizzato, ma di possibile uso futuro.