fbpx

Coordinate assolute o relative nella stampa 3D ?

Le coordinate

Quando si parla di Gcode e relativi comandi da inviare alla macchina, è fondamentale capire cosa vuol dire muoversi in maniera ASSOLUTA o RELATIVA. Le stampanti 3D hanno generalmente 3 assi (X, Y e Z) più i motori degli estrusori; per muovere l’hot-end all’interno del volume di stampa della nostra 3D Printer, dobbiamo inviare dei comandi , o meglio, delle COORDINATE che permettono all’hot-end di raggiungere una qualsiasi posizione all’interno dello spazio. Semplificando ulteriormente provate a pensare a “Battaglia Navale”… ogni punto della vostra plancia di gioco è ben definito da due coordinate (numeri e lettere) che formano una griglia.

Lo slicer si occupa di creare tutte le coordinate di movimento per far si che gli strati del nostro oggetto vengano costruiti in maniera corretta. In aggiunta, ad ogni movimento è alle volte associata anche un’estrusione di materiale. Perchè allora questa guida? Molto semplice… Se ti trovi a dover scrivere uno “Custom Start/End Gcode” è fondamentale sapere come far muovere la tua macchina, ma soprattutto come non farle fare movimenti tali da farla impattare nel telaio.  

Zero macchina

Tutti i movimenti devono far riferimento ad uno ZERO MACCHINA o meglio chiamata ORIGINE . Ti sei mai chiesto cosa sia quel G28 nello Start Gcode? E’ il comando che dice alla macchina di portare tutti e tre gli assi “a casa” (homing assi): una volta che ogni asse avrà toccato il suo fine corsa (piccolo interruttore), questa posizione diventerà il suo nuovo punto zero ovvero X0 Y0 e Z0. In generale, salvo attivando un comando specifico, non si può andare oltre alle coordinate assolute della macchina. Bada bene ai termini che abbiamo utilizzato.

Mettiamo caso che tu voglia spostare il tuo ugello in un determinato punto del piano, perché desideri farlo spurgare/pulire prima di ogni stampa. Puoi farlo tramite un

  • MOVIMENTO ASSOLUTO – G90: supponiamo di voler portare il nozzle a destra di 180 mm e in avanti di 50 mm alzandolo di 3 mm rispetto al piano (tenete ben presente le dimensioni della vostra stampante prima di fare ciò), il comando che daremo da terminale o scriveremo su un gcode è

G1 X180 Y50 Z3 F2000

G1 è il comando di movimento lineare, X180  Y50 e Z3  sono le coordinate del nostro punto di arrivo (espresse in millimetri) ed infine F2000 è la velocità di movimento espressa in mm/m (corrisponde a circa 32 mm/s). Se da questo punto volessimo tornare indietro in un’altra location ci basterà semplicemente inserire la nuova coordinata. Esempio, per spostarlo a 30 mm dall’origine ci basterà dare il comando

G1 X30 Y30 Z3 F2000

E così via… ogni coordinata inserita sarà in genere quasi sempre POSITIVA, questo perchè il suo riferimento iniziale è SEMPRE l’origine degli assi trovata con il G28 (o trovata in altri modi che vedremo…). Ci sono casi in cui si vogliono cercare delle coordinate che vanno oltre rispetto allo zero macchina ma…. lasciamo perdere per ora! Il comando che permette l’interpretazione di questo tipo di coordinate è G90, lo analizzeremo più tardi in dettaglio.

  • MOVIMENTO RELATIVO – G91: analizziamo l’esempio di prima in chiave “relativa”. Partendo sempre dall’origine, per andare alla coordinata X180 Y50 Z3, daremo il comando G1 X180 Y50 Z3 F2000 . Beh uguale a prima starai dicendo, seguimi ancora un secondo e capirai la differenza. Da quest’ultima coordinata decidi di tornare a X30 Y30 Z2 e qui scatta l’inghippo dato che compaiono le coordinate NEGATIVE! Il comando per tornare a quel punto sarà

G1 X-150 Y-20 Z-1 F2000

