En esta primera entrada de nuestro blog empezamos adentrándonos en las tripas de las impresoras 3D open source. Más concretamente en el firmware que cargara nuestro arduino o la electrónica que hayamos elegido siendo su configuración muy similar salvo por algún punto que es específico para cada electrónica.
En este nos centraremos en la electrónica Arduino MEGA2560 + Ramps 1.4 que es una de las combinaciones más usadas y más económica, aunque disponéis de
multitud de variantes entre ellas la electrónica “SAV” diseñada en España y de una calidad y funcionamiento excelente.
El primer paso que debemos realizar es conseguir el firmware, concretamente el marlín, es el que configuraremos pero como pasa con la electrónica existen otros tipos gratuitos como marlín pero este es el más usado en la comunidad de habla hispana y en el que más soporte encontraremos.
Los descargaremos desde github.com.
Para cargar marlín en la placa arduino o compatible necesitaremos su software también podemos usarlo para modificarlo aunque yo personalmente para editar la configuración de marlín prefiero este.
Vamos al lio…
Ya tenemos la herramientas, ahora nos falta poco a poco tragarnos el código de marlín, en un principio puede parecer un galimatías, pero os aseguro que si lo trasteamos en poco tiempo nos aremos con él ya que está todo bien explicado y ordenado dentro del firmware.
*Esta guía de configuración no está destinada a ningún modelo de impresora concreto, cada uno debe adaptarlo a sus necesidades una vez comprendida la utilidad de las diferentes variables.
Yo voy a hacerlo mediante el programa sublime text 2 que deje un poco más arriba (es totalmente gratuito).
-Descomprimimos el archivo de marlín.rar, con por ejemplo winrar.
-Una vez descomprimido abrimos marlín>configuration.h
1. Seleccionado nuestra electrónica
1.1. Aquí nos las primeras líneas que nos interesan son las relacionadas con la electrónica especifica que vamos o estamos utilizando en nuestra impresora 3D.
#ifndef MOTHERBOARD#define MOTHERBOARD BOARD_RAMPS_13_EFB #endif
1.2. El campo que debemos definir es “#define MOTHERBOARD BOARD_RAMPS_13_EFB” sustituyendo BOARD_RAMPS_13_EFB por la placa que estemos usando. En este caso es arduino + ramps 1.4 con un solo extrusor.
1.3. Para saber que variable debemos elegir vamos a abrir el archivo boards.h que está en la misma carpeta que co
nfiguration.h.
1.4. Aquí tenemos el listado completo de placas para las cuales marlín vienen pre-configurado, solo debemos copiar la variable y sustituirla.
1.5. Si estuviésemos utilizando la placa “Azteeg X1” quedaría en configuration.h de la siguiente manera “#define MOTHERBOARD BOARD_AZTEEG_X1”
2. Temperatura
Ahora vamos a elegir nuestros termistores para que la impresora sepa en todo momento cuál es su temperatura real tanto para la heatbed (cama caliente) como para el hotend (fusor) y pueda realizar correctamente el PID.
2.1. El primer código que nos interesa es el siguiente:
#define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 -1 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_BED 0
2.2. En nuestro caso la impresora solo tiene un extrusor por lo que solo nos interesan los valores TEMP_SENSOR_0 y TEMP_SENSOR_BED, el resto los dejaremos a 0 para anularlos, si más adelante añadimos otro extrusor deberemos pasar por estas líneas de código y modificarlo.
2.3. Para saber qué número corresponde con nuestro termistor debemos fijarnos en las líneas anteriores que aparece algo como lo siguiente:
//// Temperature sensor settings: // -2 is thermocouple with MAX6675 (only for sensor 0) // -1 is thermocouple with AD595 // 0 is not used // 1 is 100k thermistor - best choice for EPCOS 100k (4.7k pullup) // 2 is 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) // 3 is Mendel-parts thermistor (4.7k pullup) // 4 is 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! // 5 is 100K thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (4.7k pullup) // 6 is 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup)
2.4. En nuestro caso el termistor que hemos montado es el numero 5 tanto para el fusor como para la cama caliente por lo que el código queda definitivamente así:
#define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_BED 5
2.5. El código de a continuación esta correcto tal y como está pero podemos modificarlo a nuestro gusto, son los límites de temperatura que si por algún motivo se alcanzan estas temperaturas saltara la protección de marlín y detendrá todo.
#define HEATER_0_MAXTEMP 275 (temperatura máxima del fusor) #define HEATER_1_MAXTEMP 275 #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define BED_MAXTEMP 120 (temperatura máxima de la cama caliente)
3. PID
*Este apartado no es necesario modificarlo tampoco pero explicaremos como hacerlo por si nos interesa ajustar nuestro PID, aunque repetimos que tal y como viene en marlín suele funcionar perfectamente.
3.1. Dentro de repetier host, este no lo hemos mencionado anteriormente pero bueno nunca es tarde para hacerlo, debemos dirigirnos a “control manual” y dentro del campo de texto G-code usaremos lo siguiente:
3.1.1. Para el fusor: M303 E-0 S<temperatura> C<nº de ciclos>. Ejemplo M303 E-0 S235 C8
3.1.2. Para la cama caliente: M303 E-1 S<temperatura> C<nº de ciclos>. Ejemplo M303 E-1 S90 C8
3.1.3. Recomiendo hacer esto con el fusor y el cama caliente a temperatura ambiente, tras un minuto o dos nos devolverá unos valores finales para Kp, Kd y Ki en cada una de las pruebas los cuales debemos sustituir dentro de nuestro archivo configuration.h de marlín.
3.1.4. Los valores son los siguientes: #define DEFAULT_Kp 22.2 #define DEFAULT_Ki 1.08 #define DEFAULT_Kd 114
3.1.5. Debemos fijarnos cuales vamos a cambiar ya que los primeros corresponden al fusor y los siguientes a la cama caliente, debemos fijarnos dentro de que título se encuentra cada uno:
3.1.5.1. Hotend = PID Settings
3.1.5.2. Cama caliente = PID > Bed Temperature Control
4. Ajustes mecánicos
4.1. Nos encontramos con el siguiente código, el cual es encargado de controlar la lógica de los finales de carrera, así si por ejemplo queremos convertir nuestro contacto NC (normalmente cerrado) en NA (normalmente abierto) debemos dejarlo por defecto. Realmente el final de carrera no cambia nada solo la forma en que marlín lo interpreta así si vemos que la impresora no se mueve hacia “home” y está en mitad del eje puede deberse a que a que detecta que está presionando el final de carrera y solo deberemos invertir su lógica para resolverlo (es raro que esto pase pero para que os hagáis una idea).
const bool X_MIN_ENDSTOP_INVERTING = true; const bool Y_MIN_ENDSTOP_INVERTING = true; const bool Z_MIN_ENDSTOP_INVERTING = true; const bool X_MAX_ENDSTOP_INVERTING = true; const bool Y_MAX_ENDSTOP_INVERTING = true; const bool Z_MAX_ENDSTOP_INVERTING = true;
4.2. Ahora nos encontramos con este código que tiene la función de invertir la lógica pero en este caso de los motores paso a paso. En el caso de que demos la orden a un motor de moverse a la izquierda y lo haga hacia la derecha tenemos dos opciones.
4.2.1. Voltear el conector del motor en las ramps.
4.2.2. Poner en “true” el eje que queremos invertir.
#define INVERT_X_DIR true #define INVERT_Y_DIR false #define INVERT_Z_DIR true #define INVERT_E0_DIR false #define INVERT_E1_DIR false #define INVERT_E2_DIR false #define INVERT_E3_DIR false
4.3. Ahora vamos a limitar el tamaño de nuestra área de impresión a los máximos reales de nuestra impresora para no hacer que el carro del eje choque con el final de este.
#define X_MAX_POS 205 #define X_MIN_POS 0 #define Y_MAX_POS 205 #define Y_MIN_POS 0 #define Z_MAX_POS 200 #define Z_MIN_POS 0
4.3.1. Para realizar esta tarea necesitaremos por ejemplo el repetier host que mencionábamos más arriba aunque existen más opciones.
4.3.2. Una vez en repetier y la pestaña de control manual hacemos home de por ejemplo el eje “x” (repetiremos este proceso con los demás ejes).
4.3.3. Una vez en “0” o “home” debemos empezar a hacer movimientos hacia la derecha en un principio grande y conforme nos acercamos al final de eje reducirlos para ajustarlo al máximo en el menor tiempo posible.
4.3.4. Cuando este apunto de tocar la pieza del otro extremo del eje (un milímetro aproximadamente) comprobaremos la distancia total recorrida que nos marca repetier y sustituiremos este valor en marlín en el código arriba mencionado.
5. Pasos y velocidad
#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.08/3,7601.1} #define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} #define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000}
5.1. #define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.08/3,7601.1}
5.1.1. Este parámetro se encarga de definir para marlin el tipo de mecánica que tenemos montada y traducirlo para hacer el movimiento en milímetros.
5.1.2. Dentro de repetier tenéis en la pestaña herramientas>calculadora correas, allí especificáis ángulo del motor, dientes de la polea, tipo de polea… nos devolverá el valor que debemos poner. Estos son los valores para mi prusa I3:
#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,4000,775} #define DEFAULT_AXIS_STEPS_PER_UNIT {x, y, z, extrusor}
5.2. Los valores que le siguen hacen referencia al avance, aceleración… Como no puedo dar una explicación exacta de cada uno dejare los que uso.
#define DEFAULT_MAX_FEEDRATE {500, 500, 2, 25} #define DEFAULT_MAX_ACCELERATION {9000,9000,5,6000} #define DEFAULT_ACCELERATION 2000 #define DEFAULT_RETRACT_ACCELERATION 2000