Guida all’utilizzo di pausa e/o advanced pause feature

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...

Per spiegare questa parte un po complessa che in molti faticano a capire bisogna partire da come funziona il firmware nella gestione dei comandi sia seriali che da SD.

Tutti i sistemi seriali hanno una gestione a buffer, per farvi capire la cosa faccio un esempio che può essere più semplice da capire. Avete presente quando vedete un video in streaming, la prima cosa che fa il visualizzatore sul vostro PC è quello di creare un buffer di alcuni secondi del video per poi cominciare a visualizzarlo, questo perché durante il download ci possono essere dei momenti in cui il bitrate diminuisce o addirittura si ferma, in questo modo il buffer permette di continuare a vedere il filmato mentre si ripristina la connessione.

Stessa cosa funzione per la seriale pc board. Ci sono due tipi di buffer quello hardware e uno software.

Quando si mandano i comandi alla board tutti i comandi vengono bufferizzati finché il buffer non è pieno, poi vengono eseguiti uno alla volta e man mano che si svuota il buffer viene riempito da un altro comando.

Quindi se si manda una sequenza di questo tipo:

G1 F1380 X90.759 Y109.209 E66.92575
G0 F4800 X91.295 Y109.239
G1 F1380 X109.239 Y91.295 E67.76978
G0 F4800 X109.239 Y91.861
G1 F1380 X91.861 Y109.239 E68.58719
G0 F4800 X92.427 Y109.239
G1 F1380 X109.239 Y92.427 E69.37797
G0 F4800 X109.239 Y92.993
G1 F1380 X92.993 Y109.239 E70.14214
G0 F4800 X93.558 Y109.239
G1 F1380 X109.239 Y93.558 E70.87972
G0 F4800 X109.239 Y94.124
G1 F1380 X94.124 Y109.239 E71.59069
G0 F4800 X94.690 Y109.239
G1 F1380 X109.239 Y94.690 E72.27503
G0 F4800 X109.239 Y95.255
G1 F1380 X95.255 Y109.239 E72.93279
G0 F4800 X95.821 Y109.239
G1 F1380 X109.239 Y95.821 E73.56393
G0 F4800 X109.239 Y96.387
G1 F1380 X96.387 Y109.239 E74.16845
G0 F4800 X96.952 Y109.239
M0 S0
G1 F1380 X109.239 Y96.952 E74.74639
G0 F4800 X109.239 Y97.518
G1 F1380 X97.518 Y109.239 E75.29771
G0 F4800 X98.084 Y109.239
G1 F1380 X109.239 Y98.084 E75.82241
G0 F4800 X109.239 Y98.649
G1 F1380 X98.649 Y109.239 E76.32053
G0 F4800 X99.215 Y109.239
G1 F1380 X109.239 Y99.215 E76.79203
G0 F4800 X109.239 Y99.781
G1 F1380 X99.781 Y109.239 E77.23691

Questi comandi vengono messi nel buffer ed eseguiti uno alla volta. Quando il parser dei comandi arriva a M0 S0 effettua la pausa, il comando viene eseguito, ma nel frattempo il buffer è già pieno dei successivi comandi.

A questo punto come uscire dalla pausa?

Ci sono due modi il primo è meccanico perché il firmware anche se in pausa continua a controllare pin e altro quindi un pulsante collegato su un pin può dare il consenso, vedi encoder del display. Ma se non abbiamo nessun pulsante? Si potrebbe fare con un comando gcode per esempio, che è il comando M108 che è il comando che sblocca come l’encoder, ma se diamo questo comando da host che dovrà andare in seriale verso la board non è che abbia una corsia preferenziale, farà la stessa strada degli altri comandi quindi si mette in coda nel buffer e visto che la stampante è ferma non verrà mai eseguito, quindi questa strada cosi con è percorribile..

