# Nivelación Gantry (Z-TILT)

Viene siendo muy común que nuestras impresoras tengan dos o más motores en el eje Z dependiendo del tipo de máquina.

El **disponer de varios motores en el eje Z nos permite**, y dependiendo del tipo de máquina:

* **poder sustentar un eje X más pesado**, sobre todo cuando usamos extrusión directa en máquinas cartesianas, sin que este “caiga” normalmente en el lado donde no disponga de un punto de anclaje a la cinemática
* poder **sustentar una cama más pesada** en el caso, normalmente, de máquinas CoreXY
* si disponemos de **drivers independientes nos permiten alinear de forma automática** nuestro eje X o cama dependiendo de nuestro tipo de máquina.

## En que consiste el Z-TILT en Klipper

**Z-TILT básicamente es un proceso que nos ayuda a alinear nuestros motores de Z con respecto a nuestro eje/gantry X (cartesiana) o XY (CoreXY)**. Con esto **aseguramos que tenemos siempre alineado nuestro Z perfectamente y de forma precisa y automática**.

Al **usar un sensor de nivelación**, aparte de **precisión**, vamos a poder aprovechar este para el nivelado manual de nuestra cama, el ajuste de nuestro gantry/eje y el mallado de nuestra cama… con lo que tenemos casi **automatizado completamente la nivelación de nuestra máquina**.

{% embed url="<https://www.youtube.com/watch?v=Ptus5hQsJ1I>" %}

Para ello, Klipper cuenta con las macros:

* [**Z\_TILT\_ADJUST**](https://www.klipper3d.org/G-Codes.html#z_tilt), para máquinas que tengan 2 o 3 motores en el eje Z
* **QUAD\_GANTRY\_LEVEL**, en el caso de que dispongamos de 4 motores en Z

## Requerimientos aconsejables para disponer de Z-TILT:

* obviamente, **tener dos o más motores en nuestro eje Z**
* que **cada uno de estos motores se encuentre conectado a un driver independiente**, esto nos va a permitir que Klipper pueda corregir de forma independiente sus alturas
* un **sensor de nivelación**, es el método más sencillo y fiable para realizar estas alineaciones

## Configuración:

Configurar nuestro **Klipper** para Z-TILT es muy sencillo y básicamente tendremos que configurar una nueva sección [\[z\_tilt\]](https://www.klipper3d.org/Config_Reference.html#z_tilt), o [\[quad\_gantry\_level\]](https://www.klipper3d.org/Config_Reference.html#quad_gantry_level) dependiendo de nuestra máquina, en nuestros ficheros de configuración.

{% hint style="warning" %}
Tal como hemos comentado **para que funcione Z-TILT requerimos que nuestros motores en Z estén en drivers separados**. Para ello como **requerimiento previo estos han de estar definidos correctamente en nuestro fichero de configuración**, ejemplo de configuración en una máquina con 3 motores en Z (en la que solamente hacemos referencia a las secciones necesarias):

* definición de drivers por eje:

```django
[tmc2209 stepper_z]
... # your configuration
[tmc2209 stepper_z1]
... # your configuration 
[tmc2209 stepper_z2]
... # your configuration
```

* definición de ejes Z

```django
[stepper_z] 
... # your configuration
[stepper_z1] 
... # your configuration
[stepper_z2] 
... # your configuration
```

{% endhint %}

### \[z-tilt]

En el siguiente ejemplo vemos una sección \[z-tilt] para un triple Z

```django
# 3DWORK Z-TILT https://klipper.3dwork.io/klipper/empezamos/nivelacion-gantry-z-tilt
[z_tilt]
z_positions:
	0,0
	150,300
	300,0

points:
	60,60
	185,270
	260,60
		
speed: 50
horizontal_move_z: 12
retries: 10
retry_tolerance: 0.0125
```

Valores importantes de nuestra sección **\[z-tilt]**:

* **z\_positions**, indicarán las coordenadas donde se encuentran nuestros puntos de unión entre el eje Z y nuestra cama. Las coordenadas XY son con respecto a nuestro nozzle.

{% hint style="danger" %}
Es **muy importante el orden de estos puntos ya que hacen referencia a la asignación de cada stepper** siendo... **stepper\_z para la primera coordenada, stepper\_z1 para la segunda coordenada, stepper\_z2 para la tercera coordenada, etc**...\
En el siguiente ejemplo podéis ver visualmente para un Z-TILT de dos puntos:

![](https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/jKENTOnZXjPlbe61I392/image.png)\
\ <mark style="color:orange;">Este orden de coordenadas es muy importante ya que en el caso de ponerlas de forma incorrecta el sistema no sabrá corregir bien las desviaciones y fallar o incluso provocar algún daño mecánico durante el proceso.</mark>
{% endhint %}

* **points**, al igual que los valores anteriores, estos hacen referencia a las coordenadas XY con respecto a nuestro nozzle de nuevo, que el **comando Z\_TILT\_ADJUST/QUAD\_GANTRY\_LEVEL usará para los sondeos/medidas**.

{% hint style="danger" %}
**Nos aseguraremos que las coordenadas tienen en cuenta los offsets de nuestro sensor y este queda lo más cercano al punto de unión del eje Z con nuestra cama en cada caso.**
{% endhint %}

* **speed,** será la velocidad en mm/s de los movimientos de nuestros ejes durante la calibración... si no se especifica utilizará 50 mm/s
* **horizontal\_move\_z**, la distancia que Z subirá al realizar el traslado entre puntos… por defecto 5 mm aunque podemos ajustarla en caso necesario a nuestras necesidades
* **retries**, ajustaremos el número de reintentos que queremos hacer durante el proceso en el caso de que los ajustes no cumplan con la tolerancia definida
* **retry\_tolerance**, en el caso de que ajustemos **retries** a un número mayor a 0 este será el valor de tolerancia para dar por bueno el ajuste de un eje.

{% hint style="info" %}
**Tolerancia Z-Tilt:**

En ocasiones podemos ver configuraciones de toleranca entre puntos muy pequeñas algo que puede ocasionar ciertos problemas y normalmente no llegan a transformarse en una gran ventaja en la calidad final de nuestras impresiones.

Teniendo en cuenta que 1 step = 0.0125, para un desarrollo de motor y cinemática media de una impresora 3D, podriamos decir que **un valor de tolerancia de 0.0125 a 0.03 sería aceptable** y está en cada uno bajarlo o subirlo más.
{% endhint %}

### \[quad\_gantry\_level]

En este caso disponemos de algunos cambios en los valores a definir:

* **gantry\_corners**, en lugar de z\_positions, en este caso en lugar de definir todos los puntos como se hacía en el caso anterior tan solo **definiremos la esquina inicial (Z) y la opuesta (Z2)**
* **max\_adjust**, esta propiedad es exclusiva de quad\_gantry\_level, es un límite de seguridad que si el ajuste es mayor que este valor el proceso se abortará

![](https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/k0VW8Mg8XTj9tLl1eFwS/image.png)

## Proceso de alineado Z-TILT

Con todo esto configurado pasaremos a tener una **nueva macro de sistema llamada** [**Z\_TILT\_ADJUST**](https://www.klipper3d.org/G-Codes.html#z_tilt) **(o QUAD\_GANTRY\_LEVEL dependiendo de nuestra configuración).**

* **Home de nuestra impresora con un G28** o desde los controles de nuestra UI
* Es **aconsejable realizar un precalentado de nuestra cama y hotend**. En el caso de la cama a la temperatura normal de impresión y para el hotend podemos usar una temperatura de entre 140-170º

{% hint style="info" %}
Suele ser aconsejable realizar un **test de precisión de nuestro sensor con PROBE\_ACCURACY**, nos fijaremos que **la desviación de las lecturas no sea de más de 0.003mm**. De ser más altas de ese valor esperaremos unos minutos para repetir el test hasta que estemos dentro de rango.
{% endhint %}

* **Lanzaremos el comando** [**Z\_TILT\_ADJUST**](https://www.klipper3d.org/G-Codes.html#z_tilt) **o QUAD\_GANTRY\_LEVEL** que realizará el proceso de sondeo y ajuste necesario

<figure><img src="https://content.gitbook.com/content/H6gCE2fgkkpOScJ72TP7/blobs/SptYzTFrATHExQWJi1cx/telegram-cloud-photo-size-4-5920079653068978967-x.jpg" alt=""><figcaption></figcaption></figure>

* **Podemos incorporar** [**Z\_TILT\_ADJUST**](https://www.klipper3d.org/G-Codes.html#z_tilt) **o QUAD\_GANTRY\_LEVEL a nuestra rutina de inicio** de impresión para asegurar siempre un perfecto alineado, idealmente incluyendo este entre el precalentado/homing y el mallado de cama en el caso de que lo hagamos

{% hint style="info" %}
En el caso de ser **nuestra primer alineado usando Z-TILT, o en caso de ajuste de algún componente de nuestra cinemática, es aconsejable**:

* realizar el proceso de nivelación de cama manual con ayuda de nuestro sensor explicado [**aquí**](https://klipper.3dwork.io/klipper/empezamos/nivelacion-cama-manual).
* volveremos a realizar el proceso de Z-TILT
* realizaremos estos dos pasos en bucle hasta que apenas sean necesarios ajustes dando por buena la alineación de cama y gantry
  {% endhint %}

{% hint style="success" %}
**Cuando es aconsejable realizar el Z-TILT?**

* si hemos realizado algún ajuste manual en nuestro sistema en la cinemática, en especial si hemos manipulado alguna parte del eje Z
* si hemos variado la nivelación manual de nuestra cama
  {% endhint %}

{% hint style="warning" %}
A tener en cuenta en caso de **máquinas con cerramiento calefactado**:

* realizaremos primero un **home de nuestra impresora con G28** o desde los controles de nuestra UI
* Nos aseguraremos que nuestro **cerramiento esté estable a la temperatura objetivo y el hotend a la temperatura normal de impresión**.
* Realizaremos un **test de precisión de nuestro sensor con PROBE\_ACCURACY**, nos fijaremos que **la desviación de las lecturas no sea de más de 0.003mm**. De ser más altas de ese valor esperaremos unos minutos para repetir el test hasta que estemos dentro de rango.
* Una vez las **lecturas del sensor sean estable lanzaremos el comando** [**Z\_TILT\_ADJUST**](https://www.klipper3d.org/G-Codes.html#z_tilt) **o QUAD\_GANTRY\_LEVEL normalmente**

En el caso que tengamos problemas con el proceso:

* revisaremos nuestra cinemática para asegurarnos que no tengamos un problema en ella
* revisaremos el orden de la definición de los Z ya que, tal como explicamos en ese punto, si ponemos incorrectamente el orden el proceso no podrá corregir correctamente las desviaciones... es más probablemente las agrave ya que intentara corregir en un eje que no es el correcto por su configuración incorrecta.
* realizaremos un FIRMWARE\_RESTART y realizaremos un nivelado manual de nuestra cama
  {% endhint %}
