Costruire una stampante 3D – [PARTE 5] Configurazione firmware

Questo articolo è stato pubblicato da circa 3 anni . Le informazioni che seguono potrebbero non essere attuali.

Nel 5° capitolo di questa guida (il penultimo) ci occuperemo della configurazione del firmware, ovvero del programma che viene caricato sul microcontrollore Arduino, il quale avrà il compito di interpretare le istruzioni contenute nel file gcode e gestire di conseguenza la stampante. Alla fine della guida la stampante sarà “tecnicamente completa”, mancherà solo la fase finale di taratura per procedere con la prima stampa di prova.

In questa ultima fase seguiremo abbastanza pedissequamente i video di Jules Gilson (JG) e . Nella nostra personalizzazione della configurazione del firmware Marlin faremo un mix di entrambi i video cercando di fornire una lista di sequenziale e ben organizzata di tutti i passi da fare.

Il software necessario in questa fase è il seguente:

  • MARLIN firmware. Il firmware open source da caricare sulla scheda Arduino Mega (https://marlinfw.org/).
  • Arduino IDE. E’ il software necessario per programmare le schede Arduino, nel nostro caso ci servirà da editor di testo per modificare il firmware Marlin e successivamente caricarlo sul microcontrollore (https://www.arduino.cc/en/main/software).

Inizieremo scaricando il firmware per poi personalizzarlo e successivamente caricarlo su Arduino. Dopo inizierà la fase di taratura finale, fase in cui ci saranno diverse cose da mettere a punto con un po’ di attenzione.

I video da tenere come riferimento sono rispettivamente il video n° 8 di JG e la parte finale del di Tom’s 3D, dove viene installato l’ambiente di sviluppo Arduino, testata la connessione con la scheda Arduino, per poi passare alla fase di personalizzazione del firmware.

Scaricate L’IDE Arduino, installatelo ed aprite il programma.

Alla prima apertura troverete nell’editor del codice già scritto necessario per la programmazione e l’esecuzione dei dei programmi. Collegate Arduino al computer tramite il cavo USB, poi dal menù Strumenti scegliete la scheda ATmega2560 (Mega 2560) e selezionate la porta corretta.

La porta di connessione corretta può essere trovata per tentativi, oppure può essere rilevata dalla gestione periferiche del computer alla voce porte (COM e LPT).

Una volta connesso Arduino e configurato l’IDE, cliccate sull’icona con la freccia che serve a effettuare la compilazione ed il caricamento del programma, in questo caso un “programma vuoto”. Una volta completato il caricamento, se nel log nel basso della finestra non rilevate errori potete procedere con il prossimo step, altrimenti con molta probabilità avete sbagliato la configurazione della porta o potrebbero essersi verificati altri problemi.

Nel finale del di Tom’s 3D si può vedere che dopo vari tentativi e test la scheda “clone Arduino” non funziona e dovrà essere sostituita.

Nel video di JG che prendiamo come riferimento viene utilizzato un programma di esempio incluso nell’IDE, il quale consiste nel far lampeggiare il led presente sulla scheda Arduino Mega. Potete trovare il programma nel menù File > Esempi > 01.Basics > Blink. Questo potrebbe essere un buon test per verificare che il vostro Arduino Mega funzioni correttamente. Ovviamente per vedere il led lampeggiare bisognerà separare Arduino dalla scheda RAMPS.

Verificato che è possibile caricare uno sketch (programma) sulla scheda Arduino, si può scaricare il firmware Marlin. Nella nostra realizzazione abbiamo usato la versione 1.1.8 (scaricabile a questo link), al momento sono disponibili anche le versioni 1.1.9 e 2.0.2 (sconsigliata). Per un neofita alla prima realizzazione è consigliabile scaricare la versione 1.1.8 per poter seguire pedissequamente la documentazione presente in questa guida.

Una volta scaricato il pacchetto, decomprimete l’archivio e andate nella cartella Marlin dove sono presenti tantissimi file con estensione .h e .cpp, tra questi dovreste trovare anche il file Marlin.ino contraddistinto dalla tipica icona di Arduino.

Aprendo il file Marlin.ino si avvierà l’IDE di Arduino che caricherà tutti i file con compongono il firmware.

Il file su cui andremo a lavorare per personalizzare il firmware sarà configuration.h . Lo troverete esplorando le varie schede che si sono aperte all’interno dell’IDE.

La prima fase di personalizzazione del file configuration.h servirà a permetterci di iniziare a muovere la stampante mantenendoci entro margini di sicurezza evitando di causare danni. Successivamente bisognerà affinarli e fare correzioni per la configurazione finale.

Prima di procedere vi ricordiamo l’importanza di salvare sempre le modifiche che apporterete, ma sopratutto ricordatevi di compilare ciclicamente lo sketch al fine di verificare che non ci siano errori nella scrittura di parametri o errori di battitura che vi impedirebbero di caricare il programma su Arduino. Per compilare lo sketch potete usare il pulsante con il simbolo di spunta.

All’interno del file ci saranno dei parametri a cui assegnare dei valori, oppure ci sarà da abilitare o disabilitare delle funzioni. In particolare, l’abilitazione o la disattivazione avviene “commentando” o “decommentando” la riga che contiene la funzione. Il “commentare” consiste nell’aggiungere i caratteri // all’inizio della riga, i quali servono a disattivare la direttiva. Eliminando i simboli // riabilitiamo la direttiva in quanto andiamo ad eliminare il simbolo di commento. Noterete che la direttiva commentata (disattiva) sarà di colore grigio, quando verrà decommentata acquisirà i colori della codifica Arduino.

Facciamo un esempio pratico con la prima riga che andremo a modificare per assegnare un nome alla nostra stampante che verrà visualizzato sul display:

//#define CUSTOM_MACHINE_NAME "3D Printer"

Decommentiamo la riga eliminando i simboli // e modifichiamo il testo tra virgolette con uno di nostro piacimento.

#define CUSTOM_MACHINE_NAME "informatica37.it"

Come avrete notato, la riga è preceduta da spiegazioni sulla direttiva in oggetto che sono commentati e di colore grigio, quindi non verranno interpretati dal microcontrollore.

// Optional custom name for your RepStrap or other custom machine
// Displayed in the LCD "Ready" message
// IT37 - nome stampante

Ai commenti abbiamo aggiunto una sorta di tag // IT37 con un nostro commento, questa accortezza faciliterà la ricerca di direttive modificate quando bisognerà tornare nel file per fare delle correzioni. E’ consigliabile usare i commenti anche per appuntarsi valori impostati precedentemente o qualsiasi altra informazione ci possa essere utile a tenere traccia delle modifiche apportate.

Esamineremo il lunghissimo file configuration.h in maniera sequenziale, nel caso abbiate bisogno di cercare all’interno del file potrebbe tornarvi molto utile la funzione “trova” dell’IDE Arduino (Modifica > Trova oppure CTRL+F), velocizzerà di molto la ricerca delle direttive e dei commenti.

Partiamo modificando il diametro di filamento di default.

// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc.
// IT37 - modificato da informatica37.it
#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 //3.0

Come vedete è stato inserito il valore 1.75 ed è stato commentato il valore originale di 3.0.

Impostiamo la tipologia di termistori utilizzati per il blocco riscaldante dell’estrusore sensor 0 e per il piatto riscaldato sensor bed.

// IT37 - da ricontrollare
#define TEMP_SENSOR_0 13 //1
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_3 0
#define TEMP_SENSOR_4 0
// IT37 - da ricontrollare
#define TEMP_SENSOR_BED 13 //0

Sopra questa direttiva troverete un elenco di termistori che corrispondono ad un valore di riferimento, nella nostra realizzazione abbiamo utilizzato dei termistori “standard di produzione cinese” che corrispondono al numero 13. Abbiamo inserito il commento “da ricontrollare” per eventuali correzioni successive, se non siete certi della tipologia di termistore potete anche lasciare provvisoriamente il valore 1.

Impostiamo la temperatura massima a cui interrompere precauzionalmente il riscaldamento di estrusore e piatto. Montando una gola in teflon, per il momento limitiamo la temperatura massima di 250° per l’estrusore, eventualmente potrà essere corretta successivamente nel caso questo valore possa limitare la stampa di materiali come l’ABS.

// When temperature exceeds max temp, your heater will be switched off.
// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
// You should use MINTEMP for thermistor short/failure protection.
// IT37 da ricontrollare, modifico in 260 estrusore e 130 per il piatto
#define HEATER_0_MAXTEMP 260 //275
#define HEATER_1_MAXTEMP 275
#define HEATER_2_MAXTEMP 275
#define HEATER_3_MAXTEMP 275
#define HEATER_4_MAXTEMP 275
#define BED_MAXTEMP 130 //150

Vediamo ora le impostazioni del PID necessario al controllo e gestione delle temperature di riscaldamento dell’hot end e del piatto. Iniziamo da quello dell’hot end.

// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it

// Ultimaker
//#define DEFAULT_Kp 27.34
//#define DEFAULT_Ki 2.21
//#define DEFAULT_Kd 84.56

Questi valori non possono essere modificati perchè sono il risultato di una procedura di auto calibrazione che dovrà essere eseguita dalla stampante. Una volta caricato il firmware, nel prossimo ed ultimo capitolo, ci collegheremo alla stampante con il software Pronterface con cui effettueremo la taratura finale, il quale, oltre a permetterci di controllare la stampante con un controller virtuale ci consente anche di inviare dei comandi gcode alla stampante. Grazie a questo programma invieremo il comando di calibrazione del PID, al termine del quale ci otterremo i valori dei tre parametri: Kp, Ki e Kd. Se volete approfondire in cosa consiste il controllo tramite PID trovate maggiori informazioni su Wikipedia ed a questo link. Volendo semplificare estremamente: se noi impostiamo la temperatura di fusione a 200°, il PID consente di mantenere costante questa temperatura senza oscillazioni. Con un PID non calibrato opportunamente avremmo delle continue oscillazioni anche di diversi gradi in più o in meno che ci impedirebbero di avviare la stampa o peggio potrebbero innescare le protezioni del firmware che interromperebbero il riscaldamento.

Nel nostro caso abbiamo effettuato diverse calibrazioni del PID, che abbiamo conservato commentando quelle obsolete.

// Prusa i3 clone
// IT37 calibrazione 1
//#define DEFAULT_Kp 27.34
//#define DEFAULT_Ki 2.21
//#define DEFAULT_Kd 84.56

// IT37 calibrazione 2
//#define DEFAULT_Kp 28.14
//#define DEFAULT_Ki 2.20
//#define DEFAULT_Kd 89.90

// IT37 calibrazione 3 con "heat block protection"
#define DEFAULT_Kp 36.56
#define DEFAULT_Ki 3.46
#define DEFAULT_Kd 96.58

Per quanto riguarda il PID del piatto riscaldato valgono le stesse considerazioni.

// IT37 abilitiamo PID per il piatto, da ricontrollare e calibrare
#define PIDTEMPBED

[...]

// IT37 da ricontrollare, è settato al massimo
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current

[...]

// IT37 - Prusa i3 Clone - 12v MK3 heated bed
#define  DEFAULT_bedKp 765.55
#define  DEFAULT_bedKi 139.48
#define  DEFAULT_bedKd 1050.43

In entrambi i casi lasciate i valori di default, torneremo a modificarli successivamente alle procedure di calibrazione.

Attiviamo l’opzione di sicurezza che ci permette di evitare l’estrusione a freddo.

#define PREVENT_COLD_EXTRUSION
// IT37 - modificato
#define EXTRUDE_MINTEMP 180

Questa rappresenta la temperatura al di sotto della quale viene interdetta l’estrusione di materiale, la nostra impostazione di base è di 180°.

Passiamo ora alla parte del firmware che riguarda gli “aspetti meccanici”. In questa fase verranno impostate delle configurazioni che probabilmente andranno modificate successivamente, oppure richiederanno una modifica al verso di connessione dei motori o dei finecorsa.

Iniziamo con il decommentare le 3 posizioni dei nostri finecorsa.

// Specify here all the endstop connectors that are connected to any endstop or probe.
// Almost all printers will be using one per axis. Probes will use one or more of the
// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
#define USE_XMIN_PLUG
#define USE_YMIN_PLUG
#define USE_ZMIN_PLUG

Nell’immagine che segue dovrebbe essere più chiaro il posizionamento dei finecorsa sulla stampante rispetto al riferimento cartesiano. Nel nostro caso il finecorsa Z è costituito dalla sonda capacitiva, che come avrete potuto testare, nella parte alta ha un led di colore rosso che si spegne quando viene avvicinato alla sua estremità blu qualcosa di metallico.

Successivamente bisogna configurare il funzionamento dei finecorsa utilizzati. Nel nostro caso abbiamo utilizzato delle schedine elettroniche che contengono il microswitch di finecorsa con un led rosso e il pull up, quindi bisognerà tenere commentate le seguenti direttive.

// coarse Endstop Settings
// IT37 stiamo usando schede endstop con pull up integrato
//#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors

#if DISABLED(ENDSTOPPULLUPS)
// fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined
//#define ENDSTOPPULLUP_XMAX
//#define ENDSTOPPULLUP_YMAX
//#define ENDSTOPPULLUP_ZMAX
//#define ENDSTOPPULLUP_XMIN
//#define ENDSTOPPULLUP_YMIN

// IT37 ricontrollare perchè usiamo la sonda e non i finecorsa
//#define ENDSTOPPULLUP_ZMIN
//#define ENDSTOPPULLUP_ZMIN_PROBE
#endif

Come vedete nei nostri commenti, ci eravamo riservati di abilitare eventualmente il pull up per l’asse Z in cui utilizziamo la sonda capacitiva in alternativa al finecorsa. In effetti non c’è stato bisogno di attivare queste funzioni.

L’ultima configurazione sui finecorsa dipende dalla loro logica di funzionamento normalmente chiuso o normalmente aperto. E’ bene verificare la propria configurazione per poi modificare successivamente il firmware, è sconsigliabile cambiare il cablaggio del finecorsa.

// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
// IT37 controllare praticamente e cambiare la logica qui
#define X_MIN_ENDSTOP_INVERTING true// set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe.

Passiamo ora alla configurazione che riguarda la movimentazione dei motori. In questa fase ci saranno da fare alcune considerazioni teoriche e un affinamento dei settaggi che richiederà un po’ di tempo.

Di base si tratta di definire il valore dello spazio compiuto grazie alla rotazione dei motori, misurato in steps/mm (step del motore per millimetri). Questo valore dipende dalle caratteristiche costruttive del motore, dal passo delle cinghie (assi X e Y) e delle barre filettate (asse Z) misurati in mm, dal valore di microstepping desiderato.

I valori che troverete preimpostati sono i seguenti.

/**
* Default Axis Steps Per Unit (steps/mm)
* Override with M92
* X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]]
*/
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 }

Come avrete già intuito, i valori da sinistra a destra corrispondono rispettivamente a: 80 steps/mm (asse X), 80 steps/mm (asse Y), 4000 steps/mm (asse Z), 500 steps/mm (estrusore E). Per comprendere bene questi valori e poterli calcolare è bene soffermarsi un attimo sulla teoria.

Nel capitolo precedente (al paragrafo “Motori stepper, driver e microstepping”) è già stato spiegato cos’è il microstepping, ed i jumper della scheda RAMPS sono stati configurati in modo che qualsiasi tipo di driver andremo a montare, questo funzionerà al massimo del microstepping. Avendo dei motori il cui albero ruota di 1,8° ad ogni passo, la loro rotazione di 360° sarà composta da 200 passi (360/1,8=200). Alla luce di questo, montando dei driver A4988 che hanno un microstepping massimo  di 1/16, ogni passo del motore verrà suddiviso in 16 microstep, quindi potrà essere controllato su 3200 passi per giro (200*16=3200). Montando driver DRV8825 (microstepping di 1/32), il motore potrà essere controllato su 6400 passi per giro (200*32=6400).

Per quanto riguarda gli assi X e Y, che sono movimentati da cinghie dentate con passo da 2 mm tramite pulegge a 16 denti, se uso dei driver A4988, che fanno lavorare il motore su 3200 passi, avrò un valore teorico di partenza di 100 steps/mm. Il calcolo che ha portato a questo risultato è il seguente:

3200 passi / 2 mm di passo cinghia / 16 denti puleggia = 100 steps/mm

Volendo utilizzare driver DRV8825 (con microstepping massimo doppio), il valore sarà esattamente il doppio rispetto ai driver A4988.

6400 passi / 2 mm di passo cinghia / 16 denti puleggia = 200 steps/mm

Rissumendo i valori di partenza in steps/mm relativi agli assi X e Y:

  • 100 steps/mm con driver A4988 e motori con 1,8°/step, cinghie passo 2mm, puleggia 16 denti passo 2 mm.
  • 200 steps/mm con driver DRV8825 e motori con 1,8°/step, cinghie passo 2mm, puleggia 16 denti passo 2 mm.

Passiamo ora al calcolo relativo all’asse Z, che in questo caso si muove su barre filettate anziché su cinghia-puleggia. I motori fanno ruotare le barre filettate su cui è imperniato tutto l’asse X che si muove linearmente sull’asse verticale. In questo caso è fondamentale conoscere i concetti di base relativi alle filettature, in particolare le definizione di passo e principi. Questi concetti vengono spiegati molto bene nel nostro articolo sulla stampa 3D, al capitolo 3.2 – Telaio e Movimentazioni (contenuto anche nel nostro libro sulla stampa 3D).

Esempio di filettature a 1, 2 e 3 principi.
Esempio di filettature a 1, 2 e 3 principi.

Riassumendo le definizioni: il passo (pitch) è la distanza tra due “creste” consecutive della filettatura, mentre l’avanzamento (lead) è la distanza di cui trasla linearmente la vite in un giro. Le filettature possono avere un solo principio (single start), ovvero essere costituita da una sola elica, in questi casi il passo e l’avanzamento coincidono, quindi se ho un passo di 2 mm avrò un avanzamento di 2 mm ad ogni giro. Le filettature però possono essere realizzate con 2 o più eliche “attorcigliate” tra loro, dove ogni elica rappresenta un principio. In questi casi l’avanzamento sarà pari al passo moltiplicato per il numero di principi. Nel nostro caso utilizziamo delle viti a 4 principi (4 starts) con un profilo trapezioidale di passo 2 mm (pitch), quindi avremo un avanzamento di 8 mm (lead) ad ogni rotazione (4 principi * 2 mm di passo). Quando si acquistano le barre filettate per l’asse Z bisogna guardare bene ai parametri pitch e lead della filettatura.

Per ottenere il valore in steps/mm per l’asse Z bisognerà dividere il numero di microstep massimo del motore per l’avanzamento (lead).  Quindi risulterà:

  • 400 steps/mm con driver A4988 (3200/8=400) e viti passo 2 mm a 4 principi.
  • 800 steps/mm con driver DRV8825 (6400/8=800) e viti passo 2 mm a 4 principi.

Per finire passiamo alla definizione del corretto valore di steps/mm per il motore dell’estrusore. Nel capitolo 3 di questa guida, al paragrafo relativo all’assemblaggio e montaggio del corpo estrusore, è stato segnalato quale puleggia (pignone godronato, hobbed gear) acquistare (MK8 o clone Prusa). In base al tipo di puleggia, bisognerà andare a misurare il diametro centrale della parte zigrinata. Nel nostro progetto li abbiamo acquistati entrambi, poi abbiamo optato per il clone con diametro 6 mm. La versone MK8 aveva un diametro di 7 mm.

Per prima cosa calcoliamo il diametro del pignone zigrinato moltiplicando il diametro misurato per π.

 6 mm * 3,1415 = 18.849 mm

A questo punto, essendo il pignone montato sull’albero motore non abbiamo nessun rapporto di riduzione da applicare, quindi procediamo con il calcolo degli steps/mm relativo alle due tipologie di driver:

  • 169,77 steps/mm con driver A4988 (3200/18,849) e pignone godronato da 6 mm di diametro.
  • 339,54 steps/mm con driver DRV8825 (6400/18,849) e pignone godronato da 6 mm di diametro.

A questo punto possiamo scrivere i valori calcolati nel file configuration.h. Nel caso in cui si optasse per l’utilizzo di soli driver DRV8825 con 6400 microstep per giro avremo i seguenti valori di partenza.

#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 339.54 }

In altre realizzazioni ci è capitato di utilizzare dei driver A4988 per X ed Y, e dei driver A4988 per L’estrusore e l’asse Z. In questo caso la configurazione sarebbe la seguente, dove si nota che gli steps/mm di Z ed E sono praticamente dimezzati.

#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 169.77 }

Questi valori andranno poi “ritoccati” con delle prove specifiche di stampa, andandole a misurate con il calibro, misura che servirà a ricalcolare il valore esatto di steps/mm.

Ci siamo dilungati un po’ in questioni teoriche perché riteniamo sia molto importante capire il significato dei numeri che inseriamo nel file di configurazione. Se volete verificare i vostri calcoli o essere semplicemente più veloci, potete usare il Prusa Calculator, un’applicazione web che vi permette di calcolare i valori di partenza semplicemente inserendo i dati della vostra configurazione meccanica.

Passiamo a settare velocità partendo da valori più “prudenti” rispetto quelli di default.

// IT 37 - diminuire velocità per iniziare, valori di default = 300, 300, 5, 25
#define DEFAULT_MAX_FEEDRATE { 200, 200, 10, 25 }

Il Jerk è un parametro molto importante che impatta sulla qualità di stampa, è definito come la “minima variazione velocità tale da richiedere una accelerazione”. E’  un po’ complesso da spiegare, utili a comprendere meglio il suo significato pratico ed il suo settaggio.

// IT37 - mantengo valori bassi (x e y potrebbero essere doppi)
#define DEFAULT_XJERK 10.0
#define DEFAULT_YJERK 10.0
#define DEFAULT_ZJERK 0.4 //0.3
#define DEFAULT_EJERK 2.0 //5.0

Il prossimo passo riguarda la configurazione del sensore capacitivo di livellamento automatico che è montato sull’estrusore (Z Probe).

// IT37 sensore capacitivo abilitato
#define FIX_MOUNTED_PROBE

Dopodiché bisognerà dare informazioni sull’effettiva posizione della sonda rispetto all’ugello (nozzle), facendo riferimento allo schema proposto.

Bisognerà munirsi di un righello per misurare le distanze sul piano XY.

// IT37 Posizione sensore bed rispetto all'estrusore
#define X_PROBE_OFFSET_FROM_EXTRUDER 23 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 9 // Y offset: -front +behind [the nozzle]

Questi valori stanno a significare che: guardando la stampante frontalmente, la sonda è 23 mm a destra dell’ugello e 9 mm dietro all’ugello. La figura di riferimento indica infatti che a destra e dietro all’ugello vanno usati valori positivi.

L’offset rispetto a Z andrà calcolato successivamente con dei test sulla stampante in movimento.

Riguardo alla sonda, bisogna fare molta attenzione ai parametri riguardanti i “margini” espressi in mm da lasciare alla sonda rispetto al piatto per evitare che questa possa urtare qualcosa durante la fase di calibrazione (es. viti del piatto di stampa).

// IT37 - impedire al sensore di sbattere mentre si sposta per la calibrazione
#define Z_CLEARANCE_DEPLOY_PROBE   4      //10  // Z Clearance for Deploy/Stow
#define Z_CLEARANCE_BETWEEN_PROBES 4 //10 //5   // Z Clearance between probe points

I valori di default erano rispettivamente 10 mm e 5 mm, siamo partiti con valori prudenti (10; 10) poi successivamente abbiamo affinato a 4 mm e 4 mm. Il consiglio è sempre quello di partire da valori con margini più ampi.

Passiamo alla definizione della direzione dei motori. In questi casi si può scegliere se modificare il firmware o semplicemente invertire la posizione del connettore del motore che si muove in direzione errata.

// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
// IT37 da ricontrollare la direzione motori
#define INVERT_X_DIR false
#define INVERT_Y_DIR false // true
#define INVERT_Z_DIR false

Nel nostro caso abbiamo impostato tutto impostato su “false”, verificheremo nella fase di taratura se ci sarà bisogno di invertire il verso di connessione dei rispettivi motori sulla scheda RAMPS. In pratica invertendo il verso di connessione si inverte il senso di rotazione del motore.

Abilitiamo un parametro importante, ovvero un movimento verso l’alto dell’asse Z al fine di evitare collisioni quando si effettua la posizione di homing, ovvero quando tutte le componenti della stampante vanno ad attivare i finecorsa.

// IT37 abilito l'alzata di Z quando vado ad home per evitare collisioni (viti fissaggio piatto o altro)
#define Z_HOMING_HEIGHT 2 //4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ...
// Be sure you have this distance over your Z_MAX_POS in case.

Siamo partiti con un valore di 4 mm che poi abbiamo potuto affinare a 2 mm, anche in questo caso è meglio partire da valori alti per una maggiore sicurezza.

Andando avanti nel file di configurazione arriviamo ai travel limits, che servono a definire la posizione del piatto di stampa rispetto ai finecorsa, ovvero l’area utile di stampa rispetto alla posizione di home (quando tutti i finecorsa sono attivati). Potete facilmente notare che nella posizione di home degli assi X e Y, la punta dell’ugello fuori dal piatto di stampa, inoltre le viti di fissaggio del piatto potrebbero essere leggermente sporgenti quindi è bene che l’ugello possa lavorare sul piatto di stampa all’interno dei suoi margini

// IT37 - da ricontrollare
// The size of the print bed
#define X_BED_SIZE 210 //200
#define Y_BED_SIZE 193 //200
// Travel limits (mm) after homing, corresponding to endstop positions.
// IT37 - da ricontrollare
#define X_MIN_POS -5 // valore per cui il nozzle è all'inizio del piatto senza urtare le viti del piatto
#define Y_MIN_POS -11 // valore per cui il nozzle è all'inizio del piatto senza urtare le viti del piatto // potrei aumentare di 1 o 2 previo controllo
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 190

In generale, una volta definite le dimensioni del piatto di stampa (es. 200 mm x 200 mm), andiamo ad impostare di quanto l’ugello è fuori dal piatto rispetto ad X ed Y. Anche in questo caso è bene partire con valori “conservativi” da affinare con un successivo test pratico, JG ad esempio parte valori estremamente prudenti.

#define X_MIN_POS -10
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS 190
#define Y_MAX_POS 190
#define Z_MAX_POS 150

Andiamo avanti e disabilitiamo momentaneamente min_software_endstops, sia per X e Y che per Z. Queste funzioni, quando sono attive, ci permettono di andare al di sotto delle posizioni minime impostate al fine di poter calibrare lo spazio operativo dei componenti della stampante. Una volta terminata la procedura di taratura della stampante, questi parametri dovranno essere riattivati (decommentati) in quanto servono ad impedire di muovere i componenti in movimento al di fuori del loro definito perimetro di funzionamento, evitando potenziali danneggiamenti alle componenti della stampante.

// Min software endstops curtail movement below minimum coordinate bounds
// IT37 - commento MIN SOFTWARE ENDSTOPS lo posso riabilitare dopo aver ricontrollato
// limite minimo impostato via fw
//#define MIN_SOFTWARE_ENDSTOPS
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
#define MIN_SOFTWARE_ENDSTOP_X
#define MIN_SOFTWARE_ENDSTOP_Y
// IT37 - disattivare quando si calibra sensore induttivo PINDA
#define MIN_SOFTWARE_ENDSTOP_Z
#endif

La sezione successiva del file di configurazione riguarda il livellamento automatico del piatto di stampa. Abilitiamo la funzionalità decommentando la riga che segue.

// IT37 abilito modalità calibrazione
#define AUTO_BED_LEVELING_BILINEAR

Successivamente impostiamo la griglia di calibrazione.

// Set the number of grid points per dimension.
// IT37 modifico i punti di calibrazione
#define GRID_MAX_POINTS_X 4 // default = 3
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X

Dopodiché accertiamoci di aver disabilitato la funzionalità sperimentale della BILINEAR_SUBDIVISION.

// IT37 - disabiliare ABL_BILINEAR_SUBDIVISION
//#define ABL_BILINEAR_SUBDIVISION
#if ENABLED(ABL_BILINEAR_SUBDIVISION)

Abbiamo impostato 4 punti per X ed assegnato gli stessi punti ad Y, quindi la griglia sarà composta da 16 punti di calibrazione (4*4) sulla superficie del piatto.

Di conseguenza bisognerà impostare la massima area di azione della sonda. Con i travel limit abbiamo impostato l’area in cui si può muovere l’ugello. Quando questo sarà sul bordo destro del piatto, la sonda sarà per forza di cose fuori dal piatto, essendo montata a destra dell’ugello e sfasata della sopracitata probe offset in X e in Y. Nella fase di calibrazione bisogna far si che la sonda sia sempre confinata all’interno del piatto affinché possa effettuare la calibrazione. Per esserne sicuri impostiamo quindi la sua massima escursione in X  ed Y come travel limit dell’ugello sottratto del probe offset.

// Set the boundaries for probing (where the probe can reach).
// IT37 posizioni massime della sonda sul piatto
// si basano sui TRAVEL LIMITS e PROBE_OFFSET impostati sopra
// sottrarre "probe offset x" al "travel limits" RIGHT, sottrarre "probe offset y" a BACK
#define LEFT_PROBE_BED_POSITION 23 //15
#define RIGHT_PROBE_BED_POSITION 203 //170
#define FRONT_PROBE_BED_POSITION 9
#define BACK_PROBE_BED_POSITION 184 //170

Guardando l’immagine precedente con i 16 punti di calibrazione della sonda, l’ugello si trova a sinistra di tali punti, sfasato della distanza definita nel probe offset.

Di seguito c’è una parte relativa ai valori di temperature di preriscaldamento predefinite dell’ugello e del piatto, relativi ai due materiali più popolari: il PLA e l’ABS.

// Preheat Constants
#define PREHEAT_1_TEMP_HOTEND 180
#define PREHEAT_1_TEMP_BED 70
#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255

#define PREHEAT_2_TEMP_HOTEND 240
#define PREHEAT_2_TEMP_BED 110
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255

Il preriscaldamento è utile sia per il cambio filamento, ma sopratutto per la taratura della stampante prima di avviare una lavorazione. Ad esempio il livellamento del piatto va fatto con la stampante “a caldo”, in quanto la temperatura influenza le componenti metalliche come il piatto e l’ugello, quindi è bene fare le tarature in una condizione identica a quella della fase di stampa. Anche il sensore induttivo che utilizziamo per la calibrazione automatica ha una sensibilità diversa con stampante “a caldo” o “a freddo”, quindi anche in questo caso è bene preriscaldare la stampante prima di effettuare la taratura automatica della distanza piatto-ugello e avviare la stampa. Questi valori predefiniti possono essere ovviamente personalizzati in base alle vostre esigenze. Nel nostro caso abbiamo fatto alcune piccole modifiche facoltative.

//IT37 modifico temperature pre riscaldamento
#define PREHEAT_1_TEMP_HOTEND 200
#define PREHEAT_1_TEMP_BED 50
#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255

#define PREHEAT_2_TEMP_HOTEND 240
#define PREHEAT_2_TEMP_BED 70
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255

Un’opzione utile, ma facoltativa, è quella di abilitare EEPROM_SETTINGS. Questa funzione serve a memorizzare la configurazione di alcuni parametri nella memoria della scheda Arduino.

// IT37 - salvataggio settings su EEPROM
#define EEPROM_SETTINGS // Enable for M500 and M501 commands

Abilitando questa funzione avremmo la possibilità di modificare alcuni parametri direttamente dalla stampante senza dover ricaricare l’intero firmware. Tutte le modifiche che verranno fatte dalla stampante avranno priorità sul firmware, tuttavia sarà possibile ritornare alle “impostazioni di default” definite nel firmware. Per fare un esempio: potrei modificare il valore degli step/mm di un motore senza dover modificare e ricaricare il firmware, semplicemente modifico il valore tramite il display della stampante e salvo il valore personalizzato, che avrà priorità sul valore impostato nel file configuration.h. Abilitare questa funzione può essere molto utile una volta che il firmware è stato configurato e non si prevede di apportare ulteriori modifiche. In questo modo la stampante sarebbe configurabile senza bisogno di collegarla ad un computer per ricaricare il firmware modificato.

Di seguito riportiamo le direttive che riguardano l’abilitazione e configurazione del display con lettore di schede SD.

Nel nostro caso è stato impiegato un display testuale (non grafico) chiamato “RepRapDiscount Smart Controller“.

// IT37 – Abilito LCD Testuale
#define ULTRA_LCD // Character based
//#define DOGLCD // Full graphics display

[…]

// IT37 – abilito supporto schede SD
#define SDSUPPORT

[…]

// This option reverses the encoder direction everywhere.
// Set this option if CLOCKWISE causes values to DECREASE
//
// IT37 – faccio girare il selettore in senso orario
#define REVERSE_ENCODER_DIRECTION

[…]

// Individual Axis Homing
// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu.
//
// IT37 – abilito voci di menù per mandare in HOME i singoli assi da display
#define INDIVIDUAL_AXIS_HOMING_MENU

[…]

// IT37 – tra i vari modelli abilito la mia versione del dispaly LCD
#define REPRAP_DISCOUNT_SMART_CONTROLLER

[…]

Con la configurazione del display abbiamo terminato la prima versione del file di configurazione del firmware, possiamo quindi effettuare la compilazione e caricamento su Arduino tramite il pulsante di caricamento.

Nel prossimo ultimo capitolo effettueremo la taratura della stampante ed andremo ad affinare il file di configurazione del firmware.

Clicca su questo link per tornare al capitolo introduttivo con l’indice degli argomenti.

Rispondi