Se stampiamo da SD le cose si mettono in maniera diversa perché il buffer della SD è diverso da quello della seriale, quindi mandando il comando in seriale verso la board il buffer sarebbe vuoto e quindi M108 arriva al processore. Ma quì ci sarebbe un altro problema, come vi ho detto prima ci sono due buffer quello hardware e quello software, quello software che è quello che viene riempito dai comandi che arrivano o dalla seriale o dalla SD e poi eseguiti uno alla volta comunque sarebbe pieno, quindi M108 arriva tramite la seriale al processore, ma non riesce a metterlo nel buffer software perché pieno e anche cosi non verrebbe eseguito.

In quest’ultimo caso il firmware permette una via d’uscita cioè attivare EMERGENCY_PARSER, questa funzione legge il buffer seriale e legge man mano i vari vari comandi che arrivano dalla seriale man mano che arrivano inserendoli in un altro buffer di mezzo che poi sarà svuotato nel buffer principale, visto che stiamo stampando da SD questo buffer di mezzo sarà vuoto, quindi se viene rilevato che il comando che arriva è M108 o altri comandi importanti li esegue subito.

/**
* Enable an emergency-command parser to intercept certain commands as they
* enter the serial receive buffer, so they cannot be blocked.
* Currently handles M108, M112, M410
* Does not work on boards using Arduino DUE processors!
*/
//#define EMERGENCY_PARSER

Perché non metterlo definito di default chiederete voi, perché è memoria in più e tempo processore in più perché comunque ogni volta che arriva un carattere sulla seriale il firmware controlla che carattere è se è una M allora aspetta il prossimo se è un 1, il prossimo, e cosi via se rileva che è un M108 allora esegue se non lo è butta nel buffer principale e lascia al parser l’esecuzione… Quindi è tempo macchinina perso che si attiva solo se si ha la necessità di fare queste pause..

Comunque come già detto utilizzabile solo se si stampa da SD. E se si volesse stampare da Host? Bene gli Host seri vedi repetier o i vari octoprint o repetier server hanno la possibilità di mettere nel gcode il comando @pause che blocca l’host non la stampante, quindi l’host si ferma a mandare comandi e aspetta che voi premiate il tasto play che apparirà sul l’host stesso. Nei setting dell’host si possono mettere dei comandi che verranno inviati alla stampante, che vi ricordo non è in pausa, non ha più comandi da eseguire perché l’host non gliela mandati, quindi eseguirà tranquillamente qualsiasi comando che arriverà dalla seriale. Potrò cosi mettere dei comandi di spostamento per togliermi da sopra il pezzo, eventuali ritrazioni, insomma posso fare quello che voglio.

Ora vediamo cosa succede se ho un display qualsiasi display anche il nextion.

Si può abilitare ADVANCED_PAUSE_FEATURE che è praticamente il vecchio cambio filo M600 il comando annesso che eseguirà una serie di comandi in base alle impostazioni messe.

Ma se uno vuole inserire una pausa senza dover necessariamente fare il cambio filo, allora si abilità PARK_HEAD_ON_PAUSE.

Cosa attiva questa funzione, semplice se si mette in pausa la stampa da SD il firmware parcheggierà il nozzle in una posizione che è la stessa del cambio filo.

#define PAUSE_PARK_X_POS 3 // X position of hotend
#define PAUSE_PARK_Y_POS 3 // Y position of hotend
#define PAUSE_PARK_Z_ADD 10 // Z addition of hotend (lift)

Farà una ritrazione che è sempre uguale a quella del cambio filo:

#define PAUSE_PARK_RETRACT_LENGTH 2 // Initial retract in mm

e attende la pressione del tasto encoder per i display  normali il tastino che appare nel nextion send, oppure il solito comando M108 se è attiva la funzione EMERGENCY_PARSER.

Una volta che si preme l’encoder si riporta sul pezzo estrude della stessa lunghezza della ritrazione di prima e ricomincia la stampa.

Ma se si volesse forzare la pausa senza dover premere pause printer sd, come si fa?

C’è il comando M125 che fa esattamente questo, cioè andare in pausa.

M125 – Save current position and move to pause park position. (Requires PARK_HEAD_ON_PAUSE)

