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

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

Leave a Reply

Shares