Di conseguenza, interrogando con M114 da riga di comando, troveremo che le coordinate visualizzate a schermo saranno proprio X30 Y30 Z2; il movimento sarà fatto in relazione all’ultima coordinata raggiunta, ma teniamo conto che esiste sempre e comunque uno zero macchina trovato in precedenza tramite G28 (o altri metodi). Quando si ragiona per coordinate di tipo relativo, l’ultima coordinata raggiunta diventa la nuova “origine/zero” (relativo) dal quale poi partirà e farà riferimento il movimento successivo. Se nell’assoluta si fa sempre capo ad una coordinata 0,0,0 con il movimento relativo ci muoveremo in “relazione” all’ultimo movimento effettuato (scusate il doppio gioco di parole). Questo vuol dire che se deve tornare indietro vanno per forza inserite delle coordinate negative.

Facciamo un ulteriore esempio:

Mi trovo alla coordinata X50 Y80 Z3 e voglio spostarmi alla coordinata X80 Y20 Z1:

  • Assolute: G1 X80 Y20 Z1 F2000
  • Relative: G1 X30 Y-60 Z-2 F2000 dove X=80-50 , Y 20-80 (negativo), Z= 1-3 (negativo)

Altro caso, mi trovo alla coordinata X95 Y22 Z45 e devo spostarmi di 10 mm in X, tornare indietro di 12 mm in Y e alzarmi di  9 mm in Z

  • Assolute: G1 X105 Y10 Z54 F2000
  • Relative: G1 X10 Y-12 Z9 F2000

I comandi

Come vedi utilizzare le assolute è per certi versi più intuitivo e semplice se conosci il punto esatto del piano in cui stai o su cui dovrai andare. Più semplice invece l’utilizzo delle relative quando si inseriscono degli script in mezzo al gcode senza dover stare li ad azzerare coordinate in continuazione. Tanto per dare per dare una paio di informazioni sui codici da inserire in un gcode:

  • G90 : tutte le coordinate scritte DOPO questo comando verranno lette in maniera ASSOLUTA, comprese quelle dell’estrusore
  • G91 : tutte le coordinate scritte DOPO questo comando verranno lette in maniera RELATIVA, comprese quelle dell’estrusore

E’ possibile poi creare situazioni “ibride” inserendo altri comandi come:

  • M82 : tutte le coordinate DI ESTRUSIONE (solo queste) scritte DOPO questo comando verranno lette in maniera ASSOLUTA
  • M83 : tutte le coordinate DI ESTRUSIONE (solo queste) scritte DOPO questo comando verranno lette in maniera RELATIVA

Il comando che viene scritto per primo ha la precedenza, quindi presta bene attenzione all’ordine in cui li scrivi. Dire:

M83

G90

è ben differente dal dire

G90

M83

Nel primo caso stiamo dicendo “coordinate estrusione relative (M82)” e nella seconda riga diamo il comando che sovrascrive il comando precedente dicendo “ leggi TUTTE le coordinate dopo questo comando in modo assoluto”. La seconda proposta è quella più corretta.

Esempio concreto

Fino ad ora abbiamo parlato solo dei movimenti degli assi, per quanto riguarda l’estrusore invece? Per meglio spiegare come funziona troverai qui di seguito due estratti di un gcode, sono la stessa identica sezione, solo che la prima è generata con coordinate ASSOLUTE per l’estrusore e per i movimenti degli assi XYZ, mentre la seconda presenta coordinate RELATIVE per l’estrusore e assolute per gli assi XYZ.

Se dai una sguardo alle coordinate di movimento di XYZ noterai che sono esattamente le stesse (ovviamente). Ciò che cambia è come viene gestita l’estrusione:

Se assoluta vedrai che parte da un AZZERAMENTO della coordinata E (G92 E0) e poi prosegue via via in maniera progressiva fino ad aver totalizzato un’ estrusione di 9.6688 mm. Terminato questo tratto deve effettuare una “retraction” ovvero tirare indietro del materiale per evitare fenomeni di stringing. Il comando G92 E0 in questa fase è FONDAMENTALE: ricorda che siamo in coordinate di tipo ASSOLUTO, dando il comando G1 E-4 F2400 la macchina farebbe girare indietro la ruota dell’estrusore fino alla coordinata E-4, ovvero trovandosi a E9.6688 vuol dire una ritrazione di ben 13.6688 mm !! In questo caso può andare in negativo perchè sull’estrusore non esistono dei fine corsa che fisicamente impedirebbero di andare oltre lo 0. Ecco quindi che ci viene in aiuto il comando G92 E0, quando lo trovate significa che da quel momento in poi la nuova coordinata di partenza della E sarà proprio 0. Quindi la routine di una ritrazione sarà:

  • azzeramento della coordinata attuale con il comando G92 E0
  • ritrazione del materiale con la coordinata G1 E-4 F2400
  • ritorno alla coordinata 0 estrudendo con  G1 E0 F2400 (in pratica riporta il materiale in camera di estrusione pronto per essere estruso. Se hai abilitato delle funzioni tipo “extra restart distance” di solito te le ritroverai aggiunte in questo passaggio).
  • azzeramento della coordinata attuale con il comando G92 E0 (ridondante)