Quindi niente M0 o roba del genere, con questo comando si va in pausa, il nozzle viene parcheggiato e si aspetta le pressione del tasto.

Detto ciò come al solito vi auguro buone stampe e buone pause a tutti.

Mago Kimbra.

Nuove funzioni. New Feature.

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...

Aggiunte le funzioni:

  • G12 Nozzle Clean
  • G27 Nozzle Park

 

Nozzle clean fa una cosa del genere:

 

Si può settare con dei parametri che permettono dei pattern a zig zag o lineari tra punti nel piano. In questo modo si può mettere una spugnetta o quello che volete per pulire il nozzle prima di partire a stampare.

 

G27 è semplicemente un punto nello spazio dove parcheggiare la testina. Tipo per fare spurgo o quant’altro…

Basta settare le coordinate con #define NOZZLE_PARK_POINT, e ogni volta che date G27 il nozzle si sposterà in quel punto…

Gcode – G29 – Mesh Bed Level o Auto Bed Level

1 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 5 (1 votes, average: 5.00 out of 5)
You need to be a registered member to rate this post.
Loading...

Finalmente arriviamo al comando più complesso che a molti crea non pochi problemi, G29 Mesh Bed Level o Auto Bed Leveling.

Prima di tutto vediamo la geometria che sta dietro al comando e come teoricamente va ad aggiustare il livellamento del piano.

Quando la stampante con la sua probe prende un punto del piano viene memorizzato in una matrice che contiene le tre coordinate di quel punto (X, Y, Z), la matrice poi viene usata da Vector che crea dei vettori di collegamento da punto a punto. La stampante muoverà il nozzle nello spazio tenendo conto di quei vettori.

Esempio: Se nel punto X 10 Y 10 ho una Z pari a 0 e nel punto X 150 Y10 ho una Z pari a 2 ho un vettore che va da (10, 10, 0) a (150, 10, 2) quindi un vettore che sale leggermente da sinistra verso destra.

Cosi per tutti i punti del piano, naturalmente il sistema non fa altro che collegare con vettori tutti i punti del piano che sono stati sondati, senza sapere minimamente cosa succede nel mezzo…

Esistono due modi per fare i vari probe, uno è con una griglia di punti n * n  e l’altro invece è tre punti, ricordando che una regola di geometria ci dice che per tre punti nello spazio passa uno solo piano.

bed-leveling-method-1[1]

 

La prima cosa è decidere che tipo di compensazione vogliamo, per ke Cartesiane e Core:

  • MESH_BED_LEVELING
  • AUTO_BED_LEVELING_LINEAR
  • AUTO_BED_LEVELING_BILINEAR
  • AUTO_BED_LEVELING_3POINT

Per le Delta ne esiste solo uno che è:

AUTO_BED_LEVELING_FEATURE (Che è di tipo bilinear come per le cartesiane e core)

Quindi sono fondamentali i valori che andiamo a settare nel FW per MBL.

  • MESH_INSET 10
  • MESH_MIN_X
  • MESH_MAX_X
  • MESH_MIN_Y
  • MESH_MAX_Y

Per i sistemi MBL, LINEAR e BILINEAR (anche Delta) dobbiamo definire il numero dei punti della griglia

  • GRID_MAX_POINTS_X
  • GRID_MAX_POINTS_Y
  • GRID_MAX_POINTS (SOLO DELTA)

E infine i punti minimi e massimi per le due coordinate sul piano cioè X e Y

#define LEFT_PROBE_BED_POSITION 20
#define RIGHT_PROBE_BED_POSITION 180
#define FRONT_PROBE_BED_POSITION 20
#define BACK_PROBE_BED_POSITION 180

Left è il minimo a sinistra e Right è il massimo a destra, Front è il minimo avanti mentre Back è il massimo indietro. Questi punti dovrebbero essere all’interno del piano. All’interno di questi punti viene creata la nostra griglia n * n. Se la griglia è di 2 allora saranno esattamente i punti di probe, altrimenti verranno creati (n – 2) punti all’interno di quest’area.

