Ya estamos casi al final del proceso. Es importante que a la hora de realizar este paso, comprobemos que la estructura es robusta y que todo el cableado es correcto. De esta forma, los errores que tengamos durante la calibración los podremos achacar a nuestro código, y evitaremos dolores de cabeza.
Abrimos marlin con Arduino, que lo tenemos ya descargado y subido (sin calibrar) a la placa si has ido realizando todos los pasos (incluidos los del anexo). Si no es así lo descargamos ahora desde github. Esto es lo que nos encontraremos cuando lo abramos.
Vamos a trabajar en la pestaña de Configuration.h.
Lo primero que haremos será seleccionar la electrónica que vamos a utilizar. En mi caso será el número 33 ya que uso la RAMPS y hemos enchufado un ventilador en lugar de 2 hotends, como vimos en la entrada anterior. Según la electrónica que utilices tendrás que asignar un número distintos. Viene un listado con bastantes ejemplos en forma de comentario.
//// The following define selects which electronics board you have. Please choose the one that matches your setup #ifndef MOTHERBOARD #define MOTHERBOARD 33 #endif
Ahora pasamos a seleccionar el termistor, al igual que en el caso anterior, tendremos un listado con algunos ejemplos de termistores típicos, en mi caso, seleccionaré el número 5. En el cableado lo pusimos a los pines T0, así que esta es la línea que nos interesa.
#define TEMP_SENSOR_0 5
El siguiente parámetro tiene que ver con la temperatura a la hora de comenzar la impresión. Customízalo como mejor te resulte.
- TEMP_RESIDENCY_TIME: indica el tiempo que tiene que estar entre los límites antes de considerarse correcto.
- TEMP_HYSTERESIS: el rango de temperaturas que se consideran cercanas, es decir, las fronteras inferior y superior a la temperatura.
- TEMP_WINDOW: cuando se cumple que la temperatura objetivo es igual a la temperatura actual más o menos la TEMP_WINDOW, el contador para TEMP_RESIDENCY_TIME se inicia.
Por ejemplo, con el código que adjunto, si mandamos el comando M109 S190, estamos indicando que el hotend ha de ponerse a 190ºC. Cuando llegue a 189ºC el contador empezará a contar, y cuando esté 10 segundos entre 187 y 193, se considerará que se ha alcanzado la temperatura y se recibirá un OK.
// Actual temperature must be close to target for this long before M109 returns success #define TEMP_RESIDENCY_TIME 10 // (seconds) #define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one #define TEMP_WINDOW 1 // (degC) Window around target to start the recidency timer x degC early.
Lo siguiente es indicar la temperatura mínima para extruir. Esto es un parámetro de protección, y su objetivo es evitar que extruyas filamento en caso de que el plástico aún sea sólido. De nuevo, cada línea corresponde a los pines que hemos usado a la hora de realizar la conexión. En el ejemplo hemos puesto 150ºC. Si únicamente quieres comprobar que el nema se mueve y no has metido el plástico, poniendo una temperatura inferior a la temperatura ambiente es suficiente para «saltarse» esta protección. Si ponemos un 0, nos arriesgaríamos a que el termistor esté roto o la conexión mal hecha y no nos daríamos cuenta ya que esta protección no estaría cumpliendo una de las funciones para la que fue diseñada. Esto es una «ñapa». Haciéndolo bien, si queremos mover el motor del extrusor sin calentar en un momento puntual, enviando el comando M302 antes de mover el nema sería suficiente para «desbloquear» esta restricción.
#define HEATER_0_MINTEMP 150
El siguiente parámetro es lo mismo, pero en lugar de límite inferior, límite superior. Cuando el termistor detecte una temperatura superior a la temperatura límite, el cartucho calefactor se apagará. Según el material del cuerpo del hotend nos interesará poner un valor u otro.
#define HEATER_0_MAXTEMP 250
Control de temperatura PID
Un controlador PID es un mecanismo de control por realimentación ampliamente usado en sistemas de control industrial. Este calcula la desviación o error entre un valor medido y un valor deseado.
El algoritmo del control PID consiste de tres parámetros distintos: el proporcional, el integral, y el derivativo. El valor Proporcional depende del error actual. El Integral depende de los errores pasados y el Derivativo es una predicción de los errores futuros. La suma de estas tres acciones es usada para ajustar al proceso por medio de un elemento de control como la posición de una válvula de control o la potencia suministrada a un calentador. [Wikipedia]
La idea de ajustar el PID es que cuando estemos imprimiendo la temperatura sea lo más estable posible, que las oscilaciones respecto a la «temperatura ideal» sean las mínimas.
Para poder configurarlo bien vamos a hacer un autotune. Para ello, abriremos Pronterface o la Pronterface UI del Cura, por ejemplo. A la hora de realizar este proceso, lo ideal es que la impresora esté en las condiciones lo más parecidas posibles a las que tendremos a la hora de imprimir en el futuro. El comando a usar es el siguiente. Supongamos que vamos a imprimir a 195º.
M303 S<temperatura> C<ciclos> //ciclos = numero de iteraciones //Por ejemplo M303 S195 //Si no ponemos ciclos hará los que vienen por defecto
Comenzará el proceso del autotune y tras un rato obtendremos unos valores: Kp, Ki y Kd. Cogemos esos valores y los ponemos en el código que estamos editando.
#define DEFAULT_Kp tu_valorKp//19.22 #define DEFAULT_Ki tu_valorKi//1.87 #define DEFAULT_Kd tu_valorKd//49.45
Ahora vamos a los endstops. Como eGarbigune no usa finales de carrera, los tendremos que desactivar. Para ello comentamos la siguiente línea.
//#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
Ahora es hora de trabajar con los ejes.
Primero vamos a decidir si queremos bloquear (false) los steppers cuando estén parados o dejarlos en punto muerto(true).
// Disables axis when it's not being used. #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false #define DISABLE_E false // For all extruders
Una vez hecho eso, vamos a comprobar que los ejes se mueven en el sentido correcto. Para ello, desde pronterface (por ejemplo) moveremos de forma manual los tres ejes(x,y,z) y el extrusor(e0). El procedimiento es sencillo, en Marlin tenemos el siguiente código. Desde pronterface moveremos cada eje 10mm (por ejemplo) hacia la derecha. Si el «volumen» de impresión se mueve en ese sentido, dejamos la línea de código de ese eje como está, si el movimiento esperado es en sentido contrario cambiamos de true a false o viceversa. Si no queremos cambiar el código, podemos dar la vuelta al conector.
#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true #define INVERT_Y_DIR true // for Mendel set to true, for Orca set to false #define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true #define INVERT_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
Tenemos que tener en cuenta las coordenadas relativas que usamos. Hemos marcado el punto O(0,0,0) en la imagen. Lo que realmente debemos comprobar es que al realizar los movimientos los valores de las coordenadas aumentan. Supongamos que estamos en el eje z, para aumentar el valor de la coordenada z tenemos que mover la superficie de impresión hacia abajo. Con el eje x pasa lo mismo, debemos mover la superficie de impresión hacia la izquierda.
Cálculo de pasos
Ahora vamos a medir de forma precisa los pasos de los steppers. de esta forma cuando le digamos que se mueva 16 mm se moverá 16mm y no 17, por ejemplo. El procedimiento que vamos a utilizar va a ser iterativo. Cuantas más iteraciones realicemos más nos acercaremos. Es una sencilla regla de 3.
Supongamos que le mandamos mover 10mm, pero se mueve 12mm. Nos preguntaremos. Con el valor original se ha movido 12mm, ¿cuánto tengo que poner para que se mueva 10mm?
Resultado_medido (12mm) |
– |
Valor_firm (Valor en arduino) |
Resultado_ideal(10mm) |
– |
Nuevo_valor_firm |
Nuevo_valor_firm = (Resultado_ideal*Valor_firm)/Resultado_medido
#define DEFAULT_AXIS_STEPS_PER_UNIT {x,y,z,e} // default steps per unit for ultimaker #define DEFAULT_MAX_FEEDRATE {200, 200, 200, 50} // (mm/sec) #define DEFAULT_MAX_ACCELERATION {1000,1000,1000,3000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.
Con el extrusor el procedimiento es el mismo, pero midiendo lo que extruye. Lo más facil es tomar una referencia en el nema, por ejemplo quitar el racor y por el agujero por donde sale el plástico hacer un marca. Mandas extruir y mides cuánto se ha movido la marca. La regla de tres funciona igual. Yo para no quitar el racor, lo que hice fue medir la retracción por el lado contrario al racor. Vale cualquiera de los dos métodos.
Realizamos este proceso varias veces hasta obtener el resultado esperado. Pero la mejor manera de calibrar esto es realizando algunas impresiones, así que vamos a imprimir nuestra primera pieza.
Primera pieza
Vamos a empezar haciendo por ejemplo un cubo de 20mmx20mmx10mm. Nosotros usaremos el Cura para imprimir, explicamos en un anexo cómo configurarlo para la eGarbigune. Cuando tengas el cubo hecho, mide las distancias y haz alguna iteración en DEFAULT_AXIS_STEPS_PER_UNIT para lograr los mejores resultados. Para terminar os dejo una foto de la que fue mi primera pieza y un pequeño vídeo de la primera vez que eché plástico. Antes de imprimir recuerda colocar la impresora en la posición (0,0,0) de forma manual. Para ello mueve los tres ejes hasta los topes, así puedes maximizar el volumen. Pon el espejo con unas pinzas de papelería si no lo has hecho, echa un poco de laca Nelly para la adhesión, por ejemplo y nivela la cama con los muelles de las 4 esquinas.
> Siguiente paso
Una respuesta a “Paso 6 – Calibración y primera pieza”