adaptando Marlin

Siendo un magnífico programa, Marlin tiene aspectos que no se adaptan bien a mi idea de cómo debe funcionar una impresora 3D. En la medida de mis posibilidades iré retocando el código haciendo lo que creo que son mejoras.

Crear una rama de desarrollo de Marlin para colaborar a en su evolución está fuera de mi alcance porque no conozco a fondo la programación de microcontroladores, y sobre todo porque no puedo validar el código en distintas plataformas. Cuando quiera aportar algo que le llegue a todos los usuarios probaré a traducir los mensajes al patués o al élfico, porque ese tipo de "mejoras" parecen ser muy populares.

He agrupado los cambios en bloques de compilación condicional, intentando que fueran lo más independientes posible.

#define MAKA_PULIDO

Cualquier programador que haya estado involucrado en proyectos que evolucionan sabe que el código siempre tiene mocos: redundancias, algoritmos mejorables, errores que raramente llegan a ponerse de manifiesto y no suelen ser graves, etcétera.

Con esta directiva agrupo las pequeñas correcciones que he ido haciendo, pero también algún añadido, como por ejemplo el mantener en el LCD los mensajes de alerta hasta que se detecta interacción humana, para tener la certeza de que el operador ha podido ver el mensaje. Luego se recupera el mensaje previo.

Otro añadido consiste en limitar la velocidad máxima en los ejes X e Y a la velocidad de homing mientras no se conozca bien la posición. La posición es bien conocida tras un homing, y pasa a ser desconocida si se deja a los motores sin corriente.

#define MAKA_AUTONOMA

Este bloque es para eliminar la comunicación serie, que no hace ninguna falta en una impresora autónoma. Supone 17Kb de ahorro que en algún caso puede ser interesante recuperar.

#define MAKA_KILL_INMEDIATO

No hace mucho han incorporado a Marlin una "mejora" que consiste en retrasar el apagado cuando se pulsa el botón de kill, por si se pulsa por error.

Yo tengo una seta roja instalada en un lateral de mAka para el apagado de emergencia, y cuando tengo que darle un manotazo espero que reaccione cuanto antes. Esta directiva anula ese retardo en el apagado que han añadido.

#define MAKA_LCD_ENCODER

El botón de la pantalla LCD se usa entre otras cosas para cambiar parámetros, pero resulta tedioso si hay que hacer un gran cambio. Con esta modificación, cuando estás editando una cantidad y giras rápido avanza de 5 en 5 unidades.

#define MAKA_VENTILADOR

Descripción del problema

El menú LCD tiene una opción para establecer la velocidad del ventilador de capa que podemos enchufar al conector D9 de la RAMPS, pero le encuentro 2 pegas:

  • si queremos que el ventilador funcione en los contornos y no en los rellenos resulta imposible ajustarlo durante la impresión, porque como mucho al acabar la capa se pierde el valor que hayamos puesto.

  • el menú permite establecer la corriente que llega al ventilador mediante un número entre 0 y 255. Cada paso en la rotación del botón aumenta o disminuye una unidad, así que podemos afinar la corriente que llega al ventilador en incrementos de menos de un 0,4%: una precisión innecesaria e incómoda de tratar. Creo que sería preferible ajustar en incrementos de un 10%.

Solución

El comando "M106" enciende el ventilador a tope, a no ser que indiquemos una potencia con "M106 S<n>". Yo propongo añadir un matiz: "M106" no enciende el ventilador a tope, sino al valor indicado con un comando "M106 P<n>" previo, que por defecto será 255. De esta forma, "M106 S<n>" no pierde su significado, y "M106" tampoco, a no ser que lo hayamos matizado con "M106 P<n>".

Con esta estrategia podemos inicializar la impresión de una pieza con el valor de velocidad de ventilador que queramos mediante el comando "M106 P<n>" e indicar al fileteador que encienda el ventilador a tope ("M106" a secas) en los perímetros y lo apague ("M107") en los rellenos.

El menú LCD tiene una opción en Control->Temperaturas para ajustar instantáneamente la velocidad del ventilador. El ajuste de la velocidad por defecto es un concepto distinto, así que debería estar en otra opción, y quizá en otro submenú. Pero hay que ser pragmáticos y no hacer añadidos superfluos al menú: si estamos imprimiendo una pieza que hemos decidido que se haga parando el ventilador a ratos, lo que interesa es ajustar la velocidad en todos los ratos en los que debe funcionar, y no instantáneamente. Y si la pieza se va a hacer sin hacer cambios de velocidad en el ventilador, querremos poder ajustar su velocidad en el momento.

Con el cambio que propongo en el menú LCD, lo que haremos será actuar sobre ambos parámetros a la vez: la velocidad actual y la máxima por defecto.

#define MAKA_PRODUCCION

Algunos comportamientos de mAka cambian dependiendo de lo que esté haciendo. Por ejemplo, que no haya filamento mientras lo estemos cambiando es normal. Pero que no haya filamento mientras estamos fabricando una pieza es un problema grave.

Mi propuesta es distinguir un modo de funcionamiento normal del modo producción, que se puede cambiar por menú o con g-code M67[P|S], y se consulta con M119.

Esta directiva se activa automáticamente dependiendo de MAKA_SONDA_Z, MAKA_FIILAMENTO y MAKA_TEMPERATURA (descritas más adelante).

#define MAKA_Z_PROBE

Cualquier sistema de cálculo de la altura de la cama puede fallar, y entonces ¿qué pasa si...

  • mientras Z baja esperando un cambio en el estado de un endstop, el cambio no llega?

  • la cama tiene un desnivel excesivo, hasta el punto de que no es posible imprimir?

  • el sistema de autolevel ha fallado y es el endstop Z de respaldo el que está respondiendo?

Con esta directiva agrupo algo de código preventivo para dar respuesta a estas preguntas. Sencillamente, la impresión se detiene avisando con un mensaje que no tiene una medida fiable de Z.

Imaginemos que tenemos una sonda de Z a 5mm sobre la cama, y un endstop Z de respaldo a 4. Al iniciar una impresión se calienta el fusor, se hace un homing (G28), se mide el plano de la cama (G29), y a continuación hacemos un G0 Z4.5 para llevar fusor a una altura intermedia entre la de la sonda y la del endstop de respaldo. Entonces pasamos al modo de producción con M67S, que se encarga de verificar que el endstop de Z está sin pulsar. De lo contrario, significa que el autolevel lo ha hecho el de respaldo, y no la sonda móvil de Z, así que hay que abortar la impresión.

#define MAKA_SONDA_Z

El código propio de la sonda de accionamiento mecánico está delimitado con esta directiva. Prácticamente se reduce a una rutina de activar y desactivar la sonda, sin más misterio.

#define MAKA_PAUSA

Descripción del problema

Controlar la impresora con un gestor que se comunique con ella por USB o similares es fácil y cómodo, pero te obliga a tener una sesión iniciada y operativa durante todas las horas que dure la impresión. A cambio, hay un control absoluto que permite hacer pausas, interrogar a la impresora sobre su estado y modificar parámetros.

Si eres de los que prefieren dar independencia a la impresora y manejarla totalmente desde un menú LCD apreciarás esta mejora.

Imagina la situación: el filamento se atasca y el tornillo ranurado se lo come de manera que pierde el control sobre el filamento. Por suerte, te das cuenta cuando la impresión todavía se puede salvar: puedes hacer una pausa desde el menú LCD, resolver el atasco y continuar, pero:

  • es muy recomendable que levantes el fusor, sobre todo porque habrá que sacar algún churrito de plástico y no quieres que se añada a la pieza.

  • necesitarás tomar nota de las coordenadas exactas del fusor, para poderlo llevar a una posición donde sea cómodo trabajar, y dejarlo luego donde estaba.

  • mover el fusor con precisión se puede complicar, porque el menú LCD mueve los motores a saltos que a veces resultan excesivos.

  • si se te va la mano y mueves el carro del fusor al retirar el filamento y colocarlo de nuevo la has pifiado, porque la pieza se terminará de hacer desplazada. Si haces un homing para llevar el carro a una posición conocida puede ser peor, porque al buscar el origen en Z se puede destruir la pieza que estamos haciendo.

  • lo más cómodo para cambiar el filamento es sacarlo accionando el extrusor hacia atrás y meter el nuevo también con el extrusor, siempre sin quitar la rueda que presiona el filamento contra el tornillo ranurado. Todos los movimientos que hayas hecho se compensan al reanudar la impresión, de manera que el extrusor se lía a sacar o meter filamento como un loco hasta que compensa todas las maniobras que has hecho durante el cambio. El resultado es un gurruño de plástico sobre la pieza a medio hacer, que tendrás que quitar volviendo a pausar la impresión, tomando nota de las coordenadas, desplazando el fusor...

Marlin tiene una opción (FILAMENTCHANGEENABLE) que permite hacer una pausa para cambiar el filamento con el comando M600, pero no deja capacidad de maniobra: por eso no me gusta y he programado otra.

Otra utilidad de la pausa se me ocurrió haciendo un llavero. Diseñé la pieza con un alojamiento para incrustar un aro de alambre que sobresaliera un poco para poner ahí la anilla del llavero. En la parte alta del alojamiento añadí un M25 editando el .gcode a mano. La impresión se para, se coloca el aro de alambre, unas gotas de cianocrilato, un poco de bicarbonato, proseguir la impresión y me quedó un llavero chulísimo.

Solución

El comando estándar de pausa es el "M25", así que he implementado la pausa mejorada que hace lo mismo que la pausa estándar, pero además toma nota de la posición del fusor, lo levanta un poco y retrae algo de filamento.

La reanudación mejorada se ejecuta con "M24", que devuelve el fusor a su posición, recuperando el filamento retraído en la pausa. Hay que tener en cuenta que:

  • podemos maniobrar con el extrusor cuanto sea necesario: al reanudar se considera que el filamento está donde debe estar, sin necesidad de reajustar su posición.

  • no se toma nota de las temperaturas de fusor y cama, porque es posible que tras la pausa se quiera seguir con otros parámetros, así que si se modifican será responsabilidad del usuario restaurarlas.

  • en el caso de hacer movimientos a mano habrá que reajustar la posición con un homing.

El menú LCD hará ahora una pausa mejorada, y además incorpora una opción de llevar al origen X e Y.

La pausa desactiva el modo de producción para permitir más capacidad de acción, y al reanudar se recupera el modo de funcionamiento que hubiera antes.

Actualización: la última versión de Marlin que he encontrado ya tiene una pausa mejor que la que yo conocí cuando programé la mía, no me apetece revisar gratis la mejora oficial, así que me quedo con mi código porque me ofrece suficiente confianza.

#define MAKA_ALARMAS

Hay circunstancias en las que conviene avisar con luz y/o sonido, y para eso he programado un sistema de alarmas que gestiona luces y pitidos del zumbador intermitentes. Como el pitido es molesto, se apaga automáticamente en cuanto se actúa con el menú LCD. El estado silente o no de la alarma se puede controlar por menú o con comandos g-code "M68[P]", y consultar con "M119."

#define MAKA_DESORDEN

Cuando la impresora está desorientada puede hacer ruidos muy desagradables. Si no los has oído nunca, prueba lo siguiente: deja el carro X a mitad de recorrido, apaga la máquina, enciende y haz G0 X200. Si lo haces, reza para que no se rompa nada.

Yo uso la impresora para fabricar piezas de plástico, pero también para hacer circuitos impresos y agujeros que requieren precisión. Para ello manejo la impresora en modo manual, a menudo con movimientos relativos y sin homing previo, porque ajusto una posición a ojo y a partir de ahí debe hacer una secuencia de movimientos que habitualmente preparo con una hoja de cálculo. En esas condiciones cualquier error provoca un descontrol de esos que dan miedo.

Para evitar problemas, mAka tiene 8 sensores de desorden mecánico. Son mini-microrruptores conectados en serie. Cuando X, Y o Z de van 1mm más allá de los límites establecidos, uno de los 8 sensores abre el circuito de desorden mecánico y la impresora se detiene cortando la corriente de los motores, y avisa con luz y sonido del sistema de alarmas. Es una situación de emergencia que no precisa confirmación de ningún tipo.

#define MAKA_FILAMENTO

Calcular si queda filamento suficiente para la pieza que vamos a fabricar es fácil. Lo difícil es prever cuándo se va a romper el filamento.

Un sensor avisa de la falta de filamento, que se traduce en luz y aviso legible en modo normal con el sistema de alarmas. En modo de producción además emite pitidos, desactiva el fusor y la impresión entra en pausa. La cama no se deja enfriar, porque podría provocar que la pieza se despegue. Tras la pausa y con el filamento puesto se puede proseguir la impresión.

#define MAKA_TEMPERATURA

Tengo instalado un termistor redundante en el fusor, y a veces hace cosas raras. Las medidas no son muy uniformes, y puede ocurrir que una medida anormalmente baja en el termistor principal se vea seguida por una anormalmente alta en el secundario, y entonces se aborta la impresión. La primera modificación ha sido que mAka no tome decisiones sólo por una medida, sino que espere a tener unas cuantas consecutivas que supongan indicio de problemas.

Una vez que mAka decide que hay un problema se notifica con luz y sonido del sistema de alarmas, y si estamos en modo de producción se abortará la impresión. En modo normal se irá refrescando el diferencial de temperatura entre los termistores.

Otra solución que no descarto en un futuro es cambiar el termistor loco por uno fiable.

dónde encontrar el código descrito

Las modificaciones que he comentado a mi me funcionan, y he procurado que le funcionen a cualquiera con una configuración adecuada. Sólo he tocado el código correspondiente a impresoras de movimiento convencional. No he probado impresoras delta ni core-xy, ni otra placa controladora que no sea la RAMPS con Arduino Mega. El código lo puede usar quien quiera con la misma licencia GNU 3.0 de Marlin, siempre bajo su responsabilidad.

Las modificaciones están hechas a partir de la versión de Marlin que descargué el 5/Ago/2015, que tienes disponible en github.com/sacamantecas/Marlin junto con los fuentes que he modificado.