Se invece abbiamo definito il 3 POINT definiamo i tre punti di probe.

#define ABL_PROBE_PT_1_X 15
#define ABL_PROBE_PT_1_Y 180
#define ABL_PROBE_PT_2_X 15
#define ABL_PROBE_PT_2_Y 15
#define ABL_PROBE_PT_3_X 180
#define ABL_PROBE_PT_3_Y 15

Ora veniamo a qualcosa di fondamentale la distanza tra la probe e il nozzle nello spazio definita con i seguenti comandi:

#define X_PROBE_OFFSET_FROM_NOZZLE 0 // X offset: -left [of the nozzle] +right
#define Y_PROBE_OFFSET_FROM_NOZZLE 0 // Y offset: -front [of the nozzle] +behind
#define Z_PROBE_OFFSET_FROM_NOZZLE -1 // Z offset: -below [of the nozzle] (always negative!)

Come vedete è spiegato abbastanza bene come devono essere messi i valori… Se X offset è negativo vuol dire chela sonda è a sinistra del nozzle, se positivo starà a destra. Cosi se Y è negativo vuol dire che è davanti al nozzle, altrimenti starà dietro. Questi due valori devono essere interi, non essenziale una precisione enorme. Questi due valori però andranno a influire sui punti di probe.

Sia che sia una griglia che siano i tre punti, la posizione X Y è della probe e non del nozzle, quindi il nozzle si troverà spostato rispetto al punto di probe di un tot determinato dagli offset. Vado a farvi un esempio abbiamo un offset su X di -25 quindi la sonda è a sinistra del nozzle di 25 mm. Ora andiamo a fare la probe nel primo punto cosi come settato di default:

LEFT_PROBE_BED_POSITION 20

La probe andrà sul punto 20 e il nozzle? Il nozzle andrà a 20 + 25 quindi a 45 nel piano. Fin qui tutto bene.  Andiamo a fare la probe sul secondo punto a destra:

RIGHT_PROBE_BED_POSITION 180

Quindi la sonda starà a 180 mentre il nozzle a 180 + 25 = 205, Se abbiamo messo come valore X_MAX_POS 200 ecco che in compilazione del FW quest’ultimo ci avvertirà con un warning (che non è un errore come tanti e tanti dicono perché non leggono ciò che è scritto) che la posizione massima è stata superata e che non è possibile fare una probe nel punto 180, il massimo che possiamo raggiungere è 175. Stessa identica cosa vale per Y.

Cosa invece serve lo Z_PROBE_OFFSET che come dice il FW DEVE essere solo negativo. Perché negativo? Perché la sonda deve rilevare il piano prima che il nozzle lo tocchi altrimenti crash…

Questo valore è indipendente se la sonda stia più alta del nozzle (vedi pibot o sonde ottiche, oppure quelle di prossimità) o che tramite un movimento meccanico (Servo e/o Bltouch) stia più in basso del nozzle, l’importante è solo che deve rilevare il piano n mm prima del nozzle, questo valore n è il nostro Z_OFFSET.

Questo valore può essere trovato in diversi modi e poi inserito direttamente nel fw con il comando M666 P.

Uno di questi modi è quello di misurare l’altezza vera del nozzle con il solito metodo del foglio, a quel punto dovremmo avere un valore di Z pari a zero, quindi saliamo per poi riscendere piano fino a che non vediamo attivarsi la nostra sonda, magari aiutandoci con il comando M119 che ci dirà se la probe è triggered o meno. a quel punto la differenza d’altezza sarà il nostro offset.

Ricordatevi che esistono i comandi M401 e M402 per le sonde con servo (anche BLTOUCH) che faranno scendere la probe o risalire…

Quindi come è chiaro questo valore Z_PROBE_OFFSET deve essere preciso al centesimo di mm questo perché andrà a influire sull’ABL.

Altri setting da fare sono:

#define XY_TRAVEL_SPEED 10000               // X and Y axis travel speed between probes, in mm/min

