Seis años de impresiones decepcionantes: lo que mi delta FLSun QQ-S tenía de verdad, y cómo la calibramos de una vez por todas
Tres defectos de fábrica nunca vistos en 233 horas, un firmware que dejaba los motores sin fuerza, seis espirales, dos días perdidos en una pista falsa — y la regla que lo arregló todo
En dos minutos, si tienes una delta que «imprime regular» y ningún ajuste cambia nada
- El síntoma: una FLSun QQ-S comprada en 2020, 233 horas y 970 m de filamento, nunca satisfactoria del todo. Paredes débiles, cotas desviadas un 2 %, una primera capa imposible de ajustar en todo el plato a la vez. Al lado de una Bambu Lab, daba pena.
- Lo que encontramos, en orden: un extrusor que empujaba un 11,5 % menos de material desde el primer día (un valor erróneo en la memoria del firmware); unos ángulos de torre nunca calibrados (+1,02° y +0,45°, todas las correcciones a cero en la EEPROM); y, al pasar a Klipper, una corriente de motor que la placa fija por PWM y que la configuración oficial de Klipper para esta impresora no fija — motores sin par, homing imposible.
- Lo que funcionó: recalibrarlo todo en caliente, en el estado en que la máquina imprime, con un solo método de medida (la hoja de papel), en el orden geometría → cero → malla del plato → primera capa. Treinta y cinco minutos. Una espiral de control uniforme de borde a borde, un cubo a 20,00 mm en Z.
- Lo que no funcionó, y costó dos días: corregir la malla del plato encima de una geometría errónea, con un método de micrómetro que se equivocaba justo donde la boquilla estaba demasiado cerca. El detalle está en La pista falsa, porque es lo más instructivo.
- Para reproducirlo: el procedimiento completo, los archivos de configuración, los scripts y las piezas de prueba están al final del artículo. Sin sonda, sin acelerómetro, una hoja de papel y un calibre.
Este artículo pretende poder leerse sin saber nada de impresoras delta: cada término se explica la primera vez que aparece, y un glosario lo resume al final. Los recuadros «Para ir al fondo» se despliegan para quien quiera la cinemática, los valores y los comandos.