Se relativa tutto è molto più semplice in quanto non c’è da azzerare la coordinata della E per fare delle ritrazioni, semplicemente basta dare il comando negativo e poi subito positivo dello stesso valore. Cioè se vado a E-4 poi dopo per far ritornare il filamento in camera di estrusione mi basterà scrivere E4; ti starai chiedendo “ehi ma così stai estrudendo 8 mm di filamento!”…NO ! Rileggi bene quanto avevo scritto più in alto nella spiegazione degli assi relativi XYZ, E-4 diventa un punto di arrivo da considerarsi quasi come un punto “zero” di partenza , quindi inserendo la coordinata E4 semplicemente gli stiamo dicendo (alla macchina) “ ehi estrudi 4 mm”. Tornando all’analisi del gcode ti accorgerai benissimo di questo concetto, come vedi (rispetto al gcode assoluto) la E non è incrementale bensì per ogni riga di codice ti viene detto ESATTAMENTE quanto materiale viene estruso per quel tratto di movimento. Se fai la somma di tutte queste piccole estrusioni che valore ti trovi? 9.669 mm estrusi che è un valore molto SIMILE a quello trovato alla fine del codice con coordinate assolute (9.6688mm, guarda le ultime righe dello schema in grassetto).

Piccola nota sul comando G92: prima lo abbiamo usato per dire “imposta la nuova coordinata zero dell’estrusore a 0 (G92 E0) ma nessuno ci vieta di utilizzarlo anche per gli altri assi! Se noi ad esempio spostiamo manualmente (proprio a mano) il carrello di stampa in una posizione random del piano , e vogliamo che quest’ultima diventi il nostro zero assoluto di macchina, ci basterà lanciare il comando G92 X0 Y0. Però se ci pensate la descrizione del comando G92 https://reprap.org/wiki/G-code#G92:_Set_Position  dice “SET POSITION”  quindi vuol dire che le coordinate possono essere anche diverse da zero… Ti lascio questo spunto per ragionarci un attimo sopra, vedrai che lo capirai al volo! Per chi proviene dal mondo CNC e programmazione a “bordo macchina” e sanno che queste cose sono la BASE per la programmazione Gcode.

Meglio Assolute o Relative?

Quindi tirando le somme è meglio optare per movimenti di tipo relativo o assoluto? Dipende… per gli assi XYZ sicuramente valori assoluti (e comunque dipende dalla situazione), quando si deve considerare l’estrusione è meglio usare valori di tipo relativo. Perchè? Il discorso qui si fa molto più interessante ma complicato in quanto entrano in gioco gli errori che il firmware introduce nell’interpretare le coordinate sempre più grandi che si sommano in una situazione assoluta. In pratica gli “errori di arrotondamento” introdotti dal calcolo in virgola mobile https://github.com/Ultimaker/CuraEngine/issues/14 si sommano mano a mano che il codice avanza. In alcuni slicer infatti si tende ad inserire spesso il comando G92 E0 proprio per evitare di dover far calcolare al firmware (convertire mm in step di movimento del motore) numeri molto grandi. Con l’estrusione relativa, come potete notare, i numeri restano sempre nell’ordine dello 0.XX e alle volte (nei tratti di estrusione più lunghi) capita di trovare numeri superiori allo 0. Questo vale per nozzle piccoli da 0.4 mm, se ovviamente passate ad un nozzle da 2 mm tutti questi valori saranno MOLTO più grandi. Un bel casino direte voi… ma tranquilli, ai fini PRATICI possiamo anche evitare di farci troppi problemi e proseguiamo a stampare come abbiamo sempre fatto!

Stanco di non trovare la soluzione ?

Porta le tue competenze al livello successivo

Ecco perchè ho detto BASTA ai corsi di gruppo