#define Z_PROBE_SPEED_FAST 120            // Speed for the first approach when double-probing (with PROBE_DOUBLE_TOUCH)

#define Z_PROBE_SPEED_SLOW 60           // Speed for the “accurate” probe of each point

#define PROBE_DOUBLE_TOUCH               // Use double touch for probing

Come ben spiegato la velocità di spostamento da un punto all’altro dei vari probe, espressa in mm al minuto, quindi 10000 sono circa 166 mm/s.

#define Z_PROBE_DEPLOY_HEIGHT  10    // Z position for the probe to deploy/stow
#define Z_PROBE_BETWEEN_HEIGHT 5  // Z position for travel between points

Questi dicono al FW quanto si deve alzare il nozzle di Z prima (DEPLOY) di iniziare a sondare, per esempio per chi ha probe con il servo. Se per caso la probe è sul piano e il servo farà scendere la probe potremmo causare un altro crash… Poi c’è il valore BETWEEN cioè tra una probe e l’altra, tendenzialmente può essere anche di soli pochi mm, ma ci sono alcune sonde vedi Pibot, che necessitano di arrivare da lontano per avere una misura più precisa, anche quelle di prossimità, quindi meglio allontanarsi di diversi mm anche 10 mm per fare in modo che la sonda rilevi il piano con maggior accuratezza..

Infine ultimamente è possibile dire anche che tipo di sonda abbiamo montato, se di tipo servo lo si farà nel solito modo, altrimenti dobbiamo solo dire al fw che tipo abbiamo:

  • Z_ENDSTOP_SERVO_NR
  • PROBE_MANUALLY
  • Z_PROBE_FIX_MOUNTED
  • BLTOUCH (Solo originale altrimenti settare servo)
  • Z_PROBE_SLED (Solo Cartesiane e Core)
  • Z_PROBE_ALLEN_KEY (Solo Delta)

Servo sono tutte quelle probe che hanno come base un movimento fatto da un servo anche emulato, tranne i BLTOUCH originali che hanno il loro setting.

La PROBE_MANUALLY permette di poter prendere i vari punti di probe manualmente cioè proprio muovendo su e giù il nozzle con i comandi gcode regolare la giusta altezza con distanziometri o il classico foglio di carta.

La Z_PROBE_FIX_MOUNTED sono tutte quelle sonde fissate, anch’esse non hanno movimento alcuno e sono per esempio il PiBot o quelle di prossimità.

La Z_PROBE_SLED è una sonda che normalmente rimane staccata dal carrello X, viene parcheggiata fuori e agganciata solo quando serve in maniera magnetica e ha la sonda fissa non si muove quindi abbastanza precisa. Una cosa simile è stata fatta sulla Prusa I3 EVO di NicolaP.

La Z_PROBE_ALLEN_KEY è la classica sonda della Kossel con la barretta a L con molla, che ha bisogno di un movimento particolare per lo sgancio e aggancio finale, quindi bisognerà definire bene i punti di partenza e di stop dei due movimenti.

 

Arriviamo al comando vero e proprio, per MBL:

Uso

G29 S<0|1|2|3|4|5>

Argument Description
S<0|1|2|3|4|5>

S0: Produce a mesh report (see example 1)

S1: Start probing mesh points

S2: Probe the next mesh point

S3: Manually modify a single point

S4: Set Z-Offset, positive away from bed, negative closer to bed.

S5: Reset and disable mesh

 

Per ABL:

Uso

G29 [A<bool>] [B<pos>] [D<flag>] [F<pos>] [J<bool>] [L<pos>] [P<int>] [Q<bool>] [R<pos>] [S<rate>] [T<flag>][V<1|2|3|4>] [W<bool>] [X<int/float>] [Y<int/float>] [Z<float>]

