MK4duo

Various

1.EEPROM #

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…
Ultimo   aggiornamento   il 10 Marzo 2018

2.Plugin repetier per EEPROM #

Oggi vorrei spiegarvi il plugin repetier che trovate nella cartella del Firmware quando lo scaricate.

All’interno di questa cartella troverete un’altra cartella chiamata RRFirmwares che dovrete copiare all’interno della cartella plugins dove è installato Repetier Host. Al suo interno c’è un file XML che insegna a Repetier Host come leggere la eeprom di MK4duo. Una volta fatto questo potete da Host cliccare sul menu Configurazione e poi sul menu configurazione firmware EEPROM in modo che host legga la vostra EEPROM mostrandovi una finestra con tutti i dati editabili.

Questo vi consente di poterli editare direttamente da questa finestra e poi ci penserà host a dare il comando opportuno per modificare il valore. Inoltre questa finestra vi consentirà di esportare su un file PC i dati e anche importarli per ripristinare tutti i valori.

Quindi una volta che avrete configurato opportunamente la vostra stampante e salvato in eeprom i valori, collegatela all’host, cliccate sul menu detto in precedenza, esportate i valori su un file nel vostro computer nominandolo opportunamente e avrete salvato la vostra configurazione. Quando aggiornerete il vostro firmware in un momento successivo, basterà importare il file e avrete di nuovo tutto impostato come prima.

Questo metodo vi permetterà di poter sempre tornare alla vostra impostazione iniziale, inoltre visto che inserirà anche i famosi PID automaticamente il firmware non vi chiederà di rifarli.

Ultimo   aggiornamento   il 13 Luglio 2019

3.Cosa sono i PID e l'autotune #

PID sta per Proporzionale – Integrale – Derivata. Cerchiamo di capire cosa sono questi paroloni e cosa vogliono dire.

Se in un controllo automatizzato di temperatura usassimo un sistema semplice cioè quello di staccare il riscaldatore una volta raggiunta la temperatura voluta cosa accadrebbe?

Il riscaldatore, nel nostro caso una resistenza, conserverebbe ancora per un po della sua energia continuando a riscaldare il nozzle facendo superare la temperatura  impostata di alcuni gradi. Una volta persa la sua energia comincerebbe a raffreddarsi rifacendo scendere la temperatura del nozzle. A questo punto appena la temperatura rilevata scende al di sotto della temperatura impostata il circuito di controllo dovrà riaccendere il riscaldatore, ma quest’ultimo avrà un tempo t prima di tornare ad avere una energia tale per far risalire la temperatura del nozzle. Quindi la temperatura oscillerà di un dT rispetto alla temperatura impostata.

Oscillazione

Quindi questo metodo non è funzionale per il nostro scopo.

Si pilota, invece, la resistenza con un’onda di tipo PWM (Pulse Width Modulation) cioè un’onda quadra in cui quello che varia è il tempo in cui ha valore alto rispetto al tempo che ha un valore basso:

PWM

All’inizio quando il resistore è freddo il Duty Cycle sarà del 99%, cioè un impulso con una lunga durata alto e praticamente nulla basso.

Man mano che la temperatura si avvicina a quella impostata il Duty Cycle diminuirà, in questo modo la resistenza non avrà troppa energia per superare la soglia della temperatura impostata, ma ne avrà a sufficienza per essere ancora calda e tornare a scaldarsi per non scendere troppo al di sotto sempre della temperatura impostata.

Ma come fa il sistema a gestire questo Duty Cycle? Ecco che intervengono i valori PID di cui stiamo parlando.

Il valore Proporzionale (P) o Kp è una costante che è uguale a Conteggi/C, cioè di quanto deve variare l’uscita PWM rispetto a quanto si discosta la temperatura rilevata, sia in alto che in basso, a quella impostata. Un valore troppo basso rende la curva di salita più morbida, ma il controllo è meno reattivo a variazioni di temperatura. Mentre un valore troppo alto di Kp rende il sistema più reattivo, con una curva molto instabile rispetto al target:

PID_Kp

A questo punto si è portati a pensare che basta trovare il giusto valore di Kp, in effeti è già un parametro che fa molto per tenere la temperatura stabile, ma grazie anche agli altri due si arriverà ad avere una vera stabilità.

Il valore Integrale (I) o Ki rappresenta l’integrale dell’errore nel tempo dato dal parametro Kp. Questo parametro serve per variare il guadagno del controllo di temperatura per fare in modo che si acceleri il processo verso la temperatura impostata.

La derivata del processo di errore viene calcolata determinando la pendenza dell’errore nel tempo, questo valore viene moltiplicato per la costante Kd. La derivata predice il comportamento del sistema e migliora così tempo e stabilità del sistema stesso.

Qui di seguito vediamo una gif che spiega abbastanza bene quello che accade variando i tre parametri Kp, Ki e Kd:

PID_Compensation_Animation

Dopo questa spiegazione generale torniamo alle nostre stampanti.

Questi valori PID cambiano da Hotend a Hotend e anche da altri fattori esterni, tipo coibentazione del nozzle, areazione e anche velocità di stampa.

Per questo motivo bisogna fare il tuning di questi valori una volta pronta la stampante e ripetere questa operazione ogni tanto, per adeguarli anche all’usura stessa del nostro hotend.

Per fare questo tuning ci viene incontro un comando Gcode:

M303 H<numero hotend> S<temperatura target> C<numero di cicli> U<bolean upgrade>

Nel caso di un solo Hotend si può omettere il valore H, mentre per fare i tuning del BED nel caso volessero essere usati si mette il valore -1 come H (H-1).

La temperatura target di default è 150 e il numero di cicli di default è 5. Più cicli migliorano la stabilità, ma già 5 è un ottimo valore. Quindi il comando finale sarà:

M303 S200 C6

M303 H0 S210

M303 H1 C8

Per il Bed:

M303 H-1 S100 C5

Una cosa importantissima e fare questo controllo partendo da una temperatura ambiente del nozzle.

Alla fine il FW ci restituirà i tre valori Kp, Ki e Kd. A questo punto se abbiamo precedentemente attivato la EEPROM e usato il sotto comando U1 (upgrade istantaneo dei valori) possiamo salvare i nuovi valori subito con il comando M500 e quindi avere già il nostro hotend funzionante anche le prossime volte che accenderemo la stampante, altrimenti dobbiamo copiarci i valori e metterli nel FW ricompilare il tutto e scaricalo nella nostra scheda.

Nel file Configuration_Feature.h alla sezione PID troviamo:

// HotEnd{HE0,HE1,HE2,HE3}
#define DEFAULT_Kp {40, 40, 40, 40} // Kp for H0, H1, H2, H3
#define DEFAULT_Ki {07, 07, 07, 07} // Ki for H0, H1, H2, H3
#define DEFAULT_Kd {60, 60, 60, 60} // Kd for H0, H1, H2, H3

Qui mettiamo i tre valori per ogni hotend che abbiamo. I valori possono anche essere cambiati con il comando Gcode:

M301 H<hotend> P<Kp> I<Ki> D<Kd>

Mentre per il Bed il comando Gcode è:

M301 H-1 P<Kp> I<Ki> D<Kd>

Se usiamo il PLA e abbiamo una ventilazione molto forte, questa potrebbe influire sull’andamento della curva della temperatura se il nostro hotend non è perfettamente coibentato, per questo motivo meglio fare l’autotuning con le ventole accese, in questo modo i PID vengono calcolati tenendo conto dell’influenza dell’aria sul nozzle.

Il FET sulle schede controlla la resistenza in corrente, quindi se alimentiamo la board a 24V per esempio ai capi della resistenza ci saranno 24 V, ma possiamo limitare la corrente tramite il valore:

#define BANG_MAX 255       // limits current to nozzle while in bang-bang mode; 255=full current

255 è la massima corrente, abbassando il valore limitiamo la corrente che circolerà nella nostra resistenza, se per esempio non è idonea a lavorare a 24V.

Purtroppo il tuning dei PID non tiene conto della velocità di stampa e quindi il movimento del nozzle stesso e della velocità in cui arriva un filamento a temperatura ambiente. Quindi aumentando la velocità potremmo avere un abbassamento della temperatura e una conseguente alterazione della curva. Per aggiustare questo inconveniente ci viene incontro sempre il FW MK che ha anche il parametro Kc, un valore che varia la potenza in uscita in funzione della velocità di estrusione. Kc è in percentuale quindi 100 vuol dire il 100%, possiamo incrementarlo se abbiamo problemi di stampa a determinata velocità. Il valore può essere cambiato con il comando Gcode:

M301 H<hotend> C<Kc>.

Un altro valore è la Lag per PID tick un parametro superato il quale deve calcolare il nuovo valore di potenza in uscita. Il valore Lag si varia con il comando Gcode:

M301 H<Hotend> L<lag in PID tick>

che però non potrà mai superare LPQ_MAX_LEN, di default è impostato a 20 nel FW.

Anche questi due ultimi valori vengono memorizzati in EEPROM se attivata. Per attivare Kc dobbiamo decommentare:

#define PID_ADD_EXTRUSION_RATE

Quindi ricordatevi di fare il l’autotune dei PID e di rifarlo spesso per avere sempre delle buone stampe.

MagoKimbra…

Ultimo   aggiornamento   il 9 Aprile 2020

4.Junction Speed #

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:

Ultimo   aggiornamento   il 24 Gennaio 2020
Help Guide Powered by Documentor
Suggerire  la  modifica