El banco el tercer día. Todo lo que sirvió de juez: el calibre, un viejo micrómetro en pulgadas, el cubo de 20 mm, los marcos de primera capa, los cuadrados de espesor numerados a rotulador y, detrás, la pieza de siete pilares de la calibración extendida.
Una máquina «siempre un poco decepcionante»
Tengo una impresora delta FLSun QQ-S, comprada en enero de 2020. Una delta es esa impresora en forma de torre triangular en la que la boquilla cuelga de tres brazos articulados que suben y bajan por tres columnas; no hay ejes X, Y y Z separados como en una impresora cartesiana: la posición de la boquilla es el resultado de un cálculo a partir de la altura de los tres carros. Es rápida, silenciosa, elegante, y mucho más sensible a los errores de geometría que una máquina de ejes rectos: un brazo un milímetro demasiado largo o una columna desviada un grado no dan un error simple, sino una deformación en cuenco, en cúpula o en trébol que varía por todo el plato.
Poco usada, esta máquina siempre había sido un poco decepcionante. No catastrófica: las piezas salían. Pero las paredes no tenían consistencia, las cotas estaban desviadas unas décimas, la primera capa nunca agarraba en todas partes, y sobre todo ningún ajuste tenía un efecto claro. Había acabado imprimiendo con una boquilla más gruesa «para que fuera más rápido», cambiando las correas tras destruir un juego por sobretensión, y aparcando la máquina junto a una Bambu Lab que, ella sí, imprime bien sin que se le pida nada.
Esa comparación es lo que lanzó la investigación. No «cómo ajusto mi slicer», sino qué tiene exactamente esta máquina, y qué se puede recuperar. Este artículo cuenta tres días, del 4 al 6 de septiembre de 2026, llevados a cabo con una IA (Claude) que pilota la impresora, escribe las herramientas y lee los manuales, mientras yo sostengo el calibre, la hoja de papel y la cámara. Cuenta también un bonito error de método, el suyo y el mío, porque es lo que pasa cuando se busca de verdad.
El dispositivo
El firmware original iba a ser sustituido por Klipper. Klipper es un firmware de impresora 3D en dos partes: un programa minúsculo en la placa de la impresora, que solo pilota motores y calentadores en tiempo real, y un programa anfitrión, en un ordenador al lado, que hace todo lo demás: la cinemática, las calibraciones, las macros. Se pierde la pantalla táctil de la impresora (Klipper no sabe manejarla), se ganan herramientas de calibración que no existen en ningún otro sitio, en particular para las deltas.
Lo que Klipper aporta, en concreto, frente al Repetier original —o a un Marlin—:
- El cálculo deportado. Un firmware clásico hace toda la cinemática delta en el pequeño microcontrolador de la placa, con las aproximaciones que eso impone; Klipper la hace en el ordenador anfitrión, en coma flotante, y solo envía a la placa instantes de paso precalculados. En una delta, donde cada movimiento es una raíz cuadrada por columna, se nota en la precisión de los movimientos y en la velocidad posible.
- Las herramientas de calibración:
DELTA_CALIBRATE, que deduce la geometría completa a partir de siete puntos, con o sin sonda; la calibración extendida de los brazos; la malla del plato; yTUNING_TOWER, que hace variar un parámetro con la altura durante la impresión, para ajustar en una pieza lo que exigiría diez intentos. - El pressure advance y el input shaper, la compensación de la presión en el bowden y la de las vibraciones, que el firmware original no tiene y que explican la mayor parte de la diferencia de calidad con una máquina moderna.
- Una configuración en archivo de texto, legible, comentable, versionable, donde cada valor tiene su procedencia; y un socket local desde el que se pilota todo con un script.
Lo que no aporta: no eleva el techo de caudal del hotend, no sustituye una mecánica errónea, y necesita un ordenador al lado.
El anfitrión, de momento, es mi portátil conectado por USB; una Raspberry Pi tomará el relevo. Sin interfaz web por ahora: Klipper expone un socket local al que se envían comandos, y la IA escribió en una hora lo necesario para no teclear G-code a mano: un cliente para enviar un comando y leer la respuesta, un script de seguimiento de impresión y, sobre todo, calib.py, un control por teclado donde una tecla es un gesto: h para el homing, s para lanzar la calibración delta, m para la malla del plato, d/u para bajar o subir la boquilla 0,1 mm, [/] para ajustar la primera capa mientras se imprime.
El principio, desde el inicio, es el mismo que en la Bambu: se mide, no se inventa. Cada valor escrito en la configuración procede de una medida en la máquina, y cada corrección va seguida de una pieza de control.
Para ir al fondo: qué hace un firmware delta y qué corrige cada ajuste
En una delta, la posición de la boquilla se calcula a partir de siete números y medio: la longitud de los brazos (arm_length), el radio delta (delta_radius, la distancia horizontal entre el eje de una columna y el pivote del brazo en el carro, menos la del lado del efector), el ángulo de cada columna (nominalmente 210°, 330° y 90°) y la altura de tope de cada columna (position_endstop, donde el carro dispara su final de carrera). Cuando uno es erróneo, el error sobre el plato tiene una forma reconocible:
| Ajuste erróneo | Forma del error sobre el plato |
|---|---|
| altura de un tope | un plano inclinado hacia la columna afectada |
| radio delta | un cuenco o una cúpula centrados, simétricos |
| longitud de los brazos | cuenco/cúpula también, más un error de escala en XY (piezas demasiado grandes o pequeñas) |
| ángulo de una columna | una distorsión en trébol, de tres lóbulos, y piezas alabeadas |
Klipper los mide todos con DELTA_CALIBRATE: se posa la boquilla en siete puntos del plato (con una sonda, o con papel), y ajusta los parámetros para que esos siete puntos queden en un plano. La versión extendida (DELTA_ANALYZE) añade las medidas de una pieza impresa para ajustar los brazos uno a uno. Sobre esta geometría, la bed mesh (malla del plato) corrige lo que queda —los defectos de planitud del propio cristal— interpolando entre puntos medidos. El orden importa: la malla solo puede corregir limpiamente lo que es local; un error de geometría no es local, y una malla que intenta compensarlo nunca lo consigue del todo. Ese es el corazón de este artículo.
Primero la mecánica: las correas
Antes de tocar el firmware, una auditoría rápida de lo que se mueve. Las correas de esta máquina tienen historia: un primer juego destruido por sobretensión («había leído que nunca había que tensarlas, y es lo que me pasó»), en la época en que «ningún ajuste tenía efecto». Esa frase, con perspectiva, era la firma de un problema mecánico y no de slicer, y es lo que justifica empezar por ahí.
La IA propuso primero el método que se lee en todas partes: pellizcar la correa, medir la nota con una aplicación de guitarra, apuntar a una frecuencia. Tres rondas después, zanjé: «no es una cuerda, si la tenso lo bastante para que suene lo romperá todo». Ella lo comprobó, y yo tenía razón: en esta máquina el tramo libre mide 65 cm, la frecuencia objetivo estaría por debajo de 30 Hz, donde las aplicaciones saltan una octava (yo leía 70 Hz sin caer nunca en el mismo valor). Sobre todo, un artículo de Hackaday recuerda que la calidad de impresión apenas cambia con correas francamente flojas, mientras el eje no se retrase respecto al motor; en cambio, tensar de más rompe ejes de motor (un NEMA 17 admite 28 N de carga radial). No hay compromiso que buscar: ningún beneficio al apretar, un riesgo al apretar.
El método elegido es el que uso desde hace años: aflojar francamente y volver a tensar justo hasta el umbral en que la correa empieza a vibrar blandamente en vez de flotar. Se llega por debajo, así que la sobretensión es imposible; el umbral es exactamente el límite bajo del sin-holgura; el mismo gesto en las tres columnas iguala por construcción. Las seis poleas giraban libres. Auditoría cerrada. Veremos más adelante que este retensado, hecho en el momento equivocado, salió caro de todos modos.
Lo que la máquina tenía dentro
Antes de flashear había que leer la memoria del firmware original: los valores que usaba son el punto de partida de la configuración Klipper, y una vez flasheada, ya no se pueden leer. Primera sorpresa, al conectar el USB: no es Marlin. Todo lo que se lee sobre la QQ-S da por hecho Marlin, y la IA había preparado los comandos Marlin (M503 para leer la configuración, M665/M666 para la geometría delta). Respuesta de la máquina: Unknown command. El firmware se anuncia como FIRMWARE_NAME:Robin y es Repetier, que vuelca su memoria con M205. Primera lección, no la última: comprobar antes de afirmar.
El volcado, 970 m de filamento y 233 horas de máquina, dio dos cosas.
Primero los valores reales: brazos 278,6 mm (la config Klipper de referencia dice 280), radio delta 140,8 (la referencia dice 130 — diez milímetros de diferencia, suficiente para una cúpula monstruosa si hubiéramos tomado la referencia), altura 376,03, 100 pasos/mm en las columnas y 367 pasos/mm en el extrusor (recuerden esa cifra).
Después, una constatación que ya explicaba mucho: todos los términos de corrección por columna estaban a cero. Radio delta A/B/C, corrección de diagonal A/B/C, todo a cero. Esta máquina nunca había sido calibrada finamente como delta — o lo había sido en fábrica y lo perdió en una actualización del firmware, que reinicia la EEPROM: es mi hipótesis, y la EEPROM no guarda historial para zanjarla. En ambos casos, sus errores de geometría, fueran los que fueran, llevaban años intactos, y los pasos del extrusor probablemente venían del mismo reinicio.
Para ir al fondo: leer la EEPROM de un Repetier, y qué se traslada a Klipper
M205 devuelve una línea por valor, con el formato EPR:<tipo> <posición> <valor> <etiqueta>. El firmware responde ok antes de la respuesta, no después: un script que lee «hasta el ok» se lo pierde todo; hay que leer hasta el silencio. Lo que se traslada a Klipper: Diagonal rod length → arm_length, Horizontal rod radius at 0,0 → delta_radius, Z max length → position_endstop de las tres columnas, Max printable radius → print_radius, y los pasos/mm → rotation_distance (para una correa GT2 en polea de 16 dientes, 32 mm por vuelta; para el extrusor, rotation_distance = pasos_por_vuelta / pasos_por_mm, es decir 3200 / 367 = 8,719). Los PID no se trasladan (escalas distintas), se rehacen. Los desfases de tope por columna (X 0, Y 7, Z 83 pasos en la EEPROM) no se trasladaron: la convención de signo de Repetier no es segura, y DELTA_CALIBRATE los vuelve a derivar de todos modos.
El volcado completo está en los archivos al final del artículo (README-flsun.md remite al eeprom-repetier.txt del repositorio).
Klipper, y unos motores sin fuerza
El flasheo en sí no tiene historia: Klipper compilado para el STM32F103 de la placa MKS Robin Mini, con un bootloader de 28 KB, un cristal de 8 MHz y el puerto serie USART3; el binario pasado por el pequeño script update_mks_robin.py de Klipper que lo codifica en el formato que espera el bootloader MKS; copiado en una tarjeta SD de 4 GB en FAT32, impresora apagada al insertarla. Un pitido, «complete» en verde, y Klipper responde Klipper state: Ready.
Y entonces el primer homing falló. No trigger on stepper_b after full movement: un carro no llegó a su interruptor. El segundo homing también, en otra columna. Los motores gruñían, subían a 5 mm/s, se calaban a 25, y bajaban «blandamente».
Lo que siguió es más una lección que un relato. La IA fue encadenando hipótesis —duración de los pulsos de paso, modo de micropasos, correas, un potenciómetro de corriente que no existe en esta placa—, cada una probada, cada una descartada, y cada prueba alargaba la conversación sin añadir información. Es un comportamiento que conviene conocer al trabajar con una IA: cuanto más se llena su ventana de contexto de intentos fallidos, más se desliza hacia el siguiente intento en vez de volver a los hechos. Lo que la detuvo cabe en una frase, una restricción fuerte: «antes del flasheo, todo funcionaba perfectamente». La víspera, con Repetier, la misma mecánica funcionaba; el hardware quedaba descartado por construcción, y la única pregunta válida pasaba a ser: ¿qué hacía el firmware antiguo que el nuevo no hace?
Entonces hizo lo que debería haber hecho primero: leer el archivo de pines de esta placa en las fuentes de Marlin, pins_MKS_ROBIN_MINI.h, y buscar todo lo que el firmware antiguo inicializaba al arrancar. Y ahí:
MOTOR_CURRENT_PWM_XY_PIN PA6
MOTOR_CURRENT_PWM_Z_PIN PA7
MOTOR_CURRENT_PWM_E_PIN PB0
MOTOR_CURRENT_PWM_RANGE 1500
DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 }
En la Robin Mini, la tensión de referencia que fija la corriente de los motores no se ajusta con un potenciómetro: la genera el microcontrolador, como señal PWM en tres pines. Repetier las fijaba al arrancar. Klipper las dejaba flotando: referencia casi nula, par minúsculo, deriva con los minutos («se mueve mejor que al principio»). Y la configuración oficial de Klipper para esta impresora, printer-flsun-qqs-2020.cfg, no contiene esas líneas (en el momento de escribir esto). Quien siga esa configuración en una Robin Mini tiene los motores subalimentados.
La corrección son tres bloques de configuración: una salida PWM hardware por pin, 800 en una escala de 1500, a 1 kHz, el valor por defecto de Marlin. Homing inmediato, tres columnas disparadas, velocidad normal. «¡Movimiento perfecto!»
Para ir al fondo: los tres bloques, y la lección de método
[output_pin motor_current_ab]
pin: PA6
pwm: True
hardware_pwm: True
cycle_time: 0.001
scale: 1500
value: 800
[output_pin motor_current_c]
pin: PA7
# ídem
[output_pin motor_current_e]
pin: PB0
# ídem
800/1500 corresponde a unos 1,28 V de referencia, es decir ~0,9 A eficaces en los drivers TMC2208 de la placa. Se puede ajustar en pasos de 50, sin pasar de ~1000 sin refrigeración. Los tres pines están en el mismo temporizador (TIM3), hardware_pwm se acepta sin error.
La lección va más allá de esta placa: cuando «antes funcionaba» con otro firmware, hay que inventariar todo lo que el firmware antiguo inicializaba: corriente, micropasos, modos de driver, no solo STEP/DIR/ENABLE. El error de la IA no fue equivocarse, sino razonar («la corriente viene de un potenciómetro, luego no ha cambiado») en vez de comprobar cómo produce su referencia esta placa en concreto.
Calibrar una delta sin sonda
La sonda de la máquina no estaba. No importa: la documentación de Klipper recomienda de todos modos la calibración manual en una delta, porque una sonda montada al lado de la boquilla introduce su propio error cuando el efector se inclina. El método es la hoja de papel: DELTA_CALIBRATE METHOD=manual envía la boquilla a 2 mm sobre siete puntos del plato, uno en el centro y seis en círculo; en cada punto se baja la boquilla en pasos de 1 mm, luego 0,1, luego por bisección, hasta que una hoja de papel de 0,1 mm roza justo entre la boquilla y el cristal; se valida, la boquilla va al punto siguiente. Siete puntos, un cuarto de hora. Klipper calcula después los parámetros que ponen esos siete puntos en un plano.

La pieza calibrate_size.stl que viene con Klipper, para la calibración extendida de los brazos. Se imprimirá pero no se usará: veremos por qué.
El primer resultado, el 4 de septiembre por la tarde: radio delta 141,18 (la EEPROM decía 140,8), y sobre todo ángulo de la columna A a 211,02° y de la columna B a 330,45°, en lugar de los 210° y 330° nominales. Un grado en A. Es enorme para una delta, y era el defecto «que ningún ajuste corregía»: un ángulo de columna erróneo alabea las piezas y deforma el plato en trébol, y ningún ajuste de slicer, ninguna malla de plato, lo compensa.
A continuación, la bed mesh, la malla del plato: BED_MESH_CALIBRATE METHOD=manual, el mismo gesto con papel en 13 puntos, para corregir lo que el cristal tiene de no plano. Rango 0,51 mm, dominado por los dos bordes del eje Y. Guardada, cargada al inicio de cada impresión. Calibración en frío terminada.
Fíjense en este detalle: la malla se midió en frío, y yo retensé las correas entre la calibración delta y su verificación. Volveremos a ello.
El extrusor mentía un 11,5 %
La prueba más sencilla del mundo, y nunca la había hecho en seis años: una raya de rotulador en el filamento a 120 mm de la entrada del extrusor, se pide a la máquina que avance 100, se mide lo que queda. Esperado: 20 mm. Medido: 31,5 mm. La máquina había empujado 88,5 mm de los 100 pedidos.
Los 367 pasos/mm de la EEPROM, trasladados fielmente a Klipper (rotation_distance 8,719), estaban mal en un 11,5 %. Corregido a 7,716, contrastado con una segunda prueba: 20,0 mm restantes, «¡perfecto!».
Midan lo que eso significa: a cada capa que esta máquina depositó le faltaba una décima parte de su material. Paredes débiles, uniones abiertas, superficies irregulares, mala adhesión entre capas: todo lo que yo achacaba a «la delta» o «el PETG». Y ningún ajuste de slicer compensa un error que se ignora: se puede subir el flujo al 110 % al azar, no se sabe por qué, y no se mantiene de un filamento a otro.
Con los ángulos de columna y la corriente de motor, son tres defectos de fábrica — de fábrica o de una actualización de firmware que lo puso todo a cero, la máquina no dirá cuál — nunca vistos.
PID, PETG húmedo y la primera impresión
Las regulaciones de temperatura (PID) se recalibran en diez minutos, pero la de la boquilla hizo saltar la protección térmica de Klipper: heater extruder not heating at expected rate. La curva mostraba un calentamiento perfectamente sano (27 → 234 °C en 95 s), y luego una inercia inusual entre el bloque y su termistor que hace creer a la protección que el calentamiento se detiene. Sin desactivar nada: una ventana ampliada en [verify_heater extruder], documentada en la configuración.
Luego la primera pieza, en PETG, el que vivía en la máquina desde hacía siglos. El cubo salió… así:

El primer cubo, en PETG. Crepitaba en la boquilla durante la impresión: la bobina estaba saturada de agua. Las paredes son espuma.
No es la impresora: es el filamento. El PETG es higroscópico, y una bobina dejada al aire durante años crepita en la boquilla (el agua se vaporiza) y sale espumosa. Buena parte de la «fiabilidad decepcionante» de esta máquina era eso. Bobina de PLA nueva para toda la calibración; el PETG pasará por la secadora de filamento.
En PLA, el square.stl de Klipper (un marco de un milímetro de pared, cinco milímetros de alto, seis minutos): pared 1,00 mm, altura 5,00. Y el primer cubo de control: Z 20,00 · X 20,40 · Y 20,45. La altura es perfecta: las columnas están bien. El exceso del 2 % en XY lo resolveremos al final.

square.stl: la prueba de primera capa y de caudal de Klipper. Pared de 1,00 mm clavada.

El pie de un marco, muy de cerca: el pequeño labio que sobresale en la base dice que la primera capa está un poco demasiado aplastada. Con esta prueba se ajusta el desfase de primera capa, en pasos de 0,05 mm, durante la impresión.
Pressure advance
Último ajuste antes de atacar el plato: el pressure advance. En una máquina bowden (el motor del extrusor está en el chasis, un tubo largo lleva el filamento hasta la boquilla), la presión en el tubo tarda en subir y en bajar; sin compensación, las esquinas se hinchan y los finales de línea babean. Klipper compensa empujando un poco más antes de las aceleraciones y retirando antes de las deceleraciones, con un solo parámetro. Se mide con una torre de prueba en la que el parámetro aumenta con la altura (TUNING_TOWER), y se busca a ojo la altura en la que las esquinas son más nítidas.

La torre square_tower.stl: abajo, poca compensación, las esquinas se hinchan; arriba, demasiada, se hunden. La mejor esquina está a 19 mm.
Mejor esquina a 19 mm, paso de 0,020 por milímetro: pressure advance 0,38, en el rango esperado para un bowden. Grabado.
La espiral, o cómo ver la primera capa
Para juzgar el nivelado necesitaba algo mejor que la hoja de papel: recordaba un objeto en espiral que se imprime para ver la primera capa de un vistazo. En vez de buscar un archivo laminado para otra máquina, la IA generó el G-code directamente: una sola línea continua, en espiral de Arquímedes, del centro hasta 120 mm de radio, una vuelta cada 2,5 mm, una sola capa de 0,2. Doce minutos. Donde la boquilla está demasiado cerca, el cordón queda aplastado, plano, translúcido; donde está demasiado lejos, queda redondo, estrecho, mal pegado. En un plato redondo, es la prueba más legible que existe.

La primera espiral. Tres lóbulos brillantes a 120° uno de otro: la firma de una geometría delta, no de un plato alabeado.
La primera espiral mostraba un trébol de tres lóbulos. Un cristal alabeado no hace un trébol; una delta mal calibrada, sí. Y sin embargo la calibración acababa de hacerse. La conclusión correcta habría sido: la geometría aún no está bien, repetir la calibración. Tomamos el otro camino.
La pista falsa: dos días corrigiendo la malla
Mi petición era razonable: «una impresión con un espesor predeterminado sería más pertinente que la prueba de la hoja». La IA construyó el método: imprimir un cuadrado de una capa en cada uno de los 13 puntos de la malla, medir su espesor, y corregir cada punto de la malla según su desviación de la media. Un cuadrado más grueso que los demás = la boquilla estaba más alta ahí = el plato está más bajo ahí de lo que la malla cree = se baja el punto. Escribió el script (fix-mesh.py) que hace el homing, coloca la boquilla a 100 mm sobre cada cuadrado para identificarlo («¿cómo saber cuál es cuál?» — el logo no es una referencia), registra las medidas, reescribe la malla. Como mi micrómetro está graduado en pulgadas, se introducen milésimas (13t).

Pasada 1: trece cuadrados de 20 mm, una capa, uno por punto de la malla.

El micrómetro, graduado en pulgadas: una marca del cilindro son 25 milésimas, el tambor da la unidad. 13 thou = 0,33 mm.

El instrumento en sí: un Lufkin Rule Co. de Saginaw, Michigan, n.º 1941. Tiene más años que yo y sigue midiendo a la milésima de pulgada. Entre sus topes, una capa de PLA.
Funcionaba. Pasada 1: rango de espesores 0,30 mm. Pasada 2: 0,084 mm. La espiral siguiente era claramente mejor, el trébol se difuminaba. Luego pasamos a una malla más fina, 7×7 (29 puntos, paso de 40 mm en vez de 55), porque los defectos restantes parecían caer entre los puntos. Pasada 3, pasada 4, ganancia reducida para no oscilar. Y en cada espiral, volvían las mismas zonas, atenuadas pero en el mismo sitio.

Espiral 3, anotada por mí: rojo = demasiado cerca (raspado), azul = demasiado lejos (no pegado). Cinco manchas, ya sin trébol claro.

Espiral 4, tras la malla 7×7: dos zonas rojas en vez de cinco, el azul siempre en la misma esquina.

Malla 7×7, 29 cuadrados de 10 mm. Dos cuadrados de la izquierda están arrancados: demasiado cerca. El micrómetro, sin embargo, los medía «gruesos».
Ahí es cuando dije lo que había que decir: «para mí el error es muy repetible en las tres últimas espirales. Falta material en las mismas zonas y las correcciones han mejorado las cosas pero no corrigen realmente el fondo del problema.» Tres pasadas de corrección deberían haber bastado. Algo independiente del ajuste se resistía.

Espiral 5: rojo, casi sin filamento; rosa, ligera falta; azul, no pegado. Las mismas zonas, otra vez.
Dos macros lo zanjaron. En la zona azul, el cordón es redondo, estrecho, depositado sin presionar, y la transición es progresiva a lo largo de 25 mm hacia el borde: la boquilla se aleja regularmente al ir hacia el borde. En la zona roja, los cordones son anchos, planos, translúcidos, aplastados hasta ser una película: se ven los puntos del plato a través. Demasiado cerca, de verdad.

Zona azul: cordón redondo, sin presionar, que ondula y hace nudos donde ha agarrado. Demasiado lejos.

Zona roja: cordones aplastados, translúcidos, se ve el plato a través. Demasiado cerca, sin discusión.
Y ahí está la contradicción: en esas zonas rojas, los cuadrados medían un espesor normal. La explicación, una vez que se ve: un cuadrado impreso demasiado cerca forma un labio levantado en todo su contorno, y los topes del micrómetro, seis milímetros de diámetro, se apoyan en ese labio. Lee «grueso» exactamente donde está aplastado. El método de los cuadrados estaba sesgado en la dirección precisa que impedía converger. Dos conclusiones de la IA construidas sobre esas medidas («la boquilla está a 0,4 mm del cristal de media», «hay que bajar el cero global») cayeron con él.
Quedaba la pregunta de fondo: ¿por qué zonas tan repetibles? Mi pista eran las correas. La IA escribió una prueba de repetibilidad (tecla R: mismo punto, cinco aproximaciones por caminos distintos, hoja de papel): repetible a 0,1 mm fuera cual fuera el camino. Correas y holgura descartadas. Pero esa prueba dio otra cosa: en esos puntos, la hoja rozaba a Z = +0,2 y +0,6 mm — la máquina creía que el plato estaba medio milímetro más bajo de lo que está. Y la propia malla llevaba una pendiente de 0,65 mm de delante atrás, que nada justifica en una delta calibrada.
La causa estaba en la secuencia del primer día. La calibración delta se había hecho en frío; entre esa calibración y su verificación, yo había retensado las correas; la verificación había mostrado un desfase, y la IA había aplicado +0,4 mm uniforme a los tres topes. Pero el retensado había desplazado las tres columnas desigualmente. El residuo, una pendiente inclinada, se fue a la malla, y una malla de delta nunca vuelve plana una pendiente: deja lóbulos, que cuatro pasadas de cuadrados al micrómetro persiguieron sin atraparlos.
Para ir al fondo: por qué una malla no compensa un error de geometría
Un error de tope en una columna no produce un plano inclinado exacto sino una superficie ligeramente curva, porque la inclinación del efector cambia con su posición; un error de ángulo produce un trébol. La malla muestrea esa superficie en 13 o 29 puntos e interpola (aquí en bicúbico) entre ellos: captura la tendencia, no la curvatura fina, y deja un residuo allí donde la superficie real se aparta de la interpolación. Cuanto mayor es el error de geometría, mayor es el residuo. Por eso Klipper pide la geometría primero y la malla después, y por eso «rehacer la malla» nunca sustituye a «rehacer la calibración delta». Y por eso hay que calibrar en el estado en que se imprime: un plato a 60 °C no está exactamente en el mismo sitio que a 20 °C (aquí, +0,36 mm en el centro), y la diferencia no es necesariamente uniforme.
La llegada: rehacerlo todo en caliente, con papel
Plato a 60 °C, boquilla fría, malla vaciada. DELTA_CALIBRATE manual, siete puntos con papel, quince minutos. El veredicto está en los topes:
| Columna | Tope antes | Tope después | Diferencia |
|---|---|---|---|
| A | 376,252 | 376,075 | −0,18 |
| B | 376,533 | 375,970 | −0,56 |
| C | 377,204 | 376,859 | −0,35 |
Los ángulos apenas se movieron (A 211,02 → 210,93, B 330,45 → 330,33), el radio tampoco (141,18 → 141,29). La geometría aguantaba. Lo que estaba mal eran los topes, desigualmente: 0,38 mm de diferencia entre A y B. Exactamente la pendiente que llevaba la malla.
Guardar, homing, y luego la malla con papel en los 29 puntos, media hora. Centro plano a ±0,1 mm en 80 mm de radio; el borde delantero se hunde 0,6 mm a 120 mm del centro — es el propio cristal, o la delta al final de su alcance, y esta vez está medido directamente y la malla lo sabe. Luego la espiral:

Espiral 6, la primera con geometría y malla coherentes, ambas medidas en caliente. Uniforme de borde a borde, borde delantero incluido.

El cordón, con lupa: regular, mismo ancho de una vuelta a otra, pegado en todas partes.
Seis espirales, y la buena fue aquella en la que dejamos de corregir y recalibramos, en treinta y cinco minutos, con un solo método.
Quedaba una última trampa, de la misma familia: el desfase de primera capa, +0,07 mm, se había ajustado el primer día sobre el cero frío. Sobre el nuevo cero, en caliente, el cubo de control no se pegó. Un cero nuevo implica reajustar el desfase de primera capa, nunca arrastrar el antiguo. Marco de prueba, ajuste en directo en pasos de 0,05: −0,10 apenas pega, −0,20 pega con un labio de 0,3 mm en el pie; grabado a −0,15.

El cubo de control relanzado con el antiguo desfase de primera capa: no se pegó. El cero había cambiado, el desfase no.
Y el cubo, por fin: 20,3 × 20,4 × 20,00, labio de 0,1 mm por lado. El primer día medía 20,40 × 20,45 × 20,00. El exceso en XY no se movió con la geometría, porque no es geometría: la pieza de siete pilares, medida con el calibre, daba una distancia entre ejes de 65,0 ± 0,4 mm sobre 65 nominales, es decir una escala correcta al 0,5 %; un error de brazos habría dado +1,3 mm ahí. Lo que queda es un exceso constante de ancho de cordón —esquinas que se hinchan, pared de 1,07 para 1,00— y eso se ajusta en el laminado como en cualquier máquina: multiplicador de extrusión 0,95, compensación XY −0,1 mm, compensación de pie de elefante 0,1 mm, en un perfil de producción separado del perfil bruto de pruebas. La calibración extendida de los brazos, larga y delicada, no era necesaria. Cubo de control con ese perfil: 20,0 × 20,1 × 20,0.
Lo que me llevo
Calibrar en el estado en que se imprime. En caliente. Una máquina calibrada en frío describe un plato que ya no existe cuando llega el PLA.
Un solo método de medida, de principio a fin. El papel para la geometría, el papel para la malla, el marco de prueba para la primera capa. Cada cambio de método introdujo un sesgo que nadie veía.
La geometría primero, la malla después, nunca al revés. Una malla que no converge en dos pasadas no necesita más puntos: está compensando un error que no es suyo. Y cualquier retensado de correas pone la geometría de nuevo en juego: repetir s y luego m, sin atajos.
Cuando dos medidas se contradicen, se va a mirar. La lupa sobre el cordón zanjó en un minuto lo que cuatro pasadas de micrómetro no habían resuelto. Una medida no es una verdad, es un instrumento con sus puntos ciegos.
La IA sobreingenieriza cuando entiende mal. El script de corrección de malla por cuadrados al micrómetro era ingenioso, estaba bien hecho, era persistente, con reanudación y correcciones — y optimizaba una mala idea. Fui yo quien dijo «es repetible, no es el ajuste», y fue la macro la que zanjó. En cambio, ella encontró en una lectura lo que seis años de foros no habían encontrado: la corriente de motor por PWM, el extrusor desviado un 11,5 %, la calibración nunca hecha.
«Antes funcionaba» es un dato. Dos veces en esta historia, mi juicio sobre mi máquina valió más que un método leído en otra parte: sobre la tensión de las correas, sobre el homing. Y dos veces, la IA acabó comprobándolo y dándome la razón, con fuentes. Ese es el reparto correcto: ella lee rápido, no mide por mí.
Dónde estamos
Estado a 6 de septiembre de 2026: calibración de la máquina terminada. Geometría, cero y malla medidos en caliente con papel; primera capa a −0,15; extrusor a 7,716; pressure advance 0,38; PID rehechos; corriente de motor fijada. Espiral uniforme; cubo de control a 20,0 × 20,1 × 20,0 con el perfil de producción. Queda, por orden de interés: la compensación de resonancia (input shaper) con la torre de prueba de Klipper, un extrusor de doble arrastre en stock, y la Raspberry Pi como anfitrión para hacer la impresora autónoma. El PETG se está secando.
Para reproducir
Material: una FLSun QQ-S de 2020 (placa MKS Robin Mini) —el planteamiento vale para cualquier delta, los pines no—; un ordenador con Linux y un puerto USB; una tarjeta SD ≤ 8 GB en FAT32; una hoja de papel de 80 g; un calibre; una bobina de PLA seca. Sin sonda, sin acelerómetro.
Antes de flashear, leer la memoria del firmware original (en Repetier: M205; en Marlin: M503) y guardar el volcado. Anotar en particular la longitud de los brazos, el radio delta, la altura y los pasos/mm del extrusor.
Firmware: Klipper, make menuconfig → STM32F103, bootloader 28 KiB, cristal 8 MHz, USART3 (PB11/PB10), 250000 baudios; luego scripts/update_mks_robin.py out/klipper.bin Robin_mini.bin; el archivo en la raíz de la tarjeta SD, impresora apagada al insertarla, encender, esperar «complete». El bootloader renombra el archivo a .CUR. El script build-firmware.sh lo hace todo.
Configuración: printer.cfg, con sus valores reales y sus comentarios. Los tres bloques [output_pin motor_current_*] son imprescindibles en una Robin Mini. El bloque SAVE_CONFIG al final del archivo contiene los resultados de las calibraciones; para empezar de cero, borrarlo y volver a poner los valores de la EEPROM en [stepper_a/b/c] y [printer].
Herramientas: start-klipper.sh (arrancar el anfitrión), send-gcode.sh y klippy-client.py (enviar un comando), calib.py (control por teclado de las calibraciones), watch-print.py (seguimiento de impresión), make-spiral.py (la espiral). Los perfiles de PrusaSlicer en línea de comandos están en slicer/: qqs-pla.ini bruto para las pruebas, qqs-pla-prod.ini para las piezas.
En orden, en caliente (plato a la temperatura de impresión, boquilla fría para el papel):
| Paso | Comando / tecla | Duración | Lo que se obtiene |
|---|---|---|---|
| 1. Homing | h |
1 min | posición conocida |
| 2. Geometría | s (DELTA_CALIBRATE manual), 7 puntos con papel, luego c c |
15 min | radio, ángulos, topes |
| 3. Verificación | v (7 puntos a Z = 0,1) |
5 min | ±0,05 esperado; si no, repetir 2 |
| 4. Malla | m (BED_MESH_CALIBRATE manual), luego c c |
20–30 min | perfil default, cargado por START_PRINT |
| 5. Extrusor | raya a 120 mm, M83 G1 E100 F60, medir |
5 min | rotation_distance × extruido/100 |
| 6. PID | PID_CALIBRATE HEATER=extruder TARGET=210, ídem heater_bed |
15 min | ganancias, SAVE_CONFIG |
| 7. Primera capa | square.stl, [ ] en directo, grabar en START_PRINT |
7 min | desfase |
| 8. Pressure advance | square_tower.stl + TUNING_TOWER … START=0 FACTOR=.020 |
50 min | altura de la mejor esquina × 0,020 |
| 9. Control | espiral, luego cubo de 20 mm | 12 + 19 min | uniforme; 20,00 en Z |
Tres reglas, si se ponen a ello: en caliente, un solo método de medida, y cualquier intervención mecánica (correas, brazos, plato) devuelve al paso 2. Si una malla no converge en dos pasadas, no añadir puntos: rehacer la geometría.
Leer la espiral: rojo = demasiado cerca (cordón plano, translúcido, raspado), azul = demasiado lejos (cordón redondo, mal pegado). Un trébol de tres lóbulos = geometría; manchas locales = plato o malla; un borde que se hunde progresivamente = el cristal o la delta al final de su alcance. En caso de duda, la lupa.
Preguntas frecuentes
¿Hace falta una sonda para calibrar una delta con Klipper?
No. La documentación de Klipper recomienda la calibración manual con papel en las deltas, porque una sonda desplazada respecto a la boquilla introduce su propio error cuando el efector se inclina. Siete puntos para la geometría, de trece a veintinueve para la malla, media hora en total.
Mis motores gruñen y el homing falla tras pasar a Klipper en una MKS Robin Mini. ¿Por qué?
Porque la corriente de los motores se fija por PWM desde el microcontrolador (pines PA6, PA7, PB0) y la configuración oficial de Klipper para la QQ-S no lo hace. Tres bloques [output_pin] en PWM hardware, valor 800 sobre 1500, resuelven el problema. Ver Klipper, y unos motores sin fuerza.
¿Mi FLSun QQ-S lleva Marlin?
La QQ-S de 2020 no: lleva Repetier (FIRMWARE_NAME:Robin). M503, M665, M666, M900 responden Unknown command; es M205 el que lee la memoria. Los tutoriales de Marlin no aplican.
Mi malla del plato no converge, ni siquiera tras varias pasadas. ¿Necesito más puntos?
Casi nunca. Una malla que no converge suele estar compensando un error de geometría (topes desiguales, ángulo de columna) o una calibración hecha en frío. Rehacer DELTA_CALIBRATE en caliente, luego la malla, con el mismo método de medida.
¿Cómo sé si mi extrusor empuja la cantidad correcta?
Una raya en el filamento a 120 mm de la entrada del extrusor, M83 y luego G1 E100 F60, medir lo que queda: 20 mm esperados. Aquí quedaban 31,5: un 11,5 % de subextrusión desde siempre. Nuevo rotation_distance = antiguo × extruido / 100.
¿Es bueno el método de los cuadrados de espesor al micrómetro?
Está sesgado donde la boquilla está demasiado cerca: el cuadrado aplastado forma un labio levantado en su contorno, y el micrómetro lo lee «grueso». Si se empeñan, cuadrados de 20 mm medidos en el centro, topes lejos del borde. La espiral y el papel son más fiables.
¿Hay que tensar las correas de una delta a una frecuencia precisa?
No. La frecuencia depende de la longitud del tramo, de la masa y de la composición de la correa; una misma nota no significa una misma tensión de una máquina a otra, y en una QQ-S el tramo es demasiado largo para medirlo. Aflojar, y volver a tensar hasta el umbral en que la correa vibra blandamente en vez de flotar, en las tres columnas. Y rehacer la calibración delta después.
El cubo mide 20,3 en vez de 20,00 en XY: ¿debo calibrar los brazos?
No si el exceso es constante. Compruébenlo en una pieza mayor (la pieza de siete pilares de Klipper, 65 mm entre ejes): si la escala es correcta, el exceso viene del ancho de cordón y se corrige en el slicer (multiplicador de extrusión, compensación XY). La calibración de los brazos corrige un error de escala, no un exceso constante.
¿Qué hizo exactamente la IA, y qué hizo el humano?
Claude leyó la EEPROM y el archivo de pines de la placa, compiló y preparó el firmware, escribió la configuración y todos los scripts, generó la espiral, condujo las calibraciones y redactó este artículo conmigo. Se equivocó sobre el firmware (Marlin), sobre la causa del homing (varias horas), sobre la tensión de las correas y sobre el método de los cuadrados. Yo sostuve la hoja de papel, el calibre, el micrómetro y la cámara; leí las espirales; dije «antes funcionaba», «no es una cuerda» y «es repetible, no es el ajuste». Las tres veces era la pista correcta.
Pequeño glosario
- Delta: impresora en la que la boquilla va sujeta por tres brazos articulados sobre tres carros verticales; la posición se calcula, no se mide eje por eje.
- Efector: la pieza central que lleva la boquilla, al extremo de los brazos.
- Brazos (
arm_length), radio delta (delta_radius), ángulo de columna, tope (position_endstop): los parámetros de la geometría; ver el recuadro «qué corrige cada ajuste». - Homing: enviar los carros arriba hasta sus interruptores, para conocer su posición.
- Bed mesh (malla del plato): mapa de alturas del plato, medido en unos pocos puntos, que el firmware interpola para corregir la boquilla en continuo.
- Prueba del papel: bajar la boquilla hasta que una hoja de 0,1 mm roza justo; el Z = 0 queda entonces 0,1 mm por encima del cristal.
- Desfase de primera capa: pequeño desplazamiento en Z aplicado al inicio de cada impresión para ajustar el aplastamiento de la primera capa.
- Rotation distance: en Klipper, la distancia recorrida (o de filamento empujado) por vuelta de motor; sustituye a los pasos/mm.
- Pressure advance: compensación de la presión en el tubo bowden, que limpia las esquinas.
- PID: la regulación de temperatura; se recalibra con
PID_CALIBRATE. - Bowden: configuración en la que el motor del extrusor está en el chasis y empuja el filamento por un tubo largo hasta la boquilla; ligero para el efector, pero elástico.
- Thou: milésima de pulgada, 0,0254 mm. Los micrómetros antiguos están graduados así.
- Labio / pie de elefante: reborde en la base de una pieza, señal de una primera capa demasiado aplastada.
- PWM: señal cuadrada cuya anchura se modula; sirve aquí para fabricar una tensión de referencia para la corriente de los motores.
- EEPROM: la memoria del firmware original donde guarda sus ajustes.
Referencias y copias locales
Para que este artículo siga siendo útil cuando los enlaces hayan desaparecido, los archivos del proyecto están alojados aquí.
- Klipper, documentación: Delta Calibrate · Bed Mesh · Bed Level · Manual Level · Pressure Advance · Resonance Compensation · Config Reference. Las piezas de prueba (
square.stl,square_tower.stl,calibrate_size.stl,ringing_tower.stl) están endocs/prints/del repositorio. - Configuración Klipper de referencia para la QQ-S 2020 —
printer-flsun-qqs-2020.cfg(sin las salidas de corriente de motor, a 6 de septiembre de 2026). - Pines de la MKS Robin Mini en Marlin —
pins_MKS_ROBIN_MINI.h(origen de los pines PWM de corriente). - Hackaday, «Don’t Tune Your 3D Printer To Middle ‘C’ After All» — sobre la tensión de correas por frecuencia (búsqueda en el sitio).
- PrusaSlicer 2.8.1, última versión con AppImage para Linux — releases. Ejecutado en línea de comandos sin pantalla (
env -u DISPLAY); añade sus propios comandos de calentamiento salvo si encuentraM104/M140reales en el G-code inicial. - Los archivos del proyecto:
printer.cfg·calib.py·klippy-client.py·send-gcode.sh·start-klipper.sh·watch-print.py·build-firmware.sh·make-spiral.py· perfilesslicer/·README-flsun.md(el estado de la máquina y el manual del repositorio, en francés). - Para memoria, la pista falsa:
fix-mesh.py,mesh-to-7.py,first_layer_29.stl, yanalyze-delta.pypara la calibración extendida de los brazos, si algún día fuera necesaria.
Fotos y medidas: mías. Firmware, configuración, scripts y redacción: con Claude. Este artículo también está disponible en Markdown en bruto.