Argument Description
[A<bool>] Abort leveling procedure in-progress (PROBE_MANUALLY)
[B<pos>] Set the back limit of the probing grid (AUTO_BED_LEVELING_LINEAR and AUTO_BED_LEVELING_BILINEAR)
[D<flag>] Dry-Run mode. Just probe the grid but don’t update the bed leveling data
[F<pos>] Set the front limit of the probing grid (AUTO_BED_LEVELING_LINEAR and AUTO_BED_LEVELING_BILINEAR)
[J<bool>] Jettison the leveling data stored in SRAM and turn off leveling compensation. Data in EEPROM is not affected.
[L<pos>] Set the left limit of the probing grid (AUTO_BED_LEVELING_LINEAR and AUTO_BED_LEVELING_BILINEAR)
[P<int>] Set the size of the square grid that will be probed – P x P points (AUTO_BED_LEVELING_LINEAR,)
[Q<bool>] Query the current leveling state (PROBE_MANUALLY, DEBUG_LEVELING_FEATURE)
[R<pos>] Set the right limit of the probing grid (AUTO_BED_LEVELING_LINEAR and AUTO_BED_LEVELING_BILINEAR)
[S<rate>] Set the XY travel speed between probe points (AUTO_BED_LEVELING_LINEAR and AUTO_BED_LEVELING_BILINEAR)
[T<flag>] Generate a Bed Topology Report (AUTO_BED_LEVELING_LINEAR)
[V<1|2|3|4>] Set the verbose level
[W<bool>] Write a mesh Z offset (PROBE_MANUALLY). W requires X, Y, and Z.
[X<int/float>] Override the X-size of the grid that will be probed (Linear). Specify X when setting a mesh value (PROBE_MANUALLY).
[Y<int/float>] Override the Y-size of the grid that will be probed (Linear). Specify Y when setting a mesh value (PROBE_MANUALLY).
[Z<float>] Specify the Z offset when setting a mesh value (PROBE_MANUALLY).

Uno dei problemi che noto spesso è quello del montaggio della probe. Io ho sempre cercato di metterla più vicina possibile al nozzle:

20141117_161557

Questo perché? Semplice il problema nasce quando la probe è molto spostata rispetto al nozzle visto che va a sondare un punto, ma il nozzle è totalmente da un’altra parte, questo crea una matrice vettoriale falsata e non precisa. Mi spiego, se la sonda è 50 mm alla destra del nozzle quando la sonda va a sondare il punto 50 di X il nozzle è nel punto X = 0 quindi va inserire un altezza nella matrice X Y Z di un punto che non centra nulla… Quindi si creano dei vettori falsati rispetto al piano..

Il mio consiglio è sempre quello di mettere la sonda il più vicino possibile al nozzle, difatti la miglior posizione sarebbe il nozzle stesso…

Un altro problema è la precisione stessa della sonda, una sonda che rileva nello stesso punto diversi valori che si discostano di decimi di mm non è affidabile, per provarla basta fare la home di Z al centro diverse volte per verificare che l’altezza di Z rilevata sia si diversa (è impossibile averla sempre uguale), ma con differenze di non più di centesimi di mm…

MagoKimbra

Gcode – G27: Park the nozzle

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...

Park the nozzle at a predefined XYZ position.


Usage

G27 [P<0|1|2>]

Argument Description
[P<0|1|2>] Z axis action

P0: If current Z-pos is lower than Z-park then the nozzle will be raised to reach Z-park height

P1: No matter the current Z-pos, the nozzle will be raised/lowered to reach Z-park height

P2: The nozzle height will be raised by Z-park amount but never going over the machine’s limit of Z_MAX_POS

Notes

Requires NOZZLE_PARK_FEATURE.

The park position is defined by NOZZLE_PARK_POINT.

Examples

The most basic example is to use the command without any arguments, this will default to a move the the parking position and raising the Z-pos if lower than the default Z-park position.

G27 ; raise Z if lower

This one is useful to be used on the end-script of a print, it will raise the Z-pos by Z-park.

G27 P2 ; always raise Z

Gcode – G21: Unità in millimetri

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...

Setta l’unità di misura in millimetri. In questo modo tutte le posizioni, gli offsets, le velocità, le accelerazioni, etc., specificate nei parametri del G-Code sono interpretate in millimetri.